diff --git a/data/2015/6.txt b/data/2015/6.txt new file mode 100644 index 0000000..459b435 --- /dev/null +++ b/data/2015/6.txt @@ -0,0 +1,300 @@ +turn on 887,9 through 959,629 +turn on 454,398 through 844,448 +turn off 539,243 through 559,965 +turn off 370,819 through 676,868 +turn off 145,40 through 370,997 +turn off 301,3 through 808,453 +turn on 351,678 through 951,908 +toggle 720,196 through 897,994 +toggle 831,394 through 904,860 +toggle 753,664 through 970,926 +turn off 150,300 through 213,740 +turn on 141,242 through 932,871 +toggle 294,259 through 474,326 +toggle 678,333 through 752,957 +toggle 393,804 through 510,976 +turn off 6,964 through 411,976 +turn off 33,572 through 978,590 +turn on 579,693 through 650,978 +turn on 150,20 through 652,719 +turn off 782,143 through 808,802 +turn off 240,377 through 761,468 +turn off 899,828 through 958,967 +turn on 613,565 through 952,659 +turn on 295,36 through 964,978 +toggle 846,296 through 969,528 +turn off 211,254 through 529,491 +turn off 231,594 through 406,794 +turn off 169,791 through 758,942 +turn on 955,440 through 980,477 +toggle 944,498 through 995,928 +turn on 519,391 through 605,718 +toggle 521,303 through 617,366 +turn off 524,349 through 694,791 +toggle 391,87 through 499,792 +toggle 562,527 through 668,935 +turn off 68,358 through 857,453 +toggle 815,811 through 889,828 +turn off 666,61 through 768,87 +turn on 27,501 through 921,952 +turn on 953,102 through 983,471 +turn on 277,552 through 451,723 +turn off 64,253 through 655,960 +turn on 47,485 through 734,977 +turn off 59,119 through 699,734 +toggle 407,898 through 493,955 +toggle 912,966 through 949,991 +turn on 479,990 through 895,990 +toggle 390,589 through 869,766 +toggle 593,903 through 926,943 +toggle 358,439 through 870,528 +turn off 649,410 through 652,875 +turn on 629,834 through 712,895 +toggle 254,555 through 770,901 +toggle 641,832 through 947,850 +turn on 268,448 through 743,777 +turn off 512,123 through 625,874 +turn off 498,262 through 930,811 +turn off 835,158 through 886,242 +toggle 546,310 through 607,773 +turn on 501,505 through 896,909 +turn off 666,796 through 817,924 +toggle 987,789 through 993,809 +toggle 745,8 through 860,693 +toggle 181,983 through 731,988 +turn on 826,174 through 924,883 +turn on 239,228 through 843,993 +turn on 205,613 through 891,667 +toggle 867,873 through 984,896 +turn on 628,251 through 677,681 +toggle 276,956 through 631,964 +turn on 78,358 through 974,713 +turn on 521,360 through 773,597 +turn off 963,52 through 979,502 +turn on 117,151 through 934,622 +toggle 237,91 through 528,164 +turn on 944,269 through 975,453 +toggle 979,460 through 988,964 +turn off 440,254 through 681,507 +toggle 347,100 through 896,785 +turn off 329,592 through 369,985 +turn on 931,960 through 979,985 +toggle 703,3 through 776,36 +toggle 798,120 through 908,550 +turn off 186,605 through 914,709 +turn off 921,725 through 979,956 +toggle 167,34 through 735,249 +turn on 726,781 through 987,936 +toggle 720,336 through 847,756 +turn on 171,630 through 656,769 +turn off 417,276 through 751,500 +toggle 559,485 through 584,534 +turn on 568,629 through 690,873 +toggle 248,712 through 277,988 +toggle 345,594 through 812,723 +turn off 800,108 through 834,618 +turn off 967,439 through 986,869 +turn on 842,209 through 955,529 +turn on 132,653 through 357,696 +turn on 817,38 through 973,662 +turn off 569,816 through 721,861 +turn on 568,429 through 945,724 +turn on 77,458 through 844,685 +turn off 138,78 through 498,851 +turn on 136,21 through 252,986 +turn off 2,460 through 863,472 +turn on 172,81 through 839,332 +turn on 123,216 through 703,384 +turn off 879,644 through 944,887 +toggle 227,491 through 504,793 +toggle 580,418 through 741,479 +toggle 65,276 through 414,299 +toggle 482,486 through 838,931 +turn off 557,768 through 950,927 +turn off 615,617 through 955,864 +turn on 859,886 through 923,919 +turn on 391,330 through 499,971 +toggle 521,835 through 613,847 +turn on 822,787 through 989,847 +turn on 192,142 through 357,846 +turn off 564,945 through 985,945 +turn off 479,361 through 703,799 +toggle 56,481 through 489,978 +turn off 632,991 through 774,998 +toggle 723,526 through 945,792 +turn on 344,149 through 441,640 +toggle 568,927 through 624,952 +turn on 621,784 through 970,788 +toggle 665,783 through 795,981 +toggle 386,610 through 817,730 +toggle 440,399 through 734,417 +toggle 939,201 through 978,803 +turn off 395,883 through 554,929 +turn on 340,309 through 637,561 +turn off 875,147 through 946,481 +turn off 945,837 through 957,922 +turn off 429,982 through 691,991 +toggle 227,137 through 439,822 +toggle 4,848 through 7,932 +turn off 545,146 through 756,943 +turn on 763,863 through 937,994 +turn on 232,94 through 404,502 +turn off 742,254 through 930,512 +turn on 91,931 through 101,942 +toggle 585,106 through 651,425 +turn on 506,700 through 567,960 +turn off 548,44 through 718,352 +turn off 194,827 through 673,859 +turn off 6,645 through 509,764 +turn off 13,230 through 821,361 +turn on 734,629 through 919,631 +toggle 788,552 through 957,972 +toggle 244,747 through 849,773 +turn off 162,553 through 276,887 +turn off 569,577 through 587,604 +turn off 799,482 through 854,956 +turn on 744,535 through 909,802 +toggle 330,641 through 396,986 +turn off 927,458 through 966,564 +toggle 984,486 through 986,913 +toggle 519,682 through 632,708 +turn on 984,977 through 989,986 +toggle 766,423 through 934,495 +turn on 17,509 through 947,718 +turn on 413,783 through 631,903 +turn on 482,370 through 493,688 +turn on 433,859 through 628,938 +turn off 769,549 through 945,810 +turn on 178,853 through 539,941 +turn off 203,251 through 692,433 +turn off 525,638 through 955,794 +turn on 169,70 through 764,939 +toggle 59,352 through 896,404 +toggle 143,245 through 707,320 +turn off 103,35 through 160,949 +toggle 496,24 through 669,507 +turn off 581,847 through 847,903 +turn on 689,153 through 733,562 +turn on 821,487 through 839,699 +turn on 837,627 through 978,723 +toggle 96,748 through 973,753 +toggle 99,818 through 609,995 +turn on 731,193 through 756,509 +turn off 622,55 through 813,365 +turn on 456,490 through 576,548 +turn on 48,421 through 163,674 +turn off 853,861 through 924,964 +turn off 59,963 through 556,987 +turn on 458,710 through 688,847 +toggle 12,484 through 878,562 +turn off 241,964 through 799,983 +turn off 434,299 through 845,772 +toggle 896,725 through 956,847 +turn on 740,289 through 784,345 +turn off 395,840 through 822,845 +turn on 955,224 through 996,953 +turn off 710,186 through 957,722 +turn off 485,949 through 869,985 +turn on 848,209 through 975,376 +toggle 221,241 through 906,384 +turn on 588,49 through 927,496 +turn on 273,332 through 735,725 +turn on 505,962 through 895,962 +toggle 820,112 through 923,143 +turn on 919,792 through 978,982 +toggle 489,461 through 910,737 +turn off 202,642 through 638,940 +turn off 708,953 through 970,960 +toggle 437,291 through 546,381 +turn on 409,358 through 837,479 +turn off 756,279 through 870,943 +turn off 154,657 through 375,703 +turn off 524,622 through 995,779 +toggle 514,221 through 651,850 +toggle 808,464 through 886,646 +toggle 483,537 through 739,840 +toggle 654,769 through 831,825 +turn off 326,37 through 631,69 +turn off 590,570 through 926,656 +turn off 881,913 through 911,998 +turn on 996,102 through 998,616 +turn off 677,503 through 828,563 +turn on 860,251 through 877,441 +turn off 964,100 through 982,377 +toggle 888,403 through 961,597 +turn off 632,240 through 938,968 +toggle 731,176 through 932,413 +turn on 5,498 through 203,835 +turn on 819,352 through 929,855 +toggle 393,813 through 832,816 +toggle 725,689 through 967,888 +turn on 968,950 through 969,983 +turn off 152,628 through 582,896 +turn off 165,844 through 459,935 +turn off 882,741 through 974,786 +turn off 283,179 through 731,899 +toggle 197,366 through 682,445 +turn on 106,309 through 120,813 +toggle 950,387 through 967,782 +turn off 274,603 through 383,759 +turn off 155,665 through 284,787 +toggle 551,871 through 860,962 +turn off 30,826 through 598,892 +toggle 76,552 through 977,888 +turn on 938,180 through 994,997 +toggle 62,381 through 993,656 +toggle 625,861 through 921,941 +turn on 685,311 through 872,521 +turn on 124,934 through 530,962 +turn on 606,379 through 961,867 +turn off 792,735 through 946,783 +turn on 417,480 through 860,598 +toggle 178,91 through 481,887 +turn off 23,935 through 833,962 +toggle 317,14 through 793,425 +turn on 986,89 through 999,613 +turn off 359,201 through 560,554 +turn off 729,494 through 942,626 +turn on 204,143 through 876,610 +toggle 474,97 through 636,542 +turn off 902,924 through 976,973 +turn off 389,442 through 824,638 +turn off 622,863 through 798,863 +turn on 840,622 through 978,920 +toggle 567,374 through 925,439 +turn off 643,319 through 935,662 +toggle 185,42 through 294,810 +turn on 47,124 through 598,880 +toggle 828,303 through 979,770 +turn off 174,272 through 280,311 +turn off 540,50 through 880,212 +turn on 141,994 through 221,998 +turn on 476,695 through 483,901 +turn on 960,216 through 972,502 +toggle 752,335 through 957,733 +turn off 419,713 through 537,998 +toggle 772,846 through 994,888 +turn on 881,159 through 902,312 +turn off 537,651 through 641,816 +toggle 561,947 through 638,965 +turn on 368,458 through 437,612 +turn on 290,149 through 705,919 +turn on 711,918 through 974,945 +toggle 916,242 through 926,786 +toggle 522,272 through 773,314 +turn on 432,897 through 440,954 +turn off 132,169 through 775,380 +toggle 52,205 through 693,747 +toggle 926,309 through 976,669 +turn off 838,342 through 938,444 +turn on 144,431 through 260,951 +toggle 780,318 through 975,495 +turn off 185,412 through 796,541 +turn on 879,548 through 892,860 +turn on 294,132 through 460,338 +turn on 823,500 through 899,529 +turn off 225,603 through 483,920 +toggle 717,493 through 930,875 +toggle 534,948 through 599,968 +turn on 522,730 through 968,950 +turn off 102,229 through 674,529 \ No newline at end of file diff --git a/data/2015/7.txt b/data/2015/7.txt new file mode 100644 index 0000000..69971ac --- /dev/null +++ b/data/2015/7.txt @@ -0,0 +1,339 @@ +NOT dq -> dr +kg OR kf -> kh +ep OR eo -> eq +44430 -> b +NOT gs -> gt +dd OR do -> dp +eg AND ei -> ej +y AND ae -> ag +jx AND jz -> ka +lf RSHIFT 2 -> lg +z AND aa -> ac +dy AND ej -> el +bj OR bi -> bk +kk RSHIFT 3 -> km +NOT cn -> co +gn AND gp -> gq +cq AND cs -> ct +eo LSHIFT 15 -> es +lg OR lm -> ln +dy OR ej -> ek +NOT di -> dj +1 AND fi -> fj +kf LSHIFT 15 -> kj +NOT jy -> jz +NOT ft -> fu +fs AND fu -> fv +NOT hr -> hs +ck OR cl -> cm +jp RSHIFT 5 -> js +iv OR jb -> jc +is OR it -> iu +ld OR le -> lf +NOT fc -> fd +NOT dm -> dn +bn OR by -> bz +aj AND al -> am +cd LSHIFT 15 -> ch +jp AND ka -> kc +ci OR ct -> cu +gv AND gx -> gy +de AND dk -> dm +x RSHIFT 5 -> aa +et RSHIFT 2 -> eu +x RSHIFT 1 -> aq +ia OR ig -> ih +bk LSHIFT 1 -> ce +y OR ae -> af +NOT ca -> cb +e AND f -> h +ia AND ig -> ii +ck AND cl -> cn +NOT jh -> ji +z OR aa -> ab +1 AND en -> eo +ib AND ic -> ie +NOT eh -> ei +iy AND ja -> jb +NOT bb -> bc +ha OR gz -> hb +1 AND cx -> cy +NOT ax -> ay +ev OR ew -> ex +bn RSHIFT 2 -> bo +er OR es -> et +eu OR fa -> fb +jp OR ka -> kb +ea AND eb -> ed +k AND m -> n +et RSHIFT 3 -> ev +et RSHIFT 5 -> ew +hz RSHIFT 1 -> is +ki OR kj -> kk +NOT h -> i +lv LSHIFT 15 -> lz +as RSHIFT 1 -> bl +hu LSHIFT 15 -> hy +iw AND ix -> iz +lf RSHIFT 1 -> ly +fp OR fv -> fw +1 AND am -> an +ap LSHIFT 1 -> bj +u LSHIFT 1 -> ao +b RSHIFT 5 -> f +jq AND jw -> jy +iu RSHIFT 3 -> iw +ih AND ij -> ik +NOT iz -> ja +de OR dk -> dl +iu OR jf -> jg +as AND bd -> bf +b RSHIFT 3 -> e +jq OR jw -> jx +iv AND jb -> jd +cg OR ch -> ci +iu AND jf -> jh +lx -> a +1 AND cc -> cd +ly OR lz -> ma +NOT el -> em +1 AND bh -> bi +fb AND fd -> fe +lf OR lq -> lr +bn RSHIFT 3 -> bp +bn AND by -> ca +af AND ah -> ai +cf LSHIFT 1 -> cz +dw OR dx -> dy +gj AND gu -> gw +jg AND ji -> jj +jr OR js -> jt +bl OR bm -> bn +gj RSHIFT 2 -> gk +cj OR cp -> cq +gj OR gu -> gv +b OR n -> o +o AND q -> r +bi LSHIFT 15 -> bm +dy RSHIFT 1 -> er +cu AND cw -> cx +iw OR ix -> iy +hc OR hd -> he +0 -> c +db OR dc -> dd +kk RSHIFT 2 -> kl +eq LSHIFT 1 -> fk +dz OR ef -> eg +NOT ed -> ee +lw OR lv -> lx +fw AND fy -> fz +dz AND ef -> eh +jp RSHIFT 3 -> jr +lg AND lm -> lo +ci RSHIFT 2 -> cj +be AND bg -> bh +lc LSHIFT 1 -> lw +hm AND ho -> hp +jr AND js -> ju +1 AND io -> ip +cm AND co -> cp +ib OR ic -> id +NOT bf -> bg +fo RSHIFT 5 -> fr +ip LSHIFT 15 -> it +jt AND jv -> jw +jc AND je -> jf +du OR dt -> dv +NOT fx -> fy +aw AND ay -> az +ge LSHIFT 15 -> gi +NOT ak -> al +fm OR fn -> fo +ff AND fh -> fi +ci RSHIFT 5 -> cl +cz OR cy -> da +NOT ey -> ez +NOT ju -> jv +NOT ls -> lt +kk AND kv -> kx +NOT ii -> ij +kl AND kr -> kt +jk LSHIFT 15 -> jo +e OR f -> g +NOT bs -> bt +hi AND hk -> hl +hz OR ik -> il +ek AND em -> en +ao OR an -> ap +dv LSHIFT 1 -> ep +an LSHIFT 15 -> ar +fo RSHIFT 1 -> gh +NOT im -> in +kk RSHIFT 1 -> ld +hw LSHIFT 1 -> iq +ec AND ee -> ef +hb LSHIFT 1 -> hv +kb AND kd -> ke +x AND ai -> ak +dd AND do -> dq +aq OR ar -> as +iq OR ip -> ir +dl AND dn -> do +iu RSHIFT 5 -> ix +as OR bd -> be +NOT go -> gp +fk OR fj -> fl +jm LSHIFT 1 -> kg +NOT cv -> cw +dp AND dr -> ds +dt LSHIFT 15 -> dx +et RSHIFT 1 -> fm +dy RSHIFT 3 -> ea +fp AND fv -> fx +NOT p -> q +dd RSHIFT 2 -> de +eu AND fa -> fc +ba AND bc -> bd +dh AND dj -> dk +lr AND lt -> lu +he RSHIFT 1 -> hx +ex AND ez -> fa +df OR dg -> dh +fj LSHIFT 15 -> fn +NOT kx -> ky +gk OR gq -> gr +dy RSHIFT 2 -> dz +gh OR gi -> gj +lj AND ll -> lm +x OR ai -> aj +bz AND cb -> cc +1 AND lu -> lv +as RSHIFT 3 -> au +ce OR cd -> cf +il AND in -> io +dd RSHIFT 1 -> dw +NOT lo -> lp +c LSHIFT 1 -> t +dd RSHIFT 3 -> df +dd RSHIFT 5 -> dg +lh AND li -> lk +lf RSHIFT 5 -> li +dy RSHIFT 5 -> eb +NOT kt -> ku +at OR az -> ba +x RSHIFT 3 -> z +NOT lk -> ll +lb OR la -> lc +1 AND r -> s +lh OR li -> lj +ln AND lp -> lq +kk RSHIFT 5 -> kn +ea OR eb -> ec +ci AND ct -> cv +b RSHIFT 2 -> d +jp RSHIFT 1 -> ki +NOT cr -> cs +NOT jd -> je +jp RSHIFT 2 -> jq +jn OR jo -> jp +lf RSHIFT 3 -> lh +1 AND ds -> dt +lf AND lq -> ls +la LSHIFT 15 -> le +NOT fg -> fh +at AND az -> bb +au AND av -> ax +kw AND ky -> kz +v OR w -> x +kk OR kv -> kw +ks AND ku -> kv +kh LSHIFT 1 -> lb +1 AND kz -> la +NOT kc -> kd +x RSHIFT 2 -> y +et OR fe -> ff +et AND fe -> fg +NOT ac -> ad +jl OR jk -> jm +1 AND jj -> jk +bn RSHIFT 1 -> cg +NOT kp -> kq +ci RSHIFT 3 -> ck +ev AND ew -> ey +1 AND ke -> kf +cj AND cp -> cr +ir LSHIFT 1 -> jl +NOT gw -> gx +as RSHIFT 2 -> at +iu RSHIFT 1 -> jn +cy LSHIFT 15 -> dc +hg OR hh -> hi +ci RSHIFT 1 -> db +au OR av -> aw +km AND kn -> kp +gj RSHIFT 1 -> hc +iu RSHIFT 2 -> iv +ab AND ad -> ae +da LSHIFT 1 -> du +NOT bw -> bx +km OR kn -> ko +ko AND kq -> kr +bv AND bx -> by +kl OR kr -> ks +1 AND ht -> hu +df AND dg -> di +NOT ag -> ah +d OR j -> k +d AND j -> l +b AND n -> p +gf OR ge -> gg +gg LSHIFT 1 -> ha +bn RSHIFT 5 -> bq +bo OR bu -> bv +1 AND gy -> gz +s LSHIFT 15 -> w +NOT ie -> if +as RSHIFT 5 -> av +bo AND bu -> bw +hz AND ik -> im +bp AND bq -> bs +b RSHIFT 1 -> v +NOT l -> m +bp OR bq -> br +g AND i -> j +br AND bt -> bu +t OR s -> u +hz RSHIFT 5 -> ic +gk AND gq -> gs +fl LSHIFT 1 -> gf +he RSHIFT 3 -> hg +gz LSHIFT 15 -> hd +hf OR hl -> hm +1 AND gd -> ge +fo OR fz -> ga +id AND if -> ig +fo AND fz -> gb +gr AND gt -> gu +he OR hp -> hq +fq AND fr -> ft +ga AND gc -> gd +fo RSHIFT 2 -> fp +gl OR gm -> gn +hg AND hh -> hj +NOT hn -> ho +gl AND gm -> go +he RSHIFT 5 -> hh +NOT gb -> gc +hq AND hs -> ht +hz RSHIFT 3 -> ib +hz RSHIFT 2 -> ia +fq OR fr -> fs +hx OR hy -> hz +he AND hp -> hr +gj RSHIFT 5 -> gm +hf AND hl -> hn +hv OR hu -> hw +NOT hj -> hk +gj RSHIFT 3 -> gl +fo RSHIFT 3 -> fq +he RSHIFT 2 -> hf \ No newline at end of file diff --git a/data/2015/8.txt b/data/2015/8.txt new file mode 100644 index 0000000..0862f68 --- /dev/null +++ b/data/2015/8.txt @@ -0,0 +1,300 @@ +"azlgxdbljwygyttzkfwuxv" +"v\xfb\"lgs\"kvjfywmut\x9cr" +"merxdhj" +"dwz" +"d\\gkbqo\\fwukyxab\"u" +"k\xd4cfixejvkicryipucwurq\x7eq" +"nvtidemacj\"hppfopvpr" +"kbngyfvvsdismznhar\\p\"\"gpryt\"jaeh" +"khre\"o\x0elqfrbktzn" +"nugkdmqwdq\x50amallrskmrxoyo" +"jcrkptrsasjp\\\"cwigzynjgspxxv\\vyb" +"ramf\"skhcmenhbpujbqwkltmplxygfcy" +"aqjqgbfqaxga\\fkdcahlfi\"pvods" +"pcrtfb" +"\x83qg\"nwgugfmfpzlrvty\"ryoxm" +"fvhvvokdnl\\eap" +"kugdkrat" +"seuxwc" +"vhioftcosshaqtnz" +"gzkxqrdq\\uko\"mrtst" +"znjcomvy\x16hhsenmroswr" +"clowmtra" +"\xc4" +"jpavsevmziklydtqqm" +"egxjqytcttr\\ecfedmmovkyn\"m" +"mjulrvqgmsvmwf" +"o\\prxtlfbatxerhev\xf9hcl\x44rzmvklviv" +"lregjexqaqgwloydxdsc\\o\"dnjfmjcu" +"lnxluajtk\x8desue\\k\x7abhwokfhh" +"wrssfvzzn\"llrysjgiu\"npjtdli" +"\x67lwkks" +"bifw\"ybvmwiyi\"vhol\"vol\xd4" +"aywdqhvtvcpvbewtwuyxrix" +"gc\xd3\"caukdgfdywj" +"uczy\\fk" +"bnlxkjvl\x7docehufkj\\\"qoyhag" +"bidsptalmoicyorbv\\" +"jorscv\"mufcvvfmcv\"ga" +"sofpwfal\\a" +"kcuqtbboaly\"uj\"k" +"n\\c" +"x\"\xcaj\\xwwvpdldz" +"eyukphh" +"wcyjq" +"vjx\"\"hjroj\"l\x4cjwbr" +"xcodsxzfqw\\rowqtuwvjnxupjnrh" +"yc" +"fpvzldgbdtca\"hqwa" +"ymjq\x8ahohvafubra\"hgqoknkuyph" +"kx\\mkaaklvcup" +"belddrzegcsxsyfhzyz" +"fuyswi" +"\\hubzebo\"ha\\qyr\"dv\\" +"mxvlz\"fwuvx\"cyk\"" +"ftbh\"ro\\tmcpnpvh\"xx" +"ygi" +"rw\"\"wwn\\fgbjumq\"vgvoh\xd0\"mm" +"\"pat\"\x63kpfc\"\x2ckhfvxk\"uwqzlx" +"o" +"d\"hqtsfp\xceaswe\"\xc0lw" +"zajpvfawqntvoveal\"\"trcdarjua" +"xzapq" +"rkmhm" +"byuq" +"rwwmt\xe8jg\xc2\"omt" +"nfljgdmgefvlh\"x" +"rpjxcexisualz" +"doxcycmgaiptvd" +"rq\\\"mohnjdf\\xv\\hrnosdtmvxot" +"oqvbcenib\"uhy\\npjxg" +"pkvgnm\\ruayuvpbpd" +"kknmzpxqfbcdgng" +"piduhbmaympxdexz" +"vapczawekhoa\\or" +"tlwn\"avc\"bycg\"\"xuxea" +"\xcdvryveteqzxrgopmdmihkcgsuozips" +"kpzziqt" +"sdy\\s\"cjq" +"yujs" +"qte\"q" +"qyvpnkhjcqjv\"cclvv\"pclgtg\xeak\"tno" +"xwx" +"vibuvv" +"qq\"" +"wwjduomtbkbdtorhpyalxswisq\"r" +"afuw\\mfjzctcivwesutxbk\"lk" +"e\xcef\\hkiu" +"ftdrgzvygcw\"jwsrcmgxj" +"zrddqfkx\x21dr\"ju\"elybk\"powj\"\"kpryz" +"dttdkfvbodkma\"" +"lzygktugpqw" +"qu\x83tes\\u\"tnid\"ryuz" +"\\o\"pe\\vqwlsizjklwrjofg\xe2oau\\rd" +"mikevjzhnwgx\"fozrj\"h\"" +"ligxmxznzvtachvvbahnff" +"d\\kq" +"tnbkxpzmcakqhaa" +"g\\yeakebeyv" +"cqkcnd\"sxjxfnawy\x31zax\x6ceha" +"m\x0dtqotffzdnetujtsgjqgwddc" +"masnugb\"etgmxul\x3bqd\\tmtddnvcy" +"floediikodfgre\x23wyoxlswxflwecdjpt" +"zu" +"r" +"\"ashzdbd\"pdvba\xeeumkr\\amnj" +"ckslmuwbtfouwpfwtuiqmeozgspwnhx" +"t\\qjsjek\xf9gjcxsyco\"r" +"hoed\x1b\\tcmaqch\"epdy" +"mgjiojwzc\\ypqcn\xb1njmp\"aeeblxt" +"\xdf\"h\x5enfracj" +"\x6fpbpocrb" +"jbmhrswyyq\\" +"wtyqtenfwatji\"ls\\" +"voy" +"awj" +"rtbj\"j" +"hynl" +"orqqeuaat\\xu\\havsgr\xc5qdk" +"g\"npyzjfq\"rjefwsk" +"rk\\kkcirjbixr\\zelndx\"bsnqvqj\"" +"tecoz" +"dn\"uswngbdk\"" +"qb\\" +"wpyis\\ebq" +"ppwue\\airoxzjjdqbvyurhaabetv" +"fxlvt" +"ql\"oqsmsvpxcg\"k" +"vqlhuec\\adw" +"qzmi\xffberakqqkk" +"tisjqff\"wf" +"yhnpudoaybwucvppj" +"xhfuf\\ehsrhsnfxcwtibd\"ubfpz" +"ihgjquzhf\"" +"ff\x66dsupesrnusrtqnywoqcn\\" +"z\x77zpubbjmd" +"\"vhzlbwq\"xeimjt\\xe\x85umho\"m\"\"bmy" +"mmuvkioocmzjjysi\"mkfbec\"" +"rpgghowbduw\x2fayslubajinoik\xd0hcfy" +"xrkyjqul\xdexlojgdphczp\"jfk" +"mg\x07cnr\x8b\x67xdgszmgiktpjhawho" +"kdgufhaoab" +"rlhela\"nldr" +"wzye\x87u" +"yif\x75bjhnitgoarmfgqwpmopu" +"pvlbyez\"wyy\x3dpgr" +"ezdm\"ovkruthkvdwtqwr\"ibdoawzgu" +"qubp" +"b\\kcpegcn\\zgdemgorjnk" +"gjsva\\kzaor\"\"gtpd" +"\"kt" +"rlymwlcodix" +"qqtmswowxca\"jvv" +"jni\xebwhozb" +"zhino\"kzjtmgxpi\"zzexijg" +"tyrbat\\mejgzplufxixkyg" +"lhmopxiao\x09\"p\xebl" +"xefioorxvate" +"nmcgd\x46xfujt\"w" +"\xe3wnwpat\"gtimrb" +"wpq\"xkjuw\xebbohgcagppb" +"fmvpwaca" +"mlsw" +"fdan\\\x9e" +"\"f\"fmdlzc" +"nyuj\\jnnfzdnrqmhvjrahlvzl" +"zn\"f\xcfsshcdaukkimfwk" +"uayugezzo\\\"e\"blnrgjaupqhik" +"efd\"apkndelkuvfvwyyatyttkehc" +"ufxq\\\"m\"bwkh\x93kapbqrvxxzbzp\\" +"fgypsbgjak\x79qblbeidavqtddfacq\\i\"h" +"kcfgpiysdxlgejjvgndb\\dovfpqodw" +"\"onpqnssmighipuqgwx\"nrokzgvg" +"vhjrrhfrba\"jebdanzsrdusut\\wbs" +"o\xdakymbaxakys" +"uwxhhzz\\mtmhghjn\\\\tnhzbejj" +"yd\\" +"bpgztp\\lzwpdqju\"it\x35qjhihjv" +"\\my\\b\"klnnto\\\xb3mbtsh" +"ezyvknv\"l\x2bdhhfjcvwzhjgmhwbqd\"\\" +"ftkz\"amoncbsohtaumhl\"wsodemopodq" +"ifv" +"dmzfxvzq" +"sped\"bvmf\"mmevl\"zydannpfny" +"fjxcjwlv\"pnqyrzatsjwsqfidb" +"muc\xfdqouwwnmuixru\\zlhjintplvtee" +"mraqgvmj" +"njopq\"ftcsryo" +"enoh\"n" +"t\"ntjhjc\"nzqh\xf7dcohhlsja\x7dtr" +"flbqcmcoun" +"dxkiysrn\\dyuqoaig" +"nehkzi\"h\"syktzfufotng\xdafqo" +"dzkjg\\hqjk\\\"zfegssjhn" +"sadlsjv" +"vmfnrdb\"" +"ac\\bdp\"n" +"qt\x89h" +"lsndeugwvijwde\\vjapbm\\k\\nljuva" +"twpmltdzyynqt\\z\\tnund\x64hm" +"hpcyata\"ocylbkzdnhujh" +"hskzq\"knntuhscex\"q\\y\\vqj\x3an" +"eekwyufvji\\mqgeroekxeyrmymq" +"hl\"durthetvri\xebw\\jxu\"rcmiuy" +"\"fxdnmvnftxwesmvvq\"sjnf\xaabpg\"iary" +"\"\"nksqso" +"ruq\xbezugge\"d\"hwvoxmy\"iawikddxn\"x" +"rxxnlfay" +"stcu\"mv\xabcqts\\fasff" +"yrnvwfkfuzuoysfdzl\x02bk" +"qbdsmlwdbfknivtwijbwtatqfe" +"\"erqh\\csjph" +"ikfv" +"\xd2cuhowmtsxepzsivsvnvsb" +"vj" +"d" +"\\g" +"porvg\x62qghorthnc\"\\" +"tiks\\kr\"\x0fuejvuxzswnwdjscrk" +"xmgfel\"atma\\zaxmlgfjx\"ajmqf" +"oz\\rnxwljc\\\"umhymtwh" +"wlsxxhm\x7fqx\\gjoyrvccfiner\\qloluqv" +"k\\ieq" +"xidjj\"ksnlgnwxlddf\\s\\kuuleb" +"wjpnzgprzv\\maub\x0cj" +"r" +"y" +"\"yecqiei\"ire\\jdhlnnlde\xc5u" +"drvdiycqib" +"egnrbefezcrhgldrtb" +"plqodxv\\zm\"uodwjdocri\x55ucaezutm" +"f\"wexcw\x02ekewx\"alyzn" +"pqajwuk\\\\oatkfqdyspnrupo" +"rkczj\"fzntabpnygrhamk\\km\x68xfkmr" +"wejam\xbac\x37kns" +"qqmlwjk\"gh" +"fdcjsxlgx" +"\\cxvxy\"kb\"\"unubvrsq\\y\\awfhbmarj\\" +"geunceaqr" +"tpkg\"svvngk\\sizlsyaqwf" +"\"pa\\x\x18od\\emgje\\" +"ffiizogjjptubzqfuh\"cctieqcdh" +"yikhiyyrpgglpos" +"h\\" +"jotqojodcv" +"ervsz\x87ade\"fevq\\tcqowt" +"\\y\"fgrxtppkcseeg\\onxjarx\\hyhfn\x5fi" +"kxndlabn\\wwumctuzdcfiitrbnn" +"eoosynwhwm" +"\"c\x04" +"ny\xf6vuwlec" +"ubgxxcvnltzaucrzg\\xcez" +"pnocjvo\\yt" +"fcabrtqog\"a\"zj" +"o\\bha\\mzxmrfltnflv\xea" +"tbfvzwhexsdxjmxejwqqngzixcx" +"wdptrakok\"rgymturdmwfiwu" +"reffmj" +"lqm" +"\\oc" +"p\"" +"ygkdnhcuehlx" +"vsqmv\"bqay\"olimtkewedzm" +"isos\x6azbnkojhxoopzetbj\xe1yd" +"yo\\pgayjcyhshztnbdv" +"fg\"h" +"vcmcojolfcf\\\\oxveua" +"w\"vyszhbrr\"jpeddpnrjlca\x69bdbopd\\z" +"jikeqv" +"\"dkjdfrtj" +"is" +"hgzx" +"z\"" +"woubquq\\ag\"" +"xvclriqa\xe6ltt" +"tfxinifmd" +"mvywzf\"jz" +"vlle" +"c\"rf\"wynhye\x25vccvb\"" +"zvuxm" +"\xf2\"jdstiwqer\"h" +"kyogyogcknbzv\x9f\\\\e" +"kspodj\"edpeqgypc" +"oh\\x\\h" +"julb" +"bmcfkidxyilgoy\\xmu\"ig\\qg" +"veqww\"ea" +"fkdbemtgtkpqisrwlxutllxc\"mbelhs" +"e" +"ecn\x50ooprbstnq" +"\"\xe8\"ec\xeah\"qo\\g\"iuqxy\"e\"y\xe7xk\xc6d" +"lwj\"aftrcqj" +"jduij\x97zk\"rftjrixzgscxxllpqx\"bwwb" +"fqcditz" +"f\x19azclj\"rsvaokgvty\"aeq" +"erse\x9etmzhlmhy\x67yftoti" +"lsdw\xb3dmiy\\od" +"x\x6fxbljsjdgd\xaau" +"hjg\\w\"\x78uoqbsdikbjxpip\"w\"jnhzec" +"gk" +"\\zrs\\syur" \ No newline at end of file diff --git a/lib/Glib.js b/lib/Glib.js index 16683f4..1b50e87 100644 --- a/lib/Glib.js +++ b/lib/Glib.js @@ -3,6 +3,12 @@ const Math = require('./bnmath'); const EMPTY = Symbol('empty'); class Glib { + // NB: this assumes all inputs are iterable + static concat(...args) { + return Glib.fromIterable(args).flatMap((i) => { + return i; + }); + } static infiniteFromIterable(iterable) { const cache = Array.from(iterable); return new Glib( @@ -260,6 +266,16 @@ class Glib { return true; }); } + skip(n = 1n) { + return this.filter((_, i) => i >= n); + } + drop(n = 1n) { + return this.filter((_, i) => i >= n); + } + // NB: this assumes all inputs are iterable + concat(...iterables) { + return Glib.concat(this, ...iterables); + } [Symbol.iterator]() { return this._; } diff --git a/lib/_pollute/array.js b/lib/_pollute/array.js index 207f429..d28f430 100644 --- a/lib/_pollute/array.js +++ b/lib/_pollute/array.js @@ -49,3 +49,7 @@ Array.prototype.safeSort = function safeSort(...args) { clone.sort(...args); return clone; }; + +Array.prototype.sortInts = function sortInts() { + return this.safeSort((a, b) => (a < b ? -1 : 1)); +}; diff --git a/lib/_pollute/map.js b/lib/_pollute/map.js index 4116558..22bb5c2 100644 --- a/lib/_pollute/map.js +++ b/lib/_pollute/map.js @@ -24,6 +24,11 @@ Object.defineProperty(Map.prototype, 'glibValues', { }, }); +Map.prototype.update = function update(key, updateFn) { + this.set(key, updateFn(this.get(key), key)); + return this; +}; + const _getPath = (map, path) => { for (const component of path) { if (!map.has(component)) { diff --git a/lib/twodee.js b/lib/twodee.js index 691c535..cde85df 100644 --- a/lib/twodee.js +++ b/lib/twodee.js @@ -12,10 +12,13 @@ const DIRECTIONS = { class Rectangle { static fromPoints(one, two) { - const [x1, x2] = [one.v[0], two.v[0]].sort(); - const [y1, y2] = [one.v[1], two.v[1]].sort(); + const [x1, x2] = [one.v[0], two.v[0]].sortInts(); + const [y1, y2] = [one.v[1], two.v[1]].sortInts(); const bottomLeft = new Vector(x1, y1); - const size = bottomLeft.multiply(-1).add(new Vector(x2, y2)); + const size = bottomLeft + .multiply(-1) + .add(new Vector(x2, y2)) + .add(1n); return new Rectangle(bottomLeft, size); } constructor(offset, size) { @@ -37,6 +40,12 @@ class Rectangle { })(this), ); } + get bottomLeft() { + return this.offset; + } + get topRight() { + return this.offset.add(this.size); + } } class Instruction { diff --git a/solutions/2015/6.js b/solutions/2015/6.js new file mode 100644 index 0000000..3424baa --- /dev/null +++ b/solutions/2015/6.js @@ -0,0 +1,74 @@ +const { Glib, Vector, twodee } = require('../../lib'); + +const COMMANDS = { + TURN_ON: Symbol('TURN_ON'), + TURN_OFF: Symbol('TURN_OFF'), + TOGGLE: Symbol('TOGGLE'), +}; + +const cmd = new Map([ + ['turn on', COMMANDS.TURN_ON], + ['turn off', COMMANDS.TURN_OFF], + ['toggle', COMMANDS.TOGGLE], +]); + +const parse = (input) => + Glib.fromLines(input).map((l) => { + const [ + str, + command, + pt1, + pt2, + ] = /^([^\d]+)(\d+,\d+) through (\d+,\d+)$/.exec(l); + + return [ + cmd.get(command.trim()), + twodee.Rectangle.fromPoints( + Vector.fromString(`(${pt1})`), + Vector.fromString(`(${pt2})`), + ), + ]; + }); + +const ops1 = { + [COMMANDS.TURN_ON](map, pt) { + map.set(pt, 1n); + }, + [COMMANDS.TURN_OFF](map, pt) { + map.set(pt, 0n); + }, + [COMMANDS.TOGGLE](map, pt) { + map.update(pt, (v = 0n) => (v === 0n ? 1n : 0n)); + }, +}; + +const ops2 = { + [COMMANDS.TURN_ON](map, pt) { + map.update(pt, (v = 0n) => v + 1n); + }, + [COMMANDS.TURN_OFF](map, pt) { + map.update(pt, (v = 0n) => (v <= 1n ? 0n : v - 1n)); + }, + [COMMANDS.TOGGLE](map, pt) { + map.update(pt, (v = 0n) => v + 2n); + }, +}; + +module.exports = { + '1': (input) => + parse(input) + .reduce((acc, [cmd, rect]) => { + // console.log(cmd, pt1.string, pt2.string); + rect.allPoints().forEach((pt) => ops1[cmd](acc, pt.string)); + return acc; + }, new Map()) + .glibValues.sum(), + '2': (input) => + parse(input) + .reduce((acc, [cmd, rect]) => { + // console.log(cmd, pt1.string, pt2.string); + rect.allPoints().forEach((pt) => ops2[cmd](acc, pt.string)); + return acc; + }, new Map()) + .glibValues.sum(), +}; diff --git a/solutions/2015/7.js b/solutions/2015/7.js new file mode 100644 index 0000000..becf465 --- /dev/null +++ b/solutions/2015/7.js @@ -0,0 +1,83 @@ +const { Glib, fn } = require('../../lib'); + +const COMMANDS = { + AND: Symbol('AND'), + OR: Symbol('OR'), + LSHIFT: Symbol('LSHIFT'), + RSHIFT: Symbol('RSHIFT'), + NOT: Symbol('NOT'), + _NO_OP: Symbol('_NO_OP'), +}; + +const NO_OP = /^(\w+|\d+) -> (\w+)/; +const UNARY_OP = /^(\w+) (\w+) -> (\w+)/; +const BINARY_OP = /^(\w+) (\w+) (\w+|\d+) -> (\w+)$/; + +const parse = (input) => + Glib.fromLines(input) + .map((l) => { + if (l.match(NO_OP)) { + const [str, value, target] = NO_OP.exec(l); + return [target, { command: COMMANDS._NO_OP, args: [value] }]; + } + + if (l.match(UNARY_OP)) { + const [str, cmd, input, target] = UNARY_OP.exec(l); + return [target, { command: COMMANDS[cmd], args: [input] }]; + } + + if (l.match(BINARY_OP)) { + const [str, left, cmd, right, target] = BINARY_OP.exec(l); + return [target, { command: COMMANDS[cmd], args: [left, right] }]; + } + + throw new Error('unable to parse'); + }) + .toMap(); + +const ops = { + [COMMANDS.AND](lookup, l, r) { + return lookup(l) & lookup(r); + }, + [COMMANDS.OR](lookup, l, r) { + return lookup(l) | lookup(r); + }, + [COMMANDS.LSHIFT](lookup, l, r) { + return lookup(l) << BigInt(r); + }, + [COMMANDS.RSHIFT](lookup, l, r) { + return lookup(l) >> BigInt(r); + }, + [COMMANDS.NOT](lookup, v) { + return lookup(v) ^ 65535n; + }, + [COMMANDS._NO_OP](lookup, v) { + return lookup(v); + }, +}; + +const makeLookup = (input) => { + const lookup = fn.memo((v) => { + if (v.match(/^\d+$/)) { + return BigInt(v); + } + if (!input.has(v)) { + throw new Error('invalid lookup'); + } + const { command, args } = input.get(v); + return ops[command](lookup, ...args); + }); + return lookup; +}; + +module.exports = { + '1': (input) => { + return makeLookup(parse(input))('a'); + }, + '2': (input) => { + input = parse(input); + const override = makeLookup(input)('a'); + input.set('b', { command: COMMANDS._NO_OP, args: [override.toString(10)] }); + return makeLookup(input)('a'); + }, +}; diff --git a/solutions/2015/8.js b/solutions/2015/8.js new file mode 100644 index 0000000..75f8ab5 --- /dev/null +++ b/solutions/2015/8.js @@ -0,0 +1,84 @@ +const { Glib, fn } = require('../../lib'); + +const MODES = { + NORMAL: Symbol('normal'), + ESCAPE: Symbol('escape'), + HEX: Symbol('hex'), +}; + +const BACKSLASH = '\\'; +const QUOTE = '"'; +const X = 'x'; + +const decode = (input) => { + let mode = MODES.NORMAL; + let storage = null; + return Glib.fromIterable(input).flatMap((char) => { + switch (mode) { + case MODES.NORMAL: + switch (char) { + case QUOTE: + return []; + case BACKSLASH: + mode = MODES.ESCAPE; + return []; + default: + return [char]; + } + case MODES.ESCAPE: + switch (char) { + case BACKSLASH: + mode = MODES.NORMAL; + return [BACKSLASH]; + case QUOTE: + mode = MODES.NORMAL; + return [QUOTE]; + case X: + mode = MODES.HEX; + return []; + default: + console.log(char); + throw new Error('invalid escape'); + } + case MODES.HEX: + if (storage == null) { + storage = char; + return []; + } else { + char = String.fromCharCode(parseInt(`${storage}${char}`, 16)); + storage = null; + mode = MODES.NORMAL; + return [char]; + } + default: + throw new Error('bad mode'); + } + }); +}; + +const encode = (input) => + Glib.concat( + QUOTE, + Glib.fromIterable(input).flatMap((char) => { + switch (char) { + case QUOTE: + return [BACKSLASH, QUOTE]; + case BACKSLASH: + return [BACKSLASH, BACKSLASH]; + default: + return [char]; + } + }), + QUOTE, + ); + +module.exports = { + '1': (input) => + Glib.fromLines(input) + .map((i) => BigInt(i.length) - decode(i).length) + .sum(), + '2': (input) => + Glib.fromLines(input) + .map((i) => encode(i).length - BigInt(i.length)) + .sum(), +}; diff --git a/testAll.js b/testAll.js index e61a478..8b81697 100644 --- a/testAll.js +++ b/testAll.js @@ -55,8 +55,9 @@ const results = { // slow 4: [117946, 3938038], 5: [238, 69], - // todo: - // 6: [377891, 14110788], + 6: [377891, 14110788], + 7: [3176, 14710], + 8: [1342, 2074], }, };