gaokao-pro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +109 -0
  2. package/data/datasets/gaoshui-yundongdui-2024.json +33 -0
  3. package/data/datasets/junjing-jingxiao.json +75 -0
  4. package/data/datasets/provinces-specialty-2024.json +139 -0
  5. package/data/datasets/qiangji-2024.json +52 -0
  6. package/data/datasets/schools-adapters-2024.json +123 -0
  7. package/data/datasets/sushe-shitang.json +40 -0
  8. package/data/datasets/tijian-shouxian-zhuanye.json +29 -0
  9. package/data/datasets/xiaoyuzhong-zhaosheng.json +18 -0
  10. package/data/datasets/xueke-pinggu-disculun.json +28 -0
  11. package/data/datasets/zhongwai-hezuo-2024.json +36 -0
  12. package/data/datasets/zonghepingjia-2024.json +53 -0
  13. package/data/school-index.json.gz +0 -0
  14. package/data/yifenyiduan/_ocr-pipeline/extract-pdf.py +117 -0
  15. package/data/yifenyiduan/beijing-2023-combined.json +1 -0
  16. package/data/yifenyiduan/beijing-2024-combined.json +1 -0
  17. package/data/yifenyiduan/beijing-2025-combined.json +1 -0
  18. package/data/yifenyiduan/henan-2024-liberal.json +1 -0
  19. package/data/yifenyiduan/hunan-2024-history.json +1 -0
  20. package/dist/aliases.d.ts +2 -0
  21. package/dist/aliases.js +120 -0
  22. package/dist/chart-check.d.ts +20 -0
  23. package/dist/chart-check.js +99 -0
  24. package/dist/codes.d.ts +162 -0
  25. package/dist/codes.js +59 -0
  26. package/dist/compare.d.ts +39 -0
  27. package/dist/compare.js +112 -0
  28. package/dist/datasets.d.ts +65 -0
  29. package/dist/datasets.js +82 -0
  30. package/dist/find.d.ts +48 -0
  31. package/dist/find.js +87 -0
  32. package/dist/format.d.ts +17 -0
  33. package/dist/format.js +109 -0
  34. package/dist/gaokao-cn.d.ts +122 -0
  35. package/dist/gaokao-cn.js +49 -0
  36. package/dist/index-loader.d.ts +33 -0
  37. package/dist/index-loader.js +59 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +727 -0
  40. package/dist/match.d.ts +40 -0
  41. package/dist/match.js +118 -0
  42. package/dist/mcp.d.ts +1 -0
  43. package/dist/mcp.js +535 -0
  44. package/dist/memory.d.ts +31 -0
  45. package/dist/memory.js +69 -0
  46. package/dist/paiming.d.ts +29 -0
  47. package/dist/paiming.js +66 -0
  48. package/dist/probe.d.ts +1 -0
  49. package/dist/probe.js +73 -0
  50. package/dist/provinces/guangdong.d.ts +27 -0
  51. package/dist/provinces/guangdong.js +68 -0
  52. package/dist/provinces/index.d.ts +1 -0
  53. package/dist/provinces/index.js +17 -0
  54. package/dist/rank-table.d.ts +31 -0
  55. package/dist/rank-table.js +74 -0
  56. package/dist/recommend-major.d.ts +34 -0
  57. package/dist/recommend-major.js +119 -0
  58. package/dist/recommend.d.ts +54 -0
  59. package/dist/recommend.js +147 -0
  60. package/dist/selftest.d.ts +11 -0
  61. package/dist/selftest.js +48 -0
  62. package/dist/top.d.ts +29 -0
  63. package/dist/top.js +66 -0
  64. package/dist/xuanke.d.ts +8 -0
  65. package/dist/xuanke.js +35 -0
  66. package/package.json +40 -0
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ OCR pipeline for province 一分一段 PDF → JSON.
4
+
5
+ Usage:
6
+ python extract-pdf.py <pdf-url-or-path> <province-pinyin> <year> <track> > out.json
7
+
8
+ Track keys: physics | history | combined | science | liberal
9
+
10
+ Requires: pdftoppm (poppler), tesseract with chi_sim language pack.
11
+
12
+ The 一分一段 PDFs are image-only (rasterized table screenshots), so we:
13
+ 1. Convert each PDF page → PNG (pdftoppm -r 200)
14
+ 2. OCR each PNG with tesseract -l chi_sim
15
+ 3. Regex-extract rows of the form "<score> <count>" where score ∈ [200, 750]
16
+ 4. Sort + dedupe + emit RankTable JSON shape (count→cumulative we compute
17
+ as the value the table gives — note Henan's table uses cumulative
18
+ directly in the count column).
19
+ """
20
+ import json
21
+ import re
22
+ import subprocess
23
+ import sys
24
+ import tempfile
25
+ from pathlib import Path
26
+
27
+
28
+ def ocr_pdf(pdf_path: str) -> str:
29
+ """Convert PDF to PNGs, OCR each, return concatenated text."""
30
+ with tempfile.TemporaryDirectory() as td:
31
+ # 1. PDF → PNGs
32
+ subprocess.run(
33
+ ["pdftoppm", "-r", "200", pdf_path, f"{td}/p", "-png"],
34
+ check=True,
35
+ )
36
+ pages = sorted(Path(td).glob("p-*.png"))
37
+ all_text = []
38
+ for p in pages:
39
+ r = subprocess.run(
40
+ ["tesseract", str(p), "-", "-l", "chi_sim"],
41
+ check=True,
42
+ capture_output=True,
43
+ text=True,
44
+ )
45
+ all_text.append(r.stdout)
46
+ return "\n".join(all_text)
47
+
48
+
49
+ # Two-number rows: <score in [200, 750]> ... <count in [1, 999999]>
50
+ ROW_RE = re.compile(r"(?<!\d)(\d{3})\s+(\d{1,6})(?!\d)")
51
+
52
+
53
+ def parse_rows(text: str) -> list[dict]:
54
+ seen = {}
55
+ for line in text.splitlines():
56
+ for m in ROW_RE.finditer(line):
57
+ score = int(m.group(1))
58
+ count = int(m.group(2))
59
+ if 200 <= score <= 750 and 1 <= count <= 9_999_999:
60
+ # Prefer the LARGER count for duplicates — usually the true row,
61
+ # since OCR sometimes returns small partial numbers.
62
+ if score not in seen or count > seen[score]:
63
+ seen[score] = count
64
+ rows = sorted(
65
+ ({"score": s, "cumulative": c} for s, c in seen.items()),
66
+ key=lambda r: -r["score"],
67
+ )
68
+ # Enforce monotonic: cumulative must be non-decreasing as score decreases
69
+ # (i.e. as we walk down the sorted list, cumulative should grow). Drop
70
+ # rows that violate monotonicity (these are usually OCR misreads).
71
+ clean = []
72
+ last = 0
73
+ for r in rows:
74
+ if r["cumulative"] >= last:
75
+ clean.append(r)
76
+ last = r["cumulative"]
77
+ return clean
78
+
79
+
80
+ def main():
81
+ if len(sys.argv) != 5:
82
+ print("usage: extract-pdf.py <pdf-path-or-url> <province-pinyin> <year> <track>", file=sys.stderr)
83
+ sys.exit(1)
84
+ pdf_arg, province, year, track = sys.argv[1:]
85
+ if pdf_arg.startswith("http"):
86
+ # download
87
+ with tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) as tf:
88
+ subprocess.run(["curl", "-sSL", "-o", tf.name, pdf_arg, "-H", "User-Agent: Mozilla/5.0"], check=True)
89
+ pdf_path = tf.name
90
+ else:
91
+ pdf_path = pdf_arg
92
+
93
+ text = ocr_pdf(pdf_path)
94
+ rows = parse_rows(text)
95
+
96
+ province_name = {
97
+ "henan": "河南", "shandong": "山东", "guangdong": "广东", "jiangsu": "江苏",
98
+ "hebei": "河北", "sichuan": "四川", "anhui": "安徽", "hubei": "湖北",
99
+ "hunan": "湖南", "fujian": "福建", "jiangxi": "江西", "zhejiang": "浙江",
100
+ "shanghai": "上海", "beijing": "北京", "tianjin": "天津", "chongqing": "重庆",
101
+ }.get(province, province)
102
+
103
+ out = {
104
+ "province": province,
105
+ "province_name": province_name,
106
+ "year": int(year),
107
+ "track": track,
108
+ "source": pdf_arg if pdf_arg.startswith("http") else "local PDF",
109
+ "extraction": "pdftoppm + tesseract -l chi_sim",
110
+ "count": len(rows),
111
+ "rows": [{"score": r["score"], "count": 0, "cumulative": r["cumulative"]} for r in rows],
112
+ }
113
+ print(json.dumps(out, ensure_ascii=False, separators=(",", ":")))
114
+
115
+
116
+ if __name__ == "__main__":
117
+ main()
@@ -0,0 +1 @@
1
+ {"province":"beijing","province_name":"北京","year":2023,"track":"combined","source":"北京教育考试院 (bjeea.cn)","note":"统计中的分数含全国性照顾加分","count":297,"rows":[{"score":696,"count":104,"cumulative":104},{"score":695,"count":11,"cumulative":115},{"score":694,"count":12,"cumulative":127},{"score":693,"count":17,"cumulative":144},{"score":692,"count":24,"cumulative":168},{"score":691,"count":24,"cumulative":192},{"score":690,"count":29,"cumulative":221},{"score":689,"count":30,"cumulative":251},{"score":688,"count":33,"cumulative":284},{"score":687,"count":29,"cumulative":313},{"score":686,"count":23,"cumulative":336},{"score":685,"count":32,"cumulative":368},{"score":684,"count":34,"cumulative":402},{"score":683,"count":40,"cumulative":442},{"score":682,"count":40,"cumulative":482},{"score":681,"count":32,"cumulative":514},{"score":680,"count":40,"cumulative":554},{"score":679,"count":52,"cumulative":606},{"score":678,"count":44,"cumulative":650},{"score":677,"count":44,"cumulative":694},{"score":676,"count":37,"cumulative":731},{"score":675,"count":60,"cumulative":791},{"score":674,"count":47,"cumulative":838},{"score":673,"count":56,"cumulative":894},{"score":672,"count":46,"cumulative":940},{"score":671,"count":69,"cumulative":1009},{"score":670,"count":57,"cumulative":1066},{"score":669,"count":61,"cumulative":1127},{"score":668,"count":65,"cumulative":1192},{"score":667,"count":72,"cumulative":1264},{"score":666,"count":73,"cumulative":1337},{"score":665,"count":82,"cumulative":1419},{"score":664,"count":66,"cumulative":1485},{"score":663,"count":96,"cumulative":1581},{"score":662,"count":81,"cumulative":1662},{"score":661,"count":82,"cumulative":1744},{"score":660,"count":92,"cumulative":1836},{"score":659,"count":65,"cumulative":1901},{"score":658,"count":78,"cumulative":1979},{"score":657,"count":104,"cumulative":2083},{"score":656,"count":97,"cumulative":2180},{"score":655,"count":89,"cumulative":2269},{"score":654,"count":100,"cumulative":2369},{"score":653,"count":88,"cumulative":2457},{"score":652,"count":87,"cumulative":2544},{"score":651,"count":104,"cumulative":2648},{"score":650,"count":106,"cumulative":2754},{"score":649,"count":120,"cumulative":2874},{"score":648,"count":116,"cumulative":2990},{"score":647,"count":106,"cumulative":3096},{"score":646,"count":128,"cumulative":3224},{"score":645,"count":123,"cumulative":3347},{"score":644,"count":108,"cumulative":3455},{"score":643,"count":108,"cumulative":3563},{"score":642,"count":134,"cumulative":3697},{"score":641,"count":119,"cumulative":3816},{"score":640,"count":109,"cumulative":3925},{"score":639,"count":145,"cumulative":4070},{"score":638,"count":122,"cumulative":4192},{"score":637,"count":133,"cumulative":4325},{"score":636,"count":133,"cumulative":4458},{"score":635,"count":146,"cumulative":4604},{"score":634,"count":125,"cumulative":4729},{"score":633,"count":152,"cumulative":4881},{"score":632,"count":148,"cumulative":5029},{"score":631,"count":132,"cumulative":5161},{"score":630,"count":147,"cumulative":5308},{"score":629,"count":149,"cumulative":5457},{"score":628,"count":139,"cumulative":5596},{"score":627,"count":159,"cumulative":5755},{"score":626,"count":140,"cumulative":5895},{"score":625,"count":150,"cumulative":6045},{"score":624,"count":157,"cumulative":6202},{"score":623,"count":173,"cumulative":6375},{"score":622,"count":153,"cumulative":6528},{"score":621,"count":163,"cumulative":6691},{"score":620,"count":170,"cumulative":6861},{"score":619,"count":176,"cumulative":7037},{"score":618,"count":165,"cumulative":7202},{"score":617,"count":159,"cumulative":7361},{"score":616,"count":181,"cumulative":7542},{"score":615,"count":158,"cumulative":7700},{"score":614,"count":162,"cumulative":7862},{"score":613,"count":137,"cumulative":7999},{"score":612,"count":148,"cumulative":8147},{"score":611,"count":182,"cumulative":8329},{"score":610,"count":193,"cumulative":8522},{"score":609,"count":170,"cumulative":8692},{"score":608,"count":168,"cumulative":8860},{"score":607,"count":172,"cumulative":9032},{"score":606,"count":165,"cumulative":9197},{"score":605,"count":170,"cumulative":9367},{"score":604,"count":207,"cumulative":9574},{"score":603,"count":191,"cumulative":9765},{"score":602,"count":234,"cumulative":9999},{"score":601,"count":169,"cumulative":10168},{"score":600,"count":180,"cumulative":10348},{"score":599,"count":160,"cumulative":10508},{"score":598,"count":191,"cumulative":10699},{"score":597,"count":160,"cumulative":10859},{"score":596,"count":212,"cumulative":11071},{"score":595,"count":204,"cumulative":11275},{"score":594,"count":201,"cumulative":11476},{"score":593,"count":182,"cumulative":11658},{"score":592,"count":200,"cumulative":11858},{"score":591,"count":189,"cumulative":12047},{"score":590,"count":200,"cumulative":12247},{"score":589,"count":193,"cumulative":12440},{"score":588,"count":178,"cumulative":12618},{"score":587,"count":174,"cumulative":12792},{"score":586,"count":215,"cumulative":13007},{"score":585,"count":198,"cumulative":13205},{"score":584,"count":192,"cumulative":13397},{"score":583,"count":214,"cumulative":13611},{"score":582,"count":187,"cumulative":13798},{"score":581,"count":198,"cumulative":13996},{"score":580,"count":190,"cumulative":14186},{"score":579,"count":189,"cumulative":14375},{"score":578,"count":173,"cumulative":14548},{"score":577,"count":221,"cumulative":14769},{"score":576,"count":191,"cumulative":14960},{"score":575,"count":209,"cumulative":15169},{"score":574,"count":220,"cumulative":15389},{"score":573,"count":205,"cumulative":15594},{"score":572,"count":181,"cumulative":15775},{"score":571,"count":208,"cumulative":15983},{"score":570,"count":212,"cumulative":16195},{"score":569,"count":222,"cumulative":16417},{"score":568,"count":183,"cumulative":16600},{"score":567,"count":216,"cumulative":16816},{"score":566,"count":214,"cumulative":17030},{"score":565,"count":194,"cumulative":17224},{"score":564,"count":193,"cumulative":17417},{"score":563,"count":200,"cumulative":17617},{"score":562,"count":202,"cumulative":17819},{"score":561,"count":207,"cumulative":18026},{"score":560,"count":209,"cumulative":18235},{"score":559,"count":225,"cumulative":18460},{"score":558,"count":213,"cumulative":18673},{"score":557,"count":209,"cumulative":18882},{"score":556,"count":210,"cumulative":19092},{"score":555,"count":228,"cumulative":19320},{"score":554,"count":210,"cumulative":19530},{"score":553,"count":220,"cumulative":19750},{"score":552,"count":244,"cumulative":19994},{"score":551,"count":198,"cumulative":20192},{"score":550,"count":195,"cumulative":20387},{"score":549,"count":210,"cumulative":20597},{"score":548,"count":193,"cumulative":20790},{"score":547,"count":230,"cumulative":21020},{"score":546,"count":219,"cumulative":21239},{"score":545,"count":228,"cumulative":21467},{"score":544,"count":193,"cumulative":21660},{"score":543,"count":250,"cumulative":21910},{"score":542,"count":238,"cumulative":22148},{"score":541,"count":195,"cumulative":22343},{"score":540,"count":217,"cumulative":22560},{"score":539,"count":244,"cumulative":22804},{"score":538,"count":204,"cumulative":23008},{"score":537,"count":234,"cumulative":23242},{"score":536,"count":226,"cumulative":23468},{"score":535,"count":258,"cumulative":23726},{"score":534,"count":228,"cumulative":23954},{"score":533,"count":228,"cumulative":24182},{"score":532,"count":223,"cumulative":24405},{"score":531,"count":224,"cumulative":24629},{"score":530,"count":223,"cumulative":24852},{"score":529,"count":232,"cumulative":25084},{"score":528,"count":229,"cumulative":25313},{"score":527,"count":238,"cumulative":25551},{"score":526,"count":225,"cumulative":25776},{"score":525,"count":227,"cumulative":26003},{"score":524,"count":246,"cumulative":26249},{"score":523,"count":217,"cumulative":26466},{"score":522,"count":258,"cumulative":26724},{"score":521,"count":215,"cumulative":26939},{"score":520,"count":237,"cumulative":27176},{"score":519,"count":226,"cumulative":27402},{"score":518,"count":247,"cumulative":27649},{"score":517,"count":228,"cumulative":27877},{"score":516,"count":258,"cumulative":28135},{"score":515,"count":214,"cumulative":28349},{"score":514,"count":213,"cumulative":28562},{"score":513,"count":227,"cumulative":28789},{"score":512,"count":209,"cumulative":28998},{"score":511,"count":231,"cumulative":29229},{"score":510,"count":248,"cumulative":29477},{"score":509,"count":216,"cumulative":29693},{"score":508,"count":253,"cumulative":29946},{"score":507,"count":259,"cumulative":30205},{"score":506,"count":256,"cumulative":30461},{"score":505,"count":224,"cumulative":30685},{"score":504,"count":218,"cumulative":30903},{"score":503,"count":257,"cumulative":31160},{"score":502,"count":218,"cumulative":31378},{"score":501,"count":223,"cumulative":31601},{"score":500,"count":230,"cumulative":31831},{"score":499,"count":207,"cumulative":32038},{"score":498,"count":226,"cumulative":32264},{"score":497,"count":243,"cumulative":32507},{"score":496,"count":246,"cumulative":32753},{"score":495,"count":200,"cumulative":32953},{"score":494,"count":241,"cumulative":33194},{"score":493,"count":225,"cumulative":33419},{"score":492,"count":227,"cumulative":33646},{"score":491,"count":242,"cumulative":33888},{"score":490,"count":215,"cumulative":34103},{"score":489,"count":200,"cumulative":34303},{"score":488,"count":235,"cumulative":34538},{"score":487,"count":211,"cumulative":34749},{"score":486,"count":216,"cumulative":34965},{"score":485,"count":216,"cumulative":35181},{"score":484,"count":238,"cumulative":35419},{"score":483,"count":202,"cumulative":35621},{"score":482,"count":222,"cumulative":35843},{"score":481,"count":180,"cumulative":36023},{"score":480,"count":204,"cumulative":36227},{"score":479,"count":214,"cumulative":36441},{"score":478,"count":226,"cumulative":36667},{"score":477,"count":222,"cumulative":36889},{"score":476,"count":220,"cumulative":37109},{"score":475,"count":182,"cumulative":37291},{"score":474,"count":204,"cumulative":37495},{"score":473,"count":225,"cumulative":37720},{"score":472,"count":192,"cumulative":37912},{"score":471,"count":210,"cumulative":38122},{"score":470,"count":189,"cumulative":38311},{"score":469,"count":179,"cumulative":38490},{"score":468,"count":205,"cumulative":38695},{"score":467,"count":181,"cumulative":38876},{"score":466,"count":199,"cumulative":39075},{"score":465,"count":183,"cumulative":39258},{"score":464,"count":177,"cumulative":39435},{"score":463,"count":195,"cumulative":39630},{"score":462,"count":200,"cumulative":39830},{"score":461,"count":203,"cumulative":40033},{"score":460,"count":173,"cumulative":40206},{"score":459,"count":190,"cumulative":40396},{"score":458,"count":181,"cumulative":40577},{"score":457,"count":185,"cumulative":40762},{"score":456,"count":166,"cumulative":40928},{"score":455,"count":171,"cumulative":41099},{"score":454,"count":172,"cumulative":41271},{"score":453,"count":179,"cumulative":41450},{"score":452,"count":174,"cumulative":41624},{"score":451,"count":189,"cumulative":41813},{"score":450,"count":168,"cumulative":41981},{"score":449,"count":208,"cumulative":42189},{"score":448,"count":158,"cumulative":42347},{"score":447,"count":178,"cumulative":42525},{"score":446,"count":159,"cumulative":42684},{"score":445,"count":194,"cumulative":42878},{"score":444,"count":153,"cumulative":43031},{"score":443,"count":195,"cumulative":43226},{"score":442,"count":162,"cumulative":43388},{"score":441,"count":140,"cumulative":43528},{"score":440,"count":163,"cumulative":43691},{"score":439,"count":186,"cumulative":43877},{"score":438,"count":153,"cumulative":44030},{"score":437,"count":162,"cumulative":44192},{"score":436,"count":158,"cumulative":44350},{"score":435,"count":136,"cumulative":44486},{"score":434,"count":172,"cumulative":44658},{"score":433,"count":164,"cumulative":44822},{"score":432,"count":148,"cumulative":44970},{"score":431,"count":144,"cumulative":45114},{"score":430,"count":147,"cumulative":45261},{"score":429,"count":147,"cumulative":45408},{"score":428,"count":148,"cumulative":45556},{"score":427,"count":135,"cumulative":45691},{"score":426,"count":128,"cumulative":45819},{"score":425,"count":142,"cumulative":45961},{"score":424,"count":148,"cumulative":46109},{"score":423,"count":150,"cumulative":46259},{"score":422,"count":149,"cumulative":46408},{"score":421,"count":133,"cumulative":46541},{"score":420,"count":137,"cumulative":46678},{"score":419,"count":129,"cumulative":46807},{"score":418,"count":118,"cumulative":46925},{"score":417,"count":143,"cumulative":47068},{"score":416,"count":124,"cumulative":47192},{"score":415,"count":121,"cumulative":47313},{"score":414,"count":107,"cumulative":47420},{"score":413,"count":120,"cumulative":47540},{"score":412,"count":100,"cumulative":47640},{"score":411,"count":114,"cumulative":47754},{"score":410,"count":117,"cumulative":47871},{"score":409,"count":102,"cumulative":47973},{"score":408,"count":114,"cumulative":48087},{"score":407,"count":124,"cumulative":48211},{"score":406,"count":135,"cumulative":48346},{"score":405,"count":111,"cumulative":48457},{"score":404,"count":105,"cumulative":48562},{"score":403,"count":128,"cumulative":48690},{"score":402,"count":107,"cumulative":48797},{"score":401,"count":97,"cumulative":48894},{"score":400,"count":116,"cumulative":49010}]}
@@ -0,0 +1 @@
1
+ {"province":"beijing","province_name":"北京","year":2024,"track":"combined","source":"北京教育考试院 (bjeea.cn)","note":"统计中的分数含全国性照顾加分","count":301,"rows":[{"score":700,"count":117,"cumulative":117},{"score":699,"count":15,"cumulative":132},{"score":698,"count":16,"cumulative":148},{"score":697,"count":17,"cumulative":165},{"score":696,"count":18,"cumulative":183},{"score":695,"count":19,"cumulative":202},{"score":694,"count":23,"cumulative":225},{"score":693,"count":26,"cumulative":251},{"score":692,"count":27,"cumulative":278},{"score":691,"count":49,"cumulative":327},{"score":690,"count":27,"cumulative":354},{"score":689,"count":30,"cumulative":384},{"score":688,"count":39,"cumulative":423},{"score":687,"count":25,"cumulative":448},{"score":686,"count":30,"cumulative":478},{"score":685,"count":44,"cumulative":522},{"score":684,"count":47,"cumulative":569},{"score":683,"count":56,"cumulative":625},{"score":682,"count":46,"cumulative":671},{"score":681,"count":51,"cumulative":722},{"score":680,"count":42,"cumulative":764},{"score":679,"count":49,"cumulative":813},{"score":678,"count":59,"cumulative":872},{"score":677,"count":60,"cumulative":932},{"score":676,"count":64,"cumulative":996},{"score":675,"count":81,"cumulative":1077},{"score":674,"count":61,"cumulative":1138},{"score":673,"count":66,"cumulative":1204},{"score":672,"count":57,"cumulative":1261},{"score":671,"count":82,"cumulative":1343},{"score":670,"count":77,"cumulative":1420},{"score":669,"count":58,"cumulative":1478},{"score":668,"count":79,"cumulative":1557},{"score":667,"count":60,"cumulative":1617},{"score":666,"count":87,"cumulative":1704},{"score":665,"count":72,"cumulative":1776},{"score":664,"count":84,"cumulative":1860},{"score":663,"count":89,"cumulative":1949},{"score":662,"count":87,"cumulative":2036},{"score":661,"count":82,"cumulative":2118},{"score":660,"count":105,"cumulative":2223},{"score":659,"count":79,"cumulative":2302},{"score":658,"count":93,"cumulative":2395},{"score":657,"count":96,"cumulative":2491},{"score":656,"count":101,"cumulative":2592},{"score":655,"count":95,"cumulative":2687},{"score":654,"count":89,"cumulative":2776},{"score":653,"count":100,"cumulative":2876},{"score":652,"count":100,"cumulative":2976},{"score":651,"count":89,"cumulative":3065},{"score":650,"count":111,"cumulative":3176},{"score":649,"count":91,"cumulative":3267},{"score":648,"count":115,"cumulative":3382},{"score":647,"count":122,"cumulative":3504},{"score":646,"count":107,"cumulative":3611},{"score":645,"count":115,"cumulative":3726},{"score":644,"count":118,"cumulative":3844},{"score":643,"count":136,"cumulative":3980},{"score":642,"count":128,"cumulative":4108},{"score":641,"count":131,"cumulative":4239},{"score":640,"count":126,"cumulative":4365},{"score":639,"count":113,"cumulative":4478},{"score":638,"count":155,"cumulative":4633},{"score":637,"count":156,"cumulative":4789},{"score":636,"count":140,"cumulative":4929},{"score":635,"count":126,"cumulative":5055},{"score":634,"count":121,"cumulative":5176},{"score":633,"count":131,"cumulative":5307},{"score":632,"count":160,"cumulative":5467},{"score":631,"count":156,"cumulative":5623},{"score":630,"count":160,"cumulative":5783},{"score":629,"count":142,"cumulative":5925},{"score":628,"count":160,"cumulative":6085},{"score":627,"count":130,"cumulative":6215},{"score":626,"count":165,"cumulative":6380},{"score":625,"count":166,"cumulative":6546},{"score":624,"count":147,"cumulative":6693},{"score":623,"count":155,"cumulative":6848},{"score":622,"count":153,"cumulative":7001},{"score":621,"count":171,"cumulative":7172},{"score":620,"count":170,"cumulative":7342},{"score":619,"count":149,"cumulative":7491},{"score":618,"count":160,"cumulative":7651},{"score":617,"count":156,"cumulative":7807},{"score":616,"count":173,"cumulative":7980},{"score":615,"count":172,"cumulative":8152},{"score":614,"count":142,"cumulative":8294},{"score":613,"count":178,"cumulative":8472},{"score":612,"count":188,"cumulative":8660},{"score":611,"count":182,"cumulative":8842},{"score":610,"count":180,"cumulative":9022},{"score":609,"count":157,"cumulative":9179},{"score":608,"count":154,"cumulative":9333},{"score":607,"count":166,"cumulative":9499},{"score":606,"count":179,"cumulative":9678},{"score":605,"count":172,"cumulative":9850},{"score":604,"count":191,"cumulative":10041},{"score":603,"count":172,"cumulative":10213},{"score":602,"count":170,"cumulative":10383},{"score":601,"count":202,"cumulative":10585},{"score":600,"count":202,"cumulative":10787},{"score":599,"count":193,"cumulative":10980},{"score":598,"count":177,"cumulative":11157},{"score":597,"count":191,"cumulative":11348},{"score":596,"count":200,"cumulative":11548},{"score":595,"count":177,"cumulative":11725},{"score":594,"count":182,"cumulative":11907},{"score":593,"count":188,"cumulative":12095},{"score":592,"count":168,"cumulative":12263},{"score":591,"count":170,"cumulative":12433},{"score":590,"count":181,"cumulative":12614},{"score":589,"count":180,"cumulative":12794},{"score":588,"count":186,"cumulative":12980},{"score":587,"count":214,"cumulative":13194},{"score":586,"count":213,"cumulative":13407},{"score":585,"count":203,"cumulative":13610},{"score":584,"count":187,"cumulative":13797},{"score":583,"count":206,"cumulative":14003},{"score":582,"count":195,"cumulative":14198},{"score":581,"count":204,"cumulative":14402},{"score":580,"count":194,"cumulative":14596},{"score":579,"count":216,"cumulative":14812},{"score":578,"count":221,"cumulative":15033},{"score":577,"count":191,"cumulative":15224},{"score":576,"count":204,"cumulative":15428},{"score":575,"count":210,"cumulative":15638},{"score":574,"count":221,"cumulative":15859},{"score":573,"count":210,"cumulative":16069},{"score":572,"count":198,"cumulative":16267},{"score":571,"count":214,"cumulative":16481},{"score":570,"count":177,"cumulative":16658},{"score":569,"count":205,"cumulative":16863},{"score":568,"count":238,"cumulative":17101},{"score":567,"count":198,"cumulative":17299},{"score":566,"count":210,"cumulative":17509},{"score":565,"count":219,"cumulative":17728},{"score":564,"count":230,"cumulative":17958},{"score":563,"count":217,"cumulative":18175},{"score":562,"count":220,"cumulative":18395},{"score":561,"count":171,"cumulative":18566},{"score":560,"count":226,"cumulative":18792},{"score":559,"count":191,"cumulative":18983},{"score":558,"count":212,"cumulative":19195},{"score":557,"count":227,"cumulative":19422},{"score":556,"count":237,"cumulative":19659},{"score":555,"count":208,"cumulative":19867},{"score":554,"count":219,"cumulative":20086},{"score":553,"count":225,"cumulative":20311},{"score":552,"count":213,"cumulative":20524},{"score":551,"count":225,"cumulative":20749},{"score":550,"count":241,"cumulative":20990},{"score":549,"count":208,"cumulative":21198},{"score":548,"count":235,"cumulative":21433},{"score":547,"count":226,"cumulative":21659},{"score":546,"count":222,"cumulative":21881},{"score":545,"count":193,"cumulative":22074},{"score":544,"count":204,"cumulative":22278},{"score":543,"count":198,"cumulative":22476},{"score":542,"count":219,"cumulative":22695},{"score":541,"count":220,"cumulative":22915},{"score":540,"count":207,"cumulative":23122},{"score":539,"count":243,"cumulative":23365},{"score":538,"count":242,"cumulative":23607},{"score":537,"count":217,"cumulative":23824},{"score":536,"count":228,"cumulative":24052},{"score":535,"count":224,"cumulative":24276},{"score":534,"count":217,"cumulative":24493},{"score":533,"count":253,"cumulative":24746},{"score":532,"count":230,"cumulative":24976},{"score":531,"count":226,"cumulative":25202},{"score":530,"count":212,"cumulative":25414},{"score":529,"count":216,"cumulative":25630},{"score":528,"count":212,"cumulative":25842},{"score":527,"count":223,"cumulative":26065},{"score":526,"count":220,"cumulative":26285},{"score":525,"count":261,"cumulative":26546},{"score":524,"count":226,"cumulative":26772},{"score":523,"count":224,"cumulative":26996},{"score":522,"count":238,"cumulative":27234},{"score":521,"count":259,"cumulative":27493},{"score":520,"count":235,"cumulative":27728},{"score":519,"count":213,"cumulative":27941},{"score":518,"count":226,"cumulative":28167},{"score":517,"count":250,"cumulative":28417},{"score":516,"count":205,"cumulative":28622},{"score":515,"count":228,"cumulative":28850},{"score":514,"count":233,"cumulative":29083},{"score":513,"count":234,"cumulative":29317},{"score":512,"count":233,"cumulative":29550},{"score":511,"count":221,"cumulative":29771},{"score":510,"count":213,"cumulative":29984},{"score":509,"count":193,"cumulative":30177},{"score":508,"count":227,"cumulative":30404},{"score":507,"count":248,"cumulative":30652},{"score":506,"count":224,"cumulative":30876},{"score":505,"count":245,"cumulative":31121},{"score":504,"count":247,"cumulative":31368},{"score":503,"count":206,"cumulative":31574},{"score":502,"count":220,"cumulative":31794},{"score":501,"count":217,"cumulative":32011},{"score":500,"count":197,"cumulative":32208},{"score":499,"count":235,"cumulative":32443},{"score":498,"count":224,"cumulative":32667},{"score":497,"count":240,"cumulative":32907},{"score":496,"count":220,"cumulative":33127},{"score":495,"count":227,"cumulative":33354},{"score":494,"count":218,"cumulative":33572},{"score":493,"count":220,"cumulative":33792},{"score":492,"count":215,"cumulative":34007},{"score":491,"count":229,"cumulative":34236},{"score":490,"count":226,"cumulative":34462},{"score":489,"count":209,"cumulative":34671},{"score":488,"count":225,"cumulative":34896},{"score":487,"count":232,"cumulative":35128},{"score":486,"count":210,"cumulative":35338},{"score":485,"count":211,"cumulative":35549},{"score":484,"count":207,"cumulative":35756},{"score":483,"count":175,"cumulative":35931},{"score":482,"count":227,"cumulative":36158},{"score":481,"count":210,"cumulative":36368},{"score":480,"count":194,"cumulative":36562},{"score":479,"count":231,"cumulative":36793},{"score":478,"count":204,"cumulative":36997},{"score":477,"count":197,"cumulative":37194},{"score":476,"count":213,"cumulative":37407},{"score":475,"count":185,"cumulative":37592},{"score":474,"count":215,"cumulative":37807},{"score":473,"count":217,"cumulative":38024},{"score":472,"count":208,"cumulative":38232},{"score":471,"count":213,"cumulative":38445},{"score":470,"count":190,"cumulative":38635},{"score":469,"count":156,"cumulative":38791},{"score":468,"count":206,"cumulative":38997},{"score":467,"count":206,"cumulative":39203},{"score":466,"count":187,"cumulative":39390},{"score":465,"count":200,"cumulative":39590},{"score":464,"count":184,"cumulative":39774},{"score":463,"count":197,"cumulative":39971},{"score":462,"count":179,"cumulative":40150},{"score":461,"count":168,"cumulative":40318},{"score":460,"count":195,"cumulative":40513},{"score":459,"count":203,"cumulative":40716},{"score":458,"count":174,"cumulative":40890},{"score":457,"count":182,"cumulative":41072},{"score":456,"count":183,"cumulative":41255},{"score":455,"count":173,"cumulative":41428},{"score":454,"count":176,"cumulative":41604},{"score":453,"count":200,"cumulative":41804},{"score":452,"count":167,"cumulative":41971},{"score":451,"count":174,"cumulative":42145},{"score":450,"count":169,"cumulative":42314},{"score":449,"count":166,"cumulative":42480},{"score":448,"count":198,"cumulative":42678},{"score":447,"count":168,"cumulative":42846},{"score":446,"count":176,"cumulative":43022},{"score":445,"count":161,"cumulative":43183},{"score":444,"count":186,"cumulative":43369},{"score":443,"count":161,"cumulative":43530},{"score":442,"count":155,"cumulative":43685},{"score":441,"count":168,"cumulative":43853},{"score":440,"count":167,"cumulative":44020},{"score":439,"count":157,"cumulative":44177},{"score":438,"count":170,"cumulative":44347},{"score":437,"count":156,"cumulative":44503},{"score":436,"count":149,"cumulative":44652},{"score":435,"count":137,"cumulative":44789},{"score":434,"count":134,"cumulative":44923},{"score":433,"count":130,"cumulative":45053},{"score":432,"count":161,"cumulative":45214},{"score":431,"count":140,"cumulative":45354},{"score":430,"count":167,"cumulative":45521},{"score":429,"count":149,"cumulative":45670},{"score":428,"count":145,"cumulative":45815},{"score":427,"count":165,"cumulative":45980},{"score":426,"count":132,"cumulative":46112},{"score":425,"count":147,"cumulative":46259},{"score":424,"count":154,"cumulative":46413},{"score":423,"count":140,"cumulative":46553},{"score":422,"count":123,"cumulative":46676},{"score":421,"count":115,"cumulative":46791},{"score":420,"count":130,"cumulative":46921},{"score":419,"count":127,"cumulative":47048},{"score":418,"count":129,"cumulative":47177},{"score":417,"count":128,"cumulative":47305},{"score":416,"count":113,"cumulative":47418},{"score":415,"count":115,"cumulative":47533},{"score":414,"count":112,"cumulative":47645},{"score":413,"count":116,"cumulative":47761},{"score":412,"count":110,"cumulative":47871},{"score":411,"count":122,"cumulative":47993},{"score":410,"count":98,"cumulative":48091},{"score":409,"count":113,"cumulative":48204},{"score":408,"count":122,"cumulative":48326},{"score":407,"count":118,"cumulative":48444},{"score":406,"count":120,"cumulative":48564},{"score":405,"count":124,"cumulative":48688},{"score":404,"count":112,"cumulative":48800},{"score":403,"count":92,"cumulative":48892},{"score":402,"count":104,"cumulative":48996},{"score":401,"count":127,"cumulative":49123},{"score":400,"count":107,"cumulative":49230}]}
@@ -0,0 +1 @@
1
+ {"province":"beijing","province_name":"北京","year":2025,"track":"combined","source":"北京教育考试院 (bjeea.cn)","note":"统计中的分数含全国性照顾加分","count":319,"rows":[{"score":698,"count":113,"cumulative":113},{"score":697,"count":23,"cumulative":136},{"score":696,"count":12,"cumulative":148},{"score":695,"count":21,"cumulative":169},{"score":694,"count":17,"cumulative":186},{"score":693,"count":15,"cumulative":201},{"score":692,"count":27,"cumulative":228},{"score":691,"count":28,"cumulative":256},{"score":690,"count":21,"cumulative":277},{"score":689,"count":26,"cumulative":303},{"score":688,"count":37,"cumulative":340},{"score":687,"count":45,"cumulative":385},{"score":686,"count":34,"cumulative":419},{"score":685,"count":42,"cumulative":461},{"score":684,"count":42,"cumulative":503},{"score":683,"count":48,"cumulative":551},{"score":682,"count":38,"cumulative":589},{"score":681,"count":50,"cumulative":639},{"score":680,"count":46,"cumulative":685},{"score":679,"count":57,"cumulative":742},{"score":678,"count":65,"cumulative":807},{"score":677,"count":54,"cumulative":861},{"score":676,"count":50,"cumulative":911},{"score":675,"count":63,"cumulative":974},{"score":674,"count":55,"cumulative":1029},{"score":673,"count":59,"cumulative":1088},{"score":672,"count":69,"cumulative":1157},{"score":671,"count":87,"cumulative":1244},{"score":670,"count":84,"cumulative":1328},{"score":669,"count":67,"cumulative":1395},{"score":668,"count":79,"cumulative":1474},{"score":667,"count":78,"cumulative":1552},{"score":666,"count":78,"cumulative":1630},{"score":665,"count":102,"cumulative":1732},{"score":664,"count":68,"cumulative":1800},{"score":663,"count":82,"cumulative":1882},{"score":662,"count":79,"cumulative":1961},{"score":661,"count":98,"cumulative":2059},{"score":660,"count":94,"cumulative":2153},{"score":659,"count":93,"cumulative":2246},{"score":658,"count":85,"cumulative":2331},{"score":657,"count":114,"cumulative":2445},{"score":656,"count":95,"cumulative":2540},{"score":655,"count":112,"cumulative":2652},{"score":654,"count":115,"cumulative":2767},{"score":653,"count":122,"cumulative":2889},{"score":652,"count":110,"cumulative":2999},{"score":651,"count":102,"cumulative":3101},{"score":650,"count":102,"cumulative":3203},{"score":649,"count":129,"cumulative":3332},{"score":648,"count":129,"cumulative":3461},{"score":647,"count":129,"cumulative":3590},{"score":646,"count":122,"cumulative":3712},{"score":645,"count":129,"cumulative":3841},{"score":644,"count":135,"cumulative":3976},{"score":643,"count":126,"cumulative":4102},{"score":642,"count":143,"cumulative":4245},{"score":641,"count":123,"cumulative":4368},{"score":640,"count":149,"cumulative":4517},{"score":639,"count":157,"cumulative":4674},{"score":638,"count":160,"cumulative":4834},{"score":637,"count":155,"cumulative":4989},{"score":636,"count":150,"cumulative":5139},{"score":635,"count":165,"cumulative":5304},{"score":634,"count":137,"cumulative":5441},{"score":633,"count":156,"cumulative":5597},{"score":632,"count":152,"cumulative":5749},{"score":631,"count":170,"cumulative":5919},{"score":630,"count":168,"cumulative":6087},{"score":629,"count":164,"cumulative":6251},{"score":628,"count":148,"cumulative":6399},{"score":627,"count":162,"cumulative":6561},{"score":626,"count":179,"cumulative":6740},{"score":625,"count":156,"cumulative":6896},{"score":624,"count":168,"cumulative":7064},{"score":623,"count":185,"cumulative":7249},{"score":622,"count":191,"cumulative":7440},{"score":621,"count":173,"cumulative":7613},{"score":620,"count":191,"cumulative":7804},{"score":619,"count":179,"cumulative":7983},{"score":618,"count":175,"cumulative":8158},{"score":617,"count":167,"cumulative":8325},{"score":616,"count":201,"cumulative":8526},{"score":615,"count":195,"cumulative":8721},{"score":614,"count":202,"cumulative":8923},{"score":613,"count":211,"cumulative":9134},{"score":612,"count":193,"cumulative":9327},{"score":611,"count":196,"cumulative":9523},{"score":610,"count":191,"cumulative":9714},{"score":609,"count":200,"cumulative":9914},{"score":608,"count":197,"cumulative":10111},{"score":607,"count":221,"cumulative":10332},{"score":606,"count":206,"cumulative":10538},{"score":605,"count":215,"cumulative":10753},{"score":604,"count":226,"cumulative":10979},{"score":603,"count":216,"cumulative":11195},{"score":602,"count":231,"cumulative":11426},{"score":601,"count":233,"cumulative":11659},{"score":600,"count":224,"cumulative":11883},{"score":599,"count":220,"cumulative":12103},{"score":598,"count":215,"cumulative":12318},{"score":597,"count":237,"cumulative":12555},{"score":596,"count":222,"cumulative":12777},{"score":595,"count":238,"cumulative":13015},{"score":594,"count":205,"cumulative":13220},{"score":593,"count":216,"cumulative":13436},{"score":592,"count":214,"cumulative":13650},{"score":591,"count":247,"cumulative":13897},{"score":590,"count":205,"cumulative":14102},{"score":589,"count":256,"cumulative":14358},{"score":588,"count":230,"cumulative":14588},{"score":587,"count":222,"cumulative":14810},{"score":586,"count":274,"cumulative":15084},{"score":585,"count":237,"cumulative":15321},{"score":584,"count":226,"cumulative":15547},{"score":583,"count":245,"cumulative":15792},{"score":582,"count":227,"cumulative":16019},{"score":581,"count":218,"cumulative":16237},{"score":580,"count":233,"cumulative":16470},{"score":579,"count":254,"cumulative":16724},{"score":578,"count":280,"cumulative":17004},{"score":577,"count":260,"cumulative":17264},{"score":576,"count":242,"cumulative":17506},{"score":575,"count":248,"cumulative":17754},{"score":574,"count":216,"cumulative":17970},{"score":573,"count":248,"cumulative":18218},{"score":572,"count":247,"cumulative":18465},{"score":571,"count":258,"cumulative":18723},{"score":570,"count":232,"cumulative":18955},{"score":569,"count":266,"cumulative":19221},{"score":568,"count":267,"cumulative":19488},{"score":567,"count":217,"cumulative":19705},{"score":566,"count":244,"cumulative":19949},{"score":565,"count":237,"cumulative":20186},{"score":564,"count":279,"cumulative":20465},{"score":563,"count":237,"cumulative":20702},{"score":562,"count":251,"cumulative":20953},{"score":561,"count":245,"cumulative":21198},{"score":560,"count":225,"cumulative":21423},{"score":559,"count":274,"cumulative":21697},{"score":558,"count":260,"cumulative":21957},{"score":557,"count":260,"cumulative":22217},{"score":556,"count":262,"cumulative":22479},{"score":555,"count":269,"cumulative":22748},{"score":554,"count":254,"cumulative":23002},{"score":553,"count":260,"cumulative":23262},{"score":552,"count":269,"cumulative":23531},{"score":551,"count":265,"cumulative":23796},{"score":550,"count":293,"cumulative":24089},{"score":549,"count":258,"cumulative":24347},{"score":548,"count":264,"cumulative":24611},{"score":547,"count":253,"cumulative":24864},{"score":546,"count":273,"cumulative":25137},{"score":545,"count":273,"cumulative":25410},{"score":544,"count":268,"cumulative":25678},{"score":543,"count":283,"cumulative":25961},{"score":542,"count":283,"cumulative":26244},{"score":541,"count":233,"cumulative":26477},{"score":540,"count":241,"cumulative":26718},{"score":539,"count":271,"cumulative":26989},{"score":538,"count":263,"cumulative":27252},{"score":537,"count":264,"cumulative":27516},{"score":536,"count":280,"cumulative":27796},{"score":535,"count":260,"cumulative":28056},{"score":534,"count":273,"cumulative":28329},{"score":533,"count":266,"cumulative":28595},{"score":532,"count":291,"cumulative":28886},{"score":531,"count":298,"cumulative":29184},{"score":530,"count":291,"cumulative":29475},{"score":529,"count":262,"cumulative":29737},{"score":528,"count":272,"cumulative":30009},{"score":527,"count":273,"cumulative":30282},{"score":526,"count":264,"cumulative":30546},{"score":525,"count":270,"cumulative":30816},{"score":524,"count":310,"cumulative":31126},{"score":523,"count":283,"cumulative":31409},{"score":522,"count":247,"cumulative":31656},{"score":521,"count":244,"cumulative":31900},{"score":520,"count":278,"cumulative":32178},{"score":519,"count":262,"cumulative":32440},{"score":518,"count":235,"cumulative":32675},{"score":517,"count":297,"cumulative":32972},{"score":516,"count":268,"cumulative":33240},{"score":515,"count":234,"cumulative":33474},{"score":514,"count":269,"cumulative":33743},{"score":513,"count":256,"cumulative":33999},{"score":512,"count":273,"cumulative":34272},{"score":511,"count":287,"cumulative":34559},{"score":510,"count":312,"cumulative":34871},{"score":509,"count":265,"cumulative":35136},{"score":508,"count":268,"cumulative":35404},{"score":507,"count":264,"cumulative":35668},{"score":506,"count":285,"cumulative":35953},{"score":505,"count":241,"cumulative":36194},{"score":504,"count":258,"cumulative":36452},{"score":503,"count":264,"cumulative":36716},{"score":502,"count":272,"cumulative":36988},{"score":501,"count":280,"cumulative":37268},{"score":500,"count":285,"cumulative":37553},{"score":499,"count":269,"cumulative":37822},{"score":498,"count":260,"cumulative":38082},{"score":497,"count":270,"cumulative":38352},{"score":496,"count":269,"cumulative":38621},{"score":495,"count":272,"cumulative":38893},{"score":494,"count":251,"cumulative":39144},{"score":493,"count":240,"cumulative":39384},{"score":492,"count":263,"cumulative":39647},{"score":491,"count":265,"cumulative":39912},{"score":490,"count":255,"cumulative":40167},{"score":489,"count":295,"cumulative":40462},{"score":488,"count":278,"cumulative":40740},{"score":487,"count":267,"cumulative":41007},{"score":486,"count":270,"cumulative":41277},{"score":485,"count":284,"cumulative":41561},{"score":484,"count":238,"cumulative":41799},{"score":483,"count":243,"cumulative":42042},{"score":482,"count":251,"cumulative":42293},{"score":481,"count":242,"cumulative":42535},{"score":480,"count":247,"cumulative":42782},{"score":479,"count":283,"cumulative":43065},{"score":478,"count":255,"cumulative":43320},{"score":477,"count":273,"cumulative":43593},{"score":476,"count":259,"cumulative":43852},{"score":475,"count":269,"cumulative":44121},{"score":474,"count":255,"cumulative":44376},{"score":473,"count":230,"cumulative":44606},{"score":472,"count":236,"cumulative":44842},{"score":471,"count":261,"cumulative":45103},{"score":470,"count":235,"cumulative":45338},{"score":469,"count":235,"cumulative":45573},{"score":468,"count":259,"cumulative":45832},{"score":467,"count":239,"cumulative":46071},{"score":466,"count":226,"cumulative":46297},{"score":465,"count":235,"cumulative":46532},{"score":464,"count":234,"cumulative":46766},{"score":463,"count":243,"cumulative":47009},{"score":462,"count":275,"cumulative":47284},{"score":461,"count":220,"cumulative":47504},{"score":460,"count":250,"cumulative":47754},{"score":459,"count":245,"cumulative":47999},{"score":458,"count":220,"cumulative":48219},{"score":457,"count":210,"cumulative":48429},{"score":456,"count":212,"cumulative":48641},{"score":455,"count":207,"cumulative":48848},{"score":454,"count":269,"cumulative":49117},{"score":453,"count":226,"cumulative":49343},{"score":452,"count":215,"cumulative":49558},{"score":451,"count":215,"cumulative":49773},{"score":450,"count":236,"cumulative":50009},{"score":449,"count":220,"cumulative":50229},{"score":448,"count":219,"cumulative":50448},{"score":447,"count":219,"cumulative":50667},{"score":446,"count":225,"cumulative":50892},{"score":445,"count":209,"cumulative":51101},{"score":444,"count":211,"cumulative":51312},{"score":443,"count":198,"cumulative":51510},{"score":442,"count":193,"cumulative":51703},{"score":441,"count":196,"cumulative":51899},{"score":440,"count":173,"cumulative":52072},{"score":439,"count":216,"cumulative":52288},{"score":438,"count":207,"cumulative":52495},{"score":437,"count":218,"cumulative":52713},{"score":436,"count":182,"cumulative":52895},{"score":435,"count":149,"cumulative":53044},{"score":434,"count":216,"cumulative":53260},{"score":433,"count":202,"cumulative":53462},{"score":432,"count":174,"cumulative":53636},{"score":431,"count":161,"cumulative":53797},{"score":430,"count":197,"cumulative":53994},{"score":429,"count":186,"cumulative":54180},{"score":428,"count":147,"cumulative":54327},{"score":427,"count":182,"cumulative":54509},{"score":426,"count":164,"cumulative":54673},{"score":425,"count":175,"cumulative":54848},{"score":424,"count":180,"cumulative":55028},{"score":423,"count":160,"cumulative":55188},{"score":422,"count":149,"cumulative":55337},{"score":421,"count":154,"cumulative":55491},{"score":420,"count":136,"cumulative":55627},{"score":419,"count":150,"cumulative":55777},{"score":418,"count":163,"cumulative":55940},{"score":417,"count":139,"cumulative":56079},{"score":416,"count":146,"cumulative":56225},{"score":415,"count":157,"cumulative":56382},{"score":414,"count":130,"cumulative":56512},{"score":413,"count":152,"cumulative":56664},{"score":412,"count":122,"cumulative":56786},{"score":411,"count":137,"cumulative":56923},{"score":410,"count":148,"cumulative":57071},{"score":409,"count":128,"cumulative":57199},{"score":408,"count":144,"cumulative":57343},{"score":407,"count":139,"cumulative":57482},{"score":406,"count":130,"cumulative":57612},{"score":405,"count":146,"cumulative":57758},{"score":404,"count":145,"cumulative":57903},{"score":403,"count":127,"cumulative":58030},{"score":402,"count":124,"cumulative":58154},{"score":401,"count":120,"cumulative":58274},{"score":400,"count":131,"cumulative":58405},{"score":399,"count":119,"cumulative":58524},{"score":398,"count":132,"cumulative":58656},{"score":397,"count":118,"cumulative":58774},{"score":396,"count":136,"cumulative":58910},{"score":395,"count":118,"cumulative":59028},{"score":394,"count":97,"cumulative":59125},{"score":393,"count":123,"cumulative":59248},{"score":392,"count":102,"cumulative":59350},{"score":391,"count":92,"cumulative":59442},{"score":390,"count":109,"cumulative":59551},{"score":389,"count":93,"cumulative":59644},{"score":388,"count":111,"cumulative":59755},{"score":387,"count":91,"cumulative":59846},{"score":386,"count":92,"cumulative":59938},{"score":385,"count":104,"cumulative":60042},{"score":384,"count":102,"cumulative":60144},{"score":383,"count":99,"cumulative":60243},{"score":382,"count":80,"cumulative":60323},{"score":381,"count":80,"cumulative":60403},{"score":380,"count":82,"cumulative":60485}]}
@@ -0,0 +1 @@
1
+ {"province":"henan","province_name":"河南","year":2024,"track":"liberal","source":"local PDF","extraction":"pdftoppm + tesseract -l chi_sim","count":258,"rows":[{"score":671,"count":0,"cumulative":12},{"score":668,"count":0,"cumulative":13},{"score":667,"count":0,"cumulative":15},{"score":666,"count":0,"cumulative":17},{"score":665,"count":0,"cumulative":18},{"score":664,"count":0,"cumulative":19},{"score":663,"count":0,"cumulative":22},{"score":657,"count":0,"cumulative":41},{"score":656,"count":0,"cumulative":44},{"score":655,"count":0,"cumulative":49},{"score":654,"count":0,"cumulative":59},{"score":642,"count":0,"cumulative":170},{"score":641,"count":0,"cumulative":188},{"score":640,"count":0,"cumulative":208},{"score":639,"count":0,"cumulative":221},{"score":633,"count":0,"cumulative":321},{"score":632,"count":0,"cumulative":340},{"score":631,"count":0,"cumulative":360},{"score":630,"count":0,"cumulative":388},{"score":629,"count":0,"cumulative":410},{"score":628,"count":0,"cumulative":428},{"score":627,"count":0,"cumulative":455},{"score":615,"count":0,"cumulative":916},{"score":610,"count":0,"cumulative":1227},{"score":609,"count":0,"cumulative":1292},{"score":606,"count":0,"cumulative":1496},{"score":605,"count":0,"cumulative":1570},{"score":604,"count":0,"cumulative":1661},{"score":603,"count":0,"cumulative":1723},{"score":602,"count":0,"cumulative":1802},{"score":601,"count":0,"cumulative":1902},{"score":600,"count":0,"cumulative":1985},{"score":588,"count":0,"cumulative":3378},{"score":587,"count":0,"cumulative":3514},{"score":586,"count":0,"cumulative":3651},{"score":585,"count":0,"cumulative":3808},{"score":584,"count":0,"cumulative":4004},{"score":583,"count":0,"cumulative":4196},{"score":582,"count":0,"cumulative":4356},{"score":581,"count":0,"cumulative":4526},{"score":576,"count":0,"cumulative":5468},{"score":575,"count":0,"cumulative":5676},{"score":574,"count":0,"cumulative":5879},{"score":573,"count":0,"cumulative":6088},{"score":572,"count":0,"cumulative":6284},{"score":571,"count":0,"cumulative":6515},{"score":570,"count":0,"cumulative":6767},{"score":569,"count":0,"cumulative":7002},{"score":568,"count":0,"cumulative":7217},{"score":567,"count":0,"cumulative":7469},{"score":560,"count":0,"cumulative":9395},{"score":559,"count":0,"cumulative":9687},{"score":558,"count":0,"cumulative":10012},{"score":552,"count":0,"cumulative":12001},{"score":551,"count":0,"cumulative":12326},{"score":550,"count":0,"cumulative":12699},{"score":549,"count":0,"cumulative":13056},{"score":548,"count":0,"cumulative":13425},{"score":547,"count":0,"cumulative":13805},{"score":546,"count":0,"cumulative":14153},{"score":545,"count":0,"cumulative":14531},{"score":544,"count":0,"cumulative":14934},{"score":529,"count":0,"cumulative":21553},{"score":528,"count":0,"cumulative":22068},{"score":527,"count":0,"cumulative":22561},{"score":526,"count":0,"cumulative":23057},{"score":525,"count":0,"cumulative":23548},{"score":524,"count":0,"cumulative":24082},{"score":523,"count":0,"cumulative":24648},{"score":522,"count":0,"cumulative":25181},{"score":521,"count":0,"cumulative":25688},{"score":520,"count":0,"cumulative":26237},{"score":519,"count":0,"cumulative":26743},{"score":514,"count":0,"cumulative":29603},{"score":513,"count":0,"cumulative":30160},{"score":512,"count":0,"cumulative":30726},{"score":511,"count":0,"cumulative":31332},{"score":510,"count":0,"cumulative":31936},{"score":509,"count":0,"cumulative":32551},{"score":508,"count":0,"cumulative":33183},{"score":507,"count":0,"cumulative":33787},{"score":506,"count":0,"cumulative":34448},{"score":505,"count":0,"cumulative":35107},{"score":504,"count":0,"cumulative":35743},{"score":503,"count":0,"cumulative":36361},{"score":502,"count":0,"cumulative":37018},{"score":501,"count":0,"cumulative":37674},{"score":500,"count":0,"cumulative":38365},{"score":495,"count":0,"cumulative":41702},{"score":494,"count":0,"cumulative":42359},{"score":493,"count":0,"cumulative":43048},{"score":492,"count":0,"cumulative":43733},{"score":491,"count":0,"cumulative":44425},{"score":490,"count":0,"cumulative":45184},{"score":489,"count":0,"cumulative":45924},{"score":488,"count":0,"cumulative":46648},{"score":487,"count":0,"cumulative":47394},{"score":486,"count":0,"cumulative":48153},{"score":479,"count":0,"cumulative":53329},{"score":478,"count":0,"cumulative":54094},{"score":477,"count":0,"cumulative":54915},{"score":471,"count":0,"cumulative":59729},{"score":470,"count":0,"cumulative":60525},{"score":469,"count":0,"cumulative":61381},{"score":468,"count":0,"cumulative":62194},{"score":467,"count":0,"cumulative":63016},{"score":466,"count":0,"cumulative":63839},{"score":465,"count":0,"cumulative":64708},{"score":464,"count":0,"cumulative":65531},{"score":463,"count":0,"cumulative":66389},{"score":433,"count":0,"cumulative":92844},{"score":432,"count":0,"cumulative":93783},{"score":431,"count":0,"cumulative":94756},{"score":430,"count":0,"cumulative":95716},{"score":429,"count":0,"cumulative":96702},{"score":428,"count":0,"cumulative":97632},{"score":427,"count":0,"cumulative":98536},{"score":426,"count":0,"cumulative":99502},{"score":425,"count":0,"cumulative":100480},{"score":424,"count":0,"cumulative":101443},{"score":423,"count":0,"cumulative":102361},{"score":422,"count":0,"cumulative":103279},{"score":421,"count":0,"cumulative":104214},{"score":420,"count":0,"cumulative":105172},{"score":419,"count":0,"cumulative":106137},{"score":414,"count":0,"cumulative":111032},{"score":413,"count":0,"cumulative":112018},{"score":412,"count":0,"cumulative":113010},{"score":411,"count":0,"cumulative":113991},{"score":410,"count":0,"cumulative":115062},{"score":409,"count":0,"cumulative":116073},{"score":408,"count":0,"cumulative":117061},{"score":407,"count":0,"cumulative":118080},{"score":406,"count":0,"cumulative":119130},{"score":405,"count":0,"cumulative":120171},{"score":404,"count":0,"cumulative":121224},{"score":399,"count":0,"cumulative":126542},{"score":398,"count":0,"cumulative":127595},{"score":397,"count":0,"cumulative":128701},{"score":396,"count":0,"cumulative":129734},{"score":390,"count":0,"cumulative":136143},{"score":389,"count":0,"cumulative":137189},{"score":388,"count":0,"cumulative":138265},{"score":387,"count":0,"cumulative":139363},{"score":386,"count":0,"cumulative":140480},{"score":385,"count":0,"cumulative":141559},{"score":384,"count":0,"cumulative":142688},{"score":383,"count":0,"cumulative":143815},{"score":382,"count":0,"cumulative":144946},{"score":373,"count":0,"cumulative":155055},{"score":372,"count":0,"cumulative":156165},{"score":367,"count":0,"cumulative":161929},{"score":366,"count":0,"cumulative":163100},{"score":365,"count":0,"cumulative":164357},{"score":364,"count":0,"cumulative":165477},{"score":363,"count":0,"cumulative":166696},{"score":362,"count":0,"cumulative":167884},{"score":361,"count":0,"cumulative":169090},{"score":360,"count":0,"cumulative":170278},{"score":359,"count":0,"cumulative":171475},{"score":358,"count":0,"cumulative":172653},{"score":357,"count":0,"cumulative":173834},{"score":352,"count":0,"cumulative":179942},{"score":351,"count":0,"cumulative":181104},{"score":350,"count":0,"cumulative":182257},{"score":349,"count":0,"cumulative":183468},{"score":348,"count":0,"cumulative":184634},{"score":347,"count":0,"cumulative":185940},{"score":346,"count":0,"cumulative":187140},{"score":345,"count":0,"cumulative":188463},{"score":344,"count":0,"cumulative":189699},{"score":343,"count":0,"cumulative":190897},{"score":342,"count":0,"cumulative":192108},{"score":341,"count":0,"cumulative":193331},{"score":340,"count":0,"cumulative":194558},{"score":339,"count":0,"cumulative":195775},{"score":338,"count":0,"cumulative":197027},{"score":333,"count":0,"cumulative":203234},{"score":332,"count":0,"cumulative":204486},{"score":331,"count":0,"cumulative":205713},{"score":330,"count":0,"cumulative":206957},{"score":329,"count":0,"cumulative":208211},{"score":328,"count":0,"cumulative":209403},{"score":327,"count":0,"cumulative":210592},{"score":326,"count":0,"cumulative":211760},{"score":325,"count":0,"cumulative":213040},{"score":324,"count":0,"cumulative":214351},{"score":318,"count":0,"cumulative":221992},{"score":317,"count":0,"cumulative":223287},{"score":316,"count":0,"cumulative":224523},{"score":315,"count":0,"cumulative":225815},{"score":309,"count":0,"cumulative":233498},{"score":308,"count":0,"cumulative":234756},{"score":307,"count":0,"cumulative":236020},{"score":306,"count":0,"cumulative":237327},{"score":305,"count":0,"cumulative":238627},{"score":304,"count":0,"cumulative":239914},{"score":303,"count":0,"cumulative":241204},{"score":302,"count":0,"cumulative":242461},{"score":301,"count":0,"cumulative":243749},{"score":291,"count":0,"cumulative":256092},{"score":286,"count":0,"cumulative":262255},{"score":285,"count":0,"cumulative":263497},{"score":284,"count":0,"cumulative":264738},{"score":283,"count":0,"cumulative":265935},{"score":282,"count":0,"cumulative":267117},{"score":281,"count":0,"cumulative":268309},{"score":280,"count":0,"cumulative":269551},{"score":279,"count":0,"cumulative":270820},{"score":278,"count":0,"cumulative":272001},{"score":277,"count":0,"cumulative":273234},{"score":276,"count":0,"cumulative":274439},{"score":271,"count":0,"cumulative":280373},{"score":270,"count":0,"cumulative":281528},{"score":269,"count":0,"cumulative":282658},{"score":268,"count":0,"cumulative":283843},{"score":267,"count":0,"cumulative":284997},{"score":266,"count":0,"cumulative":286103},{"score":265,"count":0,"cumulative":287210},{"score":264,"count":0,"cumulative":288348},{"score":263,"count":0,"cumulative":289491},{"score":262,"count":0,"cumulative":290595},{"score":261,"count":0,"cumulative":291722},{"score":260,"count":0,"cumulative":292896},{"score":259,"count":0,"cumulative":294037},{"score":258,"count":0,"cumulative":295137},{"score":257,"count":0,"cumulative":296255},{"score":252,"count":0,"cumulative":301559},{"score":251,"count":0,"cumulative":302622},{"score":250,"count":0,"cumulative":303652},{"score":249,"count":0,"cumulative":304651},{"score":248,"count":0,"cumulative":305676},{"score":247,"count":0,"cumulative":306767},{"score":246,"count":0,"cumulative":307795},{"score":245,"count":0,"cumulative":308785},{"score":244,"count":0,"cumulative":309696},{"score":243,"count":0,"cumulative":310681},{"score":237,"count":0,"cumulative":316372},{"score":236,"count":0,"cumulative":317293},{"score":235,"count":0,"cumulative":318180},{"score":234,"count":0,"cumulative":319122},{"score":228,"count":0,"cumulative":324346},{"score":227,"count":0,"cumulative":325157},{"score":226,"count":0,"cumulative":325997},{"score":225,"count":0,"cumulative":326841},{"score":224,"count":0,"cumulative":327615},{"score":223,"count":0,"cumulative":328423},{"score":222,"count":0,"cumulative":329178},{"score":221,"count":0,"cumulative":329979},{"score":220,"count":0,"cumulative":330738},{"score":210,"count":0,"cumulative":337551},{"score":206,"count":0,"cumulative":340007},{"score":205,"count":0,"cumulative":340559},{"score":204,"count":0,"cumulative":341143},{"score":203,"count":0,"cumulative":341691},{"score":202,"count":0,"cumulative":342249},{"score":201,"count":0,"cumulative":342810},{"score":200,"count":0,"cumulative":343308}]}
@@ -0,0 +1 @@
1
+ {"province":"hunan","province_name":"湖南","year":2024,"track":"history","source":"https://m.cs.bendibao.com/edu/121234.shtm","note":"湖南省2024年高考一分一段表(历史科目组合)。完整范围 654 至 600 分;本科线 463 分。","count":53,"rows":[{"score":654,"count":2,"cumulative":51},{"score":653,"count":4,"cumulative":55},{"score":652,"count":2,"cumulative":57},{"score":651,"count":8,"cumulative":65},{"score":650,"count":11,"cumulative":76},{"score":649,"count":6,"cumulative":82},{"score":648,"count":11,"cumulative":93},{"score":647,"count":8,"cumulative":101},{"score":646,"count":2,"cumulative":103},{"score":645,"count":9,"cumulative":112},{"score":644,"count":9,"cumulative":121},{"score":643,"count":11,"cumulative":132},{"score":642,"count":9,"cumulative":141},{"score":641,"count":9,"cumulative":150},{"score":640,"count":12,"cumulative":162},{"score":639,"count":25,"cumulative":187},{"score":638,"count":24,"cumulative":211},{"score":637,"count":15,"cumulative":226},{"score":636,"count":16,"cumulative":242},{"score":635,"count":20,"cumulative":262},{"score":634,"count":19,"cumulative":281},{"score":633,"count":16,"cumulative":297},{"score":632,"count":26,"cumulative":323},{"score":631,"count":34,"cumulative":357},{"score":630,"count":25,"cumulative":382},{"score":629,"count":17,"cumulative":399},{"score":628,"count":25,"cumulative":424},{"score":627,"count":29,"cumulative":453},{"score":626,"count":28,"cumulative":481},{"score":625,"count":35,"cumulative":516},{"score":624,"count":30,"cumulative":546},{"score":623,"count":49,"cumulative":595},{"score":622,"count":40,"cumulative":635},{"score":621,"count":31,"cumulative":666},{"score":620,"count":54,"cumulative":720},{"score":619,"count":47,"cumulative":767},{"score":618,"count":49,"cumulative":816},{"score":617,"count":45,"cumulative":861},{"score":616,"count":50,"cumulative":911},{"score":615,"count":41,"cumulative":952},{"score":614,"count":58,"cumulative":1010},{"score":613,"count":46,"cumulative":1056},{"score":612,"count":55,"cumulative":1111},{"score":611,"count":78,"cumulative":1189},{"score":610,"count":53,"cumulative":1242},{"score":609,"count":55,"cumulative":1297},{"score":608,"count":54,"cumulative":1351},{"score":607,"count":70,"cumulative":1421},{"score":606,"count":67,"cumulative":1488},{"score":605,"count":79,"cumulative":1567},{"score":604,"count":79,"cumulative":1646},{"score":603,"count":62,"cumulative":1708},{"score":602,"count":82,"cumulative":1790},{"score":601,"count":78,"cumulative":1868},{"score":600,"count":81,"cumulative":1949}]}
@@ -0,0 +1,2 @@
1
+ export declare const SCHOOL_ALIASES: Record<string, string>;
2
+ export declare function resolveAlias(query: string): string;
@@ -0,0 +1,120 @@
1
+ // Common Chinese-name contractions → canonical school names.
2
+ // Used by the `compare` and similar verbs to resolve fuzzy queries.
3
+ // (Substring/subsequence matching is too ambiguous for Chinese — e.g.
4
+ // "北大" is a substring of "西北大学", "南理工" matches "华南理工大学".)
5
+ export const SCHOOL_ALIASES = {
6
+ "清华": "清华大学",
7
+ "北大": "北京大学",
8
+ "复旦": "复旦大学",
9
+ "上交": "上海交通大学",
10
+ "上交大": "上海交通大学",
11
+ "浙大": "浙江大学",
12
+ "南大": "南京大学",
13
+ "中科大": "中国科学技术大学",
14
+ "科大": "中国科学技术大学",
15
+ "哈工大": "哈尔滨工业大学",
16
+ "西交": "西安交通大学",
17
+ "西交大": "西安交通大学",
18
+ "人大": "中国人民大学",
19
+ "北航": "北京航空航天大学",
20
+ "北理": "北京理工大学",
21
+ "北理工": "北京理工大学",
22
+ "北师大": "北京师范大学",
23
+ "中农大": "中国农业大学",
24
+ "农大": "中国农业大学",
25
+ "民大": "中央民族大学",
26
+ "南开": "南开大学",
27
+ "天大": "天津大学",
28
+ "大工": "大连理工大学",
29
+ "东北大": "东北大学",
30
+ "吉大": "吉林大学",
31
+ "同济": "同济大学",
32
+ "华东师大": "华东师范大学",
33
+ "华东师": "华东师范大学",
34
+ "东南": "东南大学",
35
+ "东南大": "东南大学",
36
+ "厦大": "厦门大学",
37
+ "山大": "山东大学",
38
+ "海大": "中国海洋大学",
39
+ "武大": "武汉大学",
40
+ "华科": "华中科技大学",
41
+ "华中大": "华中科技大学",
42
+ "中南大": "中南大学",
43
+ "中山大": "中山大学",
44
+ "华工": "华南理工大学",
45
+ "华南理": "华南理工大学",
46
+ "川大": "四川大学",
47
+ "重大": "重庆大学",
48
+ "电子科大": "电子科技大学",
49
+ "成电": "电子科技大学",
50
+ "西工大": "西北工业大学",
51
+ "西农": "西北农林科技大学",
52
+ "兰大": "兰州大学",
53
+ "湖大": "湖南大学",
54
+ "北邮": "北京邮电大学",
55
+ "北交": "北京交通大学",
56
+ "北科大": "北京科技大学",
57
+ "北化": "北京化工大学",
58
+ "北中医": "北京中医药大学",
59
+ "北外": "北京外国语大学",
60
+ "央财": "中央财经大学",
61
+ "贸大": "对外经济贸易大学",
62
+ "外经贸": "对外经济贸易大学",
63
+ "北林": "北京林业大学",
64
+ "首师大": "首都师范大学",
65
+ "上财": "上海财经大学",
66
+ "上外": "上海外国语大学",
67
+ "华理": "华东理工大学",
68
+ "华东理工": "华东理工大学",
69
+ "东华": "东华大学",
70
+ "上大": "上海大学",
71
+ "华政": "华东政法大学",
72
+ "西电": "西安电子科技大学",
73
+ "长安": "长安大学",
74
+ "陕师大": "陕西师范大学",
75
+ "西北大": "西北大学",
76
+ "西南交大": "西南交通大学",
77
+ "西财": "西南财经大学",
78
+ "西南财": "西南财经大学",
79
+ "武理": "武汉理工大学",
80
+ "华农": "华中农业大学",
81
+ "中南财": "中南财经政法大学",
82
+ "华中师": "华中师范大学",
83
+ "华中师大": "华中师范大学",
84
+ "苏大": "苏州大学",
85
+ "南理工": "南京理工大学",
86
+ "南航": "南京航空航天大学",
87
+ "河海": "河海大学",
88
+ "药大": "中国药科大学",
89
+ "南师": "南京师范大学",
90
+ "南师大": "南京师范大学",
91
+ "暨大": "暨南大学",
92
+ "深大": "深圳大学",
93
+ "南科": "南方科技大学",
94
+ "南科大": "南方科技大学",
95
+ "上科": "上海科技大学",
96
+ "上科大": "上海科技大学",
97
+ "央音": "中央音乐学院",
98
+ "央美": "中央美术学院",
99
+ "福大": "福州大学",
100
+ "郑大": "郑州大学",
101
+ "合工大": "合肥工业大学",
102
+ "华侨": "华侨大学",
103
+ "南昌大": "南昌大学",
104
+ "矿大": "中国矿业大学",
105
+ "国防科大": "国防科技大学",
106
+ "公安大": "中国人民公安大学",
107
+ "民航大": "中国民航大学",
108
+ "哈工程": "哈尔滨工程大学",
109
+ "华电": "华北电力大学",
110
+ "北工大": "北京工业大学",
111
+ "华南师": "华南师范大学",
112
+ "华南师大": "华南师范大学",
113
+ "华南农": "华南农业大学",
114
+ "西南大": "西南大学",
115
+ "西政": "西南政法大学",
116
+ "西南政法": "西南政法大学"
117
+ };
118
+ export function resolveAlias(query) {
119
+ return SCHOOL_ALIASES[query] ?? query;
120
+ }
@@ -0,0 +1,20 @@
1
+ import { type ProvinceId } from "./codes.js";
2
+ export type ChartProfile = {
3
+ score?: number;
4
+ rank?: number;
5
+ province?: string;
6
+ province_id?: ProvinceId;
7
+ subjects?: string[];
8
+ year?: number;
9
+ };
10
+ export type Check = {
11
+ check: string;
12
+ message: string;
13
+ };
14
+ export type ChartCheckResult = {
15
+ ok: boolean;
16
+ health: number;
17
+ errors: Check[];
18
+ warnings: Check[];
19
+ };
20
+ export declare function chartCheck(profile: ChartProfile): ChartCheckResult;
@@ -0,0 +1,99 @@
1
+ // chart-check — sanity-check a student profile before sending it into
2
+ // recommend / match. Validates score range, subject combo, rank-score
3
+ // consistency (against 一分一段表 if ingested), 选科 vs 新高考 reform,
4
+ // and completeness.
5
+ //
6
+ // Output: { ok, score 0-100, errors, warnings }
7
+ import { PROVINCES, ALL_SUBJECTS } from "./codes.js";
8
+ import { loadRankTable, scoreToRank, inferDefaultTrack } from "./rank-table.js";
9
+ import { inferTrack } from "./recommend.js";
10
+ // Provincial total-score max — extend as needed.
11
+ const PROVINCE_MAX = {
12
+ 46: 900, // 海南 标准分
13
+ 31: 660, // 上海
14
+ // everyone else defaults to 750
15
+ };
16
+ function maxScoreFor(id) {
17
+ return PROVINCE_MAX[id] ?? 750;
18
+ }
19
+ export function chartCheck(profile) {
20
+ const errors = [];
21
+ const warnings = [];
22
+ let health = 100;
23
+ // 1. completeness
24
+ if (!profile.province_id) {
25
+ errors.push({ check: "completeness", message: "missing province_id (caller must resolve via resolveProvince)" });
26
+ }
27
+ if (profile.score === undefined) {
28
+ errors.push({ check: "completeness", message: "missing score" });
29
+ }
30
+ if (!profile.subjects || profile.subjects.length === 0) {
31
+ errors.push({ check: "completeness", message: "missing subjects" });
32
+ }
33
+ if (errors.length > 0) {
34
+ return { ok: false, health: 0, errors, warnings };
35
+ }
36
+ const provinceId = profile.province_id;
37
+ const score = profile.score;
38
+ const subjects = profile.subjects;
39
+ // 2. score-in-range
40
+ const cap = maxScoreFor(provinceId);
41
+ if (score < 0 || score > cap) {
42
+ errors.push({ check: "score_range", message: `score ${score} out of ${PROVINCES[provinceId].name} range [0, ${cap}]` });
43
+ health -= 25;
44
+ }
45
+ else if (score < 200) {
46
+ warnings.push({ check: "score_range", message: `score ${score} 偏低, 可能信息有误` });
47
+ health -= 5;
48
+ }
49
+ // 3. subjects validity
50
+ for (const s of subjects) {
51
+ if (!ALL_SUBJECTS.includes(s)) {
52
+ errors.push({ check: "subjects", message: `unknown subject: ${s}` });
53
+ health -= 10;
54
+ }
55
+ }
56
+ const reform = PROVINCES[provinceId].reform;
57
+ if (reform === "3+1+2") {
58
+ if (!subjects.includes("物理") && !subjects.includes("历史")) {
59
+ errors.push({ check: "subjects", message: "3+1+2 省份必须含 物理 或 历史 (首选科目)" });
60
+ health -= 20;
61
+ }
62
+ if (subjects.includes("物理") && subjects.includes("历史")) {
63
+ warnings.push({ check: "subjects", message: "首选只能在 物理/历史 二者择一" });
64
+ health -= 5;
65
+ }
66
+ if (subjects.length !== 3) {
67
+ warnings.push({ check: "subjects", message: `3+1+2 应有 3 门选考, 当前 ${subjects.length}` });
68
+ }
69
+ }
70
+ else if (reform === "3+3") {
71
+ if (subjects.length !== 3) {
72
+ warnings.push({ check: "subjects", message: `3+3 应有 3 门选考, 当前 ${subjects.length}` });
73
+ }
74
+ }
75
+ // 4. rank-score consistency (when 一分一段 exists)
76
+ if (profile.rank !== undefined && profile.year !== undefined) {
77
+ const track = subjects.length > 0
78
+ ? inferTrack(provinceId, subjects)
79
+ : inferDefaultTrack(provinceId);
80
+ const trackKey = track === "2073" ? "physics" : track === "2074" ? "history" : track === "3" ? "combined" : track === "1" ? "science" : track === "2" ? "liberal" : track;
81
+ const table = loadRankTable(provinceId, profile.year, trackKey);
82
+ if (table) {
83
+ const inferredRank = scoreToRank(table, score);
84
+ if (inferredRank && Math.abs(inferredRank - profile.rank) > Math.max(500, profile.rank * 0.1)) {
85
+ warnings.push({
86
+ check: "rank_score_consistency",
87
+ message: `score ${score} 在 ${PROVINCES[provinceId].name} ${profile.year} ${trackKey} 一分一段 推断位次 ≈ ${inferredRank}, 但你给的是 ${profile.rank} — 差距偏大`
88
+ });
89
+ health -= 8;
90
+ }
91
+ }
92
+ }
93
+ return {
94
+ ok: errors.length === 0,
95
+ health: Math.max(0, health),
96
+ errors,
97
+ warnings
98
+ };
99
+ }