"""任务 3 · 读进来的都是字符串

token 表里全是字符串，这件事会变成一个安静的坑：两个字符串比较**不报类型错误**，
规则换成了按字符逐个比编码。于是

    '10' < '9'          是 True      （'1' 的编码 49 小于 '9' 的编码 57）
    sorted 那几个字符串  ['10', '100', '2', '9']  （'100' 排在 '2' 前面）
    max(['10', '9'])    得 '9'，不是 '10'

一个字符串与一个整数混着比会当场报错（TypeError），那反而是好事。

这一份要把这几个反直觉的结果亲手打出来，再写对「修法」：
在解析层一次转完，算法层看不到数字字符串。

带 print 的行是判分接口，别改；要写的是标着 TODO 的那几段。

跑： py task3_string_trap.py
判： py run_tests.py
"""

import sys


# ══ TODO 1 ══════════════════════════════════════════════════
# 把下面三个字符串比较的结果打出来：不转 int，直接就比。
# 提示：它们都是 True / False，不用写引号。
lt = None
print('01 字符串 10 < 9', lt)              # 别改：期望 True（反直觉的那一个）

lt2 = None
print('02 字符串 2 < 10', lt2)             # 别改：期望 False


# ══ TODO 2 ══════════════════════════════════════════════════
# 同一批字符串排两次：一次直接排，一次指定「按什么排」（把字符转成整数再比）。
raw = ['10', '9', '100', '2']

by_str = None
print('03 直接排序', by_str)               # 别改：期望 ['10', '100', '2', '9']

by_int = None
print('04 按整数排序', by_int)             # 别改：期望 ['2', '9', '10', '100']


# ══ TODO 3 ══════════════════════════════════════════════════
# 同一批字符串求最大、最小：一次直接求，一次先转成整数再求。
# 这两行的对照最能说明问题：直接求给的是「字符串里最大的那一个」，
# 转成整数再求才是真正常识里的最大值——两个答案不一样。
mx = None
print('05 字符串最大值', mx)               # 别改：期望 9（注意不是 100，也不是 10）

mx_int = None
print('06 转整数后最大值', mx_int)         # 别改：期望 100


# ══ TODO 4 ══════════════════════════════════════════════════
# 混着比（一个字符串、一个整数）会报类型错误。把它接住，只打印报错类型名。
# 提示：try / except 把异常接住，用 type(e).__name__ 拿到类名（只要那个名字）。
kind = None
print('07 混着比的报错类型', kind)         # 别改：期望 TypeError


# ══ TODO 5 ══════════════════════════════════════════════════
# 修法：在解析层一次转完，算法层看不到数字字符串。
# 传进来的是 token 表（都是字符串），交回整数列表。
# 期望：['31', '9', '100'] → [31, 9, 100]
def to_ints(tokens):
    """token 表进来，整数列表出去。"""
    return []


print('08 解析层转完', to_ints(['31', '9', '100']))   # 别改：期望 [31, 9, 100]
