{"id":63301,"date":"2026-01-21T19:56:47","date_gmt":"2026-01-21T11:56:47","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/63301.html"},"modified":"2026-01-21T19:56:47","modified_gmt":"2026-01-21T11:56:47","slug":"%e5%af%b9clickhouse%e7%bb%99%e5%87%ba%e7%9a%84%e4%ba%8c%e5%88%86%e6%b3%95%e6%b1%82%e8%a7%a3advent-of-code-2025%e7%ac%ac10%e9%a2%98-%e7%94%b5%e5%ad%90%e5%b7%a5%e5%8e%82-%e7%ac%ac%e4%ba%8c%e9%83%a8","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/63301.html","title":{"rendered":"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3"},"content":{"rendered":"<p>\u8fd9\u662f\u6211\u5bf9\u524d\u6587SQL\u7684\u4e2d\u95f4\u7ed3\u679c\u5c55\u793a\u548c\u7406\u89e3\u7b14\u8bb0&#xff0c;\u4f7f\u7528\u7b2c\u4e00\u884c\u6570\u636e\u505a\u793a\u4f8b\u3002<\/p>\n<p><span class=\"token keyword\">WITH<\/span> RECURSIVE t <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n<span class=\"token string\">&#039;[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}<br \/>\n[#&#8230;#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}<br \/>\n[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}&#039;<\/span> t<br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\nb <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n        row_number<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">OVER<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> rn<span class=\"token punctuation\">,<\/span><br \/>\n        reverse<span class=\"token punctuation\">(<\/span>substr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;]&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> b1<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u4fe1\u53f7\u706f\u5b57\u7b26\u4e32&#xff0c;\u683c\u5f0f.##.&#xff0c;\u6ce8\u610f\u8981\u7ffb\u8f6c\u5b57\u7b26\u4e32<\/span><br \/>\n        substr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;]&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;{&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">3<\/span> <span class=\"token operator\">&#8211;<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;]&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> b2<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u6309\u94ae\u5b57\u7b26\u4e32&#xff0c;\u683c\u5f0f(3) (1,3) (2) (2,3) (0,2) (0,1)<\/span><br \/>\n        substr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;{&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;}&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&#8211;<\/span> instr<span class=\"token punctuation\">(<\/span>b<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;{&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> b3<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u4f0f\u7279\u5b57\u7b26\u4e32&#xff0c;\u683c\u5f0f3,5,4,7<\/span><br \/>\n        translate<span class=\"token punctuation\">(<\/span>b1<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;#.&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;10&#039;<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">BIT<\/span>::<span class=\"token keyword\">INT<\/span> b1a<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u8f6c\u4e8c\u8fdb\u5236\u4f4d\u518d\u8f6c\u6574\u6570<\/span><br \/>\n        list_reduce<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> string_split<span class=\"token punctuation\">(<\/span>unnest<span class=\"token punctuation\">(<\/span>string_split<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">replace<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">replace<\/span><span class=\"token punctuation\">(<\/span>b2<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;)&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;(&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039; &#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;,&#039;<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">INT<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                   lambda x<span class=\"token punctuation\">,<\/span> y : <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> b2a<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u6309\u94ae\u8f6c\u6210\u6574\u6570\u5217\u8868<\/span><br \/>\n        string_split<span class=\"token punctuation\">(<\/span>b3<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;,&#039;<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">INT<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> b3a<br \/>\n    <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">SELECT<\/span> unnest<span class=\"token punctuation\">(<\/span>string_split<span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">,<\/span> chr<span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> b <span class=\"token keyword\">FROM<\/span> t<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">&#8211;from b;<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><br \/>\nd <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> rn<span class=\"token punctuation\">,<\/span> b1a<span class=\"token punctuation\">,<\/span> array_agg<span class=\"token punctuation\">(<\/span>b2a<span class=\"token punctuation\">)<\/span> a<span class=\"token punctuation\">,<\/span> b3a<br \/>\n    <span class=\"token keyword\">FROM<\/span> b<br \/>\n    <span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> <span class=\"token keyword\">all<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p><span class=\"token comment\">&#8212; PART 2: \u9884\u8ba1\u7b97\u6309\u94ae\u7ec4\u5408\u6a21\u5f0f<\/span><br \/>\nbutton_combination_patterns <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n        rn <span class=\"token keyword\">as<\/span> puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        a <span class=\"token keyword\">as<\/span> button_effects<span class=\"token punctuation\">,<\/span><br \/>\n        b3a <span class=\"token keyword\">as<\/span> target_joltages<span class=\"token punctuation\">,<\/span><br \/>\n        length<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> num_buttons<span class=\"token punctuation\">,<\/span><br \/>\n        length<span class=\"token punctuation\">(<\/span>b3a<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> num_positions<span class=\"token punctuation\">,<\/span><br \/>\n        combination_id<span class=\"token punctuation\">,<\/span><br \/>\n        bit_count<span class=\"token punctuation\">(<\/span>combination_id<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> pattern_cost<span class=\"token punctuation\">,<\/span><\/p>\n<p>        <span class=\"token comment\">&#8212; effect_pattern: \u6bcf\u4e2a\u4f4d\u7f6e\u88ab\u6309\u4e0b\u7684\u6b21\u6570<\/span><br \/>\n        <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> list<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token punctuation\">(<\/span><br \/>\n                    <span class=\"token keyword\">SELECT<\/span> <span class=\"token function\">count<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">FROM<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> length<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>buttonindex<span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">WHERE<\/span> <span class=\"token punctuation\">(<\/span>combination_id <span class=\"token operator\">&amp;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token operator\">&lt;&lt;<\/span> buttonindex<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span><span class=\"token number\">0<\/span><br \/>\n                      <span class=\"token operator\">AND<\/span> <span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">[<\/span>buttonindex<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&amp;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token operator\">&lt;&lt;<\/span> pos<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span><span class=\"token number\">0<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pos<br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">from<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> length<span class=\"token punctuation\">(<\/span>b3a<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">INT<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">as<\/span> effect_pattern<span class=\"token punctuation\">,<\/span><\/p>\n<p>        <span class=\"token comment\">&#8212; parity_pattern: \u6bcf\u4e2a\u4f4d\u7f6e\u7684\u5947\u5076\u6027 (\u6a212)<\/span><br \/>\n        <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> list<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token punctuation\">(<\/span><br \/>\n                    <span class=\"token keyword\">SELECT<\/span> <span class=\"token function\">count<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">FROM<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> length<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>buttonindex<span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">WHERE<\/span> <span class=\"token punctuation\">(<\/span>combination_id <span class=\"token operator\">&amp;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token operator\">&lt;&lt;<\/span> buttonindex<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span><span class=\"token number\">0<\/span><br \/>\n                      <span class=\"token operator\">AND<\/span> <span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">[<\/span>buttonindex<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&amp;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token operator\">&lt;&lt;<\/span> pos<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span><span class=\"token number\">0<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span><br \/>\n                <span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pos<br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">from<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> length<span class=\"token punctuation\">(<\/span>b3a<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">INT<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">as<\/span> parity_pattern<br \/>\n    <span class=\"token keyword\">FROM<\/span> d<br \/>\n    <span class=\"token keyword\">CROSS<\/span> <span class=\"token keyword\">JOIN<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> length<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>combination_id<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">&#8211;select * from button_combination_patterns order by puzzle_id ,combination_id;<\/span><br \/>\n<span class=\"token comment\">\/*<br \/>\ncombination_id\u662f6\u4e2a\u6309\u94ae\u7684\u5168\u90e8\u7ec4\u5408\u7684\u5e8f\u53f7&#xff0c;\u5176\u7684\u4e8c\u8fdb\u5236\u6570\u7684\u5404\u4f4d\u8868\u793a\u76f8\u5e94\u6309\u94ae\u662f\u5426\u88ab\u9009\u7528\u3002\u6bd4\u5982\u300aa\u300b\u884c1\u8868\u793a\u53ea\u6309\u7b2c1\u4e2a\u6309\u94ae&#xff0c;\u5bfc\u81f4\u7ed3\u679c\u662f8\u4ee3\u8868\u7684\u7535\u538b\u7b2c3\u4f4d&#043;1&#xff0c;\u89c1effect_pattern\u7b2c4\u4e2a\u5143\u7d20\u3002<br \/>\npattern_cost\u8868\u793a\u5f53\u524d\u6a21\u5f0f\u6240\u9700\u7684\u6309\u94ae\u7ec4\u5408\u9700\u8981\u6309\u4e0b\u51e0\u4e2a\u6309\u94ae\u3002\u6bd4\u5982\u300ab\u300b\u884c&#xff0c;\u7b2c1\u548c\u7b2c2\u4e2a\u6309\u94ae\u88ab\u6309\u4e0b&#xff0c;\u6309\u952e\u6b21\u6570\u4e3a2&#xff0c;\u5bfc\u81f4\u7535\u538b\u7b2c1\u4f4d&#043;1&#xff0c;\u7b2c3\u4f4d&#043;2&#xff0c;\u89c1effect_pattern\u7b2c2\u548c\u7b2c4\u4e2a\u5143\u7d20\u3002<br \/>\nparity_pattern\u5bf9effect_pattern\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u63092\u53d6\u6a21\u3002\u5076\u6570\u53d80&#xff0c;\u5947\u6570\u53d81\u3002<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 puzzle_id \u2502    button_effects    \u2502 target_joltages \u2502 num_buttons \u2502 num_positions \u2502 combination_id \u2502 pattern_cost \u2502 effect_pattern \u2502 parity_pattern \u2502<br \/>\n\u2502   int64   \u2502       int32[]        \u2502     int32[]     \u2502    int64    \u2502     int64     \u2502     int64      \u2502     int8     \u2502    int32[]     \u2502    int32[]     \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              0 \u2502            0 \u2502 [0, 0, 0, 0]   \u2502 [0, 0, 0, 0]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              1 \u2502            1 \u2502 [0, 0, 0, 1]   \u2502 [0, 0, 0, 1]   \u2502\u300aa\u300b<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              2 \u2502            1 \u2502 [0, 1, 0, 1]   \u2502 [0, 1, 0, 1]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              3 \u2502            2 \u2502 [0, 1, 0, 2]   \u2502 [0, 1, 0, 0]   \u2502\u300ab\u300b<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              4 \u2502            1 \u2502 [0, 0, 1, 0]   \u2502 [0, 0, 1, 0]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              5 \u2502            2 \u2502 [0, 0, 1, 1]   \u2502 [0, 0, 1, 1]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              6 \u2502            2 \u2502 [0, 1, 1, 1]   \u2502 [0, 1, 1, 1]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502              7 \u2502            3 \u2502 [0, 1, 1, 2]   \u2502 [0, 1, 1, 0]   \u2502<br \/>\n\u2502         \u00b7 \u2502          \u00b7           \u2502      \u00b7          \u2502           \u00b7 \u2502             \u00b7 \u2502              \u00b7 \u2502            \u00b7 \u2502      \u00b7         \u2502      \u00b7         \u2502<br \/>\n\u2502         \u00b7 \u2502          \u00b7           \u2502      \u00b7          \u2502           \u00b7 \u2502             \u00b7 \u2502              \u00b7 \u2502            \u00b7 \u2502      \u00b7         \u2502      \u00b7         \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502             61 \u2502            5 \u2502 [2, 1, 3, 2]   \u2502 [0, 1, 1, 0]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502             62 \u2502            5 \u2502 [2, 2, 3, 2]   \u2502 [0, 0, 1, 0]   \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502 [3, 5, 4, 7]    \u2502           6 \u2502             4 \u2502             63 \u2502            6 \u2502 [2, 2, 3, 3]   \u2502 [0, 0, 1, 1]   \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 64 rows (40 shown)                                                                                                                       9 columns \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n*\/<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6309\u5947\u5076\u6027\u5206\u7ec4\u6a21\u5f0f<\/span><br \/>\npatterns_grouped_by_parity <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n        puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        button_effects<span class=\"token punctuation\">,<\/span><br \/>\n        num_buttons<span class=\"token punctuation\">,<\/span><br \/>\n        num_positions<span class=\"token punctuation\">,<\/span><br \/>\n        parity_pattern<span class=\"token punctuation\">,<\/span><br \/>\n        list<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>effect_pattern<span class=\"token punctuation\">,<\/span> pattern_cost<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> available_patterns<br \/>\n    <span class=\"token keyword\">FROM<\/span> button_combination_patterns<br \/>\n    <span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> puzzle_id<span class=\"token punctuation\">,<\/span> button_effects<span class=\"token punctuation\">,<\/span> num_buttons<span class=\"token punctuation\">,<\/span> num_positions<span class=\"token punctuation\">,<\/span> parity_pattern<br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">&#8211;from patterns_grouped_by_parity order by puzzle_id,parity_pattern;<\/span><br \/>\n<span class=\"token comment\">\/*<br \/>\n\u6309parity_pattern\u5206\u7ec4\u540e\u7684available_patterns\u5177\u6709\u4e00\u81f4\u7684\u5947\u5076\u6027&#xff0c;patterns.parity_pattern &#061; (SELECT list(solver.current_goal[pos] % 2 ))\u4fdd\u8bc1\u4e86solver.current_goal[pos] &#8211; pattern_tuple[1][pos])\u603b\u662f\u80fd\u88ab2\u6574\u9664\u3002<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 puzzle_id \u2502    button_effects    \u2502 num_buttons \u2502 num_positions \u2502 parity_pattern \u2502                              available_patterns                              \u2502<br \/>\n\u2502   int64   \u2502       int32[]        \u2502    int64    \u2502     int64     \u2502    int32[]     \u2502                         struct(integer[], tinyint)[]                         \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0]   \u2502 [([2, 2, 2, 2], 4), ([2, 2, 2, 2], 5), ([0, 0, 2, 2], 3), ([0, 0, 0, 0], 0)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 1]   \u2502 [([2, 2, 2, 3], 5), ([2, 2, 2, 1], 4), ([0, 0, 2, 1], 2), ([0, 0, 0, 1], 1)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 1, 0]   \u2502 [([2, 2, 3, 2], 5), ([2, 2, 1, 2], 4), ([0, 0, 1, 2], 2), ([0, 0, 1, 0], 1)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 1, 1]   \u2502 [([2, 2, 3, 3], 6), ([2, 2, 1, 1], 3), ([0, 0, 1, 1], 1), ([0, 0, 1, 1], 2)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 0]   \u2502 [([2, 1, 2, 2], 4), ([2, 1, 2, 0], 3), ([0, 1, 2, 2], 3), ([0, 1, 0, 2], 2)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 1]   \u2502 [([2, 1, 2, 1], 3), ([2, 1, 2, 1], 4), ([0, 1, 2, 3], 4), ([0, 1, 0, 1], 1)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 1, 0]   \u2502 [([2, 1, 3, 2], 5), ([2, 1, 1, 0], 2), ([0, 1, 1, 2], 2), ([0, 1, 1, 2], 3)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 1, 1]   \u2502 [([2, 1, 3, 1], 4), ([2, 1, 1, 1], 3), ([0, 1, 1, 3], 3), ([0, 1, 1, 1], 2)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 0, 0, 0]   \u2502 [([1, 2, 2, 2], 4), ([1, 2, 0, 2], 3), ([1, 0, 2, 2], 3), ([1, 0, 2, 0], 2)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 0, 0, 1]   \u2502 [([1, 2, 2, 3], 5), ([1, 2, 0, 1], 2), ([1, 0, 2, 1], 2), ([1, 0, 2, 1], 3)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 0, 1, 0]   \u2502 [([1, 2, 1, 2], 3), ([1, 2, 1, 2], 4), ([1, 0, 3, 2], 4), ([1, 0, 1, 0], 1)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 0, 1, 1]   \u2502 [([1, 2, 1, 3], 4), ([1, 2, 1, 1], 3), ([1, 0, 3, 1], 3), ([1, 0, 1, 1], 2)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 1, 0, 0]   \u2502 [([1, 1, 2, 2], 4), ([1, 1, 0, 0], 1), ([1, 1, 2, 2], 3), ([1, 1, 2, 2], 4)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 1, 0, 1]   \u2502 [([1, 1, 2, 1], 3), ([1, 1, 0, 1], 2), ([1, 1, 2, 3], 4), ([1, 1, 2, 1], 3)] \u2502\u300ac\u300b<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 1, 1, 0]   \u2502 [([1, 1, 1, 2], 3), ([1, 1, 1, 0], 2), ([1, 1, 3, 2], 4), ([1, 1, 1, 2], 3)] \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 1, 1, 1]   \u2502 [([1, 1, 1, 1], 2), ([1, 1, 1, 1], 3), ([1, 1, 3, 3], 5), ([1, 1, 1, 1], 2)] \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 16 rows                                                                                                                                              6 columns \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n*\/<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u9012\u5f52\u6298\u534a\u7b97\u6cd5<\/span><br \/>\nrecursive_halving_solver <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token comment\">&#8212; \u57fa\u7840\u60c5\u51b5: \u4ece\u76ee\u6807\u7535\u538b\u5f00\u59cb<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n        rn puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        a button_effects<span class=\"token punctuation\">,<\/span><br \/>\n        length<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> num_buttons<span class=\"token punctuation\">,<\/span><br \/>\n        length<span class=\"token punctuation\">(<\/span>b3a<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> num_positions<span class=\"token punctuation\">,<\/span><br \/>\n        b3a <span class=\"token keyword\">as<\/span> current_goal<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">0<\/span>::<span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">as<\/span> accumulated_cost<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">0<\/span> <span class=\"token keyword\">as<\/span> recursion_depth<br \/>\n    <span class=\"token keyword\">FROM<\/span> d<\/p>\n<p>    <span class=\"token keyword\">UNION<\/span> <span class=\"token keyword\">ALL<\/span><\/p>\n<p>    <span class=\"token comment\">&#8212; \u9012\u5f52\u60c5\u51b5: \u5e94\u7528\u6a21\u5f0f&#xff0c;\u51cf\u53bb&#xff0c;\u6298\u534a&#xff0c;\u7ee7\u7eed<\/span><br \/>\n    <span class=\"token keyword\">select<\/span><br \/>\n        puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        button_effects<span class=\"token punctuation\">,<\/span><br \/>\n        num_buttons<span class=\"token punctuation\">,<\/span><br \/>\n        num_positions<span class=\"token punctuation\">,<\/span><br \/>\n        current_goal<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>accumulated_cost<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> accumulated_cost<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>recursion_depth<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> recursion_depth<br \/>\n   <span class=\"token keyword\">from<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> <span class=\"token comment\">&#8211;DISTINCT<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>button_effects<span class=\"token punctuation\">,<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>num_buttons<span class=\"token punctuation\">,<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>num_positions<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">(<\/span><span class=\"token comment\">&#8212; New goal: (current &#8211; pattern) \/ 2<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> list<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token punctuation\">(<\/span>solver<span class=\"token punctuation\">.<\/span>current_goal<span class=\"token punctuation\">[<\/span>pos<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#8211;<\/span> pattern_tuple<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>pos<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">2<\/span><br \/>\n                <span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pos<br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">FROM<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> solver<span class=\"token punctuation\">.<\/span>num_positions<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">INT<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">as<\/span> current_goal<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token comment\">&#8212; Accumulate cost: pattern_cost * 2^depth<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>accumulated_cost <span class=\"token operator\">&#043;<\/span><br \/>\n            pattern_tuple<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span>::<span class=\"token keyword\">BIGINT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> solver<span class=\"token punctuation\">.<\/span>recursion_depth<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> accumulated_cost<span class=\"token punctuation\">,<\/span><\/p>\n<p>        solver<span class=\"token punctuation\">.<\/span>recursion_depth <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">as<\/span> recursion_depth<br \/>\n    <span class=\"token keyword\">FROM<\/span> recursive_halving_solver solver<br \/>\n    <span class=\"token keyword\">JOIN<\/span> patterns_grouped_by_parity patterns<br \/>\n        <span class=\"token keyword\">ON<\/span> patterns<span class=\"token punctuation\">.<\/span>puzzle_id <span class=\"token operator\">&#061;<\/span> solver<span class=\"token punctuation\">.<\/span>puzzle_id<br \/>\n        <span class=\"token operator\">AND<\/span> patterns<span class=\"token punctuation\">.<\/span>parity_pattern <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> list<span class=\"token punctuation\">(<\/span>solver<span class=\"token punctuation\">.<\/span>current_goal<span class=\"token punctuation\">[<\/span>pos<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">FROM<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> solver<span class=\"token punctuation\">.<\/span>num_positions<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">CROSS<\/span> <span class=\"token keyword\">JOIN<\/span> unnest<span class=\"token punctuation\">(<\/span>patterns<span class=\"token punctuation\">.<\/span>available_patterns<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pattern_tuple<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">WHERE<\/span><br \/>\n        solver<span class=\"token punctuation\">.<\/span>recursion_depth <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">100<\/span><br \/>\n        <span class=\"token operator\">AND<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> <span class=\"token number\">1<\/span><br \/>\n            <span class=\"token keyword\">FROM<\/span> unnest<span class=\"token punctuation\">(<\/span>solver<span class=\"token punctuation\">.<\/span>current_goal<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">WHERE<\/span> val <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\">&#8212; \u786e\u4fdd\u6a21\u5f0f\u4e0d\u4f1a\u8d85\u51fa\u5f53\u524d\u76ee\u6807<\/span><br \/>\n        <span class=\"token operator\">AND<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token keyword\">SELECT<\/span> <span class=\"token number\">1<\/span><br \/>\n            <span class=\"token keyword\">FROM<\/span> generate_series<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> solver<span class=\"token punctuation\">.<\/span>num_positions<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">WHERE<\/span> pattern_tuple<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>pos<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&gt;<\/span> solver<span class=\"token punctuation\">.<\/span>current_goal<span class=\"token punctuation\">[<\/span>pos<span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> puzzle_id<span class=\"token punctuation\">,<\/span> button_effects<span class=\"token punctuation\">,<\/span> num_buttons<span class=\"token punctuation\">,<\/span> num_positions<span class=\"token punctuation\">,<\/span> current_goal<br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">&#8211;from recursive_halving_solver;<\/span><br \/>\n<span class=\"token comment\">\/*<br \/>\n[3, 5, 4, 7]\u5404\u4e2a\u5143\u7d20%2\u7684\u7ed3\u679c\u662f[1, 1, 0, 1]&#xff0c; [1, 1, 0, 1]\u5bf9\u5e94\u7684\u6a21\u5f0f\u662f\u300ac\u300b\u884c [([1, 1, 2, 1], 3), ([1, 1, 0, 1], 2), ([1, 1, 2, 3], 4), ([1, 1, 2, 1], 3)]<\/p>\n<p>([3, 5, 4, 7]\u5404\u4e2a\u5143\u7d20-\u6a21\u5f0f\u4e2d\u5404\u4e2a\u5143\u7d20)\/2\u7684\u7ed3\u679c\u662f:<br \/>\n [3, 5, 4, 7]-[1, 1, 2, 1]&#061;[2, 4, 2, 6], \u518d\u9664\u4ee52\u5f97[1, 2, 1, 3]&#xff0c;<br \/>\n [3, 5, 4, 7]-[1, 1, 2, 3]&#061;[2, 4, 2, 4], \u518d\u9664\u4ee52\u5f97[1, 2, 1, 2]&#xff0c;<br \/>\n [3, 5, 4, 7]-[1, 1, 0, 1]&#061;[2, 4, 4, 6], \u518d\u9664\u4ee52\u5f97[1, 2, 2, 3]&#xff0c;<br \/>\n \u4e0b\u8f6e\u8fed\u4ee3\u4f7f\u7528\u65b0\u76ee\u6807\u53bb\u6c42\u89e3&#xff0c;\u56e0\u4e3a\u63d0\u524d\u9664\u4ee52\u4e86&#xff0c;\u6240\u4ee5\u5f97\u5230\u7684\u6309\u538b\u6b21\u6570\u9700\u8981\u4e582<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 puzzle_id \u2502    button_effects    \u2502 num_buttons \u2502 num_positions \u2502 current_goal \u2502 accumulated_cost \u2502 recursion_depth \u2502<br \/>\n\u2502   int64   \u2502       int32[]        \u2502    int64    \u2502     int64     \u2502   int32[]    \u2502      int64       \u2502      int32      \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [3, 5, 4, 7] \u2502                0 \u2502               0 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 1, 3] \u2502                3 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 1, 2] \u2502                4 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 2, 3] \u2502                2 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 1] \u2502                9 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               10 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 1, 1] \u2502                6 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 1] \u2502                6 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               10 \u2502               3 \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u82e5\u628amin\u6539\u6210distinct&#xff0c;\u53ef\u4ee5\u770b\u51fa\u76f8\u540c\u5f97\u5230[0, 0, 0, 0]&#xff08;\u5373\u5b8c\u6210\u76ee\u6807&#xff09;\u670910\u300111\u300112\u300113\u300114\u7b49\u4e0d\u540c\u7684\u6309\u538b\u6b21\u6570&#xff0c;\u6709\u7684\u8fed\u4ee3\u4e862\u5c42&#xff0c;\u6709\u76843\u5c42\u3002<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 puzzle_id \u2502    button_effects    \u2502 num_buttons \u2502 num_positions \u2502 current_goal \u2502 accumulated_cost \u2502 recursion_depth \u2502<br \/>\n\u2502   int64   \u2502       int32[]        \u2502    int64    \u2502     int64     \u2502   int32[]    \u2502      int64       \u2502      int32      \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [3, 5, 4, 7] \u2502                0 \u2502               0 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 2, 3] \u2502                2 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 1, 2] \u2502                4 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [1, 2, 1, 3] \u2502                3 \u2502               1 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 1, 1] \u2502                6 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 1] \u2502                6 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               10 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               11 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 1] \u2502                8 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 1] \u2502                9 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               12 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 1, 0, 1] \u2502                7 \u2502               2 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               12 \u2502               3 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               14 \u2502               3 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               11 \u2502               3 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               10 \u2502               3 \u2502<br \/>\n\u2502         1 \u2502 [8, 10, 4, 12, 5, 3] \u2502           6 \u2502             4 \u2502 [0, 0, 0, 0] \u2502               13 \u2502               3 \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 17 rows                                                                                                  7 columns \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n*\/<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><\/p>\n<p><span class=\"token comment\">&#8212; Part 2 \u6700\u5c0f\u6210\u672c\u89e3\u51b3\u65b9\u6848<\/span><br \/>\npart2_minimum_solutions <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span><br \/>\n        puzzle_id<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>accumulated_cost<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> minimum_cost<br \/>\n    <span class=\"token keyword\">FROM<\/span> recursive_halving_solver<br \/>\n    <span class=\"token keyword\">WHERE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token keyword\">SELECT<\/span> <span class=\"token number\">1<\/span><br \/>\n        <span class=\"token keyword\">FROM<\/span> unnest<span class=\"token punctuation\">(<\/span>current_goal<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> _<span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">WHERE<\/span> val <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> puzzle_id<br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8f93\u51faPart 2\u7ed3\u679c<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    <span class=\"token string\">&#039;Part 2&#039;<\/span> <span class=\"token keyword\">as<\/span> part<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">sum<\/span><span class=\"token punctuation\">(<\/span>minimum_cost<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> solution<br \/>\n<span class=\"token keyword\">FROM<\/span> part2_minimum_solutions<span class=\"token punctuation\">;<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u662f\u6211\u5bf9\u524d\u6587SQL\u7684\u4e2d\u95f4\u7ed3\u679c\u5c55\u793a\u548c\u7406\u89e3\u7b14\u8bb0&#xff0c;\u4f7f\u7528\u7b2c\u4e00\u884c\u6570\u636e\u505a\u793a\u4f8b\u3002<br \/>\nWITH RECURSIVE t AS (SELECT<br \/>\n[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}<br \/>\n[#&#8230;#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}<br \/>\n[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[697,100,427],"topic":[],"class_list":["post-63301","post","type-post","status-publish","format-standard","hentry","category-server","tag-clickhouse","tag-100","tag-427"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/63301.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u8fd9\u662f\u6211\u5bf9\u524d\u6587SQL\u7684\u4e2d\u95f4\u7ed3\u679c\u5c55\u793a\u548c\u7406\u89e3\u7b14\u8bb0&#xff0c;\u4f7f\u7528\u7b2c\u4e00\u884c\u6570\u636e\u505a\u793a\u4f8b\u3002 WITH RECURSIVE t AS (SELECT [.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} [#...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} [.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/63301.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-21T11:56:47+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/63301.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/63301.html\",\"name\":\"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-21T11:56:47+00:00\",\"dateModified\":\"2026-01-21T11:56:47+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/63301.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/63301.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/63301.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/63301.html","og_locale":"zh_CN","og_type":"article","og_title":"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u8fd9\u662f\u6211\u5bf9\u524d\u6587SQL\u7684\u4e2d\u95f4\u7ed3\u679c\u5c55\u793a\u548c\u7406\u89e3\u7b14\u8bb0&#xff0c;\u4f7f\u7528\u7b2c\u4e00\u884c\u6570\u636e\u505a\u793a\u4f8b\u3002 WITH RECURSIVE t AS (SELECT [.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} [#...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} [.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5","og_url":"https:\/\/www.wsisp.com\/helps\/63301.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-21T11:56:47+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/63301.html","url":"https:\/\/www.wsisp.com\/helps\/63301.html","name":"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-21T11:56:47+00:00","dateModified":"2026-01-21T11:56:47+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/63301.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/63301.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/63301.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u5bf9clickhouse\u7ed9\u51fa\u7684\u4e8c\u5206\u6cd5\u6c42\u89e3Advent of Code 2025\u7b2c10\u9898 \u7535\u5b50\u5de5\u5382 \u7b2c\u4e8c\u90e8\u5206\u7684\u7b97\u6cd5\u7406\u89e3"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/63301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=63301"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/63301\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=63301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=63301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=63301"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=63301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}