🔴 加了那一句才找得到
🔴 这一节的 Python 题会**在运行时调 gcc 现编一个 .so,再用 ctypes 加载进来**——真的跨语言调用,不是假装。判题机需要 gcc、一个可写的临时目录,以及允许 Python 起子进程。⚠️ 这条路线**一个答案都不是耗时**。耗时跟机器、跟负载、跟编译器都有关,换台机器数字就变了。**能当答案的只有"走了多少步"和"两边结果一不一样"。**
import ctypes, os, subprocess, tempfile
def build_cpp(src, name="m"):
"""把一段 C++ 现场编成 .so。判题机需要 g++。"""
d = tempfile.mkdtemp()
c_path = os.path.join(d, name + ".cpp")
so_path = os.path.join(d, name + ".so")
with open(c_path, "w") as f:
f.write(src)
subprocess.run(["g++", "-std=c++17", "-shared", "-fPIC", "-O2",
"-o", so_path, c_path], check=True, capture_output=True)
return ctypes.CDLL(so_path)
CPP_SRC = r"""
#include <numeric>
#include <vector>
/* 加了 extern "C":名字不被修饰,Python 找得到 */
extern "C" long sum_to(long n) {
std::vector<long> v(static_cast<std::size_t>(n));
std::iota(v.begin(), v.end(), 1L);
return std::accumulate(v.begin(), v.end(), 0L);
}
/* 没加:名字被修饰成别的样子,按原名找不到 */
long hidden(long n) { return n; }
"""
lib = build_cpp(CPP_SRC)
lib.sum_to.argtypes = [ctypes.c_long]
lib.sum_to.restype = ctypes.c_long
found_hidden = 0
try:
lib.hidden
found_hidden = 1
except AttributeError:
found_hidden = 0
c_result = lib.sum_to(100)
print(f"{c_result}/{int(c_result == sum(range(1, 101)))}/{found_hidden}")
全部评论