[TASK] Solved Day 16
This commit is contained in:
262
input/day16.txt
Normal file
262
input/day16.txt
Normal 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
12
input/day16_example.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
input/day16_example2.txt
Normal file
11
input/day16_example2.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
|
||||
212
src/day16.rs
Normal file
212
src/day16.rs
Normal 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 i 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));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -17,8 +17,9 @@ mod day12;
|
||||
mod day13;
|
||||
mod day14;
|
||||
mod day15;
|
||||
mod day16;
|
||||
|
||||
const MAX_DAY: u8 = 15;
|
||||
const MAX_DAY: u8 = 16;
|
||||
const BENCHMARK_AMOUNT: u32 = 100;
|
||||
|
||||
fn solve(day: u8) {
|
||||
@@ -38,6 +39,7 @@ fn solve(day: u8) {
|
||||
13 => day13::solve(),
|
||||
14 => day14::solve(),
|
||||
15 => day15::solve(),
|
||||
16 => day16::solve(),
|
||||
_ => println!("This day is not yet implemented")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user