地下旅行¶
约 1438 个字 1 行代码 1 张图片 预计阅读时间 5 分钟
剧透警告
题目主题:数据库;机场
提取方式:A1Z26
1. 这道题的主题是什么?
刘慈欣的作品。
2. 红色表示的是什么?
IATA机场代码。
3. 我应该怎么做?
计算前一个机场到后一个机场距离的连线到地心的距离(即从地心作连线的垂线,求垂线长度),以十万米为单位,四舍五入,保留整数。
4. 我找不到译名,怎么办?
本题使用英文维基百科为数据库,在此为因此造成的困扰表示歉意。 您可以参考:https://limewire.com/d/p74rV#keDnB2XR4H 或 https://441c-112-41-37-187.ngrok-free.app(感谢找不到北)
该题目未见有里程碑
最终答案
ELLIPSE
题目详情¶
20XX年的春节,你申请了国际隧道通行协会(International Association of Tunnel Access)的通行证,在地下高速穿行,脑中满是遐想……
| 他知道,这最后一课要提前讲了。 ___ _______ _______ | → | 妈妈,宇宙的目的是什么? _____ __ __ ___ _______ |
| 为了苦难中的祖国,我抖动蝴蝶的翅膀…… _________ | → | 弱小和无知不是生存的障碍,傲慢才是。 _____'_ ___ |
| 人们常说的寄托,也就是这么回事。 ____ _________ | → | 与其说是为了纪念,更像是为了忘却。 ___ _____-____ _______ |
| 过去的人真笨,过去的人真难。 ____ __ ___ _____ | → | 富人和穷人已经不是同一个物种了。 ___ ___ _______ __ _______ |
| 对宇宙和自然的内在美有深刻感觉的人,是不会去进行战争的。 ____ ________ _______ _______ | → | 永远保持理智确实是一个奢求。 ___ _________ _____ |
| 给岁月以文明,而不是给文明以岁月。 ___ ____ ______ | → | 与山脉和海洋相比,恐龙也是灰尘。 __ ____ ___ _________ |
| 绝对时空就是你们思想的大地,离开它你们对一切都无从把握。 ___________ | → | 你们这些世界上最有学问的人,在找世界上最小的沙粒。 ___ __ ___ _____ ______ |
| 至于我们,来了,做了,走了。 _________ ___ | → | 只剩艺术,艺术是文明存在的唯一理由。 ___ __ ______ |
| 不管走到天涯海角,我离她都不会更远了。 ____ ___ ____ | → | 教授,上帝确实掷骰子。 ___ _________ |
| 用这些天真的动物为他们肮脏的战争服务,这已经是最大的不道德了。 _____ ____ | → | 只有传遍全宇宙的冲动才能成为一次完整的感受。 ___ _______ |
| 她现在仍被封闭在地心中, 那么,我们之间即使最短的距离 | ↓ | |
| ANSWER | ||
总结¶
题解
注意到这些都是刘慈欣的作品,在番茄小说APP下载选集然后全文搜索即可。
| 作品 | 英文 | 红字 | 作品 | 英文 | 红字 |
|---|---|---|---|---|---|
| 乡村教师 | The Village Teacher | ETR | 朝闻道 | Heard It in the Morning | AEG |
| 混沌蝴蝶 | butterfly | TER | 三体3:死神永生 | Death’s End | EAE |
| 球状闪电 | Ball Lightning | TIN | 三体1 | The Three-Body Problem | ERE |
| 地火 | Fire in the Earth | ETE | 赡养人类 | For the Benefit of Mankind | REA |
| 全频带阻塞干扰 | Full Spectrum Barrage Jamming | TEM | 流浪地球 | The Wandering Earth | TNG |
| 三体2:黑暗森林 | The Dark Forest | TEE | 白垩纪往事 | Of Ants and Dinosaurs | FTI |
| 坍缩 | Contraction | TAO | 微观尽头 | End of the Microcosmos | FTE |
| 超新星纪元 | Supernova Era | NER | 梦之海 | Sea of Dreams | ERM |
| 带上她的眼睛 | With Her Eyes | THE | 信使 | The Messenger | TEN |
| 鲸歌 | Whale Song | ANG | 思想者 | The Thinker | THH |
微观尽头的Microcosmos应该是没有空格的,不知道题目为什么多了个空格。
注意到ft里International Association of Tunnel Access的缩写为IATA,即机场代码。根据题中箭头和问号所在,推测需要将机场进行连线,然后取垂线段长度。多方搜索获得机场信息的表格,然后查找其经纬度:
| 机场 | 纬度 | 经度 | 机场 | 纬度 | 经度 |
|---|---|---|---|---|---|
| 圣罗莎国际机场 | -3.441986 | -79.996957 | 巴东石林潘 | 1.4001 | 99.430496 |
| 拉杰斯机场 | 38.761799 | -27.090799 | 思沃机场 | -17.0903 | 168.3430023 |
| 廷杜夫机场 | 27.7003994 | -8.167099953 | 埃拉夫机场 | -6.606463154 | 143.9002132 |
| 米提玛 | 12.93299961 | 36.16699982 | 雷奥机场 | -18.46652 | -136.43855 |
| 特莫拉机场 | -34.421398 | 147.511993 | 伯克哈勒夫机场 | 35.731741 | -5.921459 |
| 泰贝萨机场 | 35.43159866 | 8.12071991 | 费图伊塔机场 | -14.2161 | -169.424 |
| 青岛国际机场 | 36.361953 | 120.088171 | 埃尔卡拉法特机场 | -50.2803 | -72.053101 |
| 内尤格里机场 | 56.91389847 | 124.9140015 | 科曼达恩特克拉莫机场 | -27.663614 | -52.271489 |
| 特雷西纳机场 | -5.06025 | -42.823712 | 铜仁凤凰机场 | 27.883333 | 109.308889 |
| 布里查姆普尼厄斯机场 | 45.729198 | 0.221456 | 塔哈罗阿机场 | -38.18109894 | 174.7079926 |
然后让大模型写代码计算垂线长度即可。根据题目暗示,最后结果要换算成以十万米为单位进行提取。运行解题代码,最后得到ANSELLIPSE,提交ELLIPSE。
解题代码
import numpy as np
def latlon_to_cartesian(lat_deg, lon_deg, R):
"""将经纬度(度)转换为三维直角坐标"""
lat = np.radians(lat_deg)
lon = np.radians(lon_deg)
x = R * np.cos(lat) * np.cos(lon)
y = R * np.cos(lat) * np.sin(lon)
z = R * np.sin(lat)
return np.array([x, y, z])
def perpendicular_distance_to_chord(lat1, lon1, lat2, lon2, R=6371.0):
"""
计算地心到地表两点所连线段(弦)的垂线段长度。
参数:
lat1, lon1: 第一个点的纬度和经度(度)
lat2, lon2: 第二个点的纬度和经度(度)
R: 地球半径(km),默认 6371 km
返回:
地心到该弦的垂直距离(km)
原理:
线段参数方程: P(t) = P1 + t·(P2 - P1), t ∈ [0, 1]
令 d = P2 - P1,最近点参数: t* = -P1·d / |d|²
由于 |P1| = |P2| = R,可以证明 t* 恒等于 0.5,
即垂足总在弦的中点(球心到等长弦的垂线平分该弦)。
因此距离 = |(P1 + P2) / 2| = R·cos(θ/2),其中 θ 为圆心角。
"""
P1 = latlon_to_cartesian(lat1, lon1, R)
P2 = latlon_to_cartesian(lat2, lon2, R)
d = P2 - P1
d_dot_d = np.dot(d, d)
# 两点重合时,弦退化为一个点,距离即为 R
if d_dot_d < 1e-12:
return R
# 求原点到直线最近点的参数 t,并限制在 [0,1] 内(线段范围)
t = -np.dot(P1, d) / d_dot_d
t = np.clip(t, 0.0, 1.0)
# 线段上离原点最近的点
closest_point = P1 + t * d
distance = np.linalg.norm(closest_point)
return distance
# ===================== 示例与验证 =====================
if __name__ == "__main__":
R = 6371.0 # 地球平均半径 (km)
_targets = {
'ETR':'AEG',
'TER':'EAE',
'TIN':'ERE',
'ETE':'REA',
'TEM':'TNG',
'TEE':'FTI',
'TAO':'FTE',
'NER':'ERM',
'THE':'TEN',
'ANG':'THH'
}
new_targets = """圣罗莎国际机场 -3.441986 -79.996957 Heard It in the Morning 巴东石林潘 1.4001 99.430496
拉杰斯机场 38.761799 -27.090799 Death's End 思沃机场 -17.0903 168.3430023
廷杜夫机场 27.7003994 -8.167099953 The Three-Body Problem 埃拉夫机场 -6.606463154 143.9002132
米提玛 12.93299961 36.16699982 For the Benefit of Mankind 雷奥机场 -18.46652 -136.43855
特莫拉机场 -34.421398 147.511993 The Wandering Earth 伯克哈勒夫机场 35.731741 -5.921459
泰贝萨机场 35.43159866 8.12071991 Of Ants and Dinosaurs 费图伊塔机场 -14.216131 -169.423771
青岛国际机场 36.361953 120.088171 End of the Microcosmos 埃尔卡拉法特机场 -50.2803 -72.053101
内尤格里机场 56.91389847 124.9140015 Sea of Dreams 科曼达恩特克拉莫机场 -27.663614 -52.271489
特雷西纳机场 -5.06025 -42.823712 The Messenger 铜仁凤凰机场 27.883333 109.308889
布里查姆普尼厄斯机场 45.729198 0.221456 The Thinker 塔哈罗阿机场 -38.18109894 174.7079926"""
d_list = []
for line in new_targets.split('\n'):
parts = line.strip().split('\t')
key = parts[0]
lat1 = float(parts[1])
lon1 = float(parts[2])
value = parts[4]
lat2 = float(parts[5])
lon2 = float(parts[6])
d = perpendicular_distance_to_chord(lat1, lon1, lat2, lon2, R)
d /= 100
d_list.append(d)
print(f"{key} → {value}: 垂线段长度 = {d:.4f} (100000 m)")
for d in d_list:
d = int(round(d, 0))
print(chr(d+ord('A')-1),end='')
# --- 示例 1:北京 → 上海 ---
# beijing = (39.9042, 116.4074)
# shanghai = (31.2304, 121.4737)
# d1 = perpendicular_distance_to_chord(*beijing, *shanghai, R)
# print(f"北京 → 上海: 垂线段长度 = {d1:.4f} km")
# # --- 示例 2:对径点(北极 → 南极),弦穿过球心,距离应为 0 ---
# d2 = perpendicular_distance_to_chord(90, 0, -90, 0, R)
# print(f"北极 → 南极: 垂线段长度 = {d2:.4f} km (理论值 0)")
# # --- 示例 3:同一点,距离应为 R ---
# d3 = perpendicular_distance_to_chord(40, 116, 40, 116, R)
# print(f"同一点: 垂线段长度 = {d3:.4f} km (理论值 {R})")
# # --- 示例 4:赤道上相隔 90°,理论值 R·cos(45°) ---
# d4 = perpendicular_distance_to_chord(0, 0, 0, 90, R)
# theory4 = R * np.cos(np.radians(45))
# print(f"赤道 0° → 90°: 垂线段长度 = {d4:.4f} km (理论值 {theory4:.4f})")
# # --- 示例 5:赤道上相隔 180°(对径),距离应为 0 ---
# d5 = perpendicular_distance_to_chord(0, 0, 0, 180, R)
# print(f"赤道 0° → 180°: 垂线段长度 = {d5:.4f} km (理论值 0)")
# # --- 通用公式验证:距离 = R·cos(θ/2) ---
# print("\n--- 通用公式验证: d = R·cos(θ/2) ---")
# for angle in [30, 60, 90, 120, 150, 180]:
# d = perpendicular_distance_to_chord(0, 0, 0, angle, R)
# theory = R * np.cos(np.radians(angle / 2))
# print(f" 圆心角 {angle:>3}°: 计算值 = {d:.4f} km, 理论值 = {theory:.4f} km, 误差 = {abs(d - theory):.2e} km")
评价
题目不赖,赛后开始看大刘的中短篇了。写得确实很感人啊,宇宙的浪漫科幻。
