aoc

Advent of Code Solutions
git clone git://git.alexkarle.com.com/aoc
Log | Files | Refs | README | LICENSE

commit 6a646f375e801d789c4c402aa128194012785f0b (patch)
parent 0b4f3a240951151681ffb0a09e40a39c5961e9af
Author: Alex Karle <alex@alexkarle.com>
Date:   Mon, 13 Dec 2021 12:57:58 -0500

day13: Add python solution

Sparse matrices for grids for the win! This also requires updating the
makefile to handle multi-line answers (cool question!)

Diffstat:
A13/a.py | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
A13/b.py | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A13/example | 21+++++++++++++++++++++
A13/input | 874+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MMakefile | 2+-
5 files changed, 1006 insertions(+), 1 deletion(-)

diff --git a/13/a.py b/13/a.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import sys +import re + +coord = re.compile("\d+,\d+") +fold = re.compile("fold along") + +coords = [] +folds = [] + +for l in sys.stdin: + l = l.strip() + if coord.match(l): + coords.append([int(x) for x in l.split(",")]) + elif fold.match(l): + split = l.split() + # x=8 + folds.append(split[2].split("=")) + +# Pt A we only care about the first split +# Assuming all points are originally unique, we just need to +# dedupe them after the fold! +d, v = folds[0] +v = int(v) + +folded = {} + +for c in coords: + x, y = c + if d == "x": + if x == v: + # lost to the fold + pass + elif x > v: + newx = v - (x - v) + folded[(newx, y)] = 1 + else: + folded[(x, y)] = 1 + elif d == "y": + if y == v: + # lost to the fold + pass + elif y > v: + newy = v - (y - v) + folded[(x, newy)] = 1 + else: + folded[(x, y)] = 1 + else: + raise Exception(f"Bad dir: {d}") + +print(len(folded.keys())) diff --git a/13/b.py b/13/b.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import sys +import re + +coord = re.compile("\d+,\d+") +fold = re.compile("fold along") + +coords = [] +folds = [] + +for l in sys.stdin: + l = l.strip() + if coord.match(l): + coords.append([int(x) for x in l.split(",")]) + elif fold.match(l): + split = l.split() + # x=8 + folds.append(split[2].split("=")) + + +prev_folded = {} +for d, v in folds: + v = int(v) + folded = {} + for c in coords: + x, y = c + if d == "x": + if x == v: + # lost to the fold + pass + elif x > v: + newx = v - (x - v) + folded[(newx, y)] = 1 + else: + folded[(x, y)] = 1 + elif d == "y": + if y == v: + # lost to the fold + pass + elif y > v: + newy = v - (y - v) + folded[(x, newy)] = 1 + else: + folded[(x, y)] = 1 + else: + raise Exception(f"Bad dir: {d}") + + coords = folded.keys() + prev_folded = folded + +# Just hope they fit on a terminal! +print() +for y in range(6): + for x in range(120): + if (x, y) in prev_folded: + print("#", end="") + else: + print(" ", end="") + print() diff --git a/13/example b/13/example @@ -0,0 +1,21 @@ +6,10 +0,14 +9,10 +0,3 +10,4 +4,11 +6,0 +6,12 +4,1 +0,13 +10,12 +3,4 +3,0 +8,4 +1,10 +2,14 +8,10 +9,0 + +fold along y=7 +fold along x=5 diff --git a/13/input b/13/input @@ -0,0 +1,874 @@ +1101,291 +221,448 +1098,383 +217,399 +507,191 +410,240 +1036,449 +208,241 +469,548 +1064,838 +189,72 +1198,812 +107,483 +900,206 +902,325 +430,7 +801,834 +1009,890 +263,65 +1255,379 +328,502 +537,703 +724,763 +126,521 +788,127 +544,484 +110,36 +243,28 +1183,215 +242,420 +811,373 +1228,325 +567,880 +798,250 +5,264 +165,362 +140,126 +915,596 +835,806 +1047,157 +1123,222 +72,654 +1111,863 +114,411 +212,511 +1071,603 +1123,672 +704,707 +1191,558 +944,137 +1168,879 +55,379 +773,74 +36,227 +36,560 +1048,856 +209,151 +1016,355 +1012,428 +528,616 +902,390 +489,532 +350,528 +790,18 +666,759 +224,191 +761,560 +571,602 +329,698 +330,806 +1310,883 +919,855 +1250,119 +1069,305 +754,486 +574,632 +411,418 +423,410 +329,180 +823,781 +499,521 +902,530 +316,778 +649,355 +581,672 +1101,603 +1110,224 +601,47 +977,264 +1297,340 +743,294 +463,343 +652,134 +73,446 +5,508 +946,891 +698,609 +1015,343 +440,792 +221,670 +597,894 +1153,763 +798,187 +946,521 +1297,365 +212,383 +157,763 +1228,894 +939,494 +1039,227 +463,551 +132,16 +536,241 +1071,561 +1027,876 +567,462 +199,438 +1009,789 +271,299 +1170,350 +557,613 +360,847 +1309,84 +58,474 +1184,0 +709,847 +711,47 +885,613 +179,75 +87,630 +577,677 +1098,511 +1086,7 +145,284 +939,176 +33,301 +373,736 +733,217 +841,346 +192,445 +147,311 +192,837 +818,653 +330,866 +610,628 +306,66 +850,497 +246,812 +162,784 +207,227 +1084,131 +738,424 +728,318 +900,318 +851,217 +1086,66 +684,169 +391,407 +798,431 +1121,341 +189,588 +441,845 +736,184 +999,582 +1061,417 +406,168 +773,820 +715,458 +649,386 +1215,529 +773,191 +960,528 +1111,438 +67,29 +946,821 +126,392 +268,868 +897,305 +1196,35 +1119,551 +60,319 +72,128 +126,278 +1305,264 +1243,522 +455,438 +393,281 +552,319 +1280,838 +733,677 +30,61 +800,819 +412,756 +246,504 +507,759 +776,114 +73,224 +1305,284 +984,872 +1233,604 +835,75 +692,334 +254,240 +1310,358 +144,371 +1066,123 +1078,810 +509,386 +1245,710 +107,819 +114,483 +678,308 +873,847 +1103,227 +463,327 +1168,250 +889,147 +830,402 +522,127 +107,115 +0,883 +805,620 +559,60 +1176,298 +897,133 +1059,758 +0,252 +985,322 +30,838 +1282,101 +1102,241 +1028,653 +1175,327 +957,378 +42,733 +1145,625 +373,343 +763,411 +459,343 +338,436 +360,47 +246,437 +907,86 +77,677 +594,575 +801,386 +723,29 +283,876 +189,621 +1110,866 +408,156 +475,88 +251,758 +738,31 +643,315 +301,4 +739,154 +728,206 +1247,487 +644,211 +330,200 +507,583 +333,182 +5,91 +294,399 +848,57 +609,191 +343,311 +995,252 +221,224 +1208,663 +406,138 +1163,311 +1230,88 +393,165 +5,162 +1064,530 +43,3 +653,628 +985,362 +1183,255 +974,267 +290,331 +1299,362 +266,775 +1064,122 +1093,47 +392,38 +65,184 +572,613 +571,544 +520,428 +1067,866 +470,19 +783,886 +363,86 +311,70 +320,527 +1066,206 +221,560 +1233,677 +1049,165 +1042,868 +1143,333 +1158,268 +472,96 +1256,894 +224,887 +565,821 +391,65 +1081,505 +925,334 +131,665 +1094,410 +761,224 +818,205 +609,43 +677,700 +738,613 +927,719 +582,318 +808,716 +960,472 +28,437 +946,563 +803,311 +33,593 +850,311 +364,521 +502,884 +856,614 +1310,232 +661,284 +212,35 +924,868 +502,626 +107,523 +445,79 +808,570 +803,703 +877,334 +181,22 +980,28 +1245,415 +502,716 +947,86 +107,380 +1039,595 +743,880 +271,595 +745,73 +559,529 +1173,889 +78,829 +105,782 +115,369 +1118,389 +917,707 +364,378 +813,131 +405,229 +321,264 +492,653 +11,362 +633,700 +408,738 +510,371 +537,815 +1277,749 +187,222 +50,497 +875,16 +599,827 +1086,255 +1064,156 +1064,604 +902,569 +454,280 +639,70 +1200,36 +107,878 +986,806 +137,374 +1102,149 +739,292 +830,626 +191,439 +221,446 +455,863 +1173,247 +1069,589 +624,838 +1176,876 +880,35 +499,373 +353,82 +632,808 +1206,68 +541,397 +321,179 +30,232 +879,122 +241,305 +1061,5 +295,343 +512,879 +937,343 +164,43 +1305,539 +610,266 +551,548 +454,28 +661,386 +994,340 +1280,61 +671,70 +618,373 +462,718 +980,638 +281,36 +460,497 +338,884 +1295,824 +393,729 +879,772 +502,268 +1009,154 +386,868 +447,227 +1138,542 +296,609 +1310,11 +408,530 +897,761 +192,53 +981,698 +54,166 +1064,390 +147,415 +587,29 +1064,856 +537,596 +1173,647 +1020,563 +774,241 +684,457 +654,11 +1111,86 +798,879 +559,813 +1158,716 +192,176 +415,732 +842,752 +115,77 +82,325 +1097,621 +966,598 +423,92 +1119,119 +60,575 +1071,499 +539,817 +395,596 +1280,662 +383,609 +873,822 +1215,813 +162,241 +857,840 +763,859 +1305,162 +728,240 +350,586 +231,81 +739,740 +242,868 +534,114 +877,448 +453,840 +1215,386 +1265,407 +487,781 +152,716 +629,516 +353,890 +1256,0 +1285,452 +902,156 +502,324 +1228,613 +706,588 +115,817 +576,513 +1086,120 +1129,834 +919,289 +629,442 +950,47 +686,838 +1183,568 +994,100 +498,815 +334,880 +373,372 +830,268 +1071,268 +137,520 +869,845 +599,515 +599,47 +577,604 +348,828 +902,290 +430,828 +440,515 +1168,431 +339,252 +957,82 +971,252 +710,894 +333,732 +838,96 +1272,332 +102,127 +1145,849 +1019,826 +217,495 +119,558 +1268,733 +1039,609 +377,551 +701,43 +982,683 +325,572 +1260,812 +1274,112 +290,597 +1068,138 +547,563 +1237,672 +343,70 +137,140 +50,588 +454,614 +118,205 +498,367 +353,378 +835,88 +114,859 +1158,772 +1145,362 +1183,639 +169,67 +711,67 +1226,868 +1268,833 +301,789 +677,642 +995,763 +582,576 +316,554 +904,138 +339,642 +1304,527 +22,422 +1129,872 +460,728 +454,168 +1196,411 +763,331 +58,292 +1227,350 +65,483 +848,841 +729,0 +634,427 +1195,77 +1149,84 +140,544 +933,551 +200,728 +985,124 +656,11 +545,616 +459,677 +957,341 +1103,652 +1119,455 +107,688 +104,826 +1101,74 +325,124 +1227,740 +502,10 +1203,523 +527,7 +1158,570 +290,821 +1207,346 +1242,763 +1064,56 +194,728 +431,122 +1068,868 +435,16 +611,242 +462,53 +115,525 +161,84 +462,885 +541,497 +788,654 +1123,224 +1120,567 +249,5 +771,817 +1154,544 +405,889 +561,572 +994,794 +396,91 +729,672 +869,273 +542,306 +644,759 +1247,381 +1020,73 +1165,508 +1094,415 +736,595 +801,60 +907,534 +1308,246 +872,31 +207,652 +1118,837 +30,609 +887,92 +595,458 +895,732 +1064,38 +82,613 +1128,544 +325,362 +85,122 +1146,43 +454,224 +517,199 +433,446 +1212,408 +1163,583 +5,732 +589,710 +364,891 +1203,75 +1033,679 +480,626 +865,255 +246,200 +316,359 +1052,131 +438,484 +15,70 +982,470 +609,851 +609,372 +194,807 +900,688 +981,124 +957,553 +1247,183 +507,31 +1233,290 +1232,392 +1089,560 +982,502 +134,428 +600,0 +1193,752 +459,665 +1020,740 +316,100 +328,22 +1305,508 +126,894 +895,716 +328,424 +550,516 +880,66 +1265,191 +1274,821 +446,653 +393,184 +902,604 +787,665 +856,280 +1068,26 +1310,502 +1056,206 +1174,786 +1091,155 +855,438 +348,380 +927,623 +759,548 +972,458 +191,775 +792,786 +648,73 +851,677 +604,588 +1280,659 +986,190 +1119,775 +455,326 +187,224 +1086,319 +165,700 +612,61 +705,215 +582,654 +581,224 +1196,483 +364,331 +441,49 +831,26 +902,255 +488,306 +869,621 +371,204 +878,516 +107,75 +768,515 +835,523 +989,264 +117,703 +971,28 +221,672 +678,586 +745,821 +599,399 +1274,597 +273,47 +145,386 +1066,0 +1200,31 +135,327 +986,88 +328,683 +589,483 +1260,497 +59,458 +1195,525 +1304,821 +1091,739 +957,452 +358,733 +1170,544 +1110,222 +856,149 +1168,655 +788,543 +664,715 +1089,448 +118,653 +960,250 +22,472 +485,60 +373,522 +888,532 +244,894 +576,138 +728,576 +147,479 +324,88 +28,101 +681,292 +612,833 +209,291 +387,346 +898,756 +1279,439 +967,824 +371,718 +1111,120 +893,73 +1089,224 +698,61 +261,710 +316,116 +1168,239 +315,642 +1225,122 +1195,817 +246,738 +224,639 +1121,247 +581,222 +1223,630 +338,564 +152,10 +271,609 +594,270 +242,474 +350,250 +194,280 +261,165 +222,378 +493,717 +410,771 +743,462 +739,544 +423,372 +358,609 +1278,623 +662,73 +1252,602 +224,774 +469,346 +213,621 +224,319 +454,390 +1039,299 +263,39 +1274,521 +570,302 +788,351 +177,274 +229,389 +36,521 +773,703 +763,819 +527,886 +986,28 +656,883 +137,72 +855,86 +711,515 +1203,483 +423,81 +946,292 +541,845 +1019,516 +329,250 +142,879 +1111,422 +1158,535 +463,439 +165,208 +848,885 +480,402 +25,442 +432,516 +145,162 +221,334 +25,292 +95,365 +98,408 +1193,372 +565,73 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 diff --git a/Makefile b/Makefile @@ -24,7 +24,7 @@ build: $(TARGETS) run: build @for d in $(DAY)/; do \ for sol in a.py a b.py b; do \ - [ -e $$d/$$sol ] && printf "%-7s %s\n" "$${d}$$sol:" `$$d/$$sol < $$d/input` || true; \ + [ -e $$d/$$sol ] && printf "%-9s" "$${d}$$sol: " && $$d/$$sol < $$d/input || true; \ done; \ done