diff --git a/advent_of_code/day_22/__init__.py b/advent_of_code/day_22/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/advent_of_code/day_22/__main__.py b/advent_of_code/day_22/__main__.py new file mode 100644 index 0000000..d4874e1 --- /dev/null +++ b/advent_of_code/day_22/__main__.py @@ -0,0 +1,6 @@ +if __name__ == "__main__": + from .solution import Puzzle + from advent_of_code.runner import attach_cli + from pathlib import Path + + attach_cli(Puzzle, Path(__file__).parent) diff --git a/advent_of_code/day_22/assets/input_big.txt b/advent_of_code/day_22/assets/input_big.txt new file mode 100644 index 0000000..454c660 --- /dev/null +++ b/advent_of_code/day_22/assets/input_big.txt @@ -0,0 +1,420 @@ +on x=-40..8,y=-12..40,z=-44..6 +on x=-34..16,y=-49..5,z=-25..23 +on x=-47..3,y=-35..15,z=-38..7 +on x=-7..47,y=-48..2,z=-46..-2 +on x=-31..13,y=-23..23,z=-32..21 +on x=-20..28,y=-9..35,z=-41..11 +on x=-38..15,y=-43..4,z=-22..31 +on x=-38..10,y=-21..33,z=-16..33 +on x=-7..37,y=-25..26,z=-49..0 +on x=-16..33,y=-27..22,z=-8..46 +off x=-29..-12,y=-13..5,z=-17..-3 +on x=-46..5,y=-9..36,z=-48..-4 +off x=-27..-11,y=2..11,z=36..49 +on x=-3..49,y=-26..28,z=-28..19 +off x=31..46,y=-4..10,z=12..30 +on x=-38..15,y=-32..17,z=-4..40 +off x=10..28,y=15..33,z=-49..-33 +on x=-12..34,y=-45..3,z=-45..1 +off x=11..20,y=-46..-34,z=36..49 +on x=-48..3,y=2..49,z=-18..36 +on x=-82126..-63903,y=-987..11722,z=23713..37261 +on x=-52674..-46028,y=-28803..-3726,z=46373..65281 +on x=-4023..12521,y=55668..80403,z=-47562..-16128 +on x=27547..40728,y=-10447..7679,z=-85083..-55603 +on x=63008..73305,y=-3151..25421,z=-45722..-36390 +on x=-18749..-8100,y=-86220..-75586,z=4366..16042 +on x=34922..59009,y=-77234..-43867,z=7436..30526 +on x=60331..82012,y=10984..15118,z=-10870..16990 +on x=-82285..-56033,y=-55289..-26519,z=12381..30430 +on x=-60502..-50906,y=17726..40990,z=-61035..-38258 +on x=-92344..-58400,y=11076..29838,z=-18684..-2158 +on x=10148..45315,y=-91252..-62235,z=-218..25502 +on x=7153..44021,y=33934..63232,z=-61569..-39694 +on x=-3399..11227,y=48234..68815,z=-70632..-36040 +on x=-62666..-33936,y=-64234..-54860,z=-5408..29606 +on x=40480..60160,y=-78515..-57003,z=-344..12313 +on x=-63690..-56170,y=46464..59283,z=-7382..4883 +on x=9819..30304,y=61528..75680,z=-30003..-9121 +on x=-82643..-47958,y=-26062..-2872,z=38557..59718 +on x=44647..57006,y=-60018..-44493,z=11164..32261 +on x=10955..26271,y=-84392..-56402,z=-36492..-11432 +on x=4685..28894,y=-81754..-61443,z=37004..46700 +on x=27842..53564,y=-45446..-22447,z=-78705..-47864 +on x=-56284..-42184,y=41394..65455,z=12416..29573 +on x=-38262..-23566,y=42363..57973,z=-61902..-51278 +on x=-69188..-43584,y=-73023..-41698,z=22924..39043 +on x=-71132..-47899,y=-27786..-1413,z=-51676..-38296 +on x=-30362..-17068,y=60015..83078,z=7896..37439 +on x=-35264..-27516,y=-11483..6854,z=62361..79012 +on x=-22516..-12957,y=-26300..533,z=-90423..-66411 +on x=30283..63697,y=-43849..-31735,z=30937..64725 +on x=12630..33846,y=10142..35422,z=71569..90515 +on x=-26526..-4341,y=-67672..-49954,z=-57322..-30420 +on x=-7330..2315,y=-41538..-15974,z=-90601..-53976 +on x=-77073..-55946,y=-18703..2516,z=28253..29893 +on x=49353..68933,y=-29634..-4395,z=-65897..-40612 +on x=34861..51274,y=-75910..-60429,z=-21753..-8660 +on x=73173..87411,y=-8889..9211,z=-34548..2328 +on x=55751..75560,y=21008..35517,z=17475..38580 +on x=19669..38919,y=68271..82612,z=-17492..-1836 +on x=-12433..17667,y=-64676..-43914,z=-65630..-44781 +on x=-75451..-41898,y=-57880..-38361,z=-40656..-24154 +on x=50406..69609,y=13291..37568,z=-62440..-33720 +on x=-61409..-30293,y=54519..80791,z=4112..34127 +on x=-24717..-21619,y=-82619..-59754,z=-33451..-2477 +on x=-11585..17490,y=-16748..6251,z=77819..92212 +on x=60212..89140,y=19799..42599,z=-19013..13394 +on x=11664..40385,y=4090..17817,z=-76762..-69090 +on x=-22767..-3777,y=54660..63938,z=-74972..-41080 +on x=-23874..-52,y=-76197..-42703,z=47677..72460 +on x=23770..43158,y=-2461..2806,z=59656..76012 +on x=-61440..-39384,y=46175..60332,z=-38191..-27168 +on x=34282..52259,y=-68202..-59181,z=-48850..-30120 +on x=57577..92773,y=-7958..-5590,z=-31441..-17315 +on x=-15942..2669,y=9472..37856,z=57866..87100 +on x=-70231..-46610,y=-52759..-25334,z=-47520..-36833 +on x=2547..16544,y=57550..79589,z=-66323..-30073 +on x=39757..69212,y=38516..59725,z=-24956..-18114 +on x=-86110..-59381,y=-29696..-4128,z=-39781..-21927 +on x=4750..30876,y=-52815..-29535,z=-64013..-55835 +on x=34280..54275,y=1501..15231,z=56304..73521 +on x=52369..69568,y=41390..59976,z=-3861..17172 +on x=-7454..-676,y=51777..87327,z=26330..49614 +on x=-78473..-66703,y=33943..52902,z=-8596..29804 +on x=31093..50781,y=-73818..-59392,z=-33647..-10812 +on x=47738..58993,y=53230..67731,z=3769..17139 +on x=-62073..-50508,y=-27202..1243,z=-79754..-56831 +on x=-8825..4153,y=70053..78036,z=-30448..-18297 +on x=-67056..-41431,y=-39979..-14673,z=-66652..-34940 +on x=21294..47379,y=4423..21508,z=59345..71607 +on x=63179..71910,y=-32530..-6691,z=-53236..-37651 +on x=-62742..-37152,y=13708..32500,z=-59316..-43743 +on x=-60426..-55813,y=-57451..-28200,z=-50225..-30645 +on x=38628..57813,y=51690..70964,z=-11146..10239 +on x=44894..65873,y=-56729..-39388,z=-36730..-25445 +on x=-30540..-17226,y=13847..38426,z=-75564..-63765 +on x=-81466..-52711,y=28003..35149,z=21729..35101 +on x=-2098..11226,y=-92426..-76586,z=-4081..7913 +on x=-75001..-50782,y=-47868..-16015,z=37079..62293 +on x=-21995..1351,y=-63366..-60513,z=-66334..-46893 +on x=48546..83682,y=-35675..-16351,z=20834..40961 +on x=63257..84718,y=-38379..-17475,z=-16019..7881 +on x=-46698..-25137,y=-12195..-6889,z=59082..75299 +on x=-16764..-1625,y=32409..37823,z=61533..73226 +on x=57995..88031,y=-34526..-20691,z=-13433..16324 +on x=26257..59352,y=15218..21512,z=-84057..-47228 +on x=21963..56400,y=49129..71140,z=-36990..-28421 +on x=-71435..-52194,y=576..20417,z=-57612..-43955 +on x=22659..43853,y=-32798..-14516,z=-89770..-57812 +on x=986..23196,y=-52121..-32628,z=62650..72789 +on x=-32909..-2156,y=50351..64532,z=40885..59832 +on x=-56781..-47496,y=52110..72603,z=-4822..14975 +on x=-76831..-60355,y=7383..45961,z=9141..36514 +on x=-68167..-51522,y=-9666..13765,z=-49874..-38542 +on x=38755..47742,y=36533..70594,z=23715..51114 +on x=-22228..2221,y=55535..65581,z=-59203..-49100 +on x=50008..79233,y=-34444..-11592,z=-58009..-25021 +on x=-20079..-10117,y=32703..48068,z=54138..69547 +on x=-1038..38184,y=74027..78160,z=-21437..-9230 +on x=56730..81697,y=-15318..16310,z=22926..28221 +on x=-17637..12949,y=-35550..-25649,z=54685..76780 +on x=-70544..-36313,y=-59604..-32797,z=33935..45861 +on x=-54733..-32442,y=47014..67047,z=-48264..-19498 +on x=19892..37897,y=-27448..-15185,z=61614..83351 +on x=-55097..-47064,y=29627..54003,z=-52532..-34841 +on x=31530..47145,y=49470..73897,z=14191..35899 +on x=51090..73888,y=32704..44842,z=46488..60516 +on x=43841..59940,y=-64605..-49840,z=30676..36351 +on x=36878..67448,y=-33473..-16265,z=-66967..-46042 +on x=-84496..-54811,y=-15495..14832,z=25242..48474 +on x=71960..93695,y=-3022..16537,z=-11266..1813 +on x=15277..42422,y=-42908..-20498,z=-71495..-46089 +on x=-9076..13038,y=-71089..-40705,z=-65485..-52090 +on x=-20300..821,y=42699..66565,z=-68476..-40978 +on x=-21242..2817,y=61844..83661,z=-53653..-41765 +on x=-39221..-22964,y=7848..20497,z=51911..76766 +on x=-51227..-32052,y=-27979..-19019,z=55765..69162 +on x=-56058..-53316,y=-33460..-10390,z=38495..61250 +on x=-36765..-13076,y=72427..97145,z=-4097..8965 +on x=-27163..11326,y=-25001..-3670,z=-96514..-62422 +on x=-51677..-34363,y=23394..39907,z=51410..78321 +on x=-1769..15675,y=51810..79011,z=28167..36184 +on x=-55569..-30615,y=-77323..-55009,z=-15111..1198 +on x=-71869..-46872,y=18784..37120,z=-37529..-16671 +on x=31387..54672,y=2355..20592,z=-72100..-59357 +on x=-59823..-37596,y=27407..46884,z=-67281..-51446 +on x=52729..73686,y=-29935..-15880,z=-60931..-37955 +on x=42385..61072,y=-35059..-22527,z=48958..68879 +on x=5012..19373,y=-82294..-54615,z=26213..47231 +on x=8135..40801,y=-81727..-71638,z=-3682..21172 +on x=34199..62592,y=-21540..-4104,z=47005..71912 +on x=34978..58484,y=18995..26948,z=50927..73777 +on x=68333..72193,y=-39892..-19771,z=-45805..-18402 +on x=-8475..21786,y=12926..32886,z=55631..76465 +on x=35318..74806,y=14739..31173,z=49038..66426 +on x=71326..76027,y=16219..26392,z=-34638..-28323 +on x=-21010..-7180,y=76193..86789,z=717..21020 +on x=32851..43674,y=-42114..-16935,z=48533..75586 +on x=-64142..-33766,y=31055..55891,z=-56471..-20281 +on x=72257..92390,y=3966..27190,z=2525..21837 +on x=18881..33522,y=39591..57543,z=40682..63262 +on x=12508..47060,y=15640..36938,z=-78696..-54221 +on x=-84833..-58908,y=12109..37763,z=-22647..-2942 +on x=40226..65178,y=36048..53152,z=-56956..-46057 +on x=37499..67957,y=-12835..1617,z=59757..67798 +on x=-64339..-45213,y=-56845..-28438,z=24038..44428 +on x=54463..76439,y=21876..47318,z=-45939..-12439 +on x=13948..40185,y=-26862..-1737,z=59403..94677 +on x=37819..50405,y=-43493..-23372,z=51730..62887 +on x=45204..77222,y=23116..40170,z=-55476..-28738 +on x=18307..42037,y=-48176..-23680,z=-73815..-52378 +on x=5259..15753,y=-82074..-69215,z=-10423..7828 +on x=11079..29100,y=55829..79257,z=35124..47261 +on x=-32836..-5540,y=-85665..-71911,z=-29943..-22158 +on x=-73869..-52698,y=-29581..-7234,z=-35178..-16458 +on x=59967..82077,y=-14102..22007,z=-44828..-24341 +on x=33674..50241,y=-40916..-14101,z=-78385..-63131 +on x=1542..23503,y=-86671..-58817,z=8596..24696 +on x=-8792..12128,y=-66675..-47931,z=34147..64970 +on x=-55704..-41035,y=-77499..-46305,z=12084..34389 +on x=-53216..-30164,y=-32383..-14318,z=-75188..-53283 +on x=42677..57946,y=39145..57798,z=-2821..16451 +on x=-77991..-42964,y=-62960..-32923,z=21825..37942 +on x=16805..49140,y=32363..65921,z=44901..71062 +on x=15834..33150,y=17633..44346,z=-79462..-61624 +on x=15021..44213,y=-34200..-11984,z=-70731..-56304 +on x=63284..89974,y=-718..20719,z=-23766..-11762 +on x=8048..32832,y=-57683..-48906,z=54490..73505 +on x=-14451..15654,y=8584..35277,z=67084..81389 +on x=55528..86682,y=-37521..-17593,z=-29253..3256 +on x=19744..51570,y=53998..67878,z=-41714..-15275 +on x=43370..55473,y=-10395..2013,z=49440..82881 +on x=-35001..-18281,y=-63634..-40099,z=37054..60838 +on x=-36978..-19267,y=-38160..-11731,z=53173..85490 +on x=-64357..-45697,y=49847..57124,z=19682..32931 +on x=-3118..19435,y=-70702..-48770,z=-70199..-41352 +on x=18257..34241,y=7732..35329,z=69578..79608 +on x=-64870..-44549,y=50467..69277,z=-23241..-592 +on x=10101..32758,y=-36710..1848,z=57639..88402 +on x=-18543..3534,y=49188..67106,z=-64541..-53813 +on x=8990..26355,y=-79598..-66761,z=14032..45420 +on x=-44503..-31174,y=24961..50440,z=50911..65394 +on x=-22035..-2545,y=-30184..-13889,z=73864..80484 +on x=-45232..-10644,y=19411..35333,z=-72985..-63149 +on x=58890..92697,y=-7794..12545,z=-26386..-6244 +on x=-31591..-8925,y=64766..81250,z=-16988..5170 +on x=54498..88037,y=28444..36988,z=11497..15792 +on x=-27201..-12002,y=-41408..-12236,z=-89690..-68917 +on x=61660..83689,y=37336..45895,z=731..14553 +on x=43598..60945,y=-50389..-17267,z=-53859..-39850 +on x=-45604..-21373,y=584..9334,z=56000..72203 +on x=26109..59741,y=4357..26151,z=-66056..-46655 +on x=-5177..3346,y=66518..93953,z=-27056..-4504 +on x=25130..46731,y=-70118..-50629,z=-45246..-33763 +on x=-20804..7005,y=66161..81713,z=-47179..-27461 +on x=-28862..2602,y=-77723..-46076,z=-68671..-29477 +on x=-36079..-12851,y=23361..43178,z=-80685..-50736 +on x=-32724..-3043,y=3665..36286,z=-81199..-62869 +on x=56494..73733,y=7021..15614,z=-48806..-31330 +on x=-23867..-14914,y=-31152..-6184,z=-85932..-58048 +on x=73984..93974,y=-22935..3428,z=8324..36387 +on x=-56835..-32399,y=-59508..-33698,z=-49375..-36987 +off x=12724..32027,y=-18641..-16357,z=53923..89382 +off x=-44213..-36772,y=-8570..15375,z=52183..70551 +on x=41061..67740,y=-4858..17748,z=36244..58477 +off x=19168..30986,y=-20094..-4672,z=-78250..-71274 +off x=-21139..14603,y=-84388..-77507,z=-2940..19938 +on x=50519..71386,y=7896..28751,z=23988..46084 +on x=-63964..-45809,y=23424..40833,z=25738..55629 +off x=51446..60785,y=-15652..-4456,z=-68915..-54830 +off x=-31431..91,y=-57972..-36557,z=-75333..-54361 +on x=-38267..-24643,y=52171..78117,z=-18645..7467 +off x=-16236..5541,y=-82621..-58675,z=-67188..-44123 +on x=-76842..-50748,y=19762..38232,z=-42649..-16651 +off x=-15845..13239,y=55257..85450,z=-53580..-30697 +off x=-18219..-2907,y=-75357..-57136,z=33673..65668 +off x=-62331..-43548,y=-14055..22801,z=-66437..-46454 +on x=46451..74055,y=-66504..-34845,z=-11848..21162 +off x=52391..69059,y=-35133..-11270,z=43089..64532 +off x=11396..33973,y=35406..67208,z=52127..70249 +off x=-3673..4567,y=-91005..-59321,z=-36138..-17880 +on x=-88718..-73602,y=-38407..-7333,z=-16629..12175 +on x=-85406..-74284,y=817..25306,z=4768..33849 +off x=58264..84317,y=16415..33196,z=-153..18569 +on x=64364..81241,y=8987..39634,z=-8661..560 +on x=-75379..-59882,y=9195..14438,z=-47172..-25795 +off x=-73080..-49485,y=15925..24765,z=-43621..-31198 +off x=-17340..14233,y=-61601..-39031,z=-75386..-65628 +off x=19642..38448,y=63201..85003,z=23282..44331 +off x=-63789..-39248,y=39245..66757,z=22217..47914 +on x=-28448..-8891,y=-49494..-29440,z=58148..81565 +on x=35267..55101,y=-9094..8426,z=-76712..-50920 +off x=-60816..-32935,y=-72794..-59050,z=23856..34058 +on x=21135..46090,y=-87847..-68511,z=-7698..17021 +on x=-38273..-9156,y=-79757..-66028,z=-10121..4942 +off x=39579..56099,y=58762..66284,z=13174..38411 +on x=-48528..-30021,y=13466..34496,z=-85489..-70896 +on x=41438..62663,y=-38986..-22074,z=29908..60986 +off x=-76597..-59402,y=5002..23907,z=43180..55817 +off x=366..13550,y=48484..83910,z=-48073..-30281 +off x=62886..79283,y=-43508..-21646,z=-44547..-29365 +off x=23371..47547,y=26998..52537,z=-57755..-43284 +off x=29401..36445,y=60732..81331,z=1665..17960 +on x=-75823..-38346,y=-11927..7507,z=-73668..-54705 +on x=25041..38419,y=-66156..-61600,z=-42258..-26735 +on x=44345..66666,y=-35572..-19234,z=-59653..-34137 +on x=-84225..-64930,y=17003..39080,z=-33597..-19320 +off x=-83721..-65961,y=-46452..-27848,z=-11928..4314 +off x=-39529..-10333,y=58181..89105,z=-23730..-3412 +off x=-17410..6592,y=-80485..-52459,z=-64702..-40126 +off x=-8084..12293,y=-6490..22343,z=-85557..-72009 +on x=-40905..-26534,y=-26776..-12570,z=55059..87224 +off x=-61252..-24924,y=-62378..-56038,z=-53892..-33454 +off x=-48250..-20928,y=-83924..-54917,z=-5981..3265 +on x=-24691..-2630,y=53505..81240,z=30898..51436 +off x=15285..28267,y=14434..23879,z=-90656..-61799 +on x=45581..71052,y=-62804..-40625,z=-3832..11579 +on x=-87414..-70182,y=10675..36383,z=230..13207 +on x=-60283..-44802,y=-73878..-52146,z=24945..46428 +on x=-23474..501,y=-16574..14956,z=66443..87065 +on x=-90686..-71311,y=-24779..-16814,z=14..17955 +on x=-72565..-46778,y=39660..72634,z=2163..14609 +off x=11655..48271,y=-78752..-53769,z=9253..37605 +on x=-10345..8032,y=37414..51904,z=67956..74122 +on x=-56820..-34101,y=-73758..-60278,z=5025..20456 +off x=6141..13887,y=-24363..-1462,z=69942..96151 +off x=30477..50653,y=45418..63470,z=47296..54940 +off x=31737..47824,y=-77970..-59235,z=-46247..-21696 +on x=-10768..21241,y=30061..35462,z=-72599..-52837 +off x=35060..68218,y=51244..75692,z=13422..18143 +on x=10278..30753,y=16181..21746,z=63887..85782 +off x=-31461..-15279,y=-10940..8822,z=-89814..-59354 +off x=-29549..-2351,y=9447..30429,z=57140..79903 +off x=-38713..-17968,y=-86353..-72705,z=-14694..18426 +off x=-38877..-12096,y=699..21248,z=55219..91507 +on x=74376..76389,y=-22219..-9435,z=1241..29922 +on x=14403..33252,y=-72313..-54719,z=-27724..-19378 +off x=56577..80879,y=4498..12937,z=21257..41844 +off x=-86395..-61614,y=-36505..-9855,z=-33831..-381 +off x=-36315..-18995,y=-44170..-19323,z=-73377..-67017 +on x=43642..76022,y=28436..51667,z=32945..46458 +off x=-65811..-49387,y=37157..58288,z=21496..49770 +off x=9043..40001,y=-71938..-47216,z=46320..67929 +on x=31028..42886,y=59860..80132,z=22950..36699 +on x=-60117..-39168,y=49180..54073,z=24621..38643 +on x=-10022..18047,y=-62343..-57287,z=-56258..-39581 +off x=-81314..-48928,y=-48216..-23883,z=-30603..-15759 +off x=-1530..19063,y=-84042..-62832,z=-42273..-21022 +off x=-52926..-30088,y=-74019..-62468,z=26808..47301 +off x=7149..24616,y=-60975..-40262,z=-84031..-54341 +off x=-57559..-37505,y=41055..59886,z=25875..31289 +off x=32494..68434,y=-45275..-38554,z=-48010..-36111 +off x=33253..61728,y=390..12874,z=-81691..-53251 +off x=53111..76688,y=39420..65080,z=-22093..2796 +off x=-57759..-24875,y=-64906..-33566,z=44569..60814 +off x=65005..80745,y=16869..47369,z=-10035..23424 +on x=64661..91230,y=11255..18628,z=-5148..15109 +on x=47927..80973,y=12427..40064,z=-49309..-37649 +on x=39035..65327,y=44860..70949,z=-12785..-4070 +off x=2356..20894,y=-61095..-56960,z=45798..60580 +on x=-4531..28734,y=-73893..-43226,z=-57720..-34752 +on x=-7539..20757,y=29077..35969,z=-78151..-54304 +off x=-66366..-41285,y=-64375..-32619,z=-43262..-16564 +off x=-63927..-50613,y=-71273..-41277,z=-17872..1746 +on x=3143..42772,y=-102..6177,z=-90673..-75855 +off x=4664..30851,y=-88763..-72010,z=-44362..-15246 +on x=-64950..-56054,y=53..35160,z=25056..53048 +on x=6430..19301,y=-68928..-47280,z=-61153..-54818 +on x=16010..31702,y=-77741..-62224,z=21546..42448 +off x=-65458..-41929,y=-20995..10706,z=49344..66294 +on x=25145..44522,y=55320..80312,z=-3926..16708 +on x=24441..29494,y=30491..49411,z=65082..80912 +on x=-76257..-57605,y=-46612..-15980,z=24533..47049 +off x=-74175..-55832,y=37876..48429,z=-29203..-19725 +on x=50446..67016,y=-57824..-27032,z=22922..26127 +off x=-78144..-59358,y=-48967..-34570,z=-46112..-18059 +on x=-67354..-53797,y=-58384..-42400,z=-25129..217 +off x=-38156..-7979,y=33388..57079,z=-70773..-51632 +off x=-52868..-32300,y=-87033..-51822,z=-27743..-9999 +on x=-33829..-27661,y=-79855..-50792,z=24617..52456 +off x=-26555..-1848,y=-91878..-69947,z=3854..28839 +on x=-25021..6874,y=68562..84477,z=-40298..-24616 +off x=53416..74907,y=-8835..12335,z=-63545..-44710 +off x=-22168..-4097,y=-88113..-69810,z=-6439..1779 +on x=-29505..2395,y=-72565..-53478,z=41815..50534 +on x=76451..96577,y=-25595..6172,z=12866..34301 +on x=-64890..-42166,y=4057..18917,z=-62885..-56246 +off x=-62133..-31843,y=-73839..-45196,z=33550..50075 +off x=-1764..24098,y=-73209..-61960,z=-48786..-24206 +on x=-57687..-44815,y=42649..59623,z=13184..19162 +on x=-87523..-59297,y=-48176..-17559,z=-37500..-13300 +on x=-22628..10276,y=-32185..-20440,z=-92845..-59498 +on x=-67745..-34616,y=49417..57428,z=-22969..-12604 +off x=-73826..-60482,y=-19297..2760,z=40509..50179 +off x=-36493..-13473,y=-42680..-26455,z=-76156..-48683 +off x=13103..46451,y=36947..48532,z=-63775..-57135 +off x=8531..23435,y=4536..10083,z=-91987..-61985 +off x=56050..73923,y=-40454..-9478,z=38442..56930 +on x=-91308..-63240,y=-33798..-14517,z=-7923..7014 +on x=55122..83995,y=-58627..-28953,z=-16725..12212 +on x=-92054..-67403,y=-35202..-32222,z=-14124..10069 +on x=-52022..-30918,y=-53453..-31212,z=-55416..-34831 +on x=71282..91766,y=-24732..6013,z=-33388..-10494 +off x=12070..29302,y=-7121..23619,z=-92620..-74461 +off x=60268..72890,y=-55225..-34208,z=-14434..7636 +on x=-90906..-55916,y=-24440..-2315,z=-25985..-18440 +off x=-57653..-45774,y=52506..62232,z=-6301..6815 +off x=47901..73816,y=-19138..9729,z=42467..57112 +on x=13835..26720,y=-91573..-62653,z=18165..40393 +off x=-36385..-17721,y=64173..81316,z=-42985..-18676 +off x=52080..79993,y=-9884..15203,z=-66282..-29943 +on x=3408..13820,y=-58699..-23119,z=-81481..-66017 +off x=33793..40800,y=42336..62231,z=31309..51803 +off x=-33317..-10896,y=-73407..-71705,z=3476..24384 +off x=7733..32852,y=37920..59902,z=45923..76552 +off x=51636..69418,y=42171..47078,z=-30455..-23222 +on x=16056..30639,y=35066..47662,z=65157..68417 +off x=33853..49551,y=-26675..-2085,z=-68769..-65650 +on x=-24133..-11988,y=59855..94650,z=-12936..8537 +on x=28447..62005,y=-60060..-27297,z=-66905..-29910 +off x=-46613..-32568,y=-39589..-9214,z=52676..69808 +off x=-73953..-43213,y=-17897..-7340,z=47162..69078 +off x=-2390..20751,y=-9828..15681,z=71197..87706 +on x=43517..62663,y=55939..67222,z=-26014..-1731 +on x=-44809..-28989,y=50700..63187,z=-59674..-29376 +off x=27470..44660,y=-64069..-55639,z=19920..41591 +on x=-589..5797,y=-96164..-76712,z=-7573..13554 +on x=-49334..-28955,y=-41829..-28483,z=-74394..-47403 +on x=-31970..-14198,y=-72010..-49780,z=-55986..-40389 +on x=732..34226,y=67471..79209,z=2434..23159 +off x=-902..37139,y=-82219..-60917,z=19058..25701 +on x=53040..66156,y=-45157..-11328,z=-54953..-34950 +on x=470..19920,y=-90058..-53315,z=27919..37944 +on x=-70734..-63047,y=-52915..-38214,z=-32010..-6598 +on x=4120..19316,y=-29727..-14514,z=69495..76639 +off x=-13526..-1060,y=-79470..-55043,z=-36809..-26726 +off x=63455..71950,y=31505..50980,z=20556..30037 +on x=-97005..-74713,y=-12517..9275,z=5365..15515 +off x=61135..76000,y=19720..46662,z=-16406..3866 +on x=-48013..-18712,y=-14344..752,z=-76561..-70108 +on x=-70672..-61837,y=-10779..-2583,z=33906..58503 +off x=-31032..-18298,y=2214..25168,z=-85970..-66718 +off x=-42975..-16006,y=-39213..-23392,z=-75166..-59822 +on x=-47866..-37273,y=-63806..-59540,z=7848..36814 +off x=-39715..-2846,y=-82199..-69208,z=-1690..12589 +on x=-11814..10292,y=-29179..-5211,z=60661..82573 +on x=-88085..-55381,y=74..27743,z=17553..27847 +on x=53653..67432,y=28805..55399,z=20173..49273 +on x=11493..24480,y=23513..54820,z=66481..78607 +off x=19144..51143,y=19721..49610,z=48301..71897 +on x=-82324..-70087,y=-43534..-31667,z=821..9844 +off x=54264..61280,y=-58431..-47305,z=8683..12505 +on x=16944..30495,y=37003..49870,z=-67471..-60171 +on x=12927..27373,y=-50416..-28211,z=45133..70263 +on x=-65737..-43338,y=-44143..-22518,z=31440..56652 +on x=-10138..15003,y=-76796..-66529,z=33035..58465 +on x=60500..93904,y=7812..26774,z=2203..32121 +off x=-77226..-62474,y=-32321..-6557,z=-14470..3713 +on x=47725..57873,y=-72930..-54630,z=10555..26451 +on x=36489..59834,y=41164..59395,z=5821..27183 diff --git a/advent_of_code/day_22/assets/input_small.txt b/advent_of_code/day_22/assets/input_small.txt new file mode 100644 index 0000000..aba7585 --- /dev/null +++ b/advent_of_code/day_22/assets/input_small.txt @@ -0,0 +1,60 @@ +on x=-5..47,y=-31..22,z=-19..33 +on x=-44..5,y=-27..21,z=-14..35 +on x=-49..-1,y=-11..42,z=-10..38 +on x=-20..34,y=-40..6,z=-44..1 +off x=26..39,y=40..50,z=-2..11 +on x=-41..5,y=-41..6,z=-36..8 +off x=-43..-33,y=-45..-28,z=7..25 +on x=-33..15,y=-32..19,z=-34..11 +off x=35..47,y=-46..-34,z=-11..5 +on x=-14..36,y=-6..44,z=-16..29 +on x=-57795..-6158,y=29564..72030,z=20435..90618 +on x=36731..105352,y=-21140..28532,z=16094..90401 +on x=30999..107136,y=-53464..15513,z=8553..71215 +on x=13528..83982,y=-99403..-27377,z=-24141..23996 +on x=-72682..-12347,y=18159..111354,z=7391..80950 +on x=-1060..80757,y=-65301..-20884,z=-103788..-16709 +on x=-83015..-9461,y=-72160..-8347,z=-81239..-26856 +on x=-52752..22273,y=-49450..9096,z=54442..119054 +on x=-29982..40483,y=-108474..-28371,z=-24328..38471 +on x=-4958..62750,y=40422..118853,z=-7672..65583 +on x=55694..108686,y=-43367..46958,z=-26781..48729 +on x=-98497..-18186,y=-63569..3412,z=1232..88485 +on x=-726..56291,y=-62629..13224,z=18033..85226 +on x=-110886..-34664,y=-81338..-8658,z=8914..63723 +on x=-55829..24974,y=-16897..54165,z=-121762..-28058 +on x=-65152..-11147,y=22489..91432,z=-58782..1780 +on x=-120100..-32970,y=-46592..27473,z=-11695..61039 +on x=-18631..37533,y=-124565..-50804,z=-35667..28308 +on x=-57817..18248,y=49321..117703,z=5745..55881 +on x=14781..98692,y=-1341..70827,z=15753..70151 +on x=-34419..55919,y=-19626..40991,z=39015..114138 +on x=-60785..11593,y=-56135..2999,z=-95368..-26915 +on x=-32178..58085,y=17647..101866,z=-91405..-8878 +on x=-53655..12091,y=50097..105568,z=-75335..-4862 +on x=-111166..-40997,y=-71714..2688,z=5609..50954 +on x=-16602..70118,y=-98693..-44401,z=5197..76897 +on x=16383..101554,y=4615..83635,z=-44907..18747 +off x=-95822..-15171,y=-19987..48940,z=10804..104439 +on x=-89813..-14614,y=16069..88491,z=-3297..45228 +on x=41075..99376,y=-20427..49978,z=-52012..13762 +on x=-21330..50085,y=-17944..62733,z=-112280..-30197 +on x=-16478..35915,y=36008..118594,z=-7885..47086 +off x=-98156..-27851,y=-49952..43171,z=-99005..-8456 +off x=2032..69770,y=-71013..4824,z=7471..94418 +on x=43670..120875,y=-42068..12382,z=-24787..38892 +off x=37514..111226,y=-45862..25743,z=-16714..54663 +off x=25699..97951,y=-30668..59918,z=-15349..69697 +off x=-44271..17935,y=-9516..60759,z=49131..112598 +on x=-61695..-5813,y=40978..94975,z=8655..80240 +off x=-101086..-9439,y=-7088..67543,z=33935..83858 +off x=18020..114017,y=-48931..32606,z=21474..89843 +off x=-77139..10506,y=-89994..-18797,z=-80..59318 +off x=8476..79288,y=-75520..11602,z=-96624..-24783 +on x=-47488..-1262,y=24338..100707,z=16292..72967 +off x=-84341..13987,y=2429..92914,z=-90671..-1318 +off x=-37810..49457,y=-71013..-7894,z=-105357..-13188 +off x=-27365..46395,y=31009..98017,z=15428..76570 +off x=-70369..-16548,y=22648..78696,z=-1892..86821 +on x=-53470..21291,y=-120233..-33476,z=-44150..38147 +off x=-93533..-4276,y=-16170..68771,z=-104985..-24507 diff --git a/advent_of_code/day_22/assets/solution_big_one.txt b/advent_of_code/day_22/assets/solution_big_one.txt new file mode 100644 index 0000000..e1a9846 --- /dev/null +++ b/advent_of_code/day_22/assets/solution_big_one.txt @@ -0,0 +1 @@ +648681 diff --git a/advent_of_code/day_22/assets/solution_big_two.txt b/advent_of_code/day_22/assets/solution_big_two.txt new file mode 100644 index 0000000..b6cdfbb --- /dev/null +++ b/advent_of_code/day_22/assets/solution_big_two.txt @@ -0,0 +1 @@ +1302784472088899 diff --git a/advent_of_code/day_22/assets/solution_small_one.txt b/advent_of_code/day_22/assets/solution_small_one.txt new file mode 100644 index 0000000..74d74df --- /dev/null +++ b/advent_of_code/day_22/assets/solution_small_one.txt @@ -0,0 +1 @@ +474140 diff --git a/advent_of_code/day_22/assets/solution_small_two.txt b/advent_of_code/day_22/assets/solution_small_two.txt new file mode 100644 index 0000000..44bc6fc --- /dev/null +++ b/advent_of_code/day_22/assets/solution_small_two.txt @@ -0,0 +1 @@ +2758514936282235 diff --git a/advent_of_code/day_22/solution.py b/advent_of_code/day_22/solution.py new file mode 100755 index 0000000..37fda52 --- /dev/null +++ b/advent_of_code/day_22/solution.py @@ -0,0 +1,180 @@ +from collections import Counter +from typing import Iterable, Literal, NamedTuple, Optional +from dataclasses import dataclass +import re +from advent_of_code.runner import PuzzleTemplate + +CUBE_REGEX = re.compile(r"-?\d+") + + +class Point(NamedTuple): + x: int + y: int + z: int + + +def intersects(a_max: Point, a_min: Point, b_max: Point, b_min: Point) -> bool: + # thanks random stranger on the internet: https://stackoverflow.com/a/53488289/8320732 + return ( + a_max.x >= b_min.x + and a_min.x <= b_max.x + and a_max.y >= b_min.y + and a_min.y <= b_max.y + and a_max.z >= b_min.z + and a_min.z <= b_max.z + ) + + +@dataclass(frozen=True) +class Cube: + max_point: Point + min_point: Point + sign: Literal[1, -1] + + @classmethod + def from_string(cls, string: str) -> "Cube": + """ + >>> Cube.from_string('on x=-20..26,y=-36..17,z=-47..7') + Cube(max_point=Point(x=26, y=17, z=7), min_point=Point(x=-20, y=-36, z=-47), sign=1) + + >>> Cube.from_string('off x=-48..-32,y=26..41,z=-47..-37') + Cube(max_point=Point(x=-32, y=41, z=-37), min_point=Point(x=-48, y=26, z=-47), sign=-1) + """ + sign, rest = string.split(" ") + x_min, x_max, y_min, y_max, z_min, z_max = map(int, CUBE_REGEX.findall(rest)) + max_point = Point(x_max, y_max, z_max) + min_point = Point(x_min, y_min, z_min) + return cls(min_point=min_point, max_point=max_point, sign=1 if sign == "on" else -1) + + def crop( + self, max_point: Point = Point(50, 50, 50), min_point: Point = Point(-50, -50, -50) + ) -> Optional["Cube"]: + """ + >>> Cube.from_string('off x=-48..-32,y=26..41,z=-47..-37').crop() + Cube(max_point=Point(x=-32, y=41, z=-37), min_point=Point(x=-48, y=26, z=-47), sign=-1) + + >>> Cube.from_string('off x=-52..52,y=-52..52,z=-52..52').crop() + Cube(max_point=Point(x=50, y=50, z=50), min_point=Point(x=-50, y=-50, z=-50), sign=-1) + + >>> Cube.from_string('off x=100..110,y=100..110,z=100..110').crop() + """ + if not intersects(self.max_point, self.min_point, max_point, min_point): + return None + + new_max_point = Point(*map(lambda x: max(-50, min(50, x)), self.max_point)) + new_min_point = Point(*map(lambda x: max(-50, min(50, x)), self.min_point)) + + return Cube(max_point=new_max_point, min_point=new_min_point, sign=self.sign) + + def area(self) -> int: + """ + >>> Cube.from_string('on x=10..12,y=10..12,z=10..12').area() + 27 + + >>> Cube.from_string('off x=10..12,y=10..12,z=10..12').area() + -27 + """ + return ( + (self.max_point.x - self.min_point.x + 1) + * (self.max_point.y - self.min_point.y + 1) + * (self.max_point.z - self.min_point.z + 1) + ) * self.sign + + def opposite(self) -> "Cube": + """ + >>> a = Cube.from_string('on x=10..12,y=10..12,z=10..12').opposite() + >>> b = Cube.from_string('off x=10..12,y=10..12,z=10..12') + >>> a == b + True + """ + return Cube(min_point=self.min_point, max_point=self.max_point, sign=-self.sign) + + def intersection(self, other: "Cube") -> Optional["Cube"]: + """ + >>> a = Cube.from_string('on x=10..12,y=10..12,z=10..12') + >>> b = Cube.from_string('on x=11..13,y=11..13,z=11..13') + >>> intersection = a.intersection(b) + >>> intersection + Cube(max_point=Point(x=12, y=12, z=12), min_point=Point(x=11, y=11, z=11), sign=-1) + >>> intersection.area() + -8 + + >>> c = Cube.from_string('on x=5..8,y=5..8,z=5..8') + >>> a.intersection(c) + """ + # test if there is intersection + if not intersects(self.max_point, self.min_point, other.max_point, other.min_point): + return None + + # we're adding some cube twice -> subtract it once + # we're subtracting some cube twice -> add it once + if self.sign == other.sign: + new_sign = -self.sign + # we need to switch off part of lit cube + # this cube is negative (it turned of some other cube) -> we need to light it back up + else: + new_sign = other.sign + + new_max = Point( + min(self.max_point.x, other.max_point.x), + min(self.max_point.y, other.max_point.y), + min(self.max_point.z, other.max_point.z), + ) + + new_min = Point( + max(self.min_point.x, other.min_point.x), + max(self.min_point.y, other.min_point.y), + max(self.min_point.z, other.min_point.z), + ) + + return Cube(min_point=new_min, max_point=new_max, sign=new_sign) + + def __str__(self) -> str: + sign = "on" if self.sign == 1 else "off" + return f"{sign} x={self.min_point.x}..{self.max_point.x},y={self.min_point.y}..{self.max_point.y},z={self.min_point.z}..{self.max_point.z}" + + +@dataclass +class Puzzle(PuzzleTemplate): + cubes: list[Cube] + + @classmethod + def from_lines(cls, lines: Iterable[str]) -> "Puzzle": + cubes = [Cube.from_string(line.strip()) for line in lines] + + return cls(cubes=cubes) + + def solve(self) -> Counter[Cube]: + final_cubes = Counter() + + for new_cube in self.cubes: + new_cubes = [] + + for cube in final_cubes.keys(): + if intersection := cube.intersection(new_cube): + new_cubes.append(intersection) + + if new_cube.sign == 1: + # we cannot add a negative cube, because everything is turned off + new_cubes.append(new_cube) + + for cube in new_cubes: + # if we have one cube in "on" and the same one in "off", they will cancel out + opposite = cube.opposite() + if opposite in final_cubes: + final_cubes[opposite] -= 1 + if final_cubes[opposite] == 0: + del final_cubes[opposite] + else: + final_cubes[cube] += 1 + + return final_cubes + + def task_one(self) -> int: + cubes = self.solve() + cropped = (cube.crop() for cube in cubes) + return sum(cube.area() for cube in cropped if cube) + + def task_two(self) -> int: + cubes = self.solve() + return sum(cube.area() for cube in cubes)