Compare commits

9 Commits

27 changed files with 4547 additions and 2 deletions

262
input/day16.txt Normal file
View File

@@ -0,0 +1,262 @@
departure location: 50-692 or 705-969
departure station: 35-540 or 556-965
departure platform: 27-776 or 790-974
departure track: 48-903 or 911-955
departure date: 33-814 or 836-953
departure time: 34-403 or 421-966
arrival location: 37-489 or 510-963
arrival station: 46-128 or 150-960
arrival platform: 45-75 or 97-959
arrival track: 28-535 or 541-952
class: 38-340 or 349-966
duration: 42-308 or 316-969
price: 49-324 or 340-970
route: 31-627 or 648-952
row: 38-878 or 893-955
seat: 39-54 or 71-967
train: 36-597 or 615-960
type: 41-438 or 453-959
wagon: 42-370 or 389-971
zone: 36-114 or 127-965
your ticket:
107,157,197,181,71,113,179,109,97,163,73,53,101,193,173,151,167,191,127,103
nearby tickets:
460,805,566,621,266,233,771,202,368,751,150,558,184,248,457,424,351,184,821,623
181,792,526,790,876,286,436,893,566,195,168,619,911,190,895,803,679,346,323,914
198,396,154,361,573,941,264,591,596,365,416,191,512,422,813,871,340,912,750,202
726,194,756,858,569,924,732,592,726,479,650,189,477,268,834,455,732,692,776,97
228,58,182,728,763,308,290,912,871,686,475,208,593,250,733,729,463,803,360,307
216,652,486,597,289,188,291,739,300,111,357,359,161,166,745,102,66,520,688,715
349,265,286,852,869,474,277,261,716,368,403,397,564,850,663,165,356,602,208,355
283,615,859,258,264,164,714,458,434,723,483,161,226,653,531,750,860,674,906,805
292,284,177,622,726,768,784,895,203,896,305,663,807,456,188,661,677,648,531,323
797,877,472,801,612,213,681,392,666,568,398,557,717,813,112,595,927,169,489,679
804,485,843,563,514,726,299,537,189,754,256,749,278,203,843,299,482,306,158,738
360,790,810,399,534,192,182,810,686,512,929,791,291,584,529,418,531,760,866,128
314,919,923,678,656,859,671,942,568,564,241,619,712,460,153,245,276,685,229,456
989,943,666,917,291,803,205,579,254,489,524,183,461,894,424,895,865,759,802,938
370,603,736,619,427,197,618,511,199,267,318,322,916,525,659,656,927,854,393,169
794,616,185,689,796,258,288,100,705,932,712,801,103,725,238,514,730,590,344,271
902,924,709,317,874,803,216,305,468,596,941,517,841,288,526,781,205,710,98,654
513,292,427,860,304,221,277,669,458,581,945,58,264,320,561,292,921,678,459,259
790,615,203,320,128,477,313,203,431,797,719,588,323,857,851,299,199,715,895,430
928,480,591,740,274,929,279,844,984,651,937,715,282,238,466,257,170,734,240,54
650,768,201,875,474,523,58,243,900,306,185,801,790,170,749,842,765,298,852,207
596,688,432,230,667,648,666,652,949,316,894,718,276,920,322,121,730,844,903,162
862,205,71,219,454,210,801,996,51,316,322,464,719,725,228,281,461,922,222,723
753,903,760,706,513,898,420,350,772,165,900,320,939,559,741,320,253,521,224,623
483,155,792,462,261,221,748,206,813,182,520,774,727,239,343,396,679,912,660,435
573,252,560,108,458,277,468,467,132,488,217,112,936,362,398,322,946,718,927,668
185,737,233,721,112,288,296,869,233,584,750,187,588,986,164,216,563,301,423,191
689,945,353,575,221,774,518,235,557,529,454,455,916,436,799,907,209,54,800,256
533,562,558,678,567,565,721,729,511,243,228,368,345,527,306,812,689,390,257,684
66,189,579,515,474,655,591,208,240,733,662,237,257,850,291,473,227,846,558,768
218,688,651,918,931,461,531,320,173,240,775,114,241,803,909,719,523,684,170,220
468,370,913,591,280,753,675,477,582,608,937,942,250,900,157,303,805,746,690,485
182,477,685,669,153,360,366,533,254,288,243,228,395,62,799,853,718,590,937,615
590,268,807,790,154,576,867,663,294,315,365,946,303,692,768,896,736,939,838,760
599,592,474,203,190,291,651,431,914,349,715,944,666,197,286,806,488,799,713,101
471,713,579,232,556,283,915,185,927,167,354,591,560,560,171,353,584,296,10,679
353,757,179,101,982,805,213,438,303,914,851,799,556,72,469,275,741,249,360,655
267,459,460,940,708,589,528,575,285,841,623,585,769,436,652,298,251,997,107,114
911,255,661,935,286,663,150,680,270,812,751,257,162,127,934,364,764,60,573,717
360,894,516,664,359,276,600,361,107,432,859,585,288,876,863,166,624,107,453,917
531,266,199,235,597,246,162,740,70,690,894,729,734,936,201,685,712,172,236,872
71,532,668,483,680,469,266,392,691,625,361,482,195,752,586,257,234,732,693,935
114,565,299,437,735,710,930,429,350,799,434,567,293,392,590,64,283,531,518,764
434,216,72,368,263,597,658,944,949,400,763,128,676,428,122,659,841,924,773,303
399,931,922,874,870,744,804,424,679,67,228,184,206,166,938,163,689,575,356,900
915,934,767,930,71,338,483,166,194,591,511,192,237,859,227,574,767,323,219,183
569,192,773,676,255,176,423,194,842,865,160,667,916,681,894,545,398,581,150,258
369,50,666,211,595,579,661,71,483,672,712,597,519,737,310,168,836,238,689,580
945,239,152,108,878,773,720,530,663,727,523,694,754,390,528,261,472,767,233,671
715,570,368,809,534,282,101,234,98,510,647,734,811,897,691,365,705,100,427,487
278,357,54,598,773,648,179,247,709,738,474,859,852,627,392,650,615,259,913,752
686,484,113,247,282,428,871,843,196,368,297,487,804,870,779,293,224,527,769,722
894,369,474,569,217,567,770,906,157,400,195,933,357,562,171,805,727,287,256,204
101,928,670,944,729,113,757,521,587,582,105,433,744,666,726,877,898,389,101,23
844,843,842,776,775,851,272,349,187,516,925,683,438,851,356,108,192,725,55,657
510,532,588,320,863,864,615,703,208,462,210,733,899,422,923,667,656,663,755,841
710,907,390,268,273,271,875,922,530,664,770,725,742,767,742,170,306,587,483,560
428,922,521,421,728,658,762,465,583,903,898,668,918,945,857,864,229,311,269,874
841,164,705,204,648,535,771,800,285,288,658,739,686,574,692,945,197,902,291,604
347,293,294,290,571,569,669,365,839,597,238,708,755,903,300,716,862,240,731,770
893,436,206,814,67,150,218,288,841,762,758,214,479,463,535,231,530,453,732,239
659,943,253,806,268,904,392,173,870,845,836,752,468,941,355,838,400,590,51,868
187,914,323,943,459,127,717,317,399,169,356,206,216,648,239,243,608,810,689,653
171,303,689,433,357,874,731,758,370,256,540,207,557,941,627,864,281,216,458,318
774,760,522,249,877,675,347,231,368,168,319,153,561,186,302,262,400,425,580,481
150,313,473,616,162,237,869,485,188,619,925,324,182,802,340,256,470,850,356,685
281,183,862,487,519,195,595,652,975,169,730,776,98,235,619,163,926,576,155,581
293,222,472,651,150,595,763,519,470,437,262,768,474,358,360,702,836,162,877,154
585,651,902,224,245,215,300,478,122,193,276,288,940,200,875,74,686,429,458,219
684,247,527,766,915,574,556,729,203,668,268,474,394,771,231,933,668,475,537,656
948,167,988,196,802,250,462,364,362,291,488,389,619,941,594,901,623,207,471,709
588,111,155,662,977,53,806,215,727,246,265,718,596,367,437,271,725,453,322,916
557,597,850,811,721,242,238,854,682,295,259,300,568,278,903,278,433,577,784,532
731,624,101,900,802,934,565,429,670,453,757,322,208,73,251,366,344,465,728,871
172,650,807,459,673,392,752,263,488,845,517,319,515,155,232,809,948,245,761,997
485,103,159,532,272,895,101,277,917,708,9,220,396,152,587,422,911,753,754,588
390,767,561,467,583,763,741,506,574,770,487,621,232,287,737,160,236,758,458,655
106,307,660,430,249,306,542,533,453,912,233,869,800,735,431,280,899,257,162,299
103,365,731,623,749,775,98,898,763,560,316,431,197,153,222,267,621,493,930,286
737,761,725,223,945,153,562,717,893,480,869,899,557,902,107,859,685,236,413,480
272,876,992,217,295,747,843,359,836,485,758,103,692,560,738,323,462,174,620,862
233,484,621,292,534,461,869,863,457,457,121,733,114,739,72,585,798,916,242,680
577,586,911,158,351,934,978,558,164,233,795,179,924,852,278,305,740,107,772,557
748,661,932,668,743,929,218,394,933,170,161,724,336,659,592,204,556,517,289,669
659,573,988,522,591,763,151,933,359,201,913,427,155,214,196,234,340,402,253,98
271,262,273,669,156,538,804,859,713,653,873,594,168,847,113,219,667,211,352,152
899,678,364,766,390,432,863,812,660,622,652,235,585,677,669,366,103,621,146,218
433,236,625,567,852,351,211,922,395,681,935,52,354,362,652,765,203,905,560,792
733,731,254,101,217,761,709,708,917,393,627,755,461,240,540,302,297,307,516,865
247,862,842,688,486,227,928,398,831,168,742,514,733,308,110,127,285,571,424,202
290,665,469,192,863,101,759,80,435,652,759,223,114,213,858,477,466,481,390,263
476,192,864,896,458,933,983,840,292,650,263,150,931,867,71,525,215,525,482,875
294,847,160,231,99,236,463,836,763,798,751,396,570,156,610,913,588,858,930,845
798,878,197,301,224,110,352,621,766,925,195,654,310,837,434,215,667,209,355,174
585,287,189,568,425,618,267,924,517,810,687,718,391,466,21,238,396,843,862,517
170,103,811,511,719,896,622,937,204,658,156,909,774,363,359,474,867,399,224,534
168,776,285,858,265,65,757,270,530,203,914,151,427,112,593,665,317,756,157,734
622,513,424,287,99,220,855,947,623,792,153,425,558,765,358,338,453,763,213,433
156,398,799,675,857,480,755,622,234,425,872,730,767,293,993,72,278,168,340,671
246,618,206,102,794,792,873,396,457,737,916,214,946,987,365,422,398,256,877,152
587,690,263,151,582,624,513,560,854,263,890,218,212,841,520,233,754,588,531,151
626,943,916,749,771,619,709,751,432,364,894,591,66,876,895,262,937,151,431,349
949,690,871,875,519,243,619,733,458,235,344,264,476,898,754,240,869,733,761,166
810,592,654,706,174,943,167,560,810,575,392,316,716,309,173,434,854,155,842,459
521,436,166,808,431,774,567,947,795,225,230,201,991,866,232,764,840,740,790,295
269,919,587,484,855,794,286,269,733,181,284,322,844,920,903,263,751,391,506,298
804,896,460,469,163,207,658,916,572,218,172,268,876,708,738,300,394,696,737,864
280,353,457,103,574,397,903,614,580,840,858,291,650,871,210,464,913,340,71,391
162,919,488,657,768,812,492,926,397,203,107,520,297,251,181,794,814,170,856,246
480,462,528,391,393,565,818,793,715,283,324,577,205,811,233,158,510,768,922,732
934,162,182,401,251,920,758,878,333,72,648,570,874,839,755,673,511,306,154,281
933,285,663,229,837,776,672,582,472,684,97,460,114,612,839,655,182,162,428,322
459,243,153,250,726,104,294,621,158,796,164,160,248,621,222,164,875,335,269,913
226,100,100,288,839,653,238,194,703,478,674,292,284,566,219,278,365,624,179,801
711,867,234,849,670,359,458,326,108,877,370,760,430,582,672,593,185,212,114,239
912,737,814,357,214,262,368,451,353,673,460,919,656,596,267,251,662,760,487,725
840,808,152,513,671,769,166,792,462,480,849,335,364,350,269,854,520,316,946,455
363,897,745,154,216,457,390,161,214,995,726,204,896,741,237,287,421,392,474,897
582,582,863,727,802,240,185,567,867,844,724,186,499,938,477,586,710,652,749,264
161,293,844,172,734,233,241,195,808,583,300,776,164,163,193,579,985,400,296,207
396,216,896,424,663,870,672,107,942,532,509,559,808,246,895,356,859,913,361,558
349,100,705,849,618,467,657,401,356,326,767,110,776,652,854,186,734,942,912,532
306,651,477,800,114,523,478,917,451,743,279,652,731,355,257,288,772,915,727,275
747,250,390,668,568,949,266,162,721,355,478,464,271,425,305,153,315,935,340,390
305,622,192,395,390,808,455,890,728,431,242,237,177,850,424,728,351,586,319,846
571,235,594,473,216,735,474,529,942,453,846,900,620,795,563,273,758,831,127,323
172,733,585,707,282,674,105,468,357,108,533,245,179,984,393,649,585,191,206,759
791,453,924,728,945,697,354,324,863,181,206,205,893,709,876,430,804,521,582,928
930,293,253,174,843,453,283,765,173,247,369,935,364,337,854,470,593,518,761,861
617,580,656,485,945,895,176,731,280,173,746,774,687,561,162,941,624,926,10,913
359,156,176,272,395,520,513,51,209,272,809,914,707,184,674,470,537,165,848,719
898,672,393,246,872,515,226,571,223,217,238,914,680,290,316,496,565,573,355,259
281,189,577,901,683,523,812,216,913,173,329,75,322,864,795,396,685,673,924,184
251,740,425,349,422,204,681,680,236,466,808,536,218,804,50,561,718,665,263,895
878,623,801,167,653,157,526,776,584,289,441,654,654,798,298,270,465,357,354,287
670,911,690,912,652,519,289,720,311,463,265,219,286,251,232,565,721,736,180,272
894,793,467,871,204,756,73,948,243,804,725,752,772,172,395,100,678,668,435,977
675,687,239,175,720,930,199,656,366,731,695,912,794,182,53,217,852,177,155,713
648,518,715,324,556,784,935,851,468,894,479,759,389,322,299,488,296,272,845,868
575,475,162,918,172,681,857,617,672,558,100,295,615,878,755,720,177,154,4,217
945,262,745,588,588,762,112,484,946,872,857,508,851,403,277,265,159,299,681,526
937,73,710,454,659,174,211,487,358,770,841,562,677,759,485,23,523,523,165,849
732,922,745,525,688,589,655,316,606,839,590,804,756,53,202,295,866,617,483,764
717,920,682,766,739,362,188,342,208,476,873,421,237,470,940,847,526,686,913,280
183,863,18,485,682,304,100,50,581,297,523,340,625,843,672,625,559,351,467,813
167,362,747,559,192,316,517,756,859,797,396,272,732,17,661,594,742,590,218,901
894,285,516,774,251,796,949,625,273,873,152,488,582,300,477,425,700,797,151,676
358,257,566,895,523,729,593,662,767,265,900,922,317,154,899,176,560,349,549,916
240,252,104,844,758,942,909,844,580,561,877,740,227,914,435,922,711,364,172,182
947,281,682,716,664,247,73,158,191,769,433,586,771,626,878,932,796,415,655,273
987,483,511,394,195,101,277,557,470,711,661,318,565,421,866,744,686,903,175,278
562,681,278,618,587,730,540,859,227,275,316,431,245,254,278,863,427,929,437,592
158,198,652,196,935,74,837,310,425,250,682,221,721,180,284,510,217,675,197,466
364,455,680,748,626,317,249,322,456,435,311,435,217,894,318,396,725,665,874,423
235,588,666,267,390,584,366,848,263,364,573,592,937,758,494,727,275,858,425,461
776,350,809,433,152,462,896,281,202,303,782,649,688,177,296,104,52,525,101,808
479,422,933,72,111,928,389,366,653,347,477,681,523,210,485,756,921,690,583,427
712,901,241,461,773,596,486,657,811,367,573,310,268,798,668,582,389,52,279,525
353,662,567,316,841,651,400,247,905,517,471,356,932,183,99,482,239,464,556,209
748,345,587,54,684,247,739,587,767,796,594,776,210,230,913,705,911,211,654,901
773,158,521,322,277,948,800,763,896,529,361,865,869,573,239,558,826,267,593,106
949,167,525,0,580,424,102,530,935,362,251,223,227,717,128,241,750,226,899,757
796,436,529,279,435,312,767,671,229,714,719,529,426,901,803,207,357,793,322,184
854,724,455,232,155,157,335,672,297,306,262,742,793,251,71,203,201,689,660,749
921,659,584,571,217,191,226,99,567,403,720,662,902,858,361,312,475,216,583,282
720,744,479,667,705,361,527,295,10,172,73,934,291,255,705,362,934,559,581,206
750,933,179,67,400,200,425,948,776,240,201,180,71,189,751,680,430,726,569,709
361,851,74,214,933,866,712,686,750,227,191,914,536,322,101,462,678,263,766,389
714,201,227,843,682,103,173,799,578,281,478,151,614,656,197,594,627,721,556,873
806,798,929,243,289,230,656,648,359,302,394,340,903,744,158,675,247,540,556,581
715,813,759,794,244,344,191,844,354,481,573,615,726,234,171,616,710,110,656,285
756,845,483,16,530,557,197,790,202,250,894,691,296,587,795,289,747,220,859,921
51,739,184,298,155,257,73,897,850,871,667,323,865,319,773,715,328,460,235,214
203,760,870,345,153,319,803,469,686,705,714,856,220,433,619,428,755,729,475,281
763,468,361,675,478,222,258,750,482,290,217,767,900,345,583,801,866,185,254,161
515,944,662,297,486,178,401,17,105,584,843,427,569,284,71,427,617,207,746,369
194,510,227,233,651,469,229,914,112,840,578,53,748,401,428,426,747,369,314,935
596,51,878,194,836,211,945,763,278,708,744,948,800,424,63,427,669,740,849,865
241,50,717,658,735,718,424,899,553,656,911,436,715,170,112,579,461,761,305,294
353,401,842,865,842,738,945,129,709,759,532,244,518,895,519,723,866,870,616,588
511,798,294,238,713,204,290,619,186,580,652,389,357,496,594,355,523,931,792,684
324,672,253,271,273,687,859,712,802,160,605,718,164,573,665,239,255,318,254,521
230,288,280,666,279,190,929,421,558,706,833,725,190,435,389,843,353,128,810,358
154,681,359,425,762,400,571,927,536,591,753,471,320,487,718,483,349,770,657,185
204,103,761,708,240,263,101,565,853,933,518,346,429,717,438,558,840,474,654,300
654,463,911,792,187,182,518,175,933,207,517,849,473,934,394,539,473,203,518,855
105,655,913,183,621,945,798,616,420,870,400,911,481,422,170,254,214,73,364,158
753,867,292,160,687,174,589,560,661,711,519,175,899,308,459,823,873,867,671,653
128,716,946,278,580,235,657,363,98,428,521,474,649,105,927,858,154,937,604,218
589,150,940,71,263,741,352,648,800,680,566,530,465,457,420,287,712,173,170,223
274,735,596,900,662,321,486,241,767,154,725,617,99,918,264,201,557,782,751,429
943,334,457,518,475,438,159,948,741,308,247,236,591,186,938,273,723,187,307,583
807,931,720,195,238,304,167,406,170,734,593,349,212,797,893,937,392,842,399,252
586,281,152,294,876,266,911,189,183,927,141,160,283,181,927,753,478,488,470,427
916,112,103,282,356,159,901,723,153,808,762,936,194,942,153,110,686,3,250,678
395,762,281,996,765,239,239,516,278,864,623,178,483,709,529,240,804,560,482,231
666,857,581,290,913,770,366,584,877,648,474,937,193,865,721,875,907,283,863,560
595,928,926,207,840,423,573,801,280,292,905,427,716,741,776,574,716,430,192,293
269,536,562,765,689,170,72,402,198,760,864,307,765,99,255,867,868,713,948,479
97,837,243,649,192,708,856,58,711,190,426,716,582,649,877,269,187,616,679,903
893,215,71,485,667,900,911,930,163,660,308,352,214,933,916,203,494,340,946,483
154,435,728,843,856,928,483,167,936,735,244,861,175,560,917,464,167,160,891,458
807,722,567,719,874,690,154,657,874,755,586,838,482,431,857,760,870,680,473,982
859,469,806,422,562,795,176,568,353,291,896,776,863,866,154,587,928,902,655,10
772,813,253,806,237,610,774,947,104,360,460,425,100,806,597,174,726,50,531,687
762,176,530,864,306,212,915,153,249,746,552,917,303,261,525,842,752,569,686,876
513,105,531,799,856,725,252,948,285,217,722,741,165,727,333,176,866,114,922,925
304,194,583,275,872,930,72,424,75,470,847,876,922,300,148,234,570,527,525,691
296,74,390,437,877,823,902,758,683,578,688,872,868,768,728,937,867,863,298,255
743,867,292,595,932,587,915,763,808,249,242,594,717,466,874,896,724,535,167,980
153,722,184,903,227,460,770,755,732,209,60,756,684,422,187,467,616,840,322,858
618,928,105,454,355,622,424,306,522,936,866,320,357,943,702,302,156,318,369,455
649,501,403,532,844,585,255,112,799,162,430,846,650,689,810,947,871,707,737,353
561,568,620,571,290,725,857,781,895,456,459,844,453,52,690,303,394,262,360,246
156,761,751,730,257,109,293,947,153,758,316,203,855,259,170,581,574,925,439,234
249,574,368,111,708,936,895,524,720,765,806,658,586,841,998,687,275,896,217,929
814,768,617,484,275,751,321,649,784,848,155,272,776,692,206,200,319,296,921,219
940,576,350,841,661,754,662,930,980,593,706,323,395,930,153,246,920,360,276,916
808,306,736,191,565,152,626,820,357,716,471,871,569,563,940,480,791,914,356,911
393,875,758,173,662,455,804,934,508,893,523,252,159,435,290,747,462,307,859,469
112,430,356,866,264,502,218,256,533,770,431,654,108,763,562,288,746,159,751,238
758,649,526,102,157,298,248,160,286,682,304,424,301,255,474,615,367,999,516,71
233,403,724,741,235,166,512,639,212,895,627,350,398,814,922,665,619,918,112,727
853,224,999,431,796,839,479,280,894,193,520,922,397,318,127,927,291,903,580,854
177,653,401,575,623,369,677,238,742,228,483,252,239,453,390,16,438,674,596,838
685,318,872,152,809,653,686,126,477,533,718,925,105,624,473,925,764,213,511,368
803,107,809,903,706,218,697,321,236,857,657,848,294,750,186,74,208,765,237,369
594,323,735,764,688,210,279,353,840,842,263,915,235,940,511,342,73,920,278,899
210,570,753,679,807,524,761,181,732,295,585,200,191,657,554,927,487,765,752,473
463,229,183,721,432,114,72,106,343,791,838,354,927,740,688,746,535,560,150,870
793,732,811,572,679,228,574,168,919,280,589,6,296,477,352,283,523,284,203,370
867,466,757,735,473,763,579,543,737,560,516,392,398,299,318,194,234,915,558,223
512,705,690,365,939,393,581,192,914,357,865,106,858,725,840,105,863,467,118,681
250,464,362,993,712,712,626,897,914,256,218,169,848,425,228,841,739,295,671,233
753,268,756,286,224,678,181,183,254,360,423,604,534,216,235,222,423,914,471,365
620,238,587,295,771,836,251,159,685,795,206,533,299,230,773,598,352,682,898,937
244,274,430,751,814,675,676,276,97,913,294,454,72,513,533,773,301,360,336,308

12
input/day16_example.txt Normal file
View File

@@ -0,0 +1,12 @@
class: 1-3 or 5-7
row: 6-11 or 33-44
seat: 13-40 or 45-50
your ticket:
7,1,14
nearby tickets:
7,3,47
40,4,50
55,2,20
38,6,12

11
input/day16_example2.txt Normal file
View File

@@ -0,0 +1,11 @@
class: 0-1 or 4-19
row: 0-5 or 8-19
seat: 0-13 or 16-19
your ticket:
11,12,13
nearby tickets:
3,9,18
15,1,5
5,14,9

8
input/day17.txt Normal file
View File

@@ -0,0 +1,8 @@
..##.#.#
.#####..
#.....##
##.##.#.
..#...#.
.#..##..
.#...#.#
#..##.##

3
input/day17_example.txt Normal file
View File

@@ -0,0 +1,3 @@
.#.
..#
###

373
input/day18.txt Normal file
View File

@@ -0,0 +1,373 @@
(4 + (2 * 7) * 4) + (6 * 9 + 8 * 4 + 7 * 3) * 3 * 5
5 * 9 + (5 * 9) * (6 + 2) + 3 + 7
8 + 5 * 9 * 9 + 9 + 5
(7 + 9 * 8 + 4 * 6) + 6 * ((9 + 9 + 5 * 7 + 4) * 8 * 2 + 5 * 6 + 2) + 2 * 6
(6 * (5 + 8 * 7 * 8 + 4) * (7 + 7 * 3 * 5)) + 5 * (8 + (8 + 3 + 5 + 5) + (3 + 2 + 7 * 2 * 9) + 6 * 5 + (2 * 6)) * ((4 * 3) + 3) + 9 * (3 + 6 * 2 + 3 * 8)
2 * 9 + (6 * 2 + 6 + (9 + 6 + 8 + 5 + 5) + (8 + 7 * 4 + 3) + 8) * (4 + 4 * 2 + 6)
5 + 4 + 5 + (7 + (9 + 7 + 4 + 4 + 4 + 5) + 2 * 4) + 4 * 9
9 + (7 * 8 + (6 + 3 + 4)) + (5 * 9)
2 * 4 + 8 + (5 + 8) * 9 * (9 + (5 + 3) + 3)
8 * 6 * 5 + 8 + (8 * (2 + 8 * 7 * 5 + 3 + 5)) * 2
6 * ((3 + 4 * 3 * 7 * 8) * 8 + (9 + 5 + 2 * 3) * 3 * 2) + 7 + 8 * 8 + 4
9 + 3 + 7 * 8
(9 + (4 + 9 + 3 + 5 * 5 + 5) * 5 + 9 * 6) * 3 * 2 * 6 * 5
7 * 9 * 6
(5 + 2 * 8) * 8 + 3 + 8
9 * 5 * (5 + (5 * 4 + 8 + 6 * 5) * (9 * 7 + 5)) * 3 * 9
(6 * (8 * 3 * 7 + 2) * (3 + 9 + 5 + 5) + 3) + 7 * 3
7 + 9 + (4 + 9 * (4 * 6 + 3 * 8 * 5) + 8 + 9 + 3) + 6 * (6 + 8 + 7 * 9 * 6 + 6) + 7
2 * (5 * 5 + 6 + (5 + 5 * 5 + 6)) * 4 + 5 + 2
8 + 2 * (8 * 7 * 4 + 8) * 9
9 + 5 * (4 * 8 + 9 * 6 + (3 * 3) + 2) + 5 + (4 * 5 + 2 * 2)
(5 * 7 + 2) + 3 + 9
7 * 9 + 8
3 * 7 * (7 + 5 + 8 * 5 * 8)
(7 + (3 * 6 + 6 * 9 + 2) * 8 * 6 + 6 + 2) * 6
4 * (7 * 5 * (6 + 8) * 7 * (5 * 3 * 2 * 9 + 2 * 4) * 6) * 2 + 2 * 5
((3 * 3 * 9 + 8) + 2 + 5 + 8) + 6 * (6 + 9 * 2) + 7 * 9 * ((9 + 4 + 4) * 4 + 4 + 9)
7 * (4 * 2 + 3 + 7 + 5) * (8 + 2 + (5 * 9) * 2 + 3 * 5)
7 + (8 + 3 + 8 * 4 * 2 * 2) + 7 * 2 + ((3 + 5 * 3 + 5) * 8 + 3) + 8
7 + 2 + 9 * 9 + 5
((6 + 4 + 2) * 2 + 9) + 3 * 6 * (6 + 4 + 9 + 2 + 6) * 9
6 + 6 * (9 * 9 + 6 + 6) + 2 * 6
2 + 5 * ((4 * 4) * 6) + (3 * 3 + 2) * 9 + 5
9 * 4 + 8 * 5 * ((6 * 5 * 4) + (3 + 8 * 7 + 6 * 7) * (6 * 6 + 7) * 8 + 4 + 7)
3 * 8 + (4 + (7 * 7 + 9 * 8 * 6 + 7) * (8 * 4 + 4 * 6 * 4 + 4) + 2 * 9)
3 + 6 * 2 * 3 * (4 + 7 + (3 * 6 + 7 * 8) * 7 + 9 * 8)
2 + 8 + (5 * 4 * 2 * 5 + 5) * 4 + 3 * 4
6 + 4 + (5 + 5)
6 * 3 + 8 + (8 + 2 + 9 * 3) * ((6 * 8 + 6) + 6 + (7 * 4 * 3) * 4 + 9 + 3)
((9 + 7 + 9 + 2 * 7 * 7) + 8 * 6) + 2 + 7
6 * (6 + 9 * 2 + 4 * 7 + 8) + 5 * 9
((2 + 5 + 6 * 3) + 7 + (7 * 6 * 8 * 3 + 8 * 3)) + (8 * 6 * 8 * 9 * 5)
6 * 7 * 5 + 5 * (2 * 9) * 4
(8 * 7) * (2 * (7 + 3) + 3) + 8
(7 * 9 + 7 + 7 + 7 + 7) + (7 * 5 * 8 + 4 * 5) + 6
5 * (6 * 7 * 8 * 5) * 6
5 * (2 + (6 * 7) * 8 * 3 + 6 * 2) + 2 * 4 + 8 + 3
3 * 5 + 6 + 6
((9 * 9) * 6) + (4 + 9 * 6 + 4 * 9 + 7)
(3 + 9 + 2) * (3 * 7 * 7 * 7 * (8 * 8 * 4 + 3 + 8)) + 2
6 * 6 + 8
((9 + 5 + 8) + 9) + 7 + ((9 * 5) * 3 * (3 * 4 * 4 + 3) * 7) + ((5 + 6 + 2) * (7 * 2 * 9 * 8) * 5)
6 + (8 * 7 * 6 + 5) + 9 * 7 * 7 * 7
2 + (4 * 9 * 3 * 9 + 8) + 2 * 7 * 3 + 4
7 + 3 + (5 + 7 * (4 + 4 * 8) + 2 + 8 * 6) * 2
(2 * 5 * (4 * 7) * 9 * (3 + 7)) + 3 * 4 * (2 * 3 * 8 * 4) * ((6 + 2 * 2) + (6 * 5 * 7 * 6) + 9 * (8 + 4))
((9 + 3 + 5) + 8) * 2
2 + 4 + 7 + 5 * (6 * 7 + 8 * (4 * 3 + 6 * 4 + 7) * (7 + 3 + 7 + 3 * 2) + 8)
5 + (9 * 8 + 5)
(2 + (9 + 7 * 8) + (6 + 7) + 6) * 5 + 3 * 2
7 + (9 + (8 * 7 * 9)) * 8 + 3
9 * (9 + 4 * 2 * 3 + (6 + 7 * 8 + 9)) + 6 * ((7 * 4 + 7 * 4) + 2 * 6 * 5 + 6 * 6)
((3 * 3 + 4 * 9) + 7 + 7 + 3) * 8
9 + 8 * (2 + 6 + 8 * 6 + 3 + (8 * 6 * 6 * 4 * 6))
3 * (9 + 2 * (9 + 2 * 8) + 3 + 8 * 5) + (9 + 8 + (6 * 9 + 2 + 8 * 5 + 7) * 7) * 2
((2 + 9) + 3) * 6 * 2 * 2 * 4 + 7
2 * 3 + 4 + (7 + (7 * 5 * 5 + 5) * 9 + (3 + 3 * 5) + 3 * 8)
4 * (8 + 2 + (3 * 7 + 4 + 2 * 6 + 2) * 8 + 7)
4 + (5 * 9 * (8 + 3 * 9 + 9 + 5) * (3 * 8 + 9 * 8)) * 8 + 9
4 * 5 * (2 + 2 + 7 + (3 * 7 * 4 * 2) + 3) * 6
((8 * 8 * 4 + 4 + 5) + 6) + 9 * (3 * 3) * 4
9 * (8 + (6 + 2 * 7 + 3 + 8 * 8) * 3 * (9 + 3) * (3 + 7 * 3) + 5)
9 * 3
6 * (7 + 8 * 8 * 4) * 6 * 9 + (4 * 7) * 4
4 * (3 * (4 * 9 * 6) + 5 + 5) * 4 * 6 * 6 * ((9 + 3 * 6 + 5 + 8) + 4)
5 * 2 * (4 * 3 + (8 * 4 + 2 + 2) * 6 * (8 * 8 * 2 + 7 + 9) + 3) * 5 + (4 + 6)
3 + (5 + 6 * 5 * 9) * 9 + 7
((3 + 6 + 8) * 7 * 3 + 4 + 4 * 8) * 2 * 2
2 + ((9 + 9 * 4 + 2 + 3) * 4 + 9 + 5 + (7 + 3 * 9)) + 8 + 7 * 3
5 * 5 * (5 * 6 * 6 + (3 + 4 * 8 + 7) * 2) * 6 + 4 + 3
4 + 3 * (5 + (6 * 5 + 6 * 2) * 4) + 9 + 7 * (5 * 5 + 9 * 5)
2 + (6 * 7) + 7 + 3 * 7
5 * 7 * (6 + (9 * 5)) * 4 + 2
((7 * 7 * 3) + 2 + 2 + (9 + 8 + 3)) * (3 * 8 + 6) + ((6 + 2 * 6) * (2 * 4 + 3 + 8 + 2)) * 8
((8 + 3 + 8 + 5 + 8 * 3) * 2 + 4 * (6 + 4)) * 8 * 2 * 5 + 9
7 + 6 * 3 + 3 + (5 * 7 + 3 + 3 + 8) * 6
8 + 7 + ((5 * 9 * 3 + 3 + 4 + 6) + (6 * 6 + 2 + 6) + 8)
5 + 5
6 + (6 * 5 * 7 + 8)
(8 + (9 + 2 + 8 + 2 + 2) * 4 + 7 * 6) * 9 * 6 * (6 * 6 * 5 + 5 * 4) + 7 + 9
3 + 8 + (3 + (6 * 9 + 9 * 2 * 3 * 4) * 3 + 9 * (4 * 2) + (3 * 2 * 9 + 2))
(5 * 8 + 7 * 8 + (2 + 3 * 8) * (8 + 4 * 7)) * 3
8 + 2 * (2 + (6 * 6 + 9 * 3 + 6) + (9 * 2 * 4) + 6 * 4 * (6 * 3 + 2 + 6 + 3 + 5)) + 8 + 4 * 9
8 + 8 + (4 * 9 + 9)
5 + 5 * (5 + 8 + (3 * 9 * 9 + 8 + 8 * 2) * 5) * (8 + 7 + 7 + 8 + (2 + 7 * 4 * 8))
6 * 3 + 6 + ((9 * 5 * 4 + 6 + 5 + 5) * 6) * 2 + (6 * 5 + 5 * 7 * 8 * (3 + 7 * 7 * 9))
4 + (3 + 4 + 5 * (4 * 2 + 7 * 9 + 6 + 6)) + (7 + 7)
2 * (6 + 2 + 6 * 3 + 4) + (6 + 5 * 4 * 8 + 3 + 7) + 8 + 3 * 5
((5 + 3 + 7 * 2 + 9 * 5) + 7 * 7 * (4 + 7 + 9) + 8 + 6) + 3
((9 * 9 + 2 * 7 * 5 * 6) + 8 * 7 * 4 * 2 + 6) * 5 * 9
((3 * 3 * 2 + 5 + 6) * 7 + (3 * 6 * 2) * 3 + 3) + 9 * 7 + 5
(7 + (4 + 7 + 6 * 8 + 9 * 9) + 7 * 2 * 2) * 7
(9 * 3 * 9) + ((2 * 6 * 6 + 9 * 7) * 3) + 3 + 8 + 8
2 + (3 * 5) * (2 + 8 + 8 * 3 * 6 + 6) * 6 * 9
(4 * 7 * 7 + 3 + 4) * 3 * 9 + 6 * (2 + 5 * 4)
(8 * 4 + 3 * 8) * 4 * 5
(7 + 5 + (4 + 2) + 4) + (2 * 5 * 9 * 2 * 6)
9 * 4 + 3 + 8 * (2 * 4 + 7 * 2 * 2) * (2 + 6 + 5 + 9 + 5)
8 + 3 * (6 * 8) + (2 * 4 + 7 * 8)
(9 + 6 + 3) * 5 + (9 * 8) * 5 + 6 * 5
((6 * 2 + 6 * 2) + 3 + 7 + 5 * 8) * 2 + 2
2 + (9 * 3 * 9) * (4 + (6 + 4 + 7) + 5) + 9
(3 + 4) + 5 + 7 + 7
9 + 8 + 8 + 7 + 5 + ((2 + 7 * 9 * 7 * 6 * 9) * 8 * 8 + 7 * 3 + 9)
(8 * 7 * (8 * 7)) * 9 + (4 * (4 + 9) * (7 * 9 + 9 + 6 * 5 + 5) + 7)
(6 + 7 * 9 + 5 + 5) * 5 * (2 + 6 + (3 * 6) + (7 + 3 + 5 * 5) + 9)
2 + ((7 + 8 * 2 + 8) * 4 + 2) * 9 * 9 + 8
8 * 8 * 7 * 2 + 2
7 * 2 + 9 + ((5 * 2 + 6 * 9 + 8 + 7) + 6 * 2 + 8 + 4 * (3 * 2 * 3 * 2))
5 * (7 * 5 + (7 * 9) * 4 * 6 * (8 + 7 + 3 + 9 + 9)) * 4
8 * ((3 + 7 + 5) + 7) + 5 + (6 + 4 + 6 + 4 * 4) + ((2 * 6) * 3) + 9
3 * 3
4 * (5 + 5 + 6 + 2 + 7) + 7 * 6
(7 + 4 + 5 * 9 + 5 + 8) * 8 * (7 * 9 * 9) + 4
3 + (9 * (7 * 7 + 3 * 4 + 8 + 5) * 7 * (2 * 4) + 9 + 5) * (4 + 7)
6 * (5 * (6 * 2) + 6 + (4 * 8 + 9) + 3 * (2 * 4 + 4)) * 6 * 5 + 6 + 3
(9 * 3 * 9) * 8 * 5 * (8 + 3 + 2 + 9)
(8 + 8 * (8 * 9) + 2 + 7) + 8 * (5 * 7 + 6 + 2 * 4 * 2) + 6 * (3 * 8 + 6) * 2
2 * (8 * 5 + 7) * 8 + 7 * 9
4 * 4 * (5 + (5 * 4 + 2 * 9 + 5 + 7)) * 8 * ((4 * 9 + 4) + 6 * (7 + 2 + 4 * 8 * 9))
4 * 6 + (4 * 8 * 3 * (9 + 8) * 7 * 9)
(6 + 9 + 3 * 2 + 8 * 8) * 6
(8 + (3 + 3 + 2 * 3) + (6 + 7 * 6) + 7 * 4 + (9 * 5 * 4 * 6 + 2)) * 2 + 5
4 * 6 + 2 * 5 * 2 + (5 + 3 + 2 + (5 * 3 * 3 + 7 * 6 + 2) + 8)
9 + 2 + (7 * 7 + 7 + 9)
5 + 8 + (8 + (5 + 9 + 6 * 2 * 4 * 4)) * 9
(2 + 4 + 8 + 7 * 8 * 5) + 3 + 3 + (9 + 9 + (9 * 2 + 6 + 4 + 4) + 6 * 2) + 2
7 + (6 + 5 * 2 * 9 + 7 + (9 + 7)) * (3 + 6 + 2 * 5 * 3)
8 + (9 + (4 * 3 * 7 * 7) * 7) + 9 * 6
6 * 9 * ((8 + 5) + 9) * 7 * 8
(2 * 9 + 2) + (6 * 3 * 3 + 6 * 7 + 9)
7 * 5 * (4 * 4 + 7 * 4 + 8 + 3)
3 * (6 + (5 + 3) + 5) * 3
(7 * (9 * 5 * 9 + 2 + 4) + 3 * 8 + (9 + 7) + (2 * 9 + 5)) * (6 + 3 * 9 + 3 + (7 + 4 * 9 + 5) + 9) * (8 * 2 + (2 * 9 + 7 + 5 * 4) * 4)
4 + 7 + 5 + 6 * 8
5 + 4 + 3
9 * (6 * 2 + 7 + 5) * 3 * 2 * 2
7 * 4 + ((6 * 7 * 6 * 8 + 6 * 9) * 7 * 3) + 8
9 * 5 + 4 + 8 + 8 * 8
(3 + 6) * 2 * 7 * (2 * 7 + 2 + 6 + 3)
5 * 2 + 8 * 7 + (4 + 8 + (3 * 6 + 7 * 2 + 4 + 7))
6 + (8 + 6 * (9 * 7 + 2 + 2 + 3 + 4) * (4 * 7 + 2 + 4 * 3) * 3)
(8 + 5 * 2) * (9 * 4) + 5
3 * (4 * 5 * (4 + 3 + 4) + 5 * (3 + 6 + 3 * 7 * 7)) * 3
2 + 7 + (8 + 3) + 8
8 * (9 * 8 * 3) + 4
(2 * 6) * 3
((9 * 6 + 3 + 3 * 9 + 7) + 2 * (2 + 9 * 8 + 2 * 4) + 9 * 8 + 6) + (5 * 9 * (2 + 7) + 7 * 9) + 7
4 + 7 * ((3 * 7 + 2) * 9 * 7 * 2 + 4 + 3) * 4 * (3 + 8 * 9) + 6
9 * (9 + (9 * 6 + 2 * 7 + 6) + 7 * 2 + 2)
(9 * 2 + 4 + 8 + 6 * 8) * (4 + 8 + 7) * 5 + (4 * 2 + 2) * ((4 * 5) * 8) * 2
(5 * 9 + 9 + 2) * 3 + ((7 * 5 + 9 * 3) + 2 + 3 + 6 + 7) + 4 * 6 * 6
9 * 8 + 3 * 4 * (9 + 5 + 7 + 5) * (6 * (7 + 4 * 6 * 7) + 6 * (6 * 5 * 3 + 9 + 4) + (2 * 3 + 3 + 6))
7 * 6 * 2 + (8 * 9 + (6 * 7 * 8 + 6 + 9 * 8) * 3 + 6)
5 + 7 * 8 + 2 + ((2 + 4) * 7)
2 * 5 + 6 * 6 * (3 * 6)
6 * 6 * 6 * (6 * (4 * 4 + 5) * 4 + 3 + 9) + 4
((3 * 4 * 7) * 5 * 9 + 7 * 6 + 5) + 2 * 2 * 6 + 4 * 8
7 * 2 * (3 + (6 * 9 * 9) * 4) * (5 * 8 * 7 * 6 + 2 * 9) * 7
9 + (6 + 6 + (8 + 8 * 3 + 6 + 6))
5 * 2 + 7 + 3 * (9 + 9 * 9 * 9 * (4 * 4)) * 2
4 + 6 + 3 + (2 + 2 * 7 * 2) + 5 + 7
7 * 9 * 9 * 2 * 4 + 7
6 + (6 + 5 + 5) + 7 + 4
9 + (9 * (7 * 3 + 9 + 7 + 8 * 8) * 6 * 5) + 2 * 5
8 + 6 * 8
8 * (9 * 6 + 4 + 8 + 8)
((8 + 3) + 8 * 2) + (3 * 6 * 7 + 7 + 4 + 2) * 9 * 5
6 * (4 * 5 + 6 * 7 * 4) + (2 * 8 + 4 + 7 + 7 + 6) + 9 + 5
9 * 8 * (2 + 7 + 9 + 4 + 5) + (8 * (3 * 8 + 3 * 6)) + ((7 * 2) * 7) + 2
9 + 4 + 9 * 2 * (5 * 2 + 6 + (9 * 5 + 8 + 2 * 5) + 6 + 6) + 7
9 + 9 * ((3 * 6) + (5 + 5 + 7 * 9 * 4 + 9) + 2 * 6 * 6) * 5
(9 * (3 * 2) + 8 * 2) * (6 * (8 + 3 * 8 + 5 * 5 * 9) + 4 + 9 * 6) * 5 + 9 * 6
7 * 9 * (2 * 9 + 4 * (3 * 2 * 6 * 9 + 5 + 6) + 2) + 7 * 6 + 3
9 + (5 * (3 * 9) + 4 * 6 + 6) + 9 + 8 * 5
8 + 8 * 8 + (9 + 4 * (5 + 3 * 8 * 3 * 4 * 4) + 2 * 8 * (9 * 6 * 4 * 6 + 9))
(6 + 6 * 3 + (5 + 8 * 4 + 4) + 3) * (3 + 7) * (6 + 5 * 4 * 6 + 6 + (5 * 7))
(9 + 7 + 6 + (8 * 8) * 4 * 6) + 3 * 5
5 * 2 * 3 + (3 + (6 + 9 * 2) * 3 * 3)
2 + (8 * 7 * (4 * 8 * 2 + 6 * 7)) * 5 + 5 + (8 * 5)
9 * 6 * 4 * 2 * ((6 * 3 + 9 * 8) * 5) * 3
((8 + 6) + 6 * (8 * 5 * 5 * 7) + (2 + 9 + 6 * 7) * 7 * (2 + 9 * 7 * 3)) * ((7 * 5 + 2 * 5) + (8 * 7))
(7 + 8) * 6 * 9 + 6 + 6 * 8
7 * 8 + (8 * 2) * 7 * 8 * 9
9 * ((8 + 6 * 9 + 2 + 3 * 2) * 2 + 4 + 3 + 7) * 2 * 6
2 + (8 + (2 + 9) * 7 * 4 + (8 * 6 + 8 * 6 * 4 + 5) + 6) + 4 * (9 + (3 + 4) * (3 * 9 * 7 * 6 + 9 + 7) + 9 * 6 * 3)
2 + (8 + (8 * 2 + 3 * 8 * 4 + 2)) + 3 * 6
(5 * 5 + (3 + 5 * 6 * 9 + 4 * 4)) * 8 * (7 * 7 + 3 * 7)
9 + 6 * (9 * 2 + 2 * (9 + 6 * 8 + 5 + 3))
5 * 5 + 5 * (7 * 3 * 3 * 5) + 6
7 * 5 * 7 * ((6 * 3 + 5 * 8 * 6) * 7 + 4 * 5) + 7
(5 * 4 + 8) * 3 + 6 + 9 + 6
(7 + 7 + 4 + 8) * (2 * 7 + 9) * 2 * 4
2 + ((7 + 2 + 9 * 4 + 2) * 6 + 9)
9 + 2 + (7 + 6 + 4) * 3 * 8
5 + 7 * 2 + 2 * (3 * 4 + 4 * 6) + 2
2 + (7 + 2 + (9 * 3 * 5 + 7 + 7) + 5 * (7 + 7 * 2 * 4 * 7 * 4) + 5) * (6 + 2 * 5 + (4 * 6 + 4 * 8 * 4) + 7) * 2 * 5
((5 * 9) * 9) * 2 + 4 + ((3 + 6) + (9 + 3 + 6 + 3) * 3 * 5 + (9 + 9 + 6 * 7) + 7) * 2 + 9
4 + (4 + 4 + 6) + 6 + 5 * 9 + 8
(3 * 8 * (7 * 5 * 7 * 5 * 7 + 2)) * 7 * 4 + 3 + 2 + 4
(4 * 8 + 7 + 8 * 5 * 9) + 2 * (5 * 2 * 3 * 9) + 7 + 7 * 2
6 * 3 * (4 + 6) + 7 + 2
(5 + 4 + 4 * 8 + (4 * 6 * 5 + 7 * 4 * 2)) * 9 * 6 * 6 * (3 + 5 + 9 * 7)
4 * (5 * 2 + 8 * 9 * 3) + 3
7 * 3 + 7 + 5 + ((6 * 8 * 8 + 8 + 2 * 4) * 8 * 2 * 9)
4 * 2 + 6 + 2
(2 * 2 + 2 * 9 * 6) + (5 + 9) * 3 * 9 * 5
(5 + 5 * (3 + 3 + 7) * (3 * 7 * 7)) + 4
9 + 7 + 9 + 5 * 6
(6 + 9 + (4 + 7 * 7 * 4) + (9 * 2 + 9 + 5 + 6)) + 7 * 8
5 + (5 * (6 * 5 + 8 + 2) + (4 * 7 * 4 * 7 * 7 * 8) * 8)
4 + (6 + 6 * 2 + 9) + 7 * ((3 + 8) * (3 * 5 + 5 * 3 * 3 * 6) + (4 + 9 * 3 + 3 * 2 + 9))
(7 * (7 + 7 + 5) * 8 * 2 * 8 + 3) + (2 * 4 + 8 * 7 + 3 + 2) + 7 * (7 + 2 + 2)
(3 * 7 * 4) * 5 + 4 * 7 * 8 * 4
7 * 3 * (2 * 7 * 9 * 7 * (8 + 4 + 2) * 3) + 7
7 * (9 + 2 + 5 + 5 + 7 * 5)
5 + 2 * 9 * (8 * 6 * 8 + 2 * 7)
4 + (2 + (2 * 5 * 7 * 5) + 3 + 6) + 8 * ((3 + 4 * 4 + 5 * 3 + 6) + 2 + (5 * 8)) + 8 + 3
2 * (9 * 7 * 3) + (8 + 7 + 8 + 2 * 3 + 9) + 8 + 9
8 * (7 + 5 * 3 + (2 * 6 * 6 * 4) + 9) + 3 * 4
3 + 4 * 8 * 9 + (6 + (5 + 7 * 7 * 4)) + 7
(5 + 6 + 8 + 5 * 7) * 2 + 5 * (9 * (9 * 9 + 8 + 5) + 7 * 4)
8 + (8 * 2 * 4 * 2 + 3 * 2) * (3 * 3) * 6 + 8
(6 * 2 * (6 + 5 * 9 * 3) * 6 * 2 + 7) + 7 * 8 + 2 * 4
5 + (2 + 4 + 5 * 4 + 6) + 9 * (5 * (5 + 9) * 9 * 9 * 2 + 8) * 5
7 * 4 + 9 * (9 + (5 * 7 + 8 * 7 * 5) + 9 + 2 + 2 + (2 * 4 * 7 + 5))
7 + 2 + (4 + (8 + 8 + 5 * 9)) + 9
(8 * 3 * 9 + 6) * 8 + 8 + 7
(2 + 3 * 9 * 4) * 7 + (8 * 6 * 9) * (8 + 6 + 9 + 4)
((7 * 6 + 4) + 6 + 6) + 5 * 4 + 3 * 4
5 * (2 + (3 * 9 + 9 * 6) + (7 + 3 + 2 * 4 + 9)) + 7 + 8 * 5 * 5
7 * 9 * (5 + 6 + (7 * 6) + 4 + 4 + 3) * 2 + 9
(3 * 2 + 5) * 8 * (2 + 4 + 2 + 8 + 7 * (8 * 9))
((2 + 7 * 8 * 9) * 4 * 3 + 6 * 7) + 9 * 8 + 5 + 9
5 + 4 + 9 + 8
7 + 7 + 9 + 2 + 5 + ((6 * 3 + 3 + 6) * 4 * (4 + 4))
(9 * 4) + 8 * 4
3 * 9 * (9 + 5 * 4) + 8 + 9 * 3
3 + (9 * 8 * (6 + 4 + 6 + 5 * 2) + 9 + (4 * 7 * 7) + (3 + 4 + 6 * 8 + 9)) * (2 + 8) + 7 * 5 * 6
9 + 6
6 * 8 * 8 + 6 * 6 * ((9 + 3) + (4 + 2 * 8 + 8 * 2 + 5) * 2)
4 + (4 * (2 + 2)) + 7 + 4 + (4 * (8 + 8 + 4 + 4 + 2) + (3 + 2) * 9 + 8) + (4 + 9 * 9)
(2 * (3 * 7 + 6 + 2)) + (4 * 6) + 6 + (6 + 9 + (2 * 2 * 2 + 6 + 4) * 4) * 5 + (4 + 2 * 5 * 8 + 6 * 2)
4 * ((5 + 5 + 9 + 3 * 5) * 7 * (7 + 9 * 5 * 7 + 2) + 5 * (4 + 7)) + 7 * 9 * 6 * 4
4 * 7 + 4 + ((4 + 8 * 6 * 3 + 2) + 3 + 8 * (6 * 7 * 2 * 8) * 7) * 9 + 6
4 * 6 * ((3 * 6) + 4 + (2 * 2 * 2 * 7) + 9 + 8) * (3 + 8 * 2 * 4 * 2 * 3) + (4 + 3 * (7 + 5) + 6 + 9) + 5
(7 + 2 + (8 + 6 * 4)) + 8 + (7 + 5 + (2 * 5 + 9) * 5)
(7 * 8 + 5 + 8 + 8 * 2) * 6 + (5 + (8 + 3 + 4 * 5) * 9)
8 * (4 + 5 * 9 + 6 + 8 * 7) * 3 * 6 + 4 * 5
6 + ((6 * 3 * 4) + (8 * 8 * 2 * 5 * 8 + 2)) + 3
9 * 3 + 6 + 5 + ((5 * 2 + 9 * 5 + 6) + (4 * 9)) + (4 * 2 * 3 + 7)
6 + 8 + (6 + 2 + 8 + 2) * (5 + 8 + 5 * 5 + (4 + 9 + 3))
(2 * 7) + (6 + 4 + (8 + 6 + 5 + 9 * 4 + 7))
8 * 3 + 3 * (3 * 5) * 6 + 2
9 + 4 + ((5 * 4 + 2 + 6) + 5) * 5 + 6 + 4
(9 * 9 * 3 + 5 * 3 * 4) * 3 + (2 + 3 * 5 + (3 + 6 * 6 + 2) * 8 + 3)
(6 + 9 * 9 + 7 * 6) + 7
4 + 6 * (3 * 3 * 7 * 7 * 5 + 2) * (7 + 7 * 2 * 5 + 4 + 9) + (8 * 2 + (8 + 8 * 4 + 7 + 3 + 5) * 7) + 9
4 + 8 + 6 * 7 * 7 + (2 * 8 + 3 + 5)
4 * 8 * 4 * (9 * 9 * 5) + 9
8 * 5 + (2 + 3 + 2 + 8 * (3 + 5 + 8 + 7 * 9))
3 * ((8 * 6 + 9 * 8 * 5) + 9 * 6 + 6) * 6
5 * 8 + 6 * (5 * 2 * 8)
8 + (6 + 7 + 7 * (6 + 7 + 3) * (5 + 2 * 7) + 7) + (2 * 8)
6 + 5 + 4 + 2 + ((3 + 8) * (5 + 4 * 9) * (4 + 9 + 3 + 9 + 9 * 7) + (5 + 2 + 9 + 3) + (6 + 6) + 3)
3 * (2 + 5 * (5 * 6 * 5 + 9) + 9 * 5) * 8 * 5 + 4
2 * 4 + 6 + (9 * 4 * 3 * 4)
(4 * 6 * (3 + 9) + (3 * 5 + 8 * 5 * 9) + 6) + 9 + 8
(3 * 5 + 8) + 8 * 8 * 7 + 8 * (9 + 6)
(5 * 4 * 6 + 3 + 3) * (3 * 8 * (7 + 2 * 9 * 6)) + ((9 * 9 * 4 + 8 * 7 * 7) + 4 * 4) + 8 * 6
3 + 5 * 5 * 6 * ((3 + 3) * 8 + (6 + 9 + 2 + 6 * 7)) * 4
9 + ((4 * 7 + 2 + 2 * 6) + 8 * (4 * 6 + 7 * 5) * 7 + 4) + 6 + 6
(9 + 9 * (8 * 2 + 9 + 5) * 3 * 4 * 4) + 5 * ((3 + 6 * 3 * 7) + 6 * 4) * (3 + 8 * 9 + 6 + (4 + 3 * 4 + 2) + 6)
5 * 5 * (9 + 8 * 3 * 3 + 3) * 4 + 8
3 + (6 * 9 * 8) + 9 + (3 + 3 + 2 + 5 + 2)
3 + 4 * (4 * 8 + 2 * (3 + 3 + 4 + 9 * 7) + 4 + (6 + 9 + 4 * 6 + 9))
6 * 5 * 9 * ((6 + 9 * 6 + 7) + (6 * 4 + 2 * 4 * 6 * 6) + 9 + 6 + 8)
7 + 7 * 2 * 4 + 7 * 2
2 + 8 * (7 + 3 * 3 + 2) + 6 + 3 * 7
2 * 2 * 9 + 8 + 8
9 + 5 + 4 * (6 * 7 * 5 * 7 * 4 * 3) * 3
7 * 5 * 7 * 6 + 4 * 9
((9 + 7 + 9 + 7 * 7 * 4) * 6 * 5) + 5 + (8 + (2 + 6 * 9 * 7 * 9 + 9) * (9 * 3 * 8 + 9 * 6 * 2) + 6 * 7) * (2 + 6 + (3 * 4 + 4) * 6 * 5) * 9 * 5
(7 * 5 * (3 + 2 + 6 * 5 + 9) + 5 + (2 + 9) + 2) + 2 * 6 + (5 * (7 * 2 + 3 + 8 * 9) * 7 + 6 + 6 * (5 + 3 + 9)) * (4 * 6 + (9 + 7 + 4))
((3 + 5) + 7 + 3) + 6
3 * 4 + 4 * 6 + (5 + 8 * 2)
7 + (7 * (4 + 4)) * 3 + 7 * 4
(5 + 4 * 6 + 3 * 9 + 7) * (7 * 3 * 5) + 6
3 + 4 * (8 + 2) + ((6 * 7) + 8 + 8 * (9 * 3 + 2) * 9)
7 + (7 + 9 * 2 * 9 * 2 * (2 + 5 + 9 * 6)) * 4
(7 + 6 + 3 + 5 * 2) + 2 * 3 + 4 * (3 + 4 * 5 * (3 + 7) + (7 + 2 * 7 * 6) + 8) * 8
4 + (9 * 2 * 6 * (6 + 6 * 7 * 7 + 5) * 9) * 9 + (4 + 8 * 7) * 4 + 4
6 * 6 * 2 + (4 * 2 + 7 + 4 + (2 + 2 * 5)) + 2
8 + 2 + 3 + 3 + 8 + (6 + 4)
8 + 9 + 2 + ((3 * 9 * 3 * 5) * 3 + (2 + 2 + 8 + 6 + 9 + 7)) + 9
6 * (3 * (5 * 4 + 4 * 4 * 4 + 4)) * 8 * (5 + (5 + 2 * 7 + 8) * 3)
3 + ((3 + 7) + 2 + (5 * 3 + 4 * 9))
4 + 5 * 6 * (7 * 5 + 6 * 5 * 5 + (4 * 6 * 9 * 6)) + 7 + 3
7 * 4 * 7 * 5 * (3 + (5 + 6 + 9 * 9 * 3 * 7) * 2 * 8 + 2 + 6)
5 * 4 + (4 * 7 * (3 + 8 + 9)) + 4
(7 + (3 * 5 * 7 + 5 * 8) * (6 + 9 * 6 * 7) * (3 + 9 * 8 + 4) + 8 + 7) * 2 + 4
8 + 7 + (9 + 6 + 7 + 9 + 6 + 4) + (7 * 8 * 6 * 5 * 3) + (3 * 4 * 3 * 8)
7 * ((4 + 4 + 9 + 3 * 3) + (9 * 6 * 8 * 7 * 3 + 6) * 7 + (7 + 2 * 3 + 6 * 2)) + 3 + (5 * 8) + (4 + 9 * 6 * (2 * 5 + 7 * 3 * 5) * 3 * 8)
8 + (3 + (8 + 3 * 4 + 4)) * 2 * 4 * (3 + 4)
(4 + 9 + 4 + (4 + 7 * 3 * 2 * 5 + 7)) * 2
2 * 8
6 * (7 * 5 + (4 * 5 * 2))
(3 + 3 * 4 * 3 + 7 + 4) + 8 + 2 + 4 * 4 * 5
7 * 2 * 5 + (2 * (9 + 6) * (3 * 8 + 4) + 3) * 9
(6 * 9 * (6 + 6 + 7 + 7) * (5 * 7 + 8 * 5 + 2 * 8) + 5 + 8) * 9 * 9 + 3 * 2 + 7
(2 * 3 + 8 + (4 * 2 + 7 * 2 + 7 + 7) + 3 + 6) * 3 * (6 + (9 + 7 * 2 + 2) + 6) + (4 + 3) * 3
4 * (6 * (8 * 8 + 7) + 7) * 6 * 9 * (4 * (6 * 4 * 3 * 2 + 6) + (8 * 9) + (9 + 3) * 4)
5 * 7 * 2 * (2 * 2 * 5 * (8 + 6))
(8 * (7 + 7 + 8)) + 2 + 9 * 9 + 9 * 4
6 + 6 + 5 + (2 * (8 * 7 + 3 * 6) + 9) * 7 + 6
8 + 6 + (8 * 4 * 8 * 2 + (6 * 6 + 9 * 3 + 6)) + 3
9 * 5 * 4 * (5 + (3 + 7) + (4 + 4 * 5 + 5 * 8 * 9) * 5)
5 + 4 * 9 * ((2 * 4 + 8 * 2 * 7 + 2) + 4) * 9 * 3
3 + 6 * (6 + 2 + 3 * 2) + (3 + 5) + ((3 * 6 + 5 + 7 + 8 * 8) * 9 + (5 + 8 * 7 + 6 * 8 + 7) + 7 + 8 + 5)
7 * ((7 + 5 * 3 * 5 + 4) + 7 + (6 * 3 * 6 * 6 * 7 * 7))
((5 + 7 * 9 * 2 + 3) * 2 + 9 * 3) * (4 + 6) * (4 * 7 * (9 + 6 * 8 + 5) * (3 + 8 + 9) + 9 * (8 + 6 * 9 + 6)) * 6 + 4
2 * (6 * 3 + 4 + 4 * 2) + 6 + 7 + 5
2 + 7 + 5 + 5 * ((7 * 6 + 2) * 8 * 8) + (2 * 5 * 4 * 5)
3 + (7 * 8 * 5) + 5 + (5 + (4 * 4 + 7 + 2) + 6 + (8 + 3) * 9 + 4)
6 * (9 + 5 + 6) * 5 + 5 * (7 * (3 * 5 + 6 + 2 * 5) * 2)
(9 + 6 + (9 + 7 * 5 + 6 * 7) * 7 * 3) + 3 + 4 + 6
7 * ((5 + 4 + 6) + 7) + 2 * 3 + (6 + 9 * (6 * 4 * 8 * 3 + 4 * 2) + 7) + 3
7 * (8 + 9 + 5 * (9 * 7 * 9) + 2) + (7 + 7 + (7 + 3 + 2 * 2) + 4 * 2)
3 * (2 * (4 + 6) * 8)
8 + ((6 * 4 * 8 + 4) + 7) * 7
(7 + (2 + 8 * 8 * 6 * 2)) + 7 * 2
(4 * 2 + 4 * 8 + 4) + (3 * 9 + (2 * 4 + 2 * 7) * 9 + 7) * (5 + 9) * (7 + (3 * 4 * 4 * 6) + 8 * 7) + 8 + 8
8 + (2 + 2 * 8 * 7 + 7) + 2 + 4 * 3 + (8 + 9 * 9)
3 + 2 + 8 + (9 + 3 * (3 + 2 + 9 + 7) + 4 * 4 * 7) * 3
5 * 4 * 7 * 3 + (9 * (6 * 6 + 2 * 4) * 8 + 2 * 9)
4 * 7 * (3 + 6 * 6 + 4 + 8) + 5
(8 + (8 + 2 * 9 + 3 * 3) * 8 * 8 * (9 * 6 + 2 * 6)) * 9 + 5 * 2 + 5
5 + 6 + 3 + 4 * 9 + (4 + (4 + 3 + 9 * 2) + 4)
3 * (5 + 3) * 7 + 6
((3 * 2 + 2 * 6 + 5 + 3) + 4) + (4 * (8 + 2 + 9 * 2) * 8 + (8 * 3 + 6 + 2 + 6) * 2) + 7 + 2 * 9
6 * 8 * ((8 * 8 + 3 * 7 + 8 * 4) * 4 + 9) + (8 * 7 * (6 * 8 * 3 * 2) * 3) * 2 * 8
(2 * 7 + 4) * 2 * (5 * 4 + 2 + 5 + (7 + 5) * (4 * 3 + 6 * 8 * 5 + 9)) * 5
(6 * 8) * (7 * 7 + 8 * 3 * 3) * (5 * 8 + 2)
(6 + 6 * 2) * 5 + ((7 * 6 * 8) * 8 * 9 * 4)
(8 * 4 * 9) + ((5 * 3 + 6 * 3) + (9 + 9 + 9 * 2 * 2) * (4 + 9 * 7 + 2 * 2 + 3) + 6) * 7 * 6 * 6
((4 + 3) * (2 * 5 + 8 * 2 * 4) * 9) + 6 + (6 + (5 * 4 * 5 * 3 + 3) * 6 * (5 * 3 + 7 * 2 + 4 + 8)) + 4 + 7
(6 * 9 + 9 + 7) * (6 * 2 * (4 * 7 * 4 + 4 * 5 + 7) + (7 + 5 * 8 * 4 + 9 + 6)) * 7 + 8 * 5 + (9 * 5 * 2 + 7)
6 * 6 + ((2 + 9) * 5 + 2 * 3 + 3 * 3) + 9 * ((4 * 7) + 5 + 8 + 4)
5 + (4 * 5 + 5 * 3 + 7) * 6 * 5 + (2 + (9 + 7 + 8 + 4))
(2 * 4 + 5 + 8 + 6 * 9) + 3 + 6
9 + (9 + 8 * 3) * (3 + 8 + 6 + 5) * 5
(3 + 9 * 5 + 7) + 2
((9 + 5 * 2) * 5 + (4 + 2 * 7) + 9) * 8
(4 + 4) * 9 + 3 + 2 * 8
(3 + 4 * 8 + 9 * 6 + 6) * 5 + 8 + 9
3 * 8 + 9 * (3 * 4)
6 + 7 * 6 * 7
3 * 3 + (8 * 8 * 9 + 3 * 8 + 2) * 3 + 8 * 2
5 + ((6 + 2 * 6) * 8 + 6 * 5) + ((7 + 3) + 2 * 5 + 7 + 6 + 5) + (8 + 2 * 7 + 4 + 2 * 3) * 2 * 5
(6 * (6 * 7) * 7 + 3) * 9 + 6 * 3
(5 * 9 + 7) + 8
(3 + 9 * 3 * 9 * 2) * 9 * 5
5 + (6 * 3)

7
input/day18_example.txt Normal file
View File

@@ -0,0 +1,7 @@
1 + (2 * 3) + (4 * (5 + 6))
1 + 2 * 3 + 4 * 5 + 6
2 * 3 + (4 * 5)
5 + (8 * 3 + 9 + 3 * 4 * 3)
5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))
((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2
6 * ((3 + 4 * 3 * 7 * 8) * 8 + (9 + 5 + 2 * 3) * 3 * 2) + 7 + 8 * 8 + 4

578
input/day19.txt Normal file
View File

@@ -0,0 +1,578 @@
77: 30 112 | 20 13
121: 43 20 | 123 30
42: 57 30 | 101 20
30: "a"
50: 65 20 | 134 30
37: 89 20 | 43 30
106: 16 30 | 54 20
17: 30 84 | 20 35
129: 89 20 | 96 30
123: 30 30 | 20 95
20: "b"
115: 20 70 | 30 93
112: 30 90 | 20 123
4: 20 55 | 30 5
72: 20 90 | 30 123
51: 30 20 | 20 95
24: 131 30 | 7 20
94: 121 20 | 15 30
117: 133 30 | 102 20
92: 28 20 | 43 30
70: 87 30 | 96 20
88: 109 20 | 36 30
35: 20 36 | 30 61
96: 30 95 | 20 20
47: 96 20 | 66 30
6: 20 55 | 30 123
130: 30 29 | 20 88
68: 5 20 | 89 30
66: 95 95
75: 96 30 | 55 20
3: 20 90 | 30 5
7: 20 53 | 30 123
86: 30 5 | 20 53
105: 20 87
46: 134 20 | 87 30
102: 30 111 | 20 103
93: 87 20 | 87 30
79: 116 20 | 71 30
8: 42
33: 5 20 | 87 30
107: 96 20 | 123 30
90: 20 30
110: 20 59 | 30 32
16: 30 68 | 20 39
52: 4 20 | 38 30
71: 96 30 | 51 20
38: 96 20 | 90 30
28: 20 30 | 30 30
27: 30 64 | 20 24
91: 30 27 | 20 113
1: 20 90 | 30 134
54: 105 20 | 18 30
0: 8 11
73: 65 20 | 55 30
132: 30 17 | 20 19
41: 20 51 | 30 22
45: 22 30 | 53 20
14: 124 20 | 73 30
22: 30 30
23: 87 30 | 55 20
10: 30 89 | 20 134
120: 56 30 | 9 20
11: 42 31
109: 95 134
127: 30 53 | 20 123
61: 20 53 | 30 90
103: 127 30 | 23 20
116: 90 20 | 87 30
134: 20 20 | 30 20
114: 20 63 | 30 41
64: 20 118 | 30 25
12: 30 48 | 20 3
111: 20 23 | 30 72
60: 79 30 | 120 20
59: 20 28 | 30 87
65: 20 30 | 20 20
44: 89 30 | 28 20
18: 65 20 | 43 30
32: 95 123
83: 30 66 | 20 22
63: 20 123 | 30 55
48: 30 134 | 20 43
99: 20 12 | 30 125
43: 20 20
133: 20 100 | 30 110
80: 20 50 | 30 44
125: 20 98 | 30 86
135: 128 30 | 130 20
131: 20 55 | 30 134
122: 97 30 | 60 20
25: 30 43 | 20 51
95: 20 | 30
55: 30 95 | 20 30
13: 43 20 | 43 30
21: 20 76 | 30 80
98: 89 30 | 65 20
81: 106 30 | 85 20
53: 30 30 | 20 20
78: 45 30 | 37 20
89: 20 30 | 30 20
9: 96 30 | 43 20
31: 2 20 | 82 30
56: 5 20 | 96 30
76: 1 20 | 23 30
62: 92 30 | 10 20
58: 30 22 | 20 43
85: 77 20 | 67 30
26: 30 58 | 20 6
101: 30 81 | 20 91
29: 83 30 | 47 20
126: 20 53 | 30 55
2: 122 20 | 135 30
15: 5 30 | 51 20
34: 20 37 | 30 116
82: 30 104 | 20 132
19: 40 20 | 62 30
108: 21 20 | 119 30
36: 30 22 | 20 87
104: 69 30 | 99 20
100: 20 7 | 30 61
39: 89 20
87: 30 20
113: 52 30 | 34 20
5: 30 30 | 30 20
40: 4 30 | 107 20
97: 20 26 | 30 78
67: 30 131 | 20 126
118: 20 134 | 30 66
124: 96 30 | 22 20
128: 30 114 | 20 14
119: 30 49 | 20 74
84: 129 30 | 33 20
74: 30 6 | 20 46
49: 30 38 | 20 75
57: 117 30 | 108 20
69: 20 94 | 30 115
aaabbaababbababbabaabbbaaabbbbaa
baabaabaaaabbabbbbbaaabb
aabbbaaabaaaabbbbaabbaaa
bababbbabbabbaaaaabababbbbaaaaaaaaabbaabaaaaabababaaabbaababbaab
baababbbbbbaaaababaaaababbabbaaaaabbbbbbbabaabaaaaabbbbb
abbaaabababbaaaabbaabababbbabbaa
aaabaaabaaabaaaaaaabbbab
abaaabaabbababababaaabba
aabbbbbbaaabbaaaabbabbbb
aabbbabaaaababaabbbababb
aaabbabbbaabbabbabaabbba
bbbaaaabbbabbbaaababbaabaaabaaaabbbbabba
babbbbaaaaabaaaabaaababbbabbaabbbaababbaabaaabab
aabaaaaabbaaaaaabbababbbbabaaaaabbaaaabb
bbbbababaaabbaaaaababbaa
baabaaabbbbbababababaabbaaabbabbaabbbaab
bbaabbabbbabbbaababbbbbabaabaabbbababababaaabaaa
baabbbbbaaaabbbabbbbbbbb
bbabbaabbbabbaaabbbaabaabaaabbbbaababaaa
babbbaababbbabbababaabbb
aabbbbbabbbbaaaabbbaabababababbb
aabbabaababababababbaaabaaabaabb
aabababbaaaaaaaababbbbaaabaaaaaa
abbbababaaabbaabababababbaaabbbbaaabaabb
baabbabaaabaaaaabbbbbaabababaaaa
abbbbabbbababbababbaabbbbaaaabba
abababbababaaabbabaabbbb
aaaabbbaaaaaabaabaaabbba
bbaabaababaaaabbaaaaaabb
aaabbabbaabaabbbaabbaaba
aaaaabaabbaabaababbabaaa
bbabbbbabbbaabbbabbbbaab
aaabbabbbaaabbbbbaabaabbbabababbaaaaaababbbbaabb
abaabbabbabaaabababaababaabbabbbabbbbaaaaabbbbaabbaaaaababbbabbaabbbbbabaabaabbabbbbbaabaaaabbab
bbbaababaaaabababaaaaaab
bbbbabbbaaababbbaabbbbbb
babbbaabaababbbaabbbbbaa
abababbabbbabbabbbbabaaa
abaabaaaaabaabbabaaabbbbbbababab
abababbaaabababbbababaaa
baaabbabbbbbbabababbaaababbbbabbbaababbbaabbbbabbbaaabbabbbbbbab
aababbbaabababaaaaaaabab
baaabbababbaaaababbabbbabaaabaaabaabbbbaaabbabaabbbaabbbabbabbabaabbaaab
baaaabaabbababbbbbbbbababaaabaab
bbabbaababbabaabaaabaaabaaaabbaaabbbbaab
bbbaaaaaabbaaaaabaaaaaaa
bbabbbaababbbaaaababababbbaabaabbbbbababbaaabbbaabbaaaabbaaaaaaa
abbbbabbaabbabbbaaaaabba
babbababbaaabbabbabbaabaaaaaaaba
bbbbababbababbbbabbababbaaababab
abbaaaababbabbbbbabbaaabaababaab
aabbbbbbabaabababbbabaaa
aaaaaaaababaaabaabaabbaaabbabbbaabaaaaaabbaabbba
abbbababaaaaabaaaababbbaaaabbaaa
bbbbbabbaabaaaaaaabaabbaaaaabbaa
ababbabababbbaabababbbaaabaabbbb
ababaabaabbabbbabbbabbbabbaaaababaabbaaa
ababaabaaaababbbbaaaabaabababbaaabbababb
aaabbbaabaabbbbbbaaababbaaaabbbabbbbbbbb
aaababbbaaaabaabbababaab
aabbbabaababbbabbaaaabab
abaabbbbbbabaabaaababababbbabaabbaabbaabaabababbabbaaaababaaaaaa
abbaaaababaaaabaabbbbbabbbaaabaaaabbabaa
babaaaaabbbaabababaaabbb
abbbbbbaabaabaaabbaaaaaabbabbbaabbabbbbbaabbbbababbababb
baabbababbbabbababbbbbaa
bbabaababbbabbabaabbbaab
ababbbabbbbbabaabaaaaabb
babbbbbbbaaaabbbabbbbaba
babbabaabaaabbababaababaababaaab
aaaababaaaababaaabbbabbaabbaaaabaaaabbab
abbaabbbbbabbabbababbbbbbbbabbaabaaaababbbbaabbabaaaabbbbabaaaabaaaabbab
baabbbbabaabbbbabaaabaaa
aaabbaaaaaabbabaabaaaaab
abbabaabbaaababbaabbabab
aabaabbbbaababbabbbbbaaabbbaaabb
aaaaaaaaaabbabbbaabaaabbabaaabababbbaababbaaabababbbbaaaaaabbbababaaaaaa
babbabababaaaababaaaabba
abbaaaaaaaabbaaabbbaabaaabaaaabbabaabaaabbbaabbbbbbaabbbbbaabababababaab
bbabaababaabbabbbbaaaaba
bbabbbaaaabaaabbbbbabbbaaabbbbba
babbbaaaaabbaaaababbbabb
bababbabbbaabaabbbbaaaaabaabbbab
bbbaaaaabababbaabaaaaaab
babababbbaabaaaaaaaabbbaabbbabbb
aaaaabaabbabbababbaabbba
aabababbabbabbaabbbaabbb
baaababbaabbaaaaaabbbabb
bbaababbaaabbbaababababbaabbaaabaaababab
baaaabaaababababaabbabbbabababbaaababbbbbbbaabba
babbbbabbbabbababaabaaabbbbaaaabababaaab
baaaaabaaabbbbaaabbaabbaabaabbbabababbabbaaabaaaaaabaaababaabbabbabaaaaaaaabbbbb
babbbaaaabbbbbbbaaaababbaabbbbbbbbbaaaabbbabbbbabaababaa
baabbbbbabababbaabababaabaabaabaaababbbbbbaabbaa
babaaababaaaaabaaabaabbabaaabbabbaaaabaabbbaabbbbbabaaabaaaaabbabbbabaab
abbabaaababaabaaabaaabaaababbbaababbababbaaabaaababbaaaa
ababaabaabbababaaaabbbbb
baababbabaabbbbbbbbaabaaababaaabbbbbbbaa
aabbaaabbbbababbababbaaa
babaabbabbbbbabbabbbbaba
abbbabbbbaaababbabaabbaabbbabaaa
babbbaaabaaaabaaaaabaaabbaaabbbbbabbaabaabaaabba
bbbbabbbbabbaababbabbbbb
bbbbaaaabaabbbabbbbabbaaaabbbaab
babbbbbababababaaaaabaaa
babbaabbbabaabbababaaaab
abbbabbabbababbbaabbbbaa
aaabbaababbbabbbbbaabaaa
babbaabaabaabaaaaaaaaaaabababbba
aabaaaababaaaabaababbbababbbababaabababa
bbbabbbbaaababbaabbbaaaabbbbbaabbabbbbbaaaabbbbaabbbaabb
abbabababbabbaaaabaabbba
abbaaaabbaaaabbabbbababaabbbabaa
abbaaabbbbaaababbbbaaaabbabbbbbabbbababbaababbab
baaababbababaababbbbabaaaabbababbaaabaaa
babbaaabbaabbbbbaabaaaaababbabaabaaabaabaabbbabbbabaabaa
aaababbbaaaababaababbaab
baaaabbbbaabbbaaabbaabbb
babbbaabaabbabababaaaaabaabbaabababaabbb
abbabbbbabababbababbaabaaaaaaaababbaaabbabbbbbaabbbabbabbbbababb
baaabbbbabbbaaaabbbaabba
abababaabaabaabbbbbabbbaaaabbababaabbbaabbababab
aaaabaababababbaaababbbabbabbaabaabbbbabbbbbbbaaabaaaaaa
aabaaabababbbaabbbbbbbaa
aabaaaabbaabaaaaaaaaabba
babababbaabbbaaaabbaaaba
abbabbbaaaababaaaabaaaaaaabbbbbbabaaabbb
bbbaaabaaabaababbbbaabba
bbabaababbbbbabbaaaababaaabaaaaaabbbbaaabbaabaaa
aaaababbbababbababbbbbbaaaabaaaaabbaaabaabbbbbaabababaab
baabbbbbaabaaaababbabbaaaaaabaaa
bbbbbaabbbbbabaababbbaaabababbbbbbbaaaaaabbbbaba
ababbaabaabbaabbaaaabbbb
bbbbbaabaabbbbbbbaaaaaaa
bbbbbaaabbbbabbbaabaaabbbabaabbb
bbbbbaabaaababbaaaabbaaabbbbababbabaabbabbbaaabbaaaaabbb
baabbbaabaabbababbababbabaaaabab
abaababbabbabbaaababbbba
aaabbaababbabababababaaabbabbbbb
aaababbbbabbabaaabaabaaabbbbaaba
baaababbbabbaaabbaabaaaabbbababb
abbbbbbaabbbabbaaabaaaabbbababbbaaabbbab
bbbbbababbbaababbababaab
aaaababababbbaaaabababbb
bbabbaababbababaaabaaababbbbababbbbbbbabbbaaabbb
abbbbbbbaabaabbaaabbbaab
bbbaababbbbbbaaaaaaabbab
babbbbbaaaaababbaaaaaabb
baabbbaabaabbababbabbabb
baabbababbbaababaabbabba
baababbabaaabbabbaaababbbabbbbbbbaababbbbabbbabbbababaab
bbaaabaaaaababbaaaabbbab
babaabbaabbbbbbbbabaabbb
ababaabaaaabbbaaabababaaaabaaabbbaaaaabb
baabbabbaabbaabbaaaabababbabaaab
aabaabbbaaababbbabbbbaab
bbbbbaaaaaabbabababbbbaaaabbbabb
baaabaabbaaabbbabaabaaababaabababbbababababbaaababaabaabbbbabbabaaabbabbaabbaaabaaabaaab
aabbbbbbaabaaabbbbabbaaabaaaaabaabbbaaaababaabaa
aaaabaabbababbabbbbabbbbaabbbababbbaaabaababaaaaabbabbab
babaababaaaabaabbaabaabbbaabbababbabbbbb
bbbaababbbbaabaaabbbabbbabbaaaba
baaaabbabbbbaaaaaaaaabbbbbabababbbbababaaababbbabbababababbbbbba
abbbabaaabaabbbaaabaabaabbbbbbab
babaaaaabaabaabaaaabaabb
aabababbabaabaaaaaaabbbabbaabbabaaaabbabbaaabbba
ababbbabbbbbbaaaaaabbaababbbaaaaaaaaabba
baabbabbbbabbaababbabbaaabaabbba
bbaaababbabbabbabbabbaabaaaaaababaabaaabaababaaa
baabbbbbbbbaabaaabbabaaa
abbabababaaabbabbaaaabab
ababbababaabaaabaabbbbbbbbbabaab
baabababbaaaabbababbaaaaabaabbaa
abbaaabbabbabbabaaaaabbbbabbbbaaababbbbbaababbabbaababbaabbbabba
abbbbababbabaabaabbaaaabbaabbabaaabbaababaaabaababaaaabbabababba
babbaaabbbabbabaaaabbbab
aabbbaaaabbbbabbaaabbbbb
baababbbbaaabbababbbabbbbbaaabaaaabbaaaaaaaabbab
babaabababababbababbbbbaabbabaaa
babaaabaaaabbabbaabaaababbaabaabbaababbbabaabbbabbbbabbaabbaabaa
baababbabababbabbbabbaabbaabbbaabbbababb
baabaabbababaabbaabbaaaaaaaaabba
aaaababbbabbaababbbbaaba
bbbabbbaaaaababbaabbbbaa
abaaaabaaaaaaaaaaaabbaaaabaabbab
ababbaabbabbaaaabbbbaaab
baaabbbbabbbaabababaabababaabbbb
baabaabaaabaaabbbbbaabaaaabaababaabbbbba
bbbbabaababbbaabaaaaaabbbaaababa
abbabababaabbabbababbabb
babababababaaaaaabbbbbaa
aabbbbbbbabaaaaabbbaaaaaabababbbabbbaabbababbaaa
babababaabaababaababaaab
baababbabaabbbbaaaabbbaabaaabbabababaababaaabaabababbbbbbbabababbaaabbaa
abbbaabaaabbbabaaaabbbbb
bbabbabaabbabbbaaabbabbbaababbababbabaaa
abbaababaaababbbabbbbbab
aaababbababaaabbabbababb
baaaaabababaaabbbaabbbaabaaabaaa
aabaaaabbbbbababaaababbb
abaaaabbbabbabbaabbbbbbbabbaabbb
bababaaababbbbaaaaaabababaaaababbaabbbabbaaabbabaabaaaaababaaaabaabaabbabbbaaabbaababaab
aabbabbbabbaaaaaaaababab
bbbaaaaaababbaabababbbba
ababababbbababbbaaabbaabbababbbabbaabbaa
aabbabaabaaabaabaaabaabaaaabaabbbbababbaaaababababbbbbabbbaabaaababbaabababaaaabbaaaaaba
abbbbabbbbaaaaaabbaabaaa
aaaababbbabaaabbbabaababaaabaaabaaaaabbb
ababbbaaabbabbaabbaaabbb
abaaaabbbaabbbaaaaabaaabbbabbbba
aaabaaaaaaabbabaabbabbaababbbbbaabaabbbb
aaabbabbbabbbaababaababbaaaaabbbaababbbb
aabaabaabaaaabbabaaabbaaabbabaaaaabbabbbbbabaaaabbbababbaabaabbb
abaabbaababbaaabbabaaabbbabaabbabbabbabaabbbbbabaababbaa
ababbbabbbbabbbbbaaaabbbabbabbbaaaaaaaab
abbbabbabaaabbababbbababaaabbaabaaaaabba
abaaaabababaaaaabbaabaabaababaaa
bbbbbbabbabbbbaaaaabbbabbbaaaabaaabaabab
bbbaaaaaabbbbbbbaabababa
baabaaaabbbabbbaabababbb
aabbbabaaaaaabaabbbabbaa
babaaabbaaaaabaaabbbbbbbbabaaabbaaaaabab
bababbbbbaabbabbbbaaabbb
bbaabbbaabbabbbbaabbbabb
abbabaabbabbaabaaababaaa
bababbaabaabaabbabbabbab
bbbaababbabbabaabaabbbbabaaaaabbbbbbaaab
bbbaababbabbbbaabababbba
babbaabbbabbabaaaabbabbbbabaaaabbbbababb
bbaabaababaabaaaababaaababaaabbaababbbbb
abbbabbbaababaaaaaabbabbabababaaaaababaaaaababbabbaababb
abbaaabbbaabbabbabaabbaaaababbbabbaabaabababbbabaaabbbab
abbbaaaaaabbbaaabbaaabbb
bbbbbabbabbabbaaabbabbbb
baabbabaaaaabababaaaaaab
aaaababbbbbabbbaaaababaabababbbb
abbbabaabbbababbbbabbbaaaaaaabaaaaaaabbbaaababab
baaabbbbaaabbaabbaaabbababbaababbbbaaaba
bbaababbbbbbbababaaababbabbabbbaaabbbabaabbbabbbbaaabaabaaabaaba
aaabaaaabbbbabbbbabbbabb
bbabbaababaababababbabbb
babbaaababbbbabbabbbaaabaabbabba
bbabbaabbabbabaababaaaaaaababbabbaaabbaababbbbbaababbbabaababbabbbabbbaabbbabbbbabaabbab
baabaaaaabaaaabbabbbbbbbaabbbaaabaaabbabbabbabbaaaaaaababaaababaaaaaabbb
bbaabbabbbaaabaabbaababa
aababbbabbbaabaaaaabbbab
baabbbbaabbabbaabbaaaabb
bbabbaabbaaaabaaaaaabbbb
baabaabaaabaabbaabababbb
abaabbaabbaabaabbbaabbabaaabbbaaaaaaabbb
bbbbbababbaaababbaabbaaa
bbaabbabbbabbaaabaabbbab
bbbaaaaaabbbbbbbaabbabaa
bbaaababbbabaabbaabbaaaaaaabbbbbbaaababaabbbbbbbbabaabaaaabbabab
aabbaabbbabbaaabaabbaaaabbababab
abbbabbaaaababbaabbaaaaa
aaabbabbbbaabaabbbabbaaaabbaaabbbabbbaba
abaabaaababbababaaababbbaabbbabb
abaaaabababbbbbbaaabaaaaabababbaaabbbbab
abbaabbbbbabbbbabbbaaababbabaaabbbabbbab
babbbbbbbabaabbabaababbaabaabaaaabbbabaababbbbab
bbbabbbbaabbaaaaabbaabaa
bbbbbaaababababbbaaababa
baabbbaabaabbababbbaababbbababbbabaabbbb
bbaababbbabaaabbabbbaaab
baabaaaaabbaaaaabbbaaaabbabbabbaaabbbaaaaabaabbbbbbbaaba
abbbababaaaaabaaababbabb
aaaaabaababbaaabaaaababbbaaabbbbababaaaa
ababbaababbabbbababbabbabbabbaababaaaaabbbbbaaaabbbaaaba
baaabaaabbbbabaaaababbaabbbaaabaababbabbaaabaaba
bababbaaababababaabbabbbaabaabaaabaaabbaabbbaaaaabbbabaa
abbaaabbabbaababbbaaaaaabbaaaabb
bbaabaabbbbaaaaabababababbabbbaaaaabbbba
bbaababbabbababaabbbaababbabbabbbbabaaab
abababaaabbbaaaabababbaaabbbaaababaaaaab
abbabaababbbbabbbbaabbbb
ababbaabbabbabababaaabbb
aababbbabababaababbbbbbaababbabbaababbbbbbbbaaaababbaabbbaaaaabb
abbbaaaaaabababbababbbba
babbabaaaaabbbaabaaabbaa
aabaaababaabbbaaaabaaababaaababbabbbaaaaaaaabbaa
bbaabbabbbabbabaaabbaaba
bababbaabbbaababbaaaabaaabbbbaab
bbbabbbabbbabbababbbaaab
abbbbbbbaabbabbbaaaabaabaabbaaabaaaabbbb
bbbbbabbbaababbbaabbaaba
ababababababababababbabb
baaaaaaabbabbaababaaabbb
bababbaaabbabababababbabaabaabbabbaababaababbbbb
bbabbaaabbbbaabaababababaabbbbabbabaabbbbaabbbaabbaaaababaabaabb
abbababaabaaaabbbabaaaab
bbabaabababbaabbbabbbbbbabbbbaabaabaabaa
bababbaaaabaaaaabbbbaabb
bbaabbabaabaabbbbabaabbaababaaababbaaaab
babaaabaaabaaaabababaabababbbaba
babbbbbaabababbaaaabbaabbabbabaabbaabbbb
abbababaabababaababaaababbbabbaa
aabaaaaaabbabbaabbabaababaababbaabaaabbb
abaabbaabbbbbaaaabbaabba
babaabbabaabbbbbbbabbbaababbbaabbbbababbaabbbaaabababbbbbaaababaabbbabbabbaaaabbaababaabaaaabbba
aaaabbbabbaaababaaabbaaaabababaababbbbababbaabbb
baabbabaabbaababaabbabab
ababaabbaabaaabaabbababb
aabbbababbaabbabaaaaabaa
ababaababbbabbbbbaaaabab
ababaababaaaaababbbabbbaabbbabaa
abaabbaaabbabababbbbabba
babbbbbabbaaaaaaaaaaabab
bbabbababbbabbbbababbbbb
abaababbabbaaabbbbbbababbbbbaaaa
abaaaabbbababbbbaababbbb
baabaababababbbbababbabb
baaaabaaaaabbabbabbabababaabbababbbbabaaabaaababbabbaaaa
aaaaaaaabbbabaaabbabbabaaabbbbaaabaaababababbabbabababab
bbbaaaabaaabaaaaaabaabbbbababaab
baabbbbabaaaaabaabbbaabb
abaaaabaabbaaaaaabaababbbaaabbba
ababbbaabbbaabaaaaababab
aaababbabbbbbabbabbbaaaabababaab
bbbbabbbbababbabaabbbbba
baaabbbbbbbbbaaabbaaabaaabaaabbaaababbab
bbabbaabababbbbbbbbaaabbabbbaaba
aaabbababaabaaabbaababbbbbaabbababbaaabbbbabbabbaabbbbab
abbaaaaabbabbaaaabbababb
baabaabbbaabbabababbaaabbaaaaababaaaabbabbbbbbaa
babbaabaaabababbbabbabaaabaaaaabbbaaabbb
babababbaabbaabbbbbbaaab
babaaababbbaabaaaaaabaabbbbaaaabababbaaa
aaabbbbbbbabababaabbabba
baaabbaaaaabbbbaaababbaaabbaaaaabbabbbbbabbbabbbbbbaaaaabbaaaababaaabbbbbaabbaababbbbbbababbaaaa
ababbababaabbabaababbbababaababbabbbaaaabbbbbbaaabbababb
babababababababaaaaabbab
aaabbaaaabbbbabbabaaabbb
babbbaaabababbaabaabaabaabbaababaaaabaaaababaaab
babaaaaaabbbbabbbbaabbba
bbabbaabaabbbaaaaabaaabaabbbababaabbaabaababaaaaababbbba
aabbbabaabbabbbababbaaaa
baaaabaababbabaabbbaabbb
aaabbabaaaabaaabaabbaaaabbaabbaa
abaabaaaabbabbaabbaababbabababbabbbbaabbbbaabbba
bbbaaaaabbabbabaabaaabaa
ababbbabbabbaababbaabbaa
aaabbaaaababbbabbaabbaaa
aaaaabaaabbabbaaabbbbaab
bbbaaaababaabaaabbbabbbabaabaaaabaabbbaaabbabaabaaaabbbb
babaaabababbbbbaaaaabbaa
baabaabbbabaabaabbaaaaab
baababbbbaaabbabaababbbb
bbaababbbbababbabbabbbbb
abbaababaabaabbaabbbbbbbbbaabbbbbbaababa
babaaaaaaaababbaabaaabab
babaaaaabbaabbaabaabbaabbbaabaaabbbbaabbbbbaabba
bbbaaabaaabbbabbabbaabbb
bbbbabababbaaaaaaabbbaaabbbbabaabbaaaaaabbbbaaaa
bbbaaaaaabaabaaabaaababa
aaabbababaaabbabbabaaaaaaaababababbbbaab
babbbbbabababbababaaabbb
aabababbaabbabbbbbbbbbba
abbabbaaabaababbbabbabbaaaaabaabaabbbbba
babbabbaabababbabababbbbaaababaaabbaaabbaabaabaa
aaaaaaaabbbabbbaabaaabba
baaaabaaabbbbbbaaabaabbbbbbbaaaa
abbbaaaabababaaabbbbbabbabaaabaaaaababbbabaababaabaaaaaa
abaababbabbbbbbaaabbabbbabbaaaab
abbabbbababbaaabbbabaaaabaababaaabbaabba
aaaabaabbbababbbbabbbbaabbbabbababaaaaab
abbaaabbabaababbbaabaababaaababa
abababababbaaabbbaaabbababaabaab
baaabbabaabaabbaaabababa
bbaaabaaaaaaabaababbaabb
ababbabaaabbabaaaabababa
babbbbaabbbbbaabbbaababa
babaaaababaabbababbabbbaabaaabababbabbaaaabbaabb
baaababbaaabaaabaabbabbbbaaaaaab
abaabbaabbabbaabaabababbabbabbbb
bbbaababaababbbabbababab
baababbabaaaabaaabababbababaaaab
babbaababbabaaaaababbaaa
aababbbaaabababbaabaabab
bbaabbabaabbbbbbbbababbbaaaabbbabbbbaaba
bbaaababbbaaabaabbbaaabaababbbbababbbabbababbbbaabaabbba
bbabaaaaaabbbababbaaabbb
baaaabaabaabbababaabaaababbbaabbbbabbaabbbbabbabaaababaaaabbaaaaaaaabbabaabbbabaabbabbaa
abaaaabbaabbabaaaabbbababbabaaaaaabbaaba
baaaaaabbbabbbbaabbbbbbbbbabaabbbabbabababaabababbbbaaabaaaabbbababbbbaa
aaaaaaaaaabbbabaaabbaaab
aababbbababaabbaaaabbbababbbaabb
abbbbabbaaabbbaaababaabbbabababa
aaaaabaabaaaabaaabbaabaa
bababbabbabaababbabbbabb
abbbbabbbaabbbabbbbaabaabbbaabbaaaaababaaaaaaaaababaaaba
aabaaababbbaabaabaabaaaabbbbaaababbbbaba
abbabaabbbaaababaaabaaba
bbaaababbbbbbaababbbabaa
bbabaaaababbbaaaabaaaaaa
aaabbaaabbabaababaaaabba
baabbabaaabbaaaaabbbbaba
baabaabababbaabbbbababaa
aaaabaabbbaaababaabbaabbabbbaaaaabaabaab
aaababbbaabaaaabbaaaabbbbabbbbba
aaabbbaababbaababbaaaaba
bbbabbbababbbaabbbaababa
abbbaaaabbabbbaaabbaabaa
aaaaaabbbbabbaaaabbabbbabaabbbabbbaaabaabaaaabaa
abababaaaaaaaaaaabbbaababaaaabbabbaabbabbabaabaaaabaabaababaabbabaabbbbb
ababbbaaabaabbaaabaababaabbbbbaa
abbabbbaababbababbbbbabaaabaabbabaabbabbbbaaaabaabaaabaa
ababbaabababbbabbbbbaaab
babbabaababaaabbbaabaabb
bbababbbaaabbaabbabbabaaaabaabaa
abaababbbaabbababaaababbbabaababbaaaaabaabbabbbb
ababababaaababaabbaaaabb
bbbaaaaaababbaababaabbba
babbbaababbbabbabbabaababaababbabbaababa
baabaabbbbaaaaaabbbaaabb
abbbaababbbbbabababbaabaaaaaabaaabbaaaaaabbbbaabaabbbbaaaabbbbabaababaab
ababaabbaabababbbbabbaabaaababaabaaaaababaaaabba
ababbbbbaabbaababababaababaaaaaaabbaaaaabbabbbaa
abbaaabbabaaaabbbbbabbbbbabbaabbbbbaaaaaabbbabbbbbbaabba
aaababbaaaaabaabbbaaababaaaabbbb
aabaaababbbbbbabaaabbabaabbaaaaabbbbbbbbababababbbaababbbabbabab
bbbaababbaaabbaabbbbbbaaabaaaaabaabbaababbaaaaab
aaaabbbaababbaabbabaabbababaaabbbaabbaab
bbbabababbababababbaabaa
bbbbabaabbaababbaaaabbbaabbbbbab
aaabbaaaaaaabbbaabbbbbbaabaaaabababbbaaabbaababbbaaaaaaaababbbbabababaaa
aaaaabbababbababbbababbbbaaababbabaabbaaaababbaabbaabbaa
bbabbabaaaaaabaabababbbbaaabbbba
ababbbaabbababbaaaaaaaab
babaaabbbaabbabaaaabaabb
babbababbbbbabaabababaab
bababbabbbaabaabbbbabaab
abbbaabaaabbbbbbaabbbbbbaabaaabbbbbbbaaaababbaaaaababaaabaaabaaa
abaabaaaabaababababaaabaaaabbbaabbabaaab
ababbbabaaaaaaaababbbbab
bbabbbbaabbbbabaaaaaabbbbababbaaabbbbbbbbbaabbbabbaaababababbbbbabbaabbabbabaaaabbbabbba
abaaaabbaaabbaabaaabaaaabbbabbbbababbbaabaabbbab
aabbbbbbbabbaababaabbababaabbbba
baaaabbbbababbabbbaabbba
abbbaaaaababbbababbabaaa
bbbabbbaaaababbaabaabbaaabaababaabbabababbaaabbaaaaaaabbabaabbabbbbaabbb

12
input/day19_example.txt Normal file
View File

@@ -0,0 +1,12 @@
0: 4 1 5
1: 2 3 | 3 2
2: 4 4 | 5 5
3: 4 5 | 5 4
4: "a"
5: "b"
ababbb
bababa
abbbab
aaabbb
aaaabbb

1727
input/day20.txt Normal file

File diff suppressed because it is too large Load Diff

107
input/day20_example.txt Normal file
View File

@@ -0,0 +1,107 @@
Tile 2311:
..##.#..#.
##..#.....
#...##..#.
####.#...#
##.##.###.
##...#.###
.#.#.#..##
..#....#..
###...#.#.
..###..###
Tile 1951:
#.##...##.
#.####...#
.....#..##
#...######
.##.#....#
.###.#####
###.##.##.
.###....#.
..#.#..#.#
#...##.#..
Tile 1171:
####...##.
#..##.#..#
##.#..#.#.
.###.####.
..###.####
.##....##.
.#...####.
#.##.####.
####..#...
.....##...
Tile 1427:
###.##.#..
.#..#.##..
.#.##.#..#
#.#.#.##.#
....#...##
...##..##.
...#.#####
.#.####.#.
..#..###.#
..##.#..#.
Tile 1489:
##.#.#....
..##...#..
.##..##...
..#...#...
#####...#.
#..#.#.#.#
...#.#.#..
##.#...##.
..##.##.##
###.##.#..
Tile 2473:
#....####.
#..#.##...
#.##..#...
######.#.#
.#...#.#.#
.#########
.###.#..#.
########.#
##...##.#.
..###.#.#.
Tile 2971:
..#.#....#
#...###...
#.#.###...
##.##..#..
.#####..##
.#..####.#
#..#.#..#.
..####.###
..#.#.###.
...#.#.#.#
Tile 2729:
...#.#.#.#
####.#....
..#.#.....
....#..#.#
.##..##.#.
.#.####...
####.#.#..
##.####...
##..#.##..
#.##...##.
Tile 3079:
#.#.#####.
.#..######
..#.......
######....
####.#..#.
.#...#.##.
#.#####.##
..#.###...
..#.......
..#.###...

35
input/day21.txt Normal file
View File

@@ -0,0 +1,35 @@
jfvltdz txzv szzbr fcbsv klzdr xclff jqqbnzz flzmlbf crfxz jxrlzm xcfpc tvk kdbx zlhlq gfpnx ccvsl zfl skllln lxqbsc frgnkt mrnd smjhxg cmqjlb jxdbh tsbffm mtjlb czbhh gbbxhp snsnj lmvx pbztj glvv jkzxn nnfps hnvrfvm fddx nhhgb hdt jg hrnzq tmgfr vjcbtd nklc fmbqgs hcg gpgrb qrgvj znqbr pfdkkzp vmrf mbqpfm pccmj bph hmngm fcbvh vtqhqs zsjlp rdbdd gtjmd bskstb krxj rglbcpq svqz jczm frssvh nmxdsnc hjbs xkpm tsvfrt txr flmm tjrm jccqsxs bncfz vlpq ngl dvfqqz hqxdv xzrdx qdnh hbqhvk spbxz pnxzqgp kjcdgh ttmcq dlvdt (contains peanuts)
bjqt frgnkt ctbmdg hbqhvk skllln spbxz frssvh rdbdd gpgrb nndr dvfqqz jlnrn tsvfrt jccqsxs jkzxn znqbr vlpq hcg gtjmd lmvx zck jnd vghkr fmfnh rlsqd vjcbtd kbszttf mdsg pfdkkzp stnb tjlz bqc gfpnx mfvxhv pdss tzglth mtpfk cnhbh thprs kvcc hnvrfvm klzdr xcfpc kdxvzqm (contains peanuts)
pngs tjlz nmxdsnc qdnh pccmj mkz rdbdd mbqpfm ngl znqbr tzglth tlbj klzdr pgrc fddx mxmvt srxrn gtjmd vdgsz dxzzp zfsmv svcmg mzjvq txr jkzxn smjhxg dptl flmm xlcgr srpqk kdbx bctn hnvrfvm qkvrf kvcc qzqdq krdmn vlpq tmjltg kdxvzqm hdt thprs pfdkkzp nklc cmqjlb jrrgck gpgrb mdnchc gzngn qrgvj pznt pdss zjh crfxz krxj xcfpc svrvv ctbmdg spbxz (contains shellfish)
xcfpc zfl cnhbh mdx tjlz pnxzqgp drzm glljh xsndjl hrnzq pdss zck kjcdgh pgrc bph gtjmd xmcsr ctgnz kbszttf gpgrb spbxz vtqhqs snsnj brjd znqbr mbqpfm crfxz blbfl rjds gdsk kdxvzqm mdnnfp mrnd mzjvq flzmlbf pznt pggzp txr vxx bncfz lzfmghs krxj pfdkkzp rtjxbbd (contains dairy, shellfish, fish)
mdx glcfml jqkxx jccqsxs kvcc nndr kbszttf mfvxhv rjds tjrm spbxz gtjmd vtqhqs fmbqgs dxzzp snptbf hrnzq rtjxbbd tmgfr sckhr hsdnz xkpm txzv fgrmrqhp gxbs gfpnx mdnnfp kbtkrcf drzm tbptvzf dtqplpj vxx cmtq zsjlp gpgrb glvv qrgvj tmjltg hnvrfvm pbztj czbhh tvk cnhbh krdmn flzmlbf lblbm mrnd znqbr kdbx xcfpc nhhgb mdsg zck txr stnb hdt hjbs pfdkkzp skks klh zfl (contains dairy)
skllln tvk srxrn snptbf cnhbh gbbxhp jczm spbxz pznt kbtkrcf fmbqgs tjlz frssvh pmhxl znqbr mtpfk fcbvh rdbdd xpmmdc vjcbtd cmqjlb jqqbnzz nnfps lblbm kdxvzqm qzqdq bjqt txzv qrgvj tmjltg mxfrnq hbqhvk gtjmd jlnrn kvcc hsdnz dfllfp mfvxhv mfcrq tgclx xlcgr glvv czbhh tsbffm hmnt xcfpc mkz cmtq gpgrb (contains soy)
gtjmd zbj vdgsz stnb tsbffm tjlz pdss jqqbnzz nklc srxrn klh glljh ctbmdg dptl jczm pfdkkzp jfvltdz nhhgb glvv jccqsxs hsdnz bskstb brjd ctgnz rjds tjrm qrgvj zck spbxz zfl xbp mfcrq svrvv zsjlp bqc pbztj xsndjl bctn lblbm fmfnh kdxvzqm cdntx hjbs gnkr rtjxbbd hdt hcg vjcbtd hmnt skqbbj frgnkt znqbr klzdr tmjltg nndr hsdqb tgclx txzv hnnz mdx pngs jg snptbf czbhh cnhbh jrrgck jlnrn gpgrb mfvxhv mdnnfp sckhr pccmj gfpnx dxzzp tbptvzf (contains peanuts, soy, dairy)
nkshjm pgmqs znqbr cdntx hsdnz kdxvzqm pmhxl tjlz nndr lzczv mtjlb jqkxx bjrbknjm pbztj nmpp mkz tbptvzf krxj bctn ctgnz qlzxbc hbqhvk mbqpfm dvfqqz gtjmd mfvxhv gdsk snptbf cmqjlb gpgrb jfvltdz vlpq zjh pggzp xkpm xpmmdc tgclx bqc spbxz kjcdgh lflzqr glvv stnb tjrm txzv qzqdq hjbs ccvsl jxdbh xcfpc bncfz flmm blbfl zbj rglbcpq srpqk tsvfrt fcbsv rtjxbbd bph tsbffm smjhxg tmjltg (contains shellfish)
snsnj tmjltg lxqbsc czbhh txzv svqz krdmn tjlz jg bnrf nmxdsnc ndhx zck zjh skks rdbdd bnnt srpqk svrvv spbxz pdss cmqjlb vmrf crfxz gpgrb jdvtlsv sgh mkz pznt tgclx kdxvzqm jfvltdz ccvsl jlnrn gdsk pfdkkzp flzmlbf xcfpc jqkxx dptl hrnzq vghkr tmgfr glvv mfvxhv gtjmd fgrmrqhp mdnnfp klh glljh kdbx lzczv klzdr (contains nuts, fish)
znqbr tsvfrt bjrbknjm kbtkrcf hsxp xsndjl jqkxx mrnd tjlz klzdr krxj gnzr nhhgb hqxdv mggk hsdqb zfl svqz hmngm ctbmdg tbptvzf bctn mdx gfpnx bskstb blbfl thprs sckhr lzfmghs rdbdd gbbxhp rglbcpq lmvx jkzxn lblbm bncfz ctgnz tjrm tlbj sndrzm tsbffm hdt spbxz jfvltdz gpgrb hrkf txzv ccvsl mtpfk vlpq pgmqs ttmcq pfdkkzp ndhx mdsg skllln xcfpc bph bdj (contains nuts, shellfish)
vdgsz srpqk jccqsxs txzv gtjmd xzrdx jdvtlsv hcg hjbs tsbffm vlpq bctn fmbqgs krdmn crfxz gpgrb zjh skllln bjqt kdxvzqm mdnchc zfl svrvv zlhlq tzglth ccvsl frgnkt xpmmdc rtjxbbd dptl dlvdt kdbx xclff gbbxhp lxqbsc vmrf lmvx smjhxg skqbbj nndr jnd rlsqd xmcsr pfdkkzp hmnt jfvltdz gnzr znqbr ctbmdg svcmg flzmlbf tjlz tbptvzf bncfz vxx tmjltg xcfpc qlzxbc klh jg xbp mrnd pgrc qkvrf qdnh qzqdq vghkr zfsmv fddx dkzz fcbsv mggk (contains shellfish, soy, eggs)
krxj kbszttf hnvrfvm mkz fjsgm nkshjm tjlz mfvxhv pccmj gnzr txzv flmm czbhh bnrf jccqsxs cnhbh gtjmd klh jg skllln hdt jrrgck nndr vtqhqs hrnzq dtqplpj blbfl glljh snptbf fddx spbxz pnxzqgp bjqt gnkr svqz dptl bncfz lhqxr pfdkkzp zsjlp srpqk dlvdt xcfpc dvfqqz zfl lmvx mzjvq thprs pngs sgh tmjltg tbptvzf vxx nmpp jdvtlsv hrkf rlsqd xzrdx mrnd skqbbj xclff szzbr srxrn vlpq nmxdsnc qkvrf hcg mfcrq fcbvh kbtkrcf mxmvt hjbs jfvltdz gpgrb (contains soy, shellfish)
bnrf jrrgck xcfpc kdxvzqm lmvx xzrdx pfdkkzp crfxz gtjmd krxj qkvrf kdbx jdvtlsv mdnchc mbqpfm jfvltdz txzv vghkr jqkxx jxrlzm klzdr bnnt xpmmdc tsvfrt fcbvh xbp tlbj rglbcpq hdt vdgsz spbxz dxzzp hsdnz jg fgrmrqhp tmjltg jxdbh gjt mggk svrvv zbj mxmvt bncfz hsdqb qdnh hbqhvk kbszttf jkzxn dvfqqz tsbffm mrnd jnd hsxp zck tjlz gpgrb (contains nuts, soy, dairy)
lmvx qzqdq mtpfk dkzz zck frssvh pbztj qlzxbc pccmj sckhr zfl dptl fddx mrnd gdsk mdnnfp hnvrfvm jfvltdz mtjlb lblbm spbxz hsdqb zbj krdmn lzfmghs pfdkkzp gzngn flmm hrnzq jqkxx znqbr jrrgck jkzxn svcs xcfpc mdsg fjsgm frgnkt rdbdd klh cmqjlb hrkf mxmvt hdt tzglth glcfml hbqhvk mkz bncfz pdss gtjmd jczm nrdv tjrm svrvv flzmlbf txzv pmhxl tjlz dvfqqz (contains peanuts, soy, nuts)
mfvxhv pfdkkzp nrdv xcfpc znqbr zck gjt snsnj lmvx nhhgb fgrmrqhp bdj bnrf hrnzq lhqxr kdbx spbxz zfl glvv gpgrb vmrf hnvrfvm pccmj bqc fjsgm jnd xpmmdc hmnt bjqt mrnd jczm fcbvh tjlz hjbs frssvh gnkr pgmqs lxqbsc skqbbj hrkf frgnkt tbptvzf rglbcpq xbp sckhr txzv vjcbtd jqqbnzz mkz (contains peanuts)
jczm gpgrb dfllfp tzglth txzv fmfnh jccqsxs zfl spbxz nhhgb cdntx txr kdxvzqm smjhxg fgrmrqhp qkvrf skqbbj kbszttf rjds snptbf cmqjlb szzbr glvv sckhr mbqpfm mxmvt gnzr pmhxl jqqbnzz bnrf frssvh bncfz znqbr dvfqqz mxfrnq hcg ttmcq kbtkrcf czbhh mdnchc hnnz xcfpc gbbxhp stnb pfdkkzp nrdv gtjmd zsjlp qzqdq flzmlbf vdgsz krdmn bjqt zjh kjcdgh sgh lblbm pdss hsdnz vxx skks mggk ctgnz xzrdx jqkxx klzdr fddx lflzqr svcmg xmcsr (contains nuts, shellfish)
hsxp tjlz crfxz xcfpc pggzp spbxz skqbbj jkzxn tzglth svrvv mtjlb gtjmd hmnt jccqsxs vlpq tmjltg zfl gpgrb lxqbsc znqbr pfdkkzp mdnchc dlvdt gbbxhp hdt sgh rjds skks mkz hmngm vxx mzjvq cnhbh pgmqs lzfmghs qkvrf tsvfrt czbhh qrgvj hrnzq lflzqr dvfqqz xclff jxdbh pdss fcbvh (contains wheat, shellfish, eggs)
jccqsxs rglbcpq pmhxl znqbr vdgsz jqkxx pngs txzv mdsg tvk cmtq dfllfp lhqxr fddx skllln dvfqqz crfxz lzczv brjd tlbj gfpnx gtjmd gxbs gnkr xmcsr dlvdt hsdnz bdj nklc zjh lzfmghs jqqbnzz pznt lflzqr bnrf cdntx tmjltg xcfpc lxqbsc tjlz mfcrq rlsqd kdbx vjcbtd dxzzp spbxz mkz pccmj hbqhvk nndr pfdkkzp fcbsv klzdr hdt svqz svrvv pbztj (contains shellfish)
skks tzglth lmvx bph txr gpgrb klzdr txzv jnd svcmg xclff zsjlp jrrgck spbxz kjcdgh mdnchc kbtkrcf bqc bctn kbszttf dxzzp gtjmd mtjlb pfdkkzp hnvrfvm smjhxg gnkr pggzp vjcbtd lzfmghs vtqhqs tjlz fgrmrqhp svrvv fcbvh ttmcq skllln fjsgm xpmmdc xcfpc nkshjm crfxz lzczv zfl rtjxbbd hsxp cmtq snptbf skqbbj cdntx (contains nuts, peanuts, soy)
xcfpc hrkf txr gxbs snptbf kbtkrcf jxrlzm mggk nmpp txzv vghkr mfcrq sckhr nrdv lflzqr xlcgr pfdkkzp hmnt fcbvh mkz glcfml znqbr cmtq spbxz crfxz gtjmd mdsg xzrdx skks stnb nkshjm zsjlp dptl fmbqgs kjcdgh jfvltdz blbfl vtqhqs lzfmghs hjbs hdt lxqbsc klzdr tjlz vxx pngs lmvx zck gdsk hsxp pccmj jrrgck fmfnh jqkxx fjsgm ccvsl jczm tlbj qkvrf smjhxg gjt jqqbnzz svqz rjds vlpq pmhxl qlzxbc pggzp lhqxr (contains wheat)
bdj bph smjhxg pggzp svrvv dvfqqz pnxzqgp rglbcpq skks dlvdt pccmj tjlz hsdqb zbj qkvrf pmhxl fmfnh cmtq txzv ctbmdg vghkr cmqjlb gtjmd vjcbtd xpmmdc gzngn hrkf blbfl srxrn ctgnz rlsqd dxzzp fcbsv vxx zfsmv lblbm lmvx pgmqs tzglth bncfz mdx vtqhqs drzm jg jnd pfdkkzp xcfpc zfl zjh jfvltdz skllln spbxz znqbr mtpfk dfllfp mxmvt zck svcmg kbtkrcf xsndjl gjt kdbx klh nnfps (contains peanuts, wheat)
jrrgck jfvltdz bjqt nndr znqbr xclff lzfmghs lxqbsc xbp dlvdt txzv tjrm ttmcq gtjmd rdbdd skqbbj dtqplpj kdbx mfcrq pggzp nhhgb tgclx pznt gnkr vghkr xcfpc klzdr krxj lzczv klh czbhh vtqhqs skllln rjds gbbxhp hsdnz bnnt qkvrf glvv bnrf tsbffm lblbm zlhlq dvfqqz bph jkzxn dkzz cnhbh tmgfr hsxp crfxz lhqxr ndhx ngl glcfml pfdkkzp mbqpfm ctgnz bdj spbxz brjd fcbvh gpgrb nklc smjhxg (contains dairy, peanuts, fish)
ttmcq gbbxhp vxx cmtq fmbqgs nklc svqz znqbr hsxp hnvrfvm mtpfk pccmj pdss jczm mrnd zbj gtjmd klzdr thprs czbhh fddx blbfl tlbj fmfnh jdvtlsv txr rdbdd xcfpc glljh snsnj tjlz jqkxx tgclx gpgrb gnzr skllln nrdv qkvrf sgh kbtkrcf hdt pfdkkzp kdxvzqm bnnt jnd jg hqxdv spbxz flmm szzbr sckhr (contains nuts, dairy)
svqz txzv gpgrb fcbvh gnzr tjlz drzm vmrf qkvrf dlvdt hsdqb hmnt spbxz tjrm mggk hnnz sckhr bjrbknjm jfvltdz xcfpc gtjmd zjh tvk srxrn mfcrq vjcbtd fcbsv xkpm gjt hbqhvk krdmn mdnchc zlhlq ndhx pfdkkzp mdnnfp xzrdx jxdbh gnkr zck pznt bncfz nmxdsnc hrnzq skqbbj mdx kdxvzqm snptbf hsdnz mdsg dxzzp rdbdd (contains shellfish, eggs, peanuts)
dptl rlsqd tjlz mdsg pfdkkzp tzglth mxfrnq gzngn tmjltg mggk hmngm mdnchc nkshjm hnnz zlhlq cmtq vxx hnvrfvm sgh frssvh pdss mdnnfp xcfpc kbtkrcf qzqdq mrnd xbp nndr znqbr szzbr ctgnz spbxz ndhx svqz pbztj bdj smjhxg kbszttf gpgrb jkzxn hqxdv dtqplpj kdxvzqm crfxz cdntx mbqpfm hsxp dxzzp nnfps pgrc cnhbh fmbqgs pnxzqgp svrvv mdx klzdr zjh tsbffm srxrn glcfml rglbcpq hcg gtjmd glljh zck pngs jczm lxqbsc pccmj glvv (contains dairy, peanuts)
znqbr hnvrfvm svrvv kbszttf bctn jccqsxs drzm rlsqd jlnrn srxrn rjds gjt skqbbj qrgvj kjcdgh vghkr svcmg gxbs xcfpc rtjxbbd zfl ndhx lzfmghs qdnh xkpm snsnj bqc lblbm dptl fcbvh gtjmd ccvsl txzv jfvltdz kdxvzqm mtpfk bph tjrm xpmmdc jqqbnzz cnhbh czbhh dtqplpj fgrmrqhp nmxdsnc gpgrb pggzp glcfml hrkf ttmcq mfcrq jczm zlhlq cmtq mdx txr vjcbtd mggk qzqdq skks svcs sndrzm bjqt hsxp tmgfr dkzz jg zck tjlz spbxz pnxzqgp klzdr mdsg zfsmv xbp (contains fish, wheat)
vjcbtd jdvtlsv ccvsl krxj qlzxbc fmfnh zjh hcg jxrlzm spbxz txzv sgh flzmlbf hsdqb nhhgb srpqk xlcgr pggzp skqbbj dlvdt mdsg gzngn pmhxl jfvltdz dptl fgrmrqhp bjqt hsxp tvk gnzr xcfpc qkvrf gtjmd glljh bdj tmgfr jg pgrc hrnzq nnfps jlnrn svcmg zbj klzdr pccmj jqqbnzz gpgrb tmjltg mrnd hnvrfvm znqbr mbqpfm qzqdq snsnj kbtkrcf smjhxg qdnh hrkf mfvxhv srxrn tgclx tjlz fjsgm sndrzm jccqsxs xsndjl (contains eggs)
ngl hjbs tsvfrt brjd zfl lflzqr jrrgck pbztj jxdbh srxrn mfvxhv thprs nkshjm tmgfr jqqbnzz rglbcpq drzm cdntx pggzp kdxvzqm mtpfk gpgrb klzdr vjcbtd mkz jnd kvcc znqbr qzqdq tgclx pdss bskstb skqbbj xkpm spbxz hsxp sgh bdj ccvsl gdsk svcs bqc lblbm gnkr gxbs tvk xpmmdc klh czbhh pccmj jxrlzm pnxzqgp pfdkkzp xzrdx fmfnh tjlz zlhlq mdnchc bctn dptl xcfpc snptbf rtjxbbd txzv bjqt mggk jqkxx flmm nklc cmtq (contains dairy)
jxrlzm pnxzqgp rdbdd frgnkt znqbr gpgrb lblbm srxrn jfvltdz mrnd jkzxn kjcdgh skks bjrbknjm nmxdsnc zjh tjrm xlcgr kdxvzqm fmfnh jnd spbxz nndr zfl dvfqqz xcfpc tmgfr mfvxhv bdj nhhgb hsxp glljh dlvdt txzv vtqhqs zck nnfps gtjmd jrrgck jczm jlnrn drzm cmqjlb fddx xpmmdc hsdnz hqxdv qdnh vjcbtd dptl svcmg bnrf xbp qkvrf kbszttf pznt mfcrq stnb mzjvq pgrc xkpm fcbvh vdgsz mxmvt hjbs hnnz pmhxl tlbj hnvrfvm bncfz zfsmv xsndjl xmcsr bjqt vmrf tjlz bskstb mdx jxdbh gzngn ndhx vlpq (contains fish, wheat, nuts)
ttmcq txr pmhxl frgnkt xbp gxbs zlhlq szzbr crfxz fmfnh smjhxg hmngm xclff glvv tmgfr thprs glcfml fjsgm tsvfrt znqbr spbxz svrvv nrdv lzfmghs tgclx jczm fgrmrqhp bctn mtpfk cdntx gtjmd fcbsv mkz rglbcpq mbqpfm rjds bph jfvltdz ngl zfl rdbdd tjlz gjt nmxdsnc hsdqb qrgvj gfpnx txzv hdt pfdkkzp tvk sckhr snptbf flmm vtqhqs lhqxr fcbvh hnnz mfvxhv nmpp bjrbknjm nkshjm fmbqgs svcs jqkxx gpgrb mtjlb zfsmv dlvdt pngs svqz hbqhvk hmnt ccvsl (contains peanuts, dairy, wheat)
nmxdsnc txzv pggzp pznt cmqjlb hsdnz snsnj ndhx dlvdt ttmcq zbj xmcsr zlhlq flzmlbf tmjltg mdnchc qdnh pngs pmhxl cmtq skqbbj bph czbhh fmbqgs spbxz xclff drzm gdsk znqbr dfllfp tjlz zjh fcbvh pfdkkzp rjds glvv mkz nndr hbqhvk krdmn xcfpc skks mtpfk gtjmd rlsqd hrnzq svcs fcbsv lmvx ctbmdg frgnkt zfsmv sckhr (contains nuts, wheat, eggs)
nrdv zlhlq mzjvq nnfps tmgfr fcbvh jccqsxs xcfpc cnhbh gpgrb brjd hnvrfvm tjlz xzrdx vmrf lmvx skllln zsjlp snsnj szzbr lxqbsc dvfqqz pdss spbxz zfsmv mggk gtjmd tgclx cmqjlb zck rjds hjbs gdsk mfvxhv thprs fcbsv lblbm srxrn jqkxx flmm jnd qdnh lzczv fjsgm xlcgr snptbf znqbr txzv stnb czbhh gnzr (contains wheat)
vlpq svcs hqxdv mxfrnq zfl frssvh mggk kdbx ctbmdg tbptvzf zck xzrdx krdmn klh fcbsv znqbr sgh frgnkt lzfmghs cmtq xcfpc txzv rtjxbbd rjds fcbvh xclff pfdkkzp jccqsxs dvfqqz gtjmd hrkf hsdqb gnzr jqkxx lmvx flmm xlcgr mdsg tjlz jlnrn hnvrfvm hcg bdj lzczv gzngn fmbqgs spbxz bskstb jg nklc hdt gjt jrrgck skks srpqk ngl vxx (contains eggs, wheat)
znqbr rdbdd jfvltdz gnzr mdx glcfml vtqhqs lblbm frssvh hsdnz jxdbh xsndjl pccmj kdxvzqm fgrmrqhp krdmn hnnz mtpfk gtjmd jccqsxs nklc vlpq svcs brjd xcfpc srxrn cdntx smjhxg pggzp fmfnh pdss nmxdsnc kbszttf xzrdx bnnt tvk fcbsv zfl mbqpfm xlcgr nnfps spbxz kdbx dlvdt gnkr tlbj vmrf hbqhvk mrnd dvfqqz tjlz gpgrb cnhbh hnvrfvm qrgvj snptbf tmjltg txzv mdnnfp nrdv jg xclff crfxz mdsg tsvfrt hdt dptl lflzqr hsdqb (contains shellfish)
tjlz srxrn gpgrb blbfl dvfqqz nrdv fmfnh smjhxg jlnrn tvk hbqhvk bdj hsdqb klh qrgvj jczm spbxz jnd lxqbsc rglbcpq jxdbh fgrmrqhp zbj znqbr pfdkkzp pngs dkzz mbqpfm hmngm vjcbtd mrnd jfvltdz jccqsxs xmcsr mfvxhv bqc mdsg pgmqs stnb svcs xcfpc kvcc skqbbj zlhlq svcmg gtjmd glcfml dtqplpj bjrbknjm gdsk nnfps qdnh hrkf ngl mdnchc bncfz gnzr srpqk sgh gjt fcbsv hnvrfvm hmnt (contains nuts, dairy, peanuts)

4
input/day21_example.txt Normal file
View File

@@ -0,0 +1,4 @@
mxmxvkd kfcds sqjhc nhms (contains dairy, fish)
trh fvjkl sbzzf mxmxvkd (contains dairy)
sqjhc fvjkl (contains soy)
sqjhc mxmxvkd sbzzf (contains fish)

53
input/day22.txt Normal file
View File

@@ -0,0 +1,53 @@
Player 1:
28
13
25
16
38
3
14
6
29
2
47
20
35
43
30
39
21
42
50
48
23
11
34
24
41
Player 2:
27
37
9
10
17
31
19
33
40
12
32
1
18
36
49
46
26
4
45
8
15
5
44
22
7

13
input/day22_example.txt Normal file
View File

@@ -0,0 +1,13 @@
Player 1:
9
2
6
3
1
Player 2:
5
8
4
7
10

1
input/day23.txt Normal file
View File

@@ -0,0 +1 @@
186524973

1
input/day23_example.txt Normal file
View File

@@ -0,0 +1 @@
389125467

View File

@@ -33,7 +33,7 @@ fn play_until(max_turn: usize, starting_numbers: &Vec<usize>) -> usize {
} else {
previous_number = turn - prev_occurrence;
}
println!("Turn {}: {}", turn + 1, previous_number);
// println!("Turn {}: {}", turn + 1, previous_number);
}
return previous_number;

212
src/day16.rs Normal file
View File

@@ -0,0 +1,212 @@
use super::util;
use std::cmp::{min, max};
pub fn solve() {
let lines = util::read_file("input/day16.txt");
let range_sets = lines.iter().take_while(|s| !s.is_empty()).map(|s| ValidRangeSet::parse(s)).collect::<Vec<_>>();
let your_ticket = lines.iter().skip_while(|s| s != &"your ticket:").skip(1).next().unwrap()
.split(",").map(|s| s.parse::<u32>().unwrap()).collect::<Vec<u32>>();
let nearby_tickets = lines.iter().skip_while(|s| s != &"nearby tickets:").skip(1)
.map(|t| t.split(",").map(|s| s.parse::<u32>().unwrap()).collect::<Vec<_>>()).collect::<Vec<_>>();
let combined_ranges = ValidRange::combine(&range_sets.iter().flat_map(|r| &r.ranges).collect::<Vec<_>>());
let invalids_per_ticket = nearby_tickets.iter()
.map(|t| find_invalid(t, &combined_ranges))
.collect::<Vec<_>>();
// println!("{:?}", combined_ranges);
let part1: u32 = invalids_per_ticket.iter().map(|t| -> u32 { t.iter().sum() }).sum();
println!("Day X Part 1: {}", part1);
let mut valid_tickets = Vec::new();
for i in 0..nearby_tickets.len() {
if invalids_per_ticket[i].is_empty() {
valid_tickets.push(&nearby_tickets[i]);
}
}
let ordered_range_sets = resolve_column_ordering(&valid_tickets, &range_sets);
// println!("{:?}", ordered_range_sets);
let fields = ordered_range_sets.iter().map(|r| &r.name).filter(|n| n.starts_with("departure")).collect::<Vec<&String>>();
let part2 =
get_ticket_values(&your_ticket, &fields, &ordered_range_sets)
.iter()
.fold(1u64, |a, b| (a as u64) * (*b as u64));
println!("Day X Part 2: {}", part2);
}
fn find_invalid(nums: &Vec<u32>, combined_ranges: &Vec<ValidRange>) -> Vec<u32> {
return nums.iter().filter(|n| not_in_ranges(n, combined_ranges)).map(|n| n.clone().clone()).collect::<Vec<u32>>()
}
fn not_in_ranges(n: &u32, ranges: &Vec<ValidRange>) -> bool {
let closest_range_idx_res = ranges.binary_search_by_key(n, |r| r.min);
let closest_range_idx = if closest_range_idx_res.is_err() {
closest_range_idx_res.unwrap_err()
} else {
// If we're matching a range, the index will be the same as the range, but if we're not matching, it will be one higher
closest_range_idx_res.unwrap() + 1
};
let optimized_res = closest_range_idx == 0 || !ranges[closest_range_idx - 1].includes(n);
return optimized_res;
}
fn resolve_column_ordering(tickets: &Vec<&Vec<u32>>, range_sets: &Vec<ValidRangeSet>) -> Vec<ValidRangeSet> {
let mut available_order_per_range_set = Vec::new();
for _ in 0..range_sets.len() {
available_order_per_range_set.push(vec!{ true; range_sets.len() });
}
let mut solved_range_sets = vec!{ false; range_sets.len() };
for ticket in tickets {
for range_set_idx in 0..available_order_per_range_set.len() {
if solved_range_sets[range_set_idx] {
continue;
}
let range_set = &range_sets[range_set_idx];
let available_orders = &mut available_order_per_range_set[range_set_idx];
let mut removed_options = false;
for j in 0..available_orders.len() {
if available_orders[j] && !range_set.matches(&ticket[j]) {
available_orders[j] = false;
removed_options = true;
}
}
if removed_options {
check_options_left(range_set_idx, &mut solved_range_sets, &mut available_order_per_range_set);
}
}
}
let order_per_range_set = available_order_per_range_set.iter()
.inspect(|a| if a.iter().filter(|b| **b).count() > 1 { panic!(format!("Inconclusive in terms of ordering"))} )
.map(|a| a.iter().position(|b| *b).unwrap())
.collect::<Vec<usize>>();
// Sort the range sets so that they're in their available order
let mut res = vec!{ ValidRangeSet{ name: String::from("temp"), ranges: Vec::new() }; range_sets.len()};
for i in 0..range_sets.len() {
res[order_per_range_set[i]] = range_sets[i].clone();
}
return res;
}
fn check_options_left(orig_range_set_idx: usize, solved_range_sets: &mut Vec<bool>, available_order_per_range_set: &mut Vec<Vec<bool>>) {
let options_left = available_order_per_range_set[orig_range_set_idx].iter().filter(|o| **o).count();
if options_left == 1 {
// We now know for sure where range_set i is supposed to be, so we can cross
// that option out for all other range sets:
solved_range_sets[orig_range_set_idx] = true;
let known_order = available_order_per_range_set[orig_range_set_idx].iter().position(|o|*o).unwrap();
// println!("Original range set position '{}' must be position: {}", orig_range_set_idx, known_order);
for j in 0..available_order_per_range_set.len() {
if j == orig_range_set_idx { continue; }
if available_order_per_range_set[j][known_order] {
available_order_per_range_set[j][known_order] = false;
check_options_left(j, solved_range_sets, available_order_per_range_set);
}
}
} else if options_left == 0 {
panic!(format!("Couldn't find any valid ordering for range set {}", orig_range_set_idx));
}
}
fn get_ticket_values(ticket: &Vec<u32>, fields: &Vec<&String>, ordered_range_sets: &Vec<ValidRangeSet>) -> Vec<u32> {
let mut res = Vec::new();
for field in fields {
let idx = ordered_range_sets.iter().position(|r| &&r.name == field).unwrap();
res.push(ticket[idx]);
}
return res;
}
#[derive(Debug, Copy, Clone)]
struct ValidRange {
min: u32,
max: u32
}
impl ValidRange {
fn parse(input: &str) -> ValidRange {
let values = input.split("-").map(|s| s.trim()).collect::<Vec<_>>();
return ValidRange {
min: values[0].parse::<u32>().unwrap(),
max: values[1].parse::<u32>().unwrap(),
}
}
fn includes(&self, n: &u32) -> bool {
return &self.min <= n && &self.max >= n;
}
fn combine(ranges: &Vec<&ValidRange>) -> Vec<ValidRange> {
let mut res = Vec::new();
for range in ranges {
let overlaps = res.iter().enumerate().filter(|(_, r)| range.overlaps(r))
.collect::<Vec<_>>();
let indices_to_remove = overlaps.iter().map(|(i, _)| i.clone()).rev().collect::<Vec<_>>();
if overlaps.len() == 0 {
res.push(ValidRange { min: range.min, max: range.max });
} else {
let combined_min = min(range.min, overlaps.iter().map(|(_, r)| r.min).min().unwrap());
let combined_max = max(range.max, overlaps.iter().map(|(_, r)| r.max).max().unwrap());
res.push(ValidRange { min: combined_min, max: combined_max })
}
for i in indices_to_remove {
res.remove(i);
}
}
res.sort_by_key(|r| r.min);
return res;
}
fn overlaps(&self, other: &ValidRange) -> bool {
return self.min <= other.max && self.max >= other.min;
}
}
#[derive(Debug, Clone)]
struct ValidRangeSet {
name: String,
ranges: Vec<ValidRange>,
}
impl ValidRangeSet {
fn parse(input: &String) -> ValidRangeSet {
let spl = input.split(": ").collect::<Vec<_>>();
return ValidRangeSet {
name: String::from(spl[0]),
ranges: spl[1].split(" or ").map(|r| ValidRange::parse(r)).collect::<Vec<_>>()
}
}
fn matches(&self, n: &u32) -> bool {
return self.ranges.iter().any(|r| r.includes(n));
}
}

272
src/day17.rs Normal file
View File

@@ -0,0 +1,272 @@
use super::util;
use std::cmp::{min, max};
pub fn solve() {
let lines = util::read_file("input/day17.txt");
let initial_width = lines[0].len() as i32;
let initial_height = lines.len() as i32;
let cycles = 6;
// The grid grows by at most 1 index per cycle, so this should be big enough:
let lower = Vec4::of(-cycles-1, -cycles-1, -cycles-1, -cycles-1);
let upper = Vec4::of(initial_width + cycles+1, initial_height + cycles+1, cycles + 2, cycles + 2);
let mut initial_state = BoolGrid4D::new(lower, upper);
for y in 0..initial_height {
let mut line_chars = lines[y as usize].chars();
for x in 0..initial_width {
if line_chars.next().unwrap() == '#' {
initial_state.set(&x, &y, &0, &0, true);
}
}
}
let res1 = run_conway_cube_simulation(&initial_state, cycles as u32, true);
let part1: u32 = res1.data.data.iter().map(|c| c.count_ones()).sum();
println!("Day 17 Part 1: {}", part1);
let res2 = run_conway_cube_simulation(&initial_state, cycles as u32, false);
let part2: u32 = res2.data.data.iter().map(|c| c.count_ones()).sum();
println!("Day 17 Part 2: {}", part2);
}
fn run_conway_cube_simulation(initial_state: &BoolGrid4D, cycles: u32, restrict_fourth_dimension: bool) -> BoolGrid4D {
let mut prev_state = initial_state.clone();
let mut next_state = initial_state.clone();
let mut lower_activity = Vec4::of(initial_state.lower.x + 1, initial_state.lower.y + 1, initial_state.lower.z + 1,
if restrict_fourth_dimension { 0 } else { initial_state.lower.w + 1 });
let mut upper_activity = Vec4::of(initial_state.upper.x - 1, initial_state.upper.y - 1, initial_state.upper.z - 1,
if restrict_fourth_dimension { 1 } else { initial_state.upper.w - 1 });
for _cycle in 0..cycles {
let mut next_lower_activity = prev_state.upper.clone();
let mut next_upper_activity = prev_state.lower.clone();
if restrict_fourth_dimension {
next_lower_activity.w = 0;
next_upper_activity.w = 1;
}
for w in lower_activity.w..upper_activity.w {
for z in lower_activity.z..upper_activity.z {
for y in lower_activity.y..upper_activity.y {
for x in lower_activity.x..upper_activity.x {
let active_neighbors: usize = prev_state.count_active_neighbors(&x, &y, &z, &w, &restrict_fourth_dimension, 4);
let active_self = prev_state.get(&x, &y, &z, &w);
let active_next = (active_self && (active_neighbors == 2 || active_neighbors == 3)) || (!active_self && active_neighbors == 3);
next_state.set(&x, &y, &z, &w, active_next);
if active_next != active_self {
next_lower_activity.x = min(next_lower_activity.x, x - 1);
next_lower_activity.y = min(next_lower_activity.y, y - 1);
next_lower_activity.z = min(next_lower_activity.z, z - 1);
next_upper_activity.x = max(next_upper_activity.x, x + 2);
next_upper_activity.y = max(next_upper_activity.y, y + 2);
next_upper_activity.z = max(next_upper_activity.z, z + 2);
if !restrict_fourth_dimension {
next_lower_activity.w = min(next_lower_activity.w, w - 1);
next_upper_activity.w = max(next_upper_activity.w, w + 2);
}
}
}
}
}
}
lower_activity = next_lower_activity;
upper_activity = next_upper_activity;
// if !restrict_fourth_dimension {
// println!("After {} cycles:", _cycle + 1);
// next_state.print();
// }
if lower_activity.x >= upper_activity.x {
panic!("No activity!");
}
prev_state = next_state.clone();
}
return prev_state;
}
#[derive(Clone)]
struct Vec4 {
x: i32,
y: i32,
z: i32,
w: i32
}
impl Vec4 {
fn of(x: i32, y: i32, z: i32, w: i32) -> Vec4 {
return Vec4 { x, y, z, w };
}
}
#[derive(Clone)]
struct BoolGrid4D {
data: BitArray,
lower: Vec4,
upper: Vec4,
size: Vec4,
}
impl BoolGrid4D {
fn new(lower: Vec4, upper: Vec4) -> BoolGrid4D {
assert!(lower.x < upper.x && lower.y < upper.y && lower.z < upper.z);
let size = Vec4 {
x: upper.x - lower.x,
y: upper.y - lower.y,
z: upper.z - lower.z,
w: upper.w - lower.w
};
return BoolGrid4D {
data: BitArray::new((size.x * size.y * size.z * size.w) as usize, false),
lower, upper, size
}
}
fn get_idx(&self, x: &i32, y: &i32, z: &i32, w: &i32) -> usize {
assert!(x >= &self.lower.x && x < &self.upper.x);
assert!(y >= &self.lower.y && y < &self.upper.y);
assert!(z >= &self.lower.z && z < &self.upper.z);
assert!(w >= &self.lower.w && w < &self.upper.w);
return (x - self.lower.x) as usize +
(y - self.lower.y) as usize * self.size.x as usize +
(z - self.lower.z) as usize * self.size.x as usize * self.size.y as usize +
(w - self.lower.w) as usize * self.size.x as usize * self.size.y as usize * self.size.z as usize;
}
fn get(&self, x: &i32, y: &i32, z: &i32, w: &i32) -> bool {
return self.data.get(self.get_idx(x, y, z, w));
}
fn set(&mut self, x: &i32, y: &i32, z: &i32, w: &i32, v: bool) {
let idx = self.get_idx(x, y, z, w);
self.data.set(idx, v);
}
fn count_active_neighbors(&self, x: &i32, y: &i32, z: &i32, w: &i32, restrict_fourth_dimension: &bool, count_until: usize) -> usize {
assert!(x - 1 >= self.lower.x && x + 1 < self.upper.x);
assert!(y - 1 >= self.lower.y && y + 1 < self.upper.y);
assert!(z - 1 >= self.lower.z && z + 1 < self.upper.z);
assert!(w - 1 >= self.lower.w && w + 1 < self.upper.w);
let mut res = 0;
for nw in if *restrict_fourth_dimension { *w..w+1 } else { w-1..w+2 } {
for nz in z - 1..z + 2 {
for ny in y - 1..y + 2 {
for nx in x - 1..x + 2 {
// Skip self (i.e. not the neighbor)
if &nz == z && &ny == y && &nx == x && &nw == w { continue };
if self.get(&nx, &ny, &nz, &nw) {
res += 1;
if res >= count_until {
return res;
}
}
}
}
}
}
return res;
}
#[allow(dead_code)]
fn print(&self) {
for w in self.lower.w..self.upper.w {
if !self.any_in_w(&w) { continue; }
for z in self.lower.z..self.upper.z {
if !self.any_in_wz(&w, &z) { continue; }
println!("z={}, w={}", z, w);
for y in self.lower.y..self.upper.y {
for x in self.lower.x..self.upper.x {
print!("{}", if self.get(&x, &y, &z, &0) { '#' } else { '.' });
}
println!();
}
}
}
}
fn any_in_w(&self, w: &i32) -> bool {
for i in self.get_idx(&self.lower.x, &self.lower.y, &self.lower.z, w)..
(self.get_idx(&(self.upper.x - 1), &(self.upper.y - 1), &(self.upper.z - 1), w) + 1) {
if self.data.get(i) { return true; }
}
return false;
}
fn any_in_wz(&self, w: &i32, z: &i32) -> bool {
for i in self.get_idx(&self.lower.x, &self.lower.y, z, w)..
(self.get_idx(&(self.upper.x - 1), &(self.upper.y - 1), z, w) + 1) {
if self.data.get(i) { return true; }
}
return false;
}
}
#[derive(Clone)]
struct BitArray {
data: Vec<u32>,
length: usize,
}
impl BitArray {
fn new(length: usize, default: bool) -> BitArray {
return BitArray{
data: vec!{if default { !0 } else { 0 }; (length / 32) + 1},
length,
}
}
fn get(&self, i: usize) -> bool {
return BitArray::get_bit(&self.data[i / 32], &(i % 32));
}
fn get_bit(d: &u32, i: &usize) -> bool {
return d & (1 << i) != 0
}
fn set(&mut self, i: usize, v: bool) {
let mask = 1 << (i % 32);
self.data[i / 32] &= !mask;
if v { self.data[i / 32] |= mask; }
}
}

202
src/day18.rs Normal file
View File

@@ -0,0 +1,202 @@
use super::util;
pub fn solve() {
let lines = util::read_file("input/day18.txt");
// lines.iter()
// .for_each(|s| println!("{} = {}", s, evaluate(s.as_str()).0));
let part1: u64 = lines.iter().map(|s| evaluate(s.as_str()).0).sum();
println!("Day X Part 1: {}", part1);
let part2: u64 = lines.iter()
// .inspect(|s| println!("{}: {}", s, build_expression_tree(s.as_str()).0.evaluate()))
.map(|s| build_expression_tree(s.as_str()).0.evaluate())
.sum();
println!("Day X Part 2: {}", part2);
}
fn evaluate(input: &str) -> (u64, usize) {
let mut i = 0usize;
let mut res = 0;
let mut operator = Operator::Add;
while i < input.len() {
let c = &input[i..(i+1)];
if c == "(" {
let sub_evaluation = evaluate(&input[(i + 1)..]);
i += sub_evaluation.1;
res = operator.apply(res, sub_evaluation.0);
} else if c == ")" {
return (res, i + 1);
} else if c == "+" {
operator = Operator::Add;
} else if c == "*" {
operator = Operator::Multiply;
} else if c == " " {
// Nothing to do
} else {
let n = c.parse::<u64>().unwrap();
res = operator.apply(res, n);
}
i += 1;
}
return (res, i);
}
fn build_expression_tree(input: &str) -> (ExpressionTreeNode, usize) {
// println!("Evaluating '{}':", input);
let mut subtrees: Vec<(usize, usize, ExpressionTreeNode)> = Vec::new();
let mut evaluate_until = input.len();
{
let mut i = 0;
// First build subtrees for brackets:
while i < evaluate_until {
let par_open = input[i..evaluate_until].find("(").map(|p| i + p);
let par_close = input[i..evaluate_until].find(")").map(|p| i + p);
if par_open.is_some() && par_close.unwrap() > par_open.unwrap() {
let subtree_start = par_open.unwrap();
let subtree = build_expression_tree(&input[(subtree_start + 1)..]);
let subtree_end = subtree_start + subtree.1 + 1;
subtrees.push((subtree_start, subtree_end, subtree.0));
i = subtree_end + 1;
} else {
if par_close.is_some() {
// If we find a closing parenthesis, we're apparently building a subtree
evaluate_until = par_close.unwrap();
break;
} else {
// No parenthesis, so no need to search further
break;
}
}
}
}
// println!("Subtrees between parentheses in '{}':", &input[0..evaluate_until]);
// subtrees.iter().for_each(|s| println!("{:?}", s));
// Now we're gonna match/find all +:
build_subtrees_for_operators(input, 0, evaluate_until, "+", &Operator::Add, &mut subtrees);
build_subtrees_for_operators(input, 0, evaluate_until, "*", &Operator::Multiply, &mut subtrees);
// // By now we should have a single root node left
// println!("Subtrees in '{}':", &input[0..evaluate_until]);
// subtrees.iter().for_each(|s| println!("{:?}", s));
assert_eq!(subtrees.len(), 1);
return (subtrees.remove(0).2, evaluate_until);
}
fn is_not_whitespace(c: char) -> bool {
return !c.is_whitespace();
}
fn build_subtrees_for_operators(input: &str, from: usize, until: usize, operator_symbol: &str, operator: &Operator, subtrees: &mut Vec<(usize, usize, ExpressionTreeNode)>) {
let mut i = if subtrees.is_empty() || subtrees[0].0 > from { 0 } else { subtrees[0].1 + 1 };
// Subtree index points to the subtree after the current search-range
let mut subtree_idx = if i == 0 { 0 } else { 1 };
let mut search_until = if subtrees.is_empty() { until } else if subtree_idx < subtrees.len() { subtrees[subtree_idx].0 } else { until };
while i < until {
let operator_idx = input[i..search_until].find(operator_symbol).map(|r| i + r);
if operator_idx.is_some() {
// Found the operator symbol, let's build a subtree with whatever is left and right of it:
let subtree_end = build_subtree_for_operator(operator_idx.unwrap(), &input, operator, subtrees);
i = subtree_end + 1;
if i > search_until {
// Our newly build subtree includes the last search range:
search_until = subtrees.iter().map(|s| s.0).find(|s| s > &i).unwrap_or(until);
}
} else {
subtree_idx += 1;
// If the subtree_idx points the to subtree "after" the last one, that just means to search until the end of the string
// If the subtree_idx points even after that, then we're done.
if subtree_idx > subtrees.len() {
break;
}
i = subtrees[subtree_idx - 1].1;
search_until = if subtrees.is_empty() { until } else if subtree_idx < subtrees.len() { subtrees[subtree_idx].0 } else { until };
if i == search_until {
break;
}
}
}
}
fn build_subtree_for_operator(idx: usize, input: &str, op: &Operator, subtrees: &mut Vec<(usize, usize, ExpressionTreeNode)>) -> usize {
let left_idx = input[0..idx].rfind(is_not_whitespace).unwrap();
let right_idx = idx + 1 + input[(idx + 1)..].find(is_not_whitespace).unwrap();
let left_subtree = subtrees.binary_search_by_key(&left_idx, |s| s.1);
let right_subtree = subtrees.binary_search_by_key(&right_idx, |s| s.0);
let subtree_start = if left_subtree.is_ok() { subtrees[left_subtree.unwrap()].0 } else {left_idx};
let subtree_end = if right_subtree.is_ok() { subtrees[right_subtree.unwrap()].1 } else {right_idx};
let subtree = ExpressionTreeNode {
operator: Option::Some(op.clone()),
right: Option::Some(Box::from( if right_subtree.is_ok() { subtrees.remove(right_subtree.unwrap()).2 } else { ExpressionTreeNode::leaf_node(&input[right_idx..(right_idx+ 1)]) })),
left: Option::Some( Box::from(if left_subtree.is_ok() { subtrees.remove(left_subtree.unwrap()).2 } else { ExpressionTreeNode::leaf_node(&input[left_idx..(left_idx + 1)]) })),
num: Option::None,
};
let insertion_index = if subtrees.is_empty() { 0 } else {
let res = subtrees.binary_search_by_key(&subtree_start, |s| s.0);
if res.is_ok() { res.unwrap() } else { res.unwrap_err() }
};
subtrees.insert(insertion_index, (subtree_start, subtree_end, subtree));
return subtree_end;
}
#[derive(Debug, PartialEq, Clone)]
enum Operator {
Multiply, Add
}
impl Operator {
fn apply(&self, x: u64, y: u64) -> u64 {
return match self {
Operator::Add => x + y,
Operator::Multiply => x * y
}
}
}
#[derive(Debug)]
struct ExpressionTreeNode {
operator: Option<Operator>,
num: Option<u64>,
left: Option<Box<ExpressionTreeNode>>,
right: Option<Box<ExpressionTreeNode>>,
}
impl ExpressionTreeNode {
fn leaf_node(input: &str) -> ExpressionTreeNode {
return ExpressionTreeNode {
operator: Option::None,
left: Option::None,
right: Option::None,
num: Option::Some(input.parse::<u64>().unwrap())
};
}
fn evaluate(&self) -> u64 {
return if self.num.is_some() {
self.num.unwrap()
} else {
self.operator.as_ref().unwrap().apply(self.left.as_ref().unwrap().evaluate(), self.right.as_ref().unwrap().evaluate())
}
}
}

112
src/day19.rs Normal file
View File

@@ -0,0 +1,112 @@
use super::util;
use regex::Regex;
use crate::day19::RuleType::{Letter, Options};
use std::collections::{HashMap, HashSet};
pub fn solve() {
let lines = util::read_file("input/day19.txt");
let mut rules_map = HashMap::new();
lines.iter()
.take_while(|s| s != &&String::from(""))
.for_each(|s| {
let mut line_split = s.split(": ");
let idx = line_split.next().unwrap().parse::<usize>().unwrap();
let rule = Rule::parse(line_split.next().unwrap());
rules_map.insert(idx, rule);
});
let messages: Vec<&String> = lines[(rules_map.len() + 1)..].iter().collect();
println!("{:?}", try_match(&messages[0], &0, &rules_map));
let part1 = messages.iter().filter(|m| try_match(m, &0, &rules_map).contains(&m.len())).count();
println!("Day X Part 1: {}", part1);
// We update the rules to include the loops:
rules_map.insert(8, Rule::parse("42 | 42 8"));
rules_map.insert(11, Rule::parse("42 31 | 42 11 31"));
let part2 = messages.iter().filter(|m| try_match(m, &0, &rules_map).contains(&m.len())).count();
println!("Day X Part 2: {}", part2);
}
/// Calculates and returns until when the string was matched
fn try_match(message: &str, rule_idx: &usize, rules: &HashMap<usize, Rule>) -> HashSet<usize> {
let rule = rules.get(&rule_idx).unwrap();
if rule.rule_type == Letter {
if message.starts_with(rule.letters.as_ref().unwrap()) {
let mut res = HashSet::new();
// Note: kind of a hack here, all the "letter" based matchers are of length 1
res.insert(rule.letters.as_ref().unwrap().len().clone());
return res;
} else {
return HashSet::new();
}
} else {
return rule.options.as_ref().unwrap().iter()
.flat_map(|options| {
let mut try_from = HashSet::new();
try_from.insert(0);
let mut next_try_from = HashSet::new();
for option_rule_idx in options {
for start_idx in try_from {
try_match(&message[start_idx..], &option_rule_idx, rules)
.iter()
.for_each(|m| { if m != &0 { next_try_from.insert(start_idx + m); () }})
}
try_from = next_try_from.clone();
if try_from.is_empty() { break; }
next_try_from.clear();
}
return try_from;
}).collect();
}
}
#[derive(Debug, Clone)]
struct Rule {
rule_type: RuleType,
letters: Option<String>,
options: Option<Vec<Vec<usize>>>
}
impl Rule {
fn parse(input: &str) -> Rule {
lazy_static! {
static ref LETTER_RULE_MATCHER: Regex = Regex::new(r###"^"([a-z])"$"###).unwrap();
}
return if LETTER_RULE_MATCHER.is_match(input) {
Rule {
rule_type: Letter,
letters: Option::Some(LETTER_RULE_MATCHER.captures(input).unwrap().get(1).map(|m| String::from(m.as_str())).unwrap()),
options: Option::None,
}
} else {
let options =
input.split(" | ")
.map(|s| s.split(" ").map(|o| o.parse::<usize>().unwrap()).collect::<Vec<_>>()).collect::<Vec<_>>();
Rule {
rule_type: Options,
letters: Option::None,
options: Option::Some(options)
}
}
}
}
#[derive(Debug, PartialEq, Clone)]
enum RuleType {
Letter, Options
}

240
src/day20.rs Normal file
View File

@@ -0,0 +1,240 @@
use super::util;
use std::collections::HashMap;
const PIECE_SIZE: u16 = 10;
// const POSSIBLE_EDGE_COUNT: u16 = 1 << (PIECE_SIZE + 1);
pub fn solve() {
let lines = util::read_file("input/day20.txt");
let mut piece_id = 0u32;
let mut piece_lines: Vec<PieceLine> = Vec::new();
let mut pieces = Vec::new();
for line in &lines {
if line == &"" {
pieces.push(Piece::from(piece_id, piece_lines));
piece_lines = Vec::new();
} else if line.starts_with("Tile") {
piece_id = line[5..(line.len() - 1)].parse::<u32>().unwrap();
} else {
piece_lines.push(PieceLine::parse(&line));
}
}
if !piece_lines.is_empty() {
pieces.push(Piece::from(piece_id, piece_lines));
}
pieces.sort_by_key(|p| p.id);
// Let's create an array containing for each puzzle piece side, in which pieces it appears:
let mut piece_matches = HashMap::new();
for piece in &pieces {
add_to_piece_matches(piece.id, &piece.top_edge, &piece.flipped_top_edge, &mut piece_matches);
add_to_piece_matches(piece.id, &piece.bottom_edge, &piece.flipped_bottom_edge, &mut piece_matches);
add_to_piece_matches(piece.id, &piece.left_edge, &piece.flipped_left_edge, &mut piece_matches);
add_to_piece_matches(piece.id, &piece.right_edge, &piece.flipped_right_edge, &mut piece_matches);
}
// println!("{:?}", piece_matches);
// And now we find which pieces are adjacent (same edge) to which other pieces (not caring about orientation at all)
let mut matched_edge_count: HashMap<u32, usize> = HashMap::new();
for piece_match in piece_matches {
if piece_match.1.len() == 1 {
continue;
}
piece_match.1.iter().for_each(|m| { matched_edge_count.entry(m.clone()).and_modify(|c| *c += 1 ).or_insert(1); })
}
println!("{:?}", matched_edge_count);
let corner_pieces: Vec<u32> = matched_edge_count.iter().filter(|e| e.1 == &2).map(|e| e.0.clone()).collect::<Vec<_>>();
assert_eq!(corner_pieces.len(), 4);
let part1 = corner_pieces.iter().fold(1u64, |a, b| a as u64 * b.clone() as u64);
println!("Day X Part 1: {}", part1);
let part2 = 0;
println!("Day X Part 2: {}", part2);
}
#[allow(dead_code)]
fn make_puzzle(pieces: &HashMap<u32, Piece>, piece_matches: &HashMap<u16, Vec<u32>>, matched_edge_count: &HashMap<u32, usize>) {
let corner_pieces = matched_edge_count.iter().filter(|e| e.1 == &2).map(|e| e.0.clone()).collect::<Vec<u32>>();
let edge_pieces = matched_edge_count.iter().filter(|e| e.1 == &3).map(|e| e.0.clone()).collect::<Vec<u32>>();
let center_pieces = matched_edge_count.iter().filter(|e| e.1 == &4).map(|e| e.0.clone()).collect::<Vec<u32>>();
let mut puzzle = Puzzle { state: Vec::new() };
// First let's make the edges:
let first_corner_piece = pieces.get(&corner_pieces[0]);
// TODO Find out what side of the corner pieces were matched and orient it correctly:
// let last_piece = pieces.get(&corner_pieces[0]).unwrap();
// let last_piece_state = PieceState {
// piece_id: corner_pieces[0],
// degrees: 0,
// flip_horizontal: false,
// flip_vertical: false
// };
// puzzle.pieces.push(vec![Option::Some(last_piece_state)]);
// loop {
//
//
// }
}
fn add_to_piece_matches(piece_id: u32, edge: &PieceLine, flipped_edge: &PieceLine, piece_matches: &mut HashMap<u16, Vec<u32>>) {
let use_flipped = flipped_edge.data < edge.data;
let bookkeeping_edge = if use_flipped { flipped_edge } else { edge };
piece_matches.entry(bookkeeping_edge.data).and_modify(|d| d.push(piece_id)).or_insert(vec![ piece_id ]);
}
#[derive(Debug, Clone)]
struct Puzzle {
state: Vec<Vec<Option<PieceState>>>
}
#[derive(Debug, Clone)]
struct PieceState {
// 0, 90, 180 or 270
piece_id: u32,
degrees: u16,
flipped: bool,
}
impl PieceState {
/// Returns the edge on the right, given the current piece state (i.e. this might be actually the edge on top or a flipped
/// edge depending on the rotation
fn right_edge<'piece>(&self, piece: &'piece Piece) -> &'piece PieceLine {
return match self.degrees {
0 =>
if self.flipped {
&piece.left_edge
} else {
&piece.right_edge
}
90 =>
if self.flipped {
&piece.flipped_top_edge
} else {
&piece.top_edge
}
180 => {
if self.flipped {
&piece.flipped_right_edge
} else {
&piece.flipped_left_edge
}
}
270 => {
if self.flipped {
&piece.bottom_edge
} else {
&piece.flipped_bottom_edge
}
}
_ => panic!("Unsupported rotation")
}
}
}
#[derive(Debug, Clone)]
struct Piece {
id: u32,
piece_lines: Vec<PieceLine>,
// left to right top edge
top_edge: PieceLine,
// left to right bottom edge
bottom_edge: PieceLine,
// Left edge (from top to bottom)
left_edge: PieceLine,
// Right edge (from to to bottom)
right_edge: PieceLine,
// Right to left top edge
flipped_top_edge: PieceLine,
// Right to left bottom edge
flipped_bottom_edge: PieceLine,
// Bottom to top left edge
flipped_left_edge: PieceLine,
// Bottom to top right edge
flipped_right_edge: PieceLine,
}
impl Piece {
fn from(id: u32, piece_lines: Vec<PieceLine>) -> Piece {
let top_edge = piece_lines[0].clone();
let bottom_edge = piece_lines[(PIECE_SIZE - 1) as usize].clone();
let left_edge = Piece::get_vertical(0, &piece_lines);
let right_edge = Piece::get_vertical(PIECE_SIZE - 1, &piece_lines);
return Piece {
id, piece_lines,
flipped_top_edge: top_edge.flipped(), flipped_bottom_edge: bottom_edge.flipped(),
flipped_left_edge: left_edge.flipped(), flipped_right_edge: right_edge.flipped(),
top_edge, bottom_edge, left_edge, right_edge,
};
}
fn get_vertical(x: u16, piece_lines: &Vec<PieceLine>) -> PieceLine {
let mut vert = 0;
for i in 0..PIECE_SIZE {
if piece_lines[i as usize].get(x as usize) {
vert |= 1 << i;
}
}
return PieceLine { data: vert };
}
}
#[derive(Debug, PartialEq, Clone)]
struct PieceLine {
data: u16,
}
impl PieceLine {
fn parse(line: &String) -> PieceLine {
let mut data = 0u16;
let mut i = 0;
for char in line.chars() {
if char == '#' {
data |= 1 << i;
}
i += 1;
}
return PieceLine { data };
}
fn get(&self, i: usize) -> bool {
let mask = 1u16 << i;
return self.data & mask == mask;
}
fn flipped(&self) -> PieceLine {
let mut res = 0u16;
for i in 0..PIECE_SIZE {
if self.get(i as usize) {
res |= 1 << (PIECE_SIZE - i - 1)
}
}
return PieceLine { data: res };
}
}

89
src/day21.rs Normal file
View File

@@ -0,0 +1,89 @@
use super::util;
use std::collections::{HashSet, HashMap};
use std::iter::FromIterator;
pub fn solve() {
let lines = util::read_file("input/day21.txt");
let recipes = lines.iter().map(Recipe::parse).collect::<Vec<Recipe>>();
// println!("{:?}", recipes);
// An ingredient that contains an allergen, must appear in all recipes that list that allergen.
// So all ingredients that don't appear in any such intersections, cannot contain allergens.
let mut allergens = recipes.iter().flat_map(|r| &r.allergens).collect::<Vec<&String>>();
allergens.sort();
allergens.dedup();
// println!("{:?}", allergens);
let mut possible_ingredients_per_allergen: HashMap<&String, Vec<&String>> = HashMap::new();
for allergen in &allergens {
let matching_recipes = recipes.iter()
.filter(|r| r.allergens.contains(allergen))
.collect::<Vec<&Recipe>>();
let mut matching_ingredients = matching_recipes[0].ingredients.iter().collect::<Vec<&String>>();
for recipe in matching_recipes[1..].iter() {
matching_ingredients = matching_ingredients.iter().filter(|i| recipe.ingredients.contains(**i)).map(|i| *i).collect();
}
possible_ingredients_per_allergen.insert(allergen, matching_ingredients);
}
// println!("{:?}", possible_ingredients_per_allergen);
// Now all the ingredients that are not "possible ingredients per allergen" can not possibly contain an allergen, so we count those instances:
let allergy_ingredients: HashSet<&String> = HashSet::from_iter(possible_ingredients_per_allergen.iter()
.flat_map(|e| e.1.iter()).map(|i|*i));
let part1: usize = recipes.iter().map(|r| r.ingredients.iter().filter(|i| !allergy_ingredients.contains(i)).count()).sum();
println!("Day 21 Part 1: {}", part1);
let mut remaining_ingredients_per_allergen: Vec<(&String, Vec<&String>)> = possible_ingredients_per_allergen.iter()
.map(|e| (*e.0, e.1.iter().map(|i|*i).collect()))
.collect();
let mut allergen_to_ingredient: HashMap<String, String> = HashMap::new();
loop {
let known_allergens: Vec<(String, String)> = remaining_ingredients_per_allergen.iter()
.filter(|e| e.1.len() == 1)
.map(|e| ((*e.0).clone(), e.1[0].clone())).collect();
for known_allergen in known_allergens {
remaining_ingredients_per_allergen = remaining_ingredients_per_allergen
.iter().filter(|e| e.0 != &known_allergen.0)
.map(|e| (e.0, e.1.iter().filter(|i| &known_allergen.1 != **i).map(|i| *i).collect()))
.collect();
allergen_to_ingredient.insert(known_allergen.0, known_allergen.1);
}
if remaining_ingredients_per_allergen.is_empty() {
break;
}
}
let dangerous_ingredients = allergens.iter().map(|a| allergen_to_ingredient.get(*a).unwrap().clone()).collect::<Vec<String>>();
let part2 = dangerous_ingredients.join(",");
println!("Day 21 Part 2: {}", part2);
}
#[derive(Debug, Clone)]
struct Recipe {
ingredients: HashSet<String>,
allergens: Vec<String>
}
impl Recipe {
fn parse(line: &String) -> Recipe {
let allergens_idx = line.find("(contains ").unwrap();
let ingredients = HashSet::from(line[0..allergens_idx - 1].split(char::is_whitespace).map(|i| String::from(i)).collect());
let allergens = line[allergens_idx + "(contains ".len()..line.len() - 1].split(", ").map(String::from).collect::<Vec<String>>();
return Recipe { ingredients, allergens };
}
}

111
src/day22.rs Normal file
View File

@@ -0,0 +1,111 @@
use super::util;
use std::collections::{VecDeque, HashSet};
pub fn solve() {
let lines = util::read_file("input/day22.txt");
let p1_cards = lines.iter().skip(1)
.take_while(|s| s != &"")
.map(|s| s.parse::<u32>().unwrap())
.collect();
let p2_cards = lines.iter().skip_while(|s| s != &"Player 2:")
.skip(1)
.map(|s| s.parse::<u32>().unwrap())
.collect();
let part1 = play_combat(&p1_cards, &p2_cards);
println!("Day 22 Part 1: {}", part1);
let part2 = play_recursive_combat(&p1_cards, &p2_cards);
println!("Day 22 Part 2: {}", part2.1);
}
fn play_combat(p1_cards: &Vec<u32>, p2_cards: &Vec<u32>) -> u32 {
let mut p1_stack = VecDeque::from(p1_cards.clone());
let mut p2_stack = VecDeque::from(p2_cards.clone());
loop {
let p1_card = p1_stack.pop_front();
if !p1_card.is_some() {
return calculate_score(&p2_stack);
}
let p2_card = p2_stack.pop_front();
if !p2_card.is_some() {
// Push the card back on the stack
p1_stack.push_front(p1_card.unwrap());
return calculate_score(&p1_stack);
}
if p1_card.unwrap() > p2_card.unwrap() {
p1_stack.push_back(p1_card.unwrap());
p1_stack.push_back(p2_card.unwrap());
} else {
p2_stack.push_back(p2_card.unwrap());
p2_stack.push_back(p1_card.unwrap());
}
}
}
fn play_recursive_combat(p1_cards: &Vec<u32>, p2_cards: &Vec<u32>) -> (u32, u32) {
let mut p1_stack = VecDeque::from(p1_cards.clone());
let mut p2_stack = VecDeque::from(p2_cards.clone());
let mut known_configurations = HashSet::new();
loop {
// TODO: Find a quick way to check if we already found this configuration before
let config = (p1_stack.clone(), p2_stack.clone());
if known_configurations.contains(&config) {
// Player 1 wins by infinite loop protection:
return (1, calculate_score(&p1_stack));
}
known_configurations.insert(config);
let p1_card = p1_stack.pop_front();
if !p1_card.is_some() {
return (2, calculate_score(&p2_stack));
}
let p2_card = p2_stack.pop_front();
if !p2_card.is_some() {
// Push the card back on the stack
p1_stack.push_front(p1_card.unwrap());
return (1, calculate_score(&p1_stack));
}
let winning_player;
if p1_card.unwrap() as usize <= p1_stack.len() && p2_card.unwrap() as usize <= p2_stack.len() {
// Let's play a recursive round:
let recursive_result = play_recursive_combat(
&p1_stack.iter().take(p1_card.unwrap() as usize).map(|n| n.clone()).collect(),
&p2_stack.iter().take(p2_card.unwrap() as usize).map(|n| n.clone()).collect::<Vec<u32>>());
winning_player = recursive_result.0;
} else {
if p1_card.unwrap() > p2_card.unwrap() {
winning_player = 1;
} else {
winning_player = 2;
}
}
if winning_player == 1 {
p1_stack.push_back(p1_card.unwrap());
p1_stack.push_back(p2_card.unwrap());
} else if winning_player == 2 {
p2_stack.push_back(p2_card.unwrap());
p2_stack.push_back(p1_card.unwrap());
} else {
panic!("No winner!");
}
}
}
fn calculate_score(stack: &VecDeque<u32>) -> u32 {
return stack.iter().rev().enumerate()
.map(|c| (c.0 + 1) as u32 * c.1)
.sum();
}

84
src/day23.rs Normal file
View File

@@ -0,0 +1,84 @@
use super::util;
use std::collections::LinkedList;
use std::iter::FromIterator;
use std::convert::TryFrom;
use std::intrinsics::copy;
pub fn solve() {
let lines = util::read_file("input/day23.txt");
let input = lines.first().unwrap().chars().map(|c| (c as u8 - '0' as u8)).collect::<Vec<u8>>();
let result = play_game(<&[u8; 9]>::try_from(&input[0..]).unwrap(), 100);
let part1 = reorder_starting_from(&result, 1).iter().take(8).map(|s| s.to_string()).collect::<Vec<String>>().join("");
println!("Day 23 Part 1: {}", part1);
let part2 = 0;
println!("Day 23 Part 2: {}", part2);
}
fn play_game(input: &[u8; 9], rounds: u64) -> [u8; 9] {
let max_cup = input.iter().max().unwrap().clone();
let min_cup = input.iter().min().unwrap().clone();
let len = input.len();
let mut cur_order = input.clone();
let mut next_order = input.clone();
let mut cur_idx = 0usize;
for _ in 0..rounds {
let cur_label = &cur_order[cur_idx];
let mut dest_label = if cur_label == &min_cup { max_cup } else { cur_label - 1 };
let mut dest_idx = index_of(&cur_order, &dest_label);
let mut looped_dest_idx = if dest_idx < cur_idx { dest_idx + input.len() } else { dest_idx };
while looped_dest_idx > cur_idx && looped_dest_idx <= cur_idx + 3 {
dest_label = if dest_label == min_cup { max_cup } else { dest_label - 1 };
dest_idx = index_of(&cur_order, &dest_label);
looped_dest_idx = if dest_idx < cur_idx { dest_idx + input.len() } else { dest_idx };
}
// First copy the part from the end of the "picked up" cups to the destination
for i in cur_idx + 4..looped_dest_idx + 1 {
next_order[(i - 3) % len] = cur_order[i % len];
}
// Then copy the picked up cups to the destination
for i in 0..3 {
next_order[(looped_dest_idx - 2 + i) % len] = cur_order[(cur_idx + 1 + i) % len];
}
// println!("{:?}", next_order);
for c in input {
assert!(next_order.contains(c), format!("Lost {} while playing with index {} and destination label {}, dest index {}", c, cur_idx, dest_label, dest_idx));
}
// The rest should already be in the correct order
cur_order = next_order.clone();
cur_idx = (cur_idx + 1) % input.len();
}
return cur_order;
}
fn index_of(cups: &[u8;9], cup: &u8) -> usize {
for i in 0..cups.len() {
if &cups[i] == cup {
return i;
}
}
panic!(format!("Couldn't find {}", cup));
}
fn reorder_starting_from(cups: &[u8; 9], n:u8) -> [u8; 9] {
let n_idx = index_of(cups, &n);
let mut res = [0u8; 9];
for i in 0..9 {
res[i] = cups[(n_idx + 1 + i) % cups.len()];
}
return res;
}

View File

@@ -17,8 +17,16 @@ mod day12;
mod day13;
mod day14;
mod day15;
mod day16;
mod day17;
mod day18;
mod day19;
mod day20;
mod day21;
mod day22;
mod day23;
const MAX_DAY: u8 = 15;
const MAX_DAY: u8 = 23;
const BENCHMARK_AMOUNT: u32 = 100;
fn solve(day: u8) {
@@ -38,6 +46,14 @@ fn solve(day: u8) {
13 => day13::solve(),
14 => day14::solve(),
15 => day15::solve(),
16 => day16::solve(),
17 => day17::solve(),
18 => day18::solve(),
19 => day19::solve(),
20 => day20::solve(),
21 => day21::solve(),
22 => day22::solve(),
23 => day23::solve(),
_ => println!("This day is not yet implemented")
}
}