rename repo, subdir for yearly challenges
This commit is contained in:
263
2020/day16/INPUT.txt
Normal file
263
2020/day16/INPUT.txt
Normal file
@@ -0,0 +1,263 @@
|
||||
departure location: 45-535 or 550-961
|
||||
departure station: 45-278 or 294-974
|
||||
departure platform: 46-121 or 138-965
|
||||
departure track: 38-149 or 173-949
|
||||
departure date: 34-223 or 248-957
|
||||
departure time: 32-64 or 79-952
|
||||
arrival location: 49-879 or 905-968
|
||||
arrival station: 47-306 or 323-973
|
||||
arrival platform: 46-823 or 834-971
|
||||
arrival track: 30-464 or 486-963
|
||||
class: 40-350 or 372-965
|
||||
duration: 47-414 or 423-950
|
||||
price: 45-507 or 526-956
|
||||
route: 42-779 or 799-970
|
||||
row: 26-865 or 872-955
|
||||
seat: 43-724 or 739-970
|
||||
train: 25-914 or 926-958
|
||||
type: 33-205 or 218-965
|
||||
wagon: 43-101 or 118-951
|
||||
zone: 45-844 or 858-970
|
||||
|
||||
your ticket:
|
||||
173,191,61,199,101,179,257,79,193,223,139,97,83,197,251,53,89,149,181,59
|
||||
|
||||
nearby tickets:
|
||||
949,764,551,379,767,144,556,835,638,591,653,872,198,825,690,527,260,396,873,333
|
||||
438,627,99,622,408,671,695,561,695,121,706,144,55,985,566,706,255,595,680,407
|
||||
879,876,665,928,874,436,766,328,620,267,995,54,430,503,86,936,489,305,64,688
|
||||
613,812,756,258,341,765,91,551,859,379,447,842,148,501,293,766,93,532,939,406
|
||||
349,340,670,248,813,557,249,949,506,656,100,19,204,409,944,659,777,843,712,801
|
||||
438,52,529,556,672,115,570,633,820,770,603,837,260,251,723,621,381,182,494,431
|
||||
948,673,202,330,552,258,406,184,177,239,774,185,638,386,834,608,835,636,805,92
|
||||
573,643,267,378,178,821,442,141,872,826,565,626,667,860,405,610,407,688,705,695
|
||||
818,724,446,459,145,373,859,346,702,441,446,753,320,426,664,177,619,712,739,342
|
||||
607,499,226,80,719,682,556,486,346,221,597,936,573,84,760,671,395,413,454,768
|
||||
743,504,830,195,413,698,93,375,565,695,947,636,602,681,436,265,614,604,632,706
|
||||
463,353,944,569,175,535,616,452,141,621,84,335,302,275,550,438,173,617,843,645
|
||||
685,400,777,752,839,86,180,754,231,450,342,341,440,57,271,202,494,591,223,707
|
||||
838,147,937,451,96,265,488,345,334,871,767,450,340,576,816,335,143,445,339,379
|
||||
502,566,121,743,99,909,876,265,204,799,566,387,672,102,713,559,773,770,571,609
|
||||
428,712,575,759,708,272,629,862,569,856,402,82,424,837,336,643,841,944,603,436
|
||||
273,987,944,534,862,943,267,741,562,327,193,838,822,933,860,933,459,811,622,383
|
||||
423,937,320,374,801,942,490,257,646,724,558,507,198,601,713,719,667,260,585,948
|
||||
404,679,328,916,688,615,345,688,556,146,452,306,89,742,808,141,816,85,938,457
|
||||
180,335,648,810,119,202,393,268,921,177,92,462,605,615,248,599,394,303,269,599
|
||||
941,261,695,643,381,830,753,705,84,694,305,61,556,256,599,653,388,566,626,759
|
||||
148,340,708,139,625,680,713,695,583,356,182,457,458,95,841,496,591,347,392,670
|
||||
534,434,615,686,348,621,832,275,380,667,811,590,389,585,528,652,862,617,778,535
|
||||
81,653,435,681,584,455,261,928,121,863,263,807,599,593,691,320,495,329,879,380
|
||||
739,632,692,639,702,94,274,910,707,758,196,934,490,189,169,333,807,396,448,719
|
||||
590,588,570,617,910,928,304,663,531,470,203,505,277,669,841,593,668,693,338,671
|
||||
938,259,221,406,579,390,619,327,824,601,502,529,573,912,930,396,940,139,501,819
|
||||
633,326,149,590,618,581,583,195,755,678,746,717,527,326,557,775,330,518,807,192
|
||||
438,722,427,758,324,251,757,753,297,300,438,304,588,633,254,823,835,766,977,195
|
||||
335,430,937,298,266,258,331,551,747,644,575,120,373,629,652,583,777,131,804,941
|
||||
427,663,220,864,378,80,945,695,7,584,679,375,566,176,300,631,932,558,639,681
|
||||
577,644,678,146,396,443,94,488,670,691,260,931,834,755,577,395,420,94,57,664
|
||||
660,574,799,666,748,858,393,603,120,391,561,138,631,578,463,344,382,747,699,102
|
||||
676,866,348,927,187,452,615,943,52,752,749,707,699,615,840,563,653,271,844,223
|
||||
573,453,587,838,260,802,768,303,382,817,429,486,586,184,502,156,486,486,816,203
|
||||
433,285,809,588,756,504,121,598,265,273,666,769,799,405,218,189,221,191,681,712
|
||||
612,63,678,529,775,684,531,838,617,572,555,386,628,272,765,603,23,393,743,753
|
||||
775,704,877,81,597,529,579,699,527,662,652,456,801,863,94,335,679,820,415,714
|
||||
714,306,176,652,492,446,325,580,647,149,554,708,504,327,624,245,702,506,843,756
|
||||
173,294,877,499,714,200,253,808,661,664,14,879,146,533,693,527,424,660,274,204
|
||||
564,434,116,585,801,617,764,860,376,185,639,698,863,620,753,253,253,182,93,491
|
||||
685,559,336,773,906,568,936,270,938,397,95,264,95,119,266,21,250,709,528,591
|
||||
174,57,400,298,350,799,139,603,686,586,601,663,527,248,560,613,838,742,698,225
|
||||
335,275,260,293,142,266,611,685,400,840,337,584,276,770,698,191,665,668,685,50
|
||||
706,97,296,848,85,63,600,191,120,490,905,776,581,435,265,530,602,61,596,646
|
||||
327,663,656,436,773,760,255,609,655,452,439,490,254,939,327,815,600,235,507,811
|
||||
334,58,143,417,630,455,454,390,327,339,906,494,739,188,260,842,298,740,680,662
|
||||
398,346,388,443,680,563,666,666,438,764,559,926,909,948,437,72,493,809,397,381
|
||||
176,272,305,197,346,610,179,253,506,413,174,506,647,689,338,570,873,929,317,820
|
||||
553,946,409,562,258,398,187,429,819,104,909,571,534,266,739,258,643,60,601,379
|
||||
678,905,187,870,253,184,489,414,690,184,175,741,197,626,388,204,612,637,219,259
|
||||
346,665,800,614,94,264,658,811,374,640,666,295,449,976,563,696,695,675,527,694
|
||||
821,387,760,379,635,251,51,911,54,543,710,808,453,873,746,326,258,306,411,764
|
||||
186,487,378,937,559,575,382,931,664,697,534,576,715,940,984,628,409,651,676,665
|
||||
502,393,59,176,760,326,106,378,96,573,344,174,652,294,650,703,402,297,185,52
|
||||
834,433,613,554,764,839,493,752,185,254,388,83,769,621,623,17,607,330,529,690
|
||||
818,21,649,258,186,258,775,449,454,912,61,603,578,578,410,603,770,254,535,269
|
||||
757,615,389,650,749,630,560,257,269,822,412,740,759,941,59,835,522,462,494,531
|
||||
570,764,174,296,499,867,277,700,820,380,663,718,756,462,496,564,562,698,265,147
|
||||
500,680,271,610,396,820,250,827,87,768,671,906,706,865,300,560,815,691,745,907
|
||||
385,346,945,504,411,291,566,530,677,685,95,659,393,692,683,822,553,640,753,204
|
||||
492,821,178,186,488,140,411,739,135,582,445,776,222,699,656,633,879,807,591,428
|
||||
635,931,935,304,84,634,416,670,611,773,64,821,570,389,504,671,927,773,333,906
|
||||
807,626,617,932,187,402,581,640,693,551,458,583,444,126,695,711,221,327,835,947
|
||||
679,750,506,101,705,335,568,615,550,388,497,940,861,260,714,776,333,993,388,753
|
||||
197,656,802,589,341,993,378,390,347,403,927,593,928,673,747,554,680,775,342,639
|
||||
639,76,742,603,424,219,754,458,257,350,186,805,193,764,390,627,749,342,433,439
|
||||
629,704,941,304,637,860,661,388,139,404,945,647,573,840,886,149,667,382,399,747
|
||||
588,195,763,438,835,707,220,268,838,574,402,980,372,347,92,205,261,86,681,86
|
||||
266,739,816,2,585,701,841,600,590,497,204,743,383,810,140,617,864,770,705,300
|
||||
62,673,949,391,765,184,305,528,101,192,708,275,561,649,606,527,687,315,197,633
|
||||
433,419,644,531,626,534,300,263,265,257,618,303,631,194,675,684,694,669,861,721
|
||||
692,764,408,248,459,176,691,179,252,618,685,456,431,119,948,334,104,433,581,85
|
||||
333,341,627,766,620,263,720,118,690,914,641,204,189,722,197,912,612,65,930,906
|
||||
711,387,815,619,202,592,613,221,765,403,715,939,844,715,537,204,176,683,656,746
|
||||
91,927,559,933,197,406,641,658,391,199,339,272,383,932,829,196,739,755,720,430
|
||||
864,603,696,455,752,374,703,98,508,119,756,331,758,396,600,258,842,191,350,526
|
||||
633,121,659,428,179,562,715,821,404,260,587,760,570,707,711,566,570,642,824,560
|
||||
774,22,878,300,676,763,95,931,268,574,82,490,218,937,602,940,665,97,60,566
|
||||
223,632,412,385,909,707,336,937,808,743,775,705,99,984,380,384,585,99,337,724
|
||||
947,709,610,646,665,593,278,755,556,606,189,679,403,377,677,84,392,108,638,651
|
||||
262,424,498,429,623,385,496,138,696,693,258,454,273,868,533,834,257,100,459,99
|
||||
817,56,51,544,631,258,101,384,841,906,637,681,772,189,305,181,200,608,839,932
|
||||
141,409,907,665,54,177,349,173,4,448,843,717,380,253,598,140,570,820,502,948
|
||||
184,920,382,142,342,530,612,431,196,710,101,704,398,862,612,377,173,876,218,757
|
||||
811,800,437,212,756,425,584,616,384,119,839,334,934,600,534,178,86,624,532,711
|
||||
938,334,603,142,54,695,5,874,779,700,632,99,942,223,661,579,807,707,614,602
|
||||
665,296,52,621,320,434,570,506,687,908,905,714,185,683,758,617,644,82,95,716
|
||||
656,685,176,452,385,195,375,87,814,290,52,683,413,456,457,656,143,634,174,659
|
||||
756,765,269,251,263,616,715,637,760,454,533,489,52,251,418,306,202,838,180,198
|
||||
877,557,220,115,249,774,63,97,348,119,940,444,486,616,926,82,256,585,619,772
|
||||
758,337,98,360,296,453,739,807,390,634,497,820,381,179,349,714,676,256,765,60
|
||||
50,619,639,941,571,66,267,454,561,379,143,452,554,393,759,149,148,875,397,640
|
||||
274,523,275,683,384,620,94,811,79,839,776,589,507,194,430,331,95,606,631,88
|
||||
165,121,84,575,201,409,82,800,401,52,301,493,325,691,503,336,555,774,706,251
|
||||
576,119,938,333,462,449,339,382,266,808,145,763,459,810,910,342,640,199,617,520
|
||||
408,762,183,409,763,59,333,932,323,59,560,703,306,856,269,652,298,98,488,587
|
||||
344,948,221,749,835,316,779,860,56,205,723,712,553,346,721,305,494,338,186,819
|
||||
184,773,66,619,554,807,120,437,774,645,272,89,710,378,659,403,253,533,396,715
|
||||
610,579,565,758,336,817,690,406,289,724,618,200,188,486,529,488,841,582,101,671
|
||||
14,325,750,801,182,263,858,550,710,391,633,768,265,601,910,687,429,689,337,402
|
||||
200,653,645,875,527,382,348,424,909,810,186,426,60,682,90,83,121,595,116,834
|
||||
305,300,686,769,590,90,764,551,426,863,381,506,721,612,627,323,177,4,704,529
|
||||
416,277,175,662,688,698,437,586,777,425,533,858,222,60,140,719,493,558,695,768
|
||||
863,268,739,653,512,779,437,248,300,451,195,874,436,772,332,589,183,746,94,756
|
||||
621,97,575,770,327,803,659,397,346,907,720,862,770,436,520,694,445,691,810,553
|
||||
436,642,811,221,758,406,362,442,501,374,684,53,660,146,205,383,677,597,430,201
|
||||
926,439,650,266,578,486,189,819,539,760,872,560,910,589,821,605,694,142,762,180
|
||||
499,436,417,535,718,674,698,174,696,96,440,490,304,199,406,559,185,328,573,685
|
||||
92,803,711,603,721,185,450,676,809,132,569,427,596,248,745,498,574,388,879,667
|
||||
253,339,295,805,61,620,140,376,332,712,94,841,528,621,686,756,307,610,255,533
|
||||
175,429,628,629,407,260,647,276,619,666,820,145,611,380,750,21,91,629,62,445
|
||||
580,750,665,742,935,591,405,643,195,295,592,773,455,545,449,347,701,912,143,380
|
||||
698,948,527,822,713,52,683,671,759,767,684,184,817,392,983,60,396,599,907,342
|
||||
138,630,6,583,526,401,187,945,836,690,841,531,563,910,408,779,644,660,683,374
|
||||
280,669,596,815,346,497,740,493,596,767,675,248,817,222,860,457,938,435,121,120
|
||||
144,631,771,437,616,745,668,604,142,862,550,324,570,345,124,622,93,59,619,79
|
||||
393,442,549,374,222,447,601,753,373,455,440,582,751,435,596,691,187,686,179,347
|
||||
298,616,59,623,447,51,909,755,71,709,701,406,697,373,875,754,573,332,754,767
|
||||
709,201,430,81,608,688,939,496,569,260,711,935,943,304,87,617,744,165,487,626
|
||||
294,446,946,700,392,880,758,687,656,751,395,407,266,443,61,629,820,458,434,179
|
||||
648,669,942,695,587,813,803,254,173,633,376,14,574,702,711,654,761,740,297,597
|
||||
435,774,935,592,779,494,635,406,573,723,994,139,772,562,707,637,839,635,380,82
|
||||
413,630,657,637,328,614,574,741,687,445,413,777,202,244,200,682,506,644,348,806
|
||||
575,712,119,720,695,920,679,300,488,583,933,410,555,762,90,192,138,252,556,95
|
||||
813,457,628,648,696,403,382,806,338,183,344,146,799,315,497,401,328,63,747,198
|
||||
622,652,329,198,710,442,178,754,817,744,675,819,815,922,764,659,934,582,61,302
|
||||
392,533,619,311,299,593,707,876,331,714,590,447,690,753,463,914,526,822,698,655
|
||||
665,754,602,614,646,594,550,619,560,393,428,747,634,271,274,339,627,826,909,585
|
||||
942,809,614,568,815,344,514,779,927,580,564,909,347,838,403,752,618,566,530,443
|
||||
692,820,746,88,640,933,118,183,586,744,745,268,616,250,581,639,615,858,386,984
|
||||
87,631,934,841,613,249,691,97,336,886,270,613,634,692,669,257,558,399,306,93
|
||||
930,717,669,275,189,258,703,272,602,718,530,331,218,660,271,834,653,836,408,421
|
||||
383,804,698,441,417,403,940,858,700,875,770,198,714,435,569,486,487,177,80,949
|
||||
202,142,864,348,426,537,204,615,681,676,933,178,816,396,175,769,423,766,879,593
|
||||
592,309,804,638,197,759,426,577,441,409,928,571,800,506,275,768,689,333,932,937
|
||||
509,607,248,556,575,424,435,942,490,678,563,677,374,295,629,666,252,337,578,745
|
||||
827,754,62,747,686,627,671,98,708,686,407,599,835,205,805,534,741,201,384,189
|
||||
623,434,15,496,89,655,146,190,816,63,423,496,635,948,910,934,81,641,437,614
|
||||
495,52,634,181,376,500,680,57,497,717,14,679,148,406,661,452,906,264,526,401
|
||||
97,188,330,948,374,251,633,639,434,777,913,529,679,605,76,625,550,939,762,445
|
||||
859,675,304,473,427,261,640,196,647,350,686,58,202,908,912,174,447,590,275,401
|
||||
372,748,687,696,381,201,569,676,147,516,338,428,394,148,391,338,819,766,707,585
|
||||
769,449,505,602,814,644,272,945,773,424,444,811,417,709,100,862,596,628,450,346
|
||||
426,228,424,384,257,681,383,639,554,551,701,942,95,100,842,396,909,609,626,622
|
||||
397,589,766,277,459,819,85,807,295,488,449,399,339,532,378,420,144,750,841,145
|
||||
683,626,645,75,265,267,773,550,595,604,328,747,262,647,201,590,201,906,932,445
|
||||
618,932,345,435,532,276,277,532,813,459,764,327,979,388,634,914,452,396,391,64
|
||||
668,53,721,716,591,433,265,190,763,327,693,926,648,84,98,863,770,621,638,977
|
||||
685,834,490,686,402,768,575,741,930,582,724,389,551,22,838,665,627,460,590,261
|
||||
225,384,397,667,843,411,673,56,120,697,220,623,376,101,305,185,807,698,637,599
|
||||
687,375,914,602,806,372,491,560,608,573,80,758,632,932,599,610,327,695,944,987
|
||||
676,637,860,718,698,193,71,187,684,335,596,340,673,81,860,630,877,340,948,273
|
||||
249,716,674,400,553,567,698,505,834,85,424,597,706,581,740,3,100,804,652,274
|
||||
837,836,437,872,220,502,375,643,328,490,0,662,267,648,222,344,399,555,944,946
|
||||
121,717,463,643,406,261,391,646,181,641,336,651,86,275,494,607,353,84,384,434
|
||||
650,252,13,259,334,840,601,249,199,607,258,629,259,678,611,100,696,339,765,56
|
||||
449,692,80,752,778,675,496,940,934,98,189,552,679,629,110,277,192,399,696,739
|
||||
190,589,432,913,606,839,121,82,358,384,701,760,618,927,838,912,139,937,326,328
|
||||
935,276,427,859,504,758,716,753,276,935,672,457,937,800,192,356,101,679,699,757
|
||||
249,830,752,560,801,199,594,722,875,637,99,579,740,762,58,710,149,657,218,605
|
||||
935,949,653,453,949,930,802,501,768,275,905,500,177,217,298,768,423,655,187,568
|
||||
608,87,296,220,982,200,676,661,147,931,496,600,333,683,192,462,691,400,812,198
|
||||
770,435,844,907,402,186,706,433,532,656,696,837,688,774,218,826,575,324,441,874
|
||||
680,679,223,459,803,100,300,577,636,751,383,879,404,621,646,306,827,400,413,808
|
||||
805,991,623,83,626,615,505,682,757,491,941,295,266,487,807,221,526,914,686,193
|
||||
694,622,82,566,187,944,390,431,433,659,837,937,345,513,504,179,306,324,610,601
|
||||
660,456,823,760,914,52,773,272,251,815,412,683,266,819,119,111,683,593,487,426
|
||||
101,278,712,51,187,710,270,598,219,940,612,182,389,999,341,325,626,302,770,572
|
||||
913,537,624,602,584,928,630,862,275,179,803,913,928,805,530,388,445,593,629,294
|
||||
111,668,811,864,632,261,929,306,451,665,503,439,88,817,570,874,838,555,304,349
|
||||
692,263,255,192,739,621,768,262,318,373,459,487,680,704,799,583,428,447,705,834
|
||||
306,406,813,692,107,89,177,597,711,223,408,862,628,603,582,176,142,83,248,657
|
||||
395,566,620,663,335,557,385,599,341,810,459,706,805,873,305,875,262,418,613,553
|
||||
840,563,100,626,823,186,600,668,945,314,323,442,99,705,684,638,859,564,669,583
|
||||
714,334,464,911,406,196,683,931,62,301,98,743,450,416,182,860,197,840,634,599
|
||||
774,948,146,893,944,775,339,655,120,176,650,277,712,707,81,140,377,573,487,630
|
||||
685,697,143,167,668,773,946,423,859,766,266,696,375,580,264,640,615,807,148,302
|
||||
584,124,649,752,220,202,449,935,97,189,64,762,927,432,432,714,80,914,426,188
|
||||
836,176,180,839,740,420,54,946,934,149,384,603,743,564,678,662,720,377,461,821
|
||||
443,837,385,124,374,267,555,746,459,823,935,586,180,659,632,662,660,934,530,949
|
||||
940,874,96,101,801,227,948,553,589,744,698,656,272,278,276,626,337,452,764,702
|
||||
430,558,528,533,618,710,321,277,761,937,277,205,914,405,765,779,435,306,119,624
|
||||
176,843,763,380,908,190,931,769,327,491,333,463,89,172,838,349,809,675,505,632
|
||||
437,764,275,681,911,752,634,340,621,55,491,400,555,751,143,385,575,552,551,357
|
||||
749,179,843,429,61,669,426,709,624,74,264,333,631,934,808,196,200,944,526,176
|
||||
368,195,441,183,251,699,705,802,295,770,762,819,254,203,669,578,298,600,89,660
|
||||
376,178,807,375,628,691,685,299,683,333,824,447,506,305,779,778,62,874,182,303
|
||||
536,744,502,769,182,299,184,344,803,619,504,86,769,638,811,836,745,597,614,626
|
||||
451,430,651,761,60,844,118,591,776,165,451,573,772,839,96,652,878,807,676,930
|
||||
526,589,622,768,773,259,304,262,261,54,249,555,426,865,120,520,54,706,430,323
|
||||
97,844,261,260,633,739,761,805,179,178,566,754,330,911,311,58,698,101,276,741
|
||||
564,379,453,342,193,676,99,278,443,278,325,257,487,744,299,538,606,335,438,761
|
||||
740,97,612,392,272,264,724,252,117,708,818,562,810,675,196,372,749,454,499,560
|
||||
779,990,410,448,696,391,672,441,146,581,554,694,768,383,405,692,675,776,936,342
|
||||
219,140,563,457,455,326,608,755,720,680,56,412,459,687,925,98,183,802,841,740
|
||||
322,81,594,687,52,61,427,173,626,673,863,945,174,594,200,688,770,876,768,553
|
||||
815,611,595,454,441,681,526,297,942,301,447,426,100,755,191,645,203,374,276,77
|
||||
86,385,659,621,584,684,51,816,347,499,603,488,396,67,432,342,687,816,94,260
|
||||
437,778,345,504,574,862,609,843,667,251,704,84,258,457,647,429,875,743,814,833
|
||||
676,672,942,197,505,390,568,719,931,947,276,120,824,188,594,808,563,876,775,909
|
||||
762,752,940,230,341,118,623,404,716,120,768,101,834,176,755,486,141,184,577,767
|
||||
721,676,437,454,391,303,810,220,191,178,937,190,56,714,455,299,82,368,802,740
|
||||
60,462,575,865,250,172,931,347,53,54,813,81,295,452,561,937,776,81,705,669
|
||||
670,772,676,945,432,522,347,489,620,680,749,194,384,637,201,613,605,630,562,529
|
||||
99,599,660,263,304,431,427,101,323,863,426,462,83,649,243,385,497,759,777,93
|
||||
433,608,512,425,329,530,602,945,173,875,638,494,770,670,940,836,262,702,659,873
|
||||
453,391,428,348,907,687,462,324,941,381,613,204,395,896,946,381,779,810,841,705
|
||||
265,905,560,54,681,765,682,88,568,273,939,493,57,266,342,6,612,633,550,337
|
||||
930,534,204,753,934,846,569,682,745,934,403,906,272,677,719,776,754,534,556,173
|
||||
486,809,755,763,441,396,689,415,385,490,145,304,271,204,375,344,800,92,872,694
|
||||
489,425,688,573,743,564,295,652,257,707,267,173,758,365,739,265,684,527,860,655
|
||||
299,646,180,52,697,721,766,574,151,762,376,182,407,196,80,873,188,329,248,448
|
||||
431,381,779,393,223,575,408,858,616,415,85,707,749,264,489,390,597,779,185,937
|
||||
457,168,219,54,90,119,744,332,52,862,941,818,554,703,820,464,742,554,331,914
|
||||
809,529,444,455,91,11,843,862,428,632,707,195,571,747,905,187,328,864,393,629
|
||||
295,720,375,80,928,551,683,567,418,341,685,632,711,98,218,811,622,583,487,382
|
||||
804,113,92,442,296,669,390,218,691,263,492,643,80,669,501,329,566,803,191,879
|
||||
805,609,749,808,563,141,612,724,266,666,678,491,566,687,940,338,704,544,528,501
|
||||
556,879,356,876,607,183,577,811,344,586,616,767,622,865,859,497,429,580,776,254
|
||||
130,276,393,927,190,455,908,329,676,818,572,204,760,801,146,946,205,95,579,139
|
||||
423,862,374,93,685,844,101,811,461,81,617,175,643,287,271,179,180,101,595,774
|
||||
256,89,407,563,759,665,844,563,932,91,406,597,685,389,658,348,81,295,251,309
|
||||
189,743,376,86,333,394,593,773,562,589,668,646,565,477,669,196,581,297,652,98
|
||||
769,807,569,559,976,651,266,86,258,934,334,635,560,761,61,188,497,680,571,823
|
||||
931,752,461,705,394,128,764,569,297,932,450,665,59,440,694,710,753,627,559,388
|
||||
775,631,390,87,772,654,561,145,401,917,175,912,693,64,766,606,590,427,701,688
|
||||
594,740,203,748,461,294,822,642,96,610,907,805,647,582,359,719,632,377,748,943
|
||||
65,561,677,645,495,99,223,592,596,402,385,746,328,392,583,336,487,684,304,935
|
||||
260,679,451,176,596,581,938,679,456,762,464,859,565,715,820,752,530,928,248,15
|
||||
218,529,596,297,876,651,557,659,506,562,341,96,3,564,199,400,503,647,707,182
|
||||
613,195,929,818,823,808,265,63,498,686,583,97,88,650,866,640,141,461,594,119
|
||||
219,873,720,388,835,143,205,602,339,576,448,388,255,731,558,305,644,672,303,255
|
||||
526,652,256,520,263,182,263,686,382,581,250,255,559,500,248,566,807,273,622,944
|
||||
464,802,408,702,829,299,397,414,403,565,407,412,759,503,565,59,652,758,650,427
|
||||
602,57,873,828,564,554,565,435,303,590,323,388,138,528,94,350,175,634,410,63
|
||||
254,500,57,86,984,253,751,822,202,395,181,719,812,940,625,640,615,749,437,610
|
||||
326,631,940,409,753,368,438,202,553,446,592,876,818,684,617,843,753,575,800,695
|
30
2020/day16/Makefile
Normal file
30
2020/day16/Makefile
Normal file
@@ -0,0 +1,30 @@
|
||||
INPUT := INPUT.txt
|
||||
SHELL := /bin/bash
|
||||
#CFLAGS := -w -g
|
||||
#CFLAGS := -w -g -pg
|
||||
CFLAGS := -w -O3
|
||||
TIME := \time -f "\ttime: %E real, %U user, %S sys\n\tcontext-switch:\t%c+%w, page-faults: %F+%R\n"
|
||||
export PATH := .:$(PATH)
|
||||
|
||||
.PHONY: clean all compile deploy ex1 ex2
|
||||
|
||||
all: ex1 ex2
|
||||
|
||||
output:
|
||||
@$(MAKE) --no-print-directory all 2>&1 > OUTPUT
|
||||
|
||||
compile: ex1-c ex2-c
|
||||
|
||||
ex1: ex1-c
|
||||
@$(TIME) ex1.bash < $(INPUT) 2>&1
|
||||
@$(TIME) ex1-c < $(INPUT) 2>&1
|
||||
|
||||
ex2: ex2-c
|
||||
@$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||
@$(TIME) ex2-c < $(INPUT) 2>&1
|
||||
|
||||
clean:
|
||||
@rm -f ex1-c ex2-c core
|
||||
|
||||
deploy:
|
||||
@$(MAKE) -C .. deploy
|
17
2020/day16/OUTPUT
Normal file
17
2020/day16/OUTPUT
Normal file
@@ -0,0 +1,17 @@
|
||||
cc -w -O3 ex1-c.c -o ex1-c
|
||||
ex1.bash : res=21996
|
||||
time: 0:00.23 real, 0.16 user, 0.03 sys
|
||||
context-switch: 19+99, page-faults: 0+9381
|
||||
|
||||
ex1-c : res=21996
|
||||
time: 0:00.00 real, 0.00 user, 0.00 sys
|
||||
context-switch: 0+1, page-faults: 0+71
|
||||
|
||||
ex2.bash : res=650080463519
|
||||
time: 0:06.58 real, 6.54 user, 0.04 sys
|
||||
context-switch: 662+95, page-faults: 0+10210
|
||||
|
||||
ex2-c : res=650080463519
|
||||
time: 0:00.00 real, 0.00 user, 0.00 sys
|
||||
context-switch: 0+1, page-faults: 0+71
|
||||
|
76
2020/day16/README
Normal file
76
2020/day16/README
Normal file
@@ -0,0 +1,76 @@
|
||||
--- Day 16: Ticket Translation ---
|
||||
|
||||
As you're walking to yet another connecting flight, you realize that one of the legs of your re-routed trip coming up is on a high-speed train. However, the train ticket you were given is in a language you don't understand. You should probably figure out what it says before you get to the train station after the next flight.
|
||||
|
||||
Unfortunately, you can't actually read the words on the ticket. You can, however, read the numbers, and so you figure out the fields these tickets must have and the valid ranges for values in those fields.
|
||||
|
||||
You collect the rules for ticket fields, the numbers on your ticket, and the numbers on other nearby tickets for the same train service (via the airport security cameras) together into a single document you can reference (your puzzle input).
|
||||
|
||||
The rules for ticket fields specify a list of fields that exist somewhere on the ticket and the valid ranges of values for each field. For example, a rule like class: 1-3 or 5-7 means that one of the fields in every ticket is named class and can be any value in the ranges 1-3 or 5-7 (inclusive, such that 3 and 5 are both valid in this field, but 4 is not).
|
||||
|
||||
Each ticket is represented by a single line of comma-separated values. The values are the numbers on the ticket in the order they appear; every ticket has the same format. For example, consider this ticket:
|
||||
|
||||
.--------------------------------------------------------.
|
||||
| ????: 101 ?????: 102 ??????????: 103 ???: 104 |
|
||||
| |
|
||||
| ??: 301 ??: 302 ???????: 303 ??????? |
|
||||
| ??: 401 ??: 402 ???? ????: 403 ????????? |
|
||||
'--------------------------------------------------------'
|
||||
|
||||
Here, ? represents text in a language you don't understand. This ticket might be represented as 101,102,103,104,301,302,303,401,402,403; of course, the actual train tickets you're looking at are much more complicated. In any case, you've extracted just the numbers in such a way that the first number is always the same specific field, the second number is always a different specific field, and so on - you just don't know what each position actually means!
|
||||
|
||||
Start by determining which tickets are completely invalid; these are tickets that contain values which aren't valid for any field. Ignore your ticket for now.
|
||||
|
||||
For example, suppose you have the following notes:
|
||||
|
||||
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
|
||||
|
||||
It doesn't matter which position corresponds to which field; you can identify invalid nearby tickets by considering only whether tickets contain values that are not valid for any field. In this example, the values on the first nearby ticket are all valid for at least one field. This is not true of the other three nearby tickets: the values 4, 55, and 12 are are not valid for any field. Adding together all of the invalid values produces your ticket scanning error rate: 4 + 55 + 12 = 71.
|
||||
|
||||
Consider the validity of the nearby tickets you scanned. What is your ticket scanning error rate?
|
||||
|
||||
Your puzzle answer was 21996.
|
||||
--- Part Two ---
|
||||
|
||||
Now that you've identified which tickets contain invalid values, discard those tickets entirely. Use the remaining valid tickets to determine which field is which.
|
||||
|
||||
Using the valid ranges for each field, determine what order the fields appear on the tickets. The order is consistent between all tickets: if seat is the third field, it is the third field on every ticket, including your ticket.
|
||||
|
||||
For example, suppose you have the following notes:
|
||||
|
||||
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
|
||||
|
||||
Based on the nearby tickets in the above example, the first position must be row, the second position must be class, and the third position must be seat; you can conclude that in your ticket, class is 12, row is 11, and seat is 13.
|
||||
|
||||
Once you work out which field is which, look for the six fields on your ticket that start with the word departure. What do you get if you multiply those six values together?
|
||||
|
||||
Your puzzle answer was 650080463519.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
At this point, you should return to your Advent calendar and try another puzzle.
|
||||
|
||||
If you still want to see it, you can get your puzzle input.
|
||||
|
||||
You can also [Share] this puzzle.
|
12
2020/day16/TEST.txt
Normal file
12
2020/day16/TEST.txt
Normal 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
2020/day16/TEST2.txt
Normal file
11
2020/day16/TEST2.txt
Normal 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
|
162
2020/day16/ex1-c.c
Normal file
162
2020/day16/ex1-c.c
Normal file
@@ -0,0 +1,162 @@
|
||||
/* ex1-c: Advent2020 game, day 16/game 1
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* tickets ranges */
|
||||
struct srange {
|
||||
char *name;
|
||||
int s1, e1;
|
||||
int s2, e2;
|
||||
};
|
||||
|
||||
struct list {
|
||||
int size;
|
||||
int last;
|
||||
struct srange *ranges;
|
||||
} list = {
|
||||
0, 0, NULL
|
||||
};
|
||||
|
||||
#define BLOCKSIZE 1024 /* number of elements for realloc() */
|
||||
|
||||
int *myticket=NULL;
|
||||
int *curticket=NULL; /* current ticket */
|
||||
int ticketsize=0;
|
||||
|
||||
void print_ranges()
|
||||
{
|
||||
unsigned i, n=list.last;
|
||||
struct srange *p=list.ranges;
|
||||
|
||||
fprintf(stderr, "LIST: address=%p last=%u size=%u\n", list.ranges, n, list.size);
|
||||
for (i=0; i<n; ++i, ++p)
|
||||
printf("\t[%03u] %u-%u %u-%u [%s]\n", i, p->s1, p->e1, p->s2, p->e2, p->name);
|
||||
}
|
||||
|
||||
struct srange *add_range(name, s1, e1, s2, e2)
|
||||
char *name;
|
||||
int s1, e1, s2, e2;
|
||||
{
|
||||
struct srange *p;
|
||||
|
||||
if (list.last == list.size) {
|
||||
list.ranges=realloc(list.ranges, sizeof(struct srange)*BLOCKSIZE);
|
||||
list.size+=BLOCKSIZE;
|
||||
}
|
||||
p=list.ranges+list.last;
|
||||
p->name=strdup(name);
|
||||
p->s1=s1;
|
||||
p->e1=e1;
|
||||
p->s2=s2;
|
||||
p->e2=e2;
|
||||
list.last++;
|
||||
return p;
|
||||
}
|
||||
|
||||
void print_ticket(ticket)
|
||||
int *ticket;
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<ticketsize; ++i)
|
||||
printf("\t%2d: %d\n", i, *(ticket+i));
|
||||
}
|
||||
|
||||
int *parse_ticket(str)
|
||||
char *str;
|
||||
{
|
||||
int i;
|
||||
char *p;
|
||||
|
||||
if (!curticket)
|
||||
curticket=malloc(ticketsize * sizeof *myticket);
|
||||
for (i=0, p=str; i<ticketsize; ++i, ++p)
|
||||
curticket[i]=(int)strtol(p, &p, 10);
|
||||
return curticket;
|
||||
}
|
||||
|
||||
int *parse_myticket(str)
|
||||
char *str;
|
||||
{
|
||||
int i=0;
|
||||
char *p;
|
||||
|
||||
ticketsize=1;
|
||||
for (p=str; *p; p++)
|
||||
if (*p==',')
|
||||
ticketsize++;
|
||||
|
||||
myticket=malloc(ticketsize * sizeof *myticket);
|
||||
for (p=str, i=0; i<ticketsize; ++i, ++p)
|
||||
myticket[i]=(int)strtol(p, &p, 10);
|
||||
return myticket;
|
||||
}
|
||||
|
||||
int is_in_range(i, range)
|
||||
int i;
|
||||
struct srange *range;
|
||||
{
|
||||
if ((i>=range->s1 && i<=range->e1) || (i>=range->s2 && i<=range->e2))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ex1(ticket)
|
||||
int *ticket;
|
||||
{
|
||||
int i, r, res=0, found;
|
||||
|
||||
for (i=0; i<ticketsize; ++i) {
|
||||
found=0;
|
||||
for (r=0; r<list.last; ++r) {
|
||||
if (is_in_range(*(ticket+i), list.ranges+r)) {
|
||||
found=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
res+=ticket[i];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(ac, av)
|
||||
int ac;
|
||||
char **av;
|
||||
{
|
||||
char line[1024], pname[80], *elabel;
|
||||
int s1, e1, s2, e2, end=0, status=0, res=0;
|
||||
int *ticket;
|
||||
|
||||
while (fgets(line, sizeof line, stdin)) {
|
||||
if (*line=='\n')
|
||||
continue;
|
||||
if (*line >= '0' && *line <= '9') {
|
||||
switch (status) {
|
||||
case 1:
|
||||
ticket=parse_myticket(line);
|
||||
break;
|
||||
case 2:
|
||||
ticket=parse_ticket(line);
|
||||
res += ex1(ticket);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (elabel=strchr(line, ':')) {
|
||||
if (*(elabel+1)=='\n') {
|
||||
status++;
|
||||
continue;
|
||||
}
|
||||
sscanf(line, "%[^:]: %d-%d or %d-%d %n",
|
||||
pname, &s1, &e1, &s2, &e2, &end);
|
||||
add_range(pname, s1, e1, s2, e2);
|
||||
|
||||
}
|
||||
}
|
||||
printf("%s : res=%d\n", *av, res);
|
||||
exit (0);
|
||||
}
|
32
2020/day16/ex1.bash
Executable file
32
2020/day16/ex1.bash
Executable file
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ex1.bash: Advent2020 game, day 16/game 1.
|
||||
|
||||
CMD=${0##*/}
|
||||
#shopt -s extglob
|
||||
|
||||
declare -A VALID=()
|
||||
declare -i state=0 res=0
|
||||
|
||||
while read -r line; do
|
||||
if [[ $line =~ ^([a-z :]+)([0-9]+)-([0-9]+)([a-z ]+)([0-9]+)-([0-9]+)$ ]]; then
|
||||
n1=$(seq "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}")
|
||||
n2=$(seq "${BASH_REMATCH[5]}" "${BASH_REMATCH[6]}")
|
||||
for i in $n1 $n2; do
|
||||
VALID[$i]=1
|
||||
done
|
||||
elif [[ $line =~ (your ticket:|nearby tickets) ]]; then
|
||||
((state++))
|
||||
elif [[ $line != "" ]]; then
|
||||
if ((state == 2)); then
|
||||
for i in ${line//,/ }; do
|
||||
# shellcheck disable=SC2100
|
||||
[[ ! -v VALID[$i] ]] && res=res+i
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
printf "%s : res=%d\n" "$CMD" "$res"
|
||||
|
||||
exit 0
|
243
2020/day16/ex2-c.c
Normal file
243
2020/day16/ex2-c.c
Normal file
@@ -0,0 +1,243 @@
|
||||
/* ex2-c: Advent2020 game, day 16/game 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* tickets ranges */
|
||||
struct srange {
|
||||
char *name;
|
||||
int s1, e1;
|
||||
int s2, e2;
|
||||
int col;
|
||||
int possiblecount;
|
||||
int *possible; /* possible[i]=-1 => column i cannot be */
|
||||
};
|
||||
|
||||
struct list {
|
||||
int size;
|
||||
int last;
|
||||
struct srange *ranges;
|
||||
} list = {
|
||||
0, 0, NULL
|
||||
};
|
||||
|
||||
#define BLOCKSIZE 1024 /* number of elements for realloc() */
|
||||
|
||||
int *myticket=NULL;
|
||||
int *curticket=NULL; /* current ticket */
|
||||
int ticketsize=0;
|
||||
|
||||
void print_ranges()
|
||||
{
|
||||
unsigned i, n=list.last;
|
||||
int j;
|
||||
struct srange *p=list.ranges;
|
||||
|
||||
printf("RANGES: address=%p last=%u size=%u\n", list.ranges, n, list.size);
|
||||
for (i=0; i<n; ++i, ++p) {
|
||||
printf(" [%03u] %u-%u %u-%u [%s]\n", i, p->s1, p->e1, p->s2, p->e2, p->name);
|
||||
printf(" Possible cols (%d remaining) : ", p->possiblecount);
|
||||
for (j=0; j<ticketsize; ++j)
|
||||
if (p->possible[j] >= 0)
|
||||
printf(" %d", p->possible[j]);
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
struct srange *add_range(name, s1, e1, s2, e2)
|
||||
char *name;
|
||||
int s1, e1, s2, e2;
|
||||
{
|
||||
struct srange *p;
|
||||
|
||||
if (list.last == list.size) {
|
||||
list.ranges=realloc(list.ranges, sizeof(struct srange)*BLOCKSIZE);
|
||||
list.size+=BLOCKSIZE;
|
||||
}
|
||||
p=list.ranges+list.last;
|
||||
p->name=strdup(name);
|
||||
p->s1=s1;
|
||||
p->e1=e1;
|
||||
p->s2=s2;
|
||||
p->e2=e2;
|
||||
p->col=-1;
|
||||
list.last++;
|
||||
return p;
|
||||
}
|
||||
|
||||
void print_ticket(ticket)
|
||||
int *ticket;
|
||||
{
|
||||
int i;
|
||||
printf("Ticket: ");
|
||||
for (i=0; i<ticketsize; ++i)
|
||||
printf("%d ", *(ticket+i));
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
int *parse_ticket(str)
|
||||
char *str;
|
||||
{
|
||||
int i;
|
||||
char *p;
|
||||
|
||||
if (!curticket)
|
||||
curticket=malloc(ticketsize * sizeof *myticket);
|
||||
for (i=0, p=str; i<ticketsize; ++i, ++p)
|
||||
curticket[i]=(int)strtol(p, &p, 10);
|
||||
return curticket;
|
||||
}
|
||||
|
||||
int *parse_myticket(str)
|
||||
char *str;
|
||||
{
|
||||
int i, j, *possible;
|
||||
char *p;
|
||||
|
||||
ticketsize=1;
|
||||
for (p=str; *p; p++)
|
||||
if (*p==',')
|
||||
ticketsize++;
|
||||
|
||||
myticket=malloc(ticketsize * sizeof *myticket);
|
||||
for (p=str, i=0; i<ticketsize; ++i, ++p)
|
||||
myticket[i]=(int)strtol(p, &p, 10);
|
||||
// set possible columns for all ranges
|
||||
for (i=0; i<list.last; ++i) {
|
||||
possible=malloc(sizeof (int) * ticketsize);
|
||||
list.ranges[i].possible=possible;
|
||||
list.ranges[i].possiblecount=ticketsize;
|
||||
for (j=0; j<ticketsize; ++j)
|
||||
possible[j]=j;
|
||||
}
|
||||
return myticket;
|
||||
}
|
||||
|
||||
int is_in_range(i, range)
|
||||
int i;
|
||||
struct srange *range;
|
||||
{
|
||||
if ((i>=range->s1 && i<=range->e1) || (i>=range->s2 && i<=range->e2))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int check_valid(ticket)
|
||||
int *ticket;
|
||||
{
|
||||
int i, r, found;
|
||||
|
||||
for (i=0; i<ticketsize; ++i) {
|
||||
found=0;
|
||||
for (r=0; r<list.last; ++r) {
|
||||
if (is_in_range(*(ticket+i), list.ranges+r)) {
|
||||
found=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
break;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
void ex2_add(ticket)
|
||||
int *ticket;
|
||||
{
|
||||
int i, r;
|
||||
|
||||
if (check_valid(ticket)) {
|
||||
for (i=0; i<ticketsize; ++i) {
|
||||
for (r=0; r<list.last; ++r) {
|
||||
if (!is_in_range(*(ticket+i), list.ranges+r)) {
|
||||
// this value cannot be in this range, we unset this column
|
||||
list.ranges[r].possible[i]=-1;
|
||||
list.ranges[r].possiblecount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long ex2()
|
||||
{
|
||||
int i, r, r1, unique=0;
|
||||
unsigned long res=1;
|
||||
struct srange *range, *range1;
|
||||
|
||||
while (!unique) {
|
||||
unique=1;
|
||||
for (r=0; r<list.last; ++r) {
|
||||
range=list.ranges+r;
|
||||
if (range->col >= 0)
|
||||
continue;
|
||||
if (range->possiblecount == 1) {
|
||||
for (i=0; range->possible[i]==-1 && i<ticketsize; ++i)
|
||||
;
|
||||
range->col=i;
|
||||
for (r1=0; r1<list.last; ++r1) {
|
||||
range1=list.ranges+r1;
|
||||
if (range1 != range && range1->possible[i] != -1) {
|
||||
range1->possible[i]=-1;
|
||||
range1->possiblecount--;
|
||||
unique=0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (r=0; r<list.last; ++r) {
|
||||
range=list.ranges+r;
|
||||
if (!strncmp(range->name, "departure", 9)) {
|
||||
res*=myticket[range->col];
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(ac, av)
|
||||
int ac;
|
||||
char **av;
|
||||
{
|
||||
char line[1024], pname[80], *elabel;
|
||||
int s1, e1, s2, e2, end=0, status=0;
|
||||
unsigned long res=0;
|
||||
int *ticket;
|
||||
|
||||
while (fgets(line, sizeof line, stdin)) {
|
||||
if (*line=='\n')
|
||||
continue;
|
||||
if (*line >= '0' && *line <= '9') {
|
||||
switch (status) {
|
||||
case 1:
|
||||
ticket=parse_myticket(line);
|
||||
// print_ranges();
|
||||
break;
|
||||
case 2:
|
||||
ticket=parse_ticket(line);
|
||||
// valid ticket
|
||||
// print_ticket(ticket);
|
||||
ex2_add(ticket);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (elabel=strchr(line, ':')) {
|
||||
if (*(elabel+1)=='\n') {
|
||||
status++;
|
||||
continue;
|
||||
}
|
||||
sscanf(line, "%[^:]: %d-%d or %d-%d %n",
|
||||
pname, &s1, &e1, &s2, &e2, &end);
|
||||
add_range(pname, s1, e1, s2, e2);
|
||||
|
||||
}
|
||||
}
|
||||
res=ex2();
|
||||
printf("%s : res=%lu\n", *av, res);
|
||||
exit (0);
|
||||
}
|
90
2020/day16/ex2.bash
Executable file
90
2020/day16/ex2.bash
Executable file
@@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ex2.bash: Advent2020 game, day 16/game 2.
|
||||
|
||||
CMD=${0##*/}
|
||||
shopt -s extglob
|
||||
|
||||
declare -a valid=() myticket=() keys=() values=() match=()
|
||||
declare -A position=()
|
||||
declare -i state=0 res=1 curkey=0 curticket=0
|
||||
|
||||
while read -r line; do
|
||||
if [[ $line =~ ^([a-z ]+)\:\ ([0-9]+)-([0-9]+)([a-z ]+)([0-9]+)-([0-9]+)$ ]]; then
|
||||
# valid ranges
|
||||
keys[$curkey]="${BASH_REMATCH[1]}"
|
||||
n1=$(seq -s" " "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}")
|
||||
n2=$(seq -s" " "${BASH_REMATCH[5]}" "${BASH_REMATCH[6]}")
|
||||
|
||||
for i in $n1 $n2; do
|
||||
valid[$i]=1
|
||||
done
|
||||
values[$curkey]="${n1[*]} ${n2[*]}"
|
||||
((curkey++))
|
||||
|
||||
elif [[ $line =~ (your ticket:|nearby tickets) ]]; then
|
||||
# next section
|
||||
((state++))
|
||||
elif [[ $line =~ [0-9,]+ ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
numbers=( ${line//,/ } )
|
||||
case $state in
|
||||
1) # my ticket
|
||||
# shellcheck disable=SC2206
|
||||
myticket=( ${numbers[@]} )
|
||||
# initialize possible matches array: all
|
||||
for ((i=0; i<curkey; ++i)); do
|
||||
for ((j=0; j<${#numbers[@]}; ++j)); do
|
||||
match[$j]+=" $i "
|
||||
done
|
||||
done
|
||||
;;
|
||||
2) # other tickets
|
||||
#printf "ticket %d\n" "$curticket"
|
||||
for i in ${numbers[*]}; do
|
||||
[[ ! -v valid[$i] ]] && continue 2
|
||||
done
|
||||
for ((j=0; j<curkey; ++j)); do
|
||||
for ((i=0; i<${#numbers[@]}; ++i)); do
|
||||
num=" ${numbers[$i]} "
|
||||
[[ " ${values[$j]} " =~ $num ]] && continue
|
||||
match[$j]=${match[$j]// $i /}
|
||||
|
||||
done
|
||||
done
|
||||
((curticket++))
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
|
||||
end=0
|
||||
while ((end==0)); do
|
||||
end=1
|
||||
for ((i=0; i<${#match[@]}; ++i)); do
|
||||
[[ -n ${position[$i]} ]] && continue
|
||||
# shellcheck disable=SC2206
|
||||
array=( ${match[$i]} )
|
||||
if (( ${#array[@]} == 1 )); then
|
||||
cur=${array[0]}
|
||||
position[$i]=$cur
|
||||
for ((j=0; j<${#match[@]}; ++j)); do
|
||||
((j != i)) && match[$j]=${match[$j]// $cur /}
|
||||
done
|
||||
end=0
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
for ((i=0; i<${#keys[@]}; ++i )); do
|
||||
if [[ ${keys[$i]} =~ "departure" ]]; then
|
||||
pos=${match[$i]}
|
||||
(( res *= ${myticket[$pos]} ))
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
printf "%s : res=%d\n" "$CMD" "$res"
|
||||
|
||||
exit 0
|
Reference in New Issue
Block a user