Day 3
This commit is contained in:
parent
5229f3fb54
commit
87d19742f6
140
d03/input.txt
Normal file
140
d03/input.txt
Normal file
@ -0,0 +1,140 @@
|
||||
.....180.........230..........................218.....189......415.......................322....507..................206..............111...
|
||||
........*.602.........571-.......................*...*.............199.....$.........181.......*......980....292............................
|
||||
..509.923.=....................+......835*......608.984..............-.801..922.156...*.........533.....$.......*678.......&................
|
||||
...*............273..........307..........393................@..........*.......*...231..................................106.339............
|
||||
.906..............*.350..........................322...938..582.372....160...................411........197.........42.................$81..
|
||||
...............944.....*......473........80*..............#.....*............340.......107....*...........&..................893............
|
||||
...........937........32........./..12......199.......440......32.785..........*......*.....50......198......37.....710.......$..740.691+...
|
||||
....304....*...870.......*787.........@..$......462.............................264....420........#..........*........*...........*.........
|
||||
...&......395...*.....545...............539..............................491.......................318.=410...10.....16.....364..188.=891...
|
||||
......../.....423.337......42....430........554................614.90.......*702....*587......$................................*............
|
||||
...269.267..........*......*.....*............*........%.930.....*......864......675........133...-.......707...318.908...629.776...........
|
||||
.....*......884......345...979..780..917.....942.....875........826......................*......28...254..&.......*...=.....................
|
||||
...270...95*...........................*....................289...................307..431..............*.....%.........................611.
|
||||
.....................+.............890.970..+...........235......*...........@...............405.........817...242./991...........*.........
|
||||
..............137...63....../......*.......478.255.739.....*.....584......399..367..........#....51........................403.908.175......
|
||||
761....582...=.............740..143.....*.........*.........722......151......*.........-.....................23......476....*..............
|
||||
....49...*............444.............537......*......791....................37...212...60.444....-728.+......*...778..*...31.....895.@534..
|
||||
......*...108....942....*......463...........39.616.........40.........*...........*........*...........446...........268........*..........
|
||||
..50#.625...........+..838........*.....................105*....250..409......+......425....101.914.............................876.+386....
|
||||
..............116..............848..111.......14..................&..........816.......*........*..........548...........*....@.............
|
||||
................./........#........*.........@...58......................181..........792....565..750...........767....%..81..525......770..
|
||||
716......439.498...........942....719..................697@...............*.....&688...............*..421........&..847................&....
|
||||
...*261.....*.......*.................=..........................5.....800................-......471..%......753...............880.../......
|
||||
.................289.715............832........120...=............&...........*126.........258..............*.........300.......*...909.....
|
||||
.676.........432................757.................309..............311...903..................422.......335..38......*.....521............
|
||||
..../..742...*..............#....*.......574..198.*......852..............................751...-.....531.......&.......849.........449.....
|
||||
........*....116......../.839..712............*...402......*.....865.894.........964.................../..*........288......................
|
||||
......568........295.547....................471.........................*.......*........640*......457...193..599*....*.......137.......888.
|
||||
..................@..........345.189...849.........181...........879.....339.730...32........734...*..............793.289....*....&....#....
|
||||
........%854....*.....*976......*........*.872....*.................%.............*......167.......2......................747......814......
|
||||
.454............322.........*.........930........696..28........9.....................-..................890...17*..........................
|
||||
...........912.......133&...87.....*.................+.........*............412........473.....781.778.......................*801..676#.867.
|
||||
.605......*.....................685.345.......545.+.............636.....665*......................*...................19..933...............
|
||||
....*..678.......844.881*.................667...*.940..52...................................336/..................51...@...........927.455..
|
||||
.779..............*......221................/.657.......*..@1....220*....100.....=.................320..............=.................*.....
|
||||
..........991......198........419.283..................414..................@..833...........334.....&...................567..235&..........
|
||||
.............=................*...=..............944........188........61.......................%.........508..130...*.....*........*205....
|
||||
.............................357.........$619......*....674*.....*262..&..479...912.421%..74.........261....#..*...68.708.795....695........
|
||||
....594....432........521.......................794...........636............*............*...................315........................568
|
||||
...%..........*..909.....#..........................*...720........419..603*..256.........386..........150............149.-.........=.......
|
||||
............492..*...172.........701...109-.176..641......&....235.$...........................915.......=..+636......*....643......515.....
|
||||
484...695........857.$..../.......*...........+......2..........*.................@..383.........*.254................103......665..........
|
||||
.........%..543..........20..@....113....102..........*884.............12.......685...-.........40..*......231............@.........*...219.
|
||||
.918.......@................633..........*...+901.......................%.................&.........145.................109...538...653.$...
|
||||
......................668...............845..............=..................611...........30.............20.....166.............$...........
|
||||
............627.........&........617..................179.............776.....-................&.....823*...98&....*.................203#...
|
||||
.575..........*.............338..............216.229...........-..304*...........*960..........876.................539......................
|
||||
......-284.655.....188......*....=.787..../....*....$.56.+....892.............792..........................-...........37.......546.993.....
|
||||
...............134..=.....945..392....*...663..639........567.......298...277........665...........702......706.........*..........*.....328
|
||||
...#..502..598..-..................611................................*......*...172*........607......#.....................................
|
||||
425......*....*.....%677...260*214.............#....@759...............260.935...........247*...............779......430............=...84..
|
||||
......159...156.......................99.642...42.........825..+720..................&..........+27....@...@.........*........611...240.....
|
||||
.............................402..798*.../..............-...*.......218..........371..491...........314.......*372....601......*............
|
||||
..310.........+263.266...............................721...431.....*.........342....-.............+........211.................397......253.
|
||||
......................*........60...................................83..........*..................435..........=...........................
|
||||
............458@.......424........909....241......611..................109..934..476..356...571..............900..495.....57................
|
||||
...125...86........356..............=........................653=..402*........*......*....&........540..........*..............126.........
|
||||
......*.%.......#...*..................82.227..713*868.36...............248...698.....399..............*.......276.564.820...69.............
|
||||
....458.......294..58......890*1...44...@..................-.83....783....&.................*326..246.981............#...=.....*.........549
|
||||
....................................*...............*...677...@..............538*463.....493........*......63.................63..930.......
|
||||
.......253.................$...916..549...974.......319.............................................451.....*.48..206..996...........*370...
|
||||
...#..*...............655..15.*..............*616........................................................934....%.@.......+.../827..........
|
||||
.292.699....*.....94...........782......492...............21*........+....182....................818........................................
|
||||
...........789................................812...759......394......870../....50*351...................690..........*.....................
|
||||
...............361...141*467......923............*.$.......................................349......*....*.....780...621...619..............
|
||||
....11....920..*....................*..........34..............................987.....$....*......143..448.....+...........................
|
||||
..............777.83....../.616....706...115............503...........................267.....229.................645.....488..839......%...
|
||||
..........411...........801.#...........*.........298.......20*.......@587...930.................*770.....................@...-........989..
|
||||
.....672+.............*...........887.307.....922*.............315..............$.........878*.........261.......317.............624........
|
||||
..........640......411.25...$981...................37...357..........#984..684@...............310......*...&.....*..................#.......
|
||||
...........*............................/.%............%.......541.........................=.........812....67.902....956.....-.........824.
|
||||
285*118.606....274.......272*956..498.825.244...754./.............*..717......./............798..........................*....841..999..=...
|
||||
................../................*..............*.5............566...*....830..................286.........683/......967.........+........
|
||||
...........................=....761.............458.....125&............88..........217.411/.879*................................/...418....
|
||||
982......47..............167............*100..%...................%818...............*......................805&..%.....934...896.......*...
|
||||
.....987.....525...................@.911.......802............120...........808.......164................./........212.*...............720..
|
||||
.....*.........%..730.5*330......47....................752....*......520/..../...............964.......166.............392..................
|
||||
....260...........*......................473....163.....*..875..........................760..................532.............*.....&827.....
|
||||
...............211.......*........&..299..&..%....%.80.30........560.............326...........834*148..411......572......304.716...........
|
||||
628........+.......119..7.854....936..*......128...........38.=....*.....281......&...............................*...................753...
|
||||
....109..116......*..................98................269.=...327..910.....*823............773.....+..%237........411.....*803...175*......
|
||||
.....*............727.............................................................109....*.....$.897....................................779.
|
||||
...406.................#3.......%......454....109.........823.........................877.774.........298....+..........@..678..............
|
||||
............962............*.428........*....................*.........752..............................$.380.........687../.........963*649
|
||||
......323...*.....+286..914........834....893..124...494......785.......*.....806.................179.............85........................
|
||||
.......&...778./...................*.......*......*..%....866............500..&...327....970..........821.................+.863.......-663..
|
||||
..829..........626............569...164....197.401.......*..................................*.....784.../..224......117.22..*.....24........
|
||||
.....*.994..............................................609.&467............870..............811...............$....*.......386.............
|
||||
..207..*........816....................#..141......587...........*......218...+......536=......................337..927..85......194....802.
|
||||
......846......%.....+...............336......................846.398.....*..........................144.................*.........*....+...
|
||||
.160..............258......517...943...........128......33..............151..272.......124../...427....*............648.451....242..498.....
|
||||
......779.879................*.....*...%.........*........@...................*.........../.969....*..143............*............*.........
|
||||
.........*....354.417.......112.......409.........681........=....117.......241.$....#..........240........698.508.32....958*339.356........
|
||||
..915...........*........$...................194........48....600..*.............326.590.....................*..............................
|
||||
.....*250..781.503.....94........+877........*......88.....69.......693....757........................61..362......@...871.@................
|
||||
..........................................349..405....*539.#....855.......*............+902.......898.*...........121...=..541......959.....
|
||||
......541....712...927&.*370...339...............&..............*.......297........................+..571.881.......................*...260.
|
||||
.....*....#...........................392...........884.935..710............=......%./........................332.944.............575..*....
|
||||
..246....99............316..970...71..$.......606.......@........339...#..#..181.343.693.........542...729=........*..................357...
|
||||
...............781....&.......#.....*.........../.................#..172.761......................*................360...93&................
|
||||
251.............*..................980....368-...............977@.................489............729....537..........................41.....
|
||||
.................235.....631........................+....=...................818.........755............/..................$855.....*.......
|
||||
.............*...................250....708.623..380...890...........51..........598........*..............557..........*.......1.656....360
|
||||
..749.........368.............@....+......*......................660....862.866$...@./634.757..745........*.......209....652............*...
|
||||
.......379..#...............577........835.............312*913.....*......*.......................*......872..747........................168
|
||||
........#....346.329.........................852.=9..............%.....972...-...............604..198.67...........711.............247@.....
|
||||
..................*....&.........@5.....*....../........*467......839......159........&..941............-..........*........................
|
||||
....195.......711...509.....298@.......633.......936..=........*......990......903..833.*.....................&...72....=.....614...........
|
||||
613....*.....*......................................*..236..594.......&..................851.............760.850.........980........*980....
|
||||
......9.....130......549...549...................895.......................=....................840.....@........................989........
|
||||
....................*..................750...842.....27.804..@............950.....682.....586../.............166..481.......461.............
|
||||
.......881.....189..954.....513...45..@......*...........*...279...438.............*.........+...........740....&...+........*..............
|
||||
.568......@.............153...=...............690.......174.........../.............122..............867.=............451.906........324....
|
||||
...............&........*...&..........730........987.......................%.......................@.........*190...*...........672....%...
|
||||
................109...183..493.841@.......*...984*.......................857....39....635*653..519.........144.......896.$.......*...$......
|
||||
.........990...........................340..............+134...741...*...........%................=.....74................498....145..485...
|
||||
.../227....*.-.............990.............963.891..............=..553.....348.............965*.....$..*................#...................
|
||||
........641...100..*.............866.........$..*.......451*531.........-...*...185............762...4..178..690%........481.$....589..@216.
|
||||
....................65.164*697......*977.......96.......................184.514....*591......................................506....*.......
|
||||
...........334..................773.................226..253.511............................761..........607.....*532....909.....415........
|
||||
..548..668....*843.....23.824%..*....71.....411......../..*....#......656....................@.......=...*....452.......*..............+....
|
||||
.........@.=....................719.....804.*............653......................698....296.........613.29............749...........197....
|
||||
..705-......214....428#....633@...........*...................642....%986............*....*................................779...484........
|
||||
...................................228..........605...%237......*..................666..906.................296........736..%.....*.........
|
||||
.............593%.38...........129.*...............*...........474.....487.269@....................681.862....*.......@........517..........
|
||||
........539.......&..781.......*............895.876..336*794...........*............................*....*....621....................145....
|
||||
...815...*............$....484.54............*..........................953....564.......246.513...601...488......................&.........
|
||||
...*......776................&............840.....................974.............*471......*...................250....*....106#.548........
|
||||
437..............@.............#979............752%.798......97....#......*726.....................990*155.778.....*.78.....................
|
||||
................358.+706.....................*......*..................621..................&................-...757...................456..
|
||||
.....132....................44.....368....637.......209..............................464.242.......376..................492....=439.....#...
|
||||
......%...592........48*....-.....+......................897.799..108*...........432...&..............*472.261............@.................
|
||||
.........*.....$487.....471............236...944=..407......*.........337.........-...........................................270.....265...
|
||||
....$.....988...........................*...........*.....................713..................910..680..297*549......518.....&...727*......
|
||||
.....267.......634......202....../.....726.285..76...408..864.....377.....&................*..*........*.........289.*.....-................
|
||||
..............*..........*......782..........................@......*................460.172..768.......934......=....119.921..........$....
|
||||
........315.850......850.3..........322..439.....................784...........612.....*............................+.........310.813...819.
|
||||
.........*.............+.............*....*....457.......371.829.....215.......*......117...757...727$.....538......561.730..*..............
|
||||
......231......%....................604.725......*.=710.=.............*....974.329..............*.........*....747..........600.............
|
||||
..............688...869.........15............222.....................366....................120.10....539........................934.97....
|
110
d03/main.py
Normal file
110
d03/main.py
Normal file
@ -0,0 +1,110 @@
|
||||
from collections.abc import Iterable
|
||||
from functools import reduce
|
||||
from itertools import product
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple
|
||||
|
||||
|
||||
class Point(NamedTuple):
|
||||
x: int
|
||||
y: int
|
||||
|
||||
def iter_adjacent(self, wrap=False) -> Iterable["Point"]:
|
||||
for offset in product((1, 0, -1), (1, 0, -1)):
|
||||
adj = Point(self.x + offset[0], self.y + offset[1])
|
||||
if adj == self:
|
||||
continue
|
||||
if not wrap and (adj.x < 0 or adj.y < 0):
|
||||
continue
|
||||
yield adj
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"Point({self.x}, {self.y})"
|
||||
|
||||
|
||||
def is_symbol(v: str) -> bool:
|
||||
return not v.isnumeric() and v != "."
|
||||
|
||||
|
||||
def read_part(grid: list[str], point: Point) -> tuple[Point, int]:
|
||||
points = [point]
|
||||
|
||||
num = grid[point.y][point.x]
|
||||
if not num.isnumeric():
|
||||
raise ValueError(f"Can't read a part because {num}@{point} is not a number")
|
||||
|
||||
row = grid[point.y]
|
||||
|
||||
x = point.x - 1
|
||||
while x >= 0 and row[x].isnumeric():
|
||||
num = row[x] + num
|
||||
points.append(Point(x, point.y))
|
||||
x -= 1
|
||||
|
||||
left_point = Point(x, point.y)
|
||||
|
||||
x = point.x + 1
|
||||
while x < len(row) and row[x].isnumeric():
|
||||
num = num + row[x]
|
||||
points.append(Point(x, point.y))
|
||||
x += 1
|
||||
|
||||
print(f"Part {num}@{left_point} for {point}")
|
||||
|
||||
return left_point, int(num)
|
||||
|
||||
|
||||
def find_parts(grid: list[str], point: Point) -> dict[Point, int]:
|
||||
parts: dict[Point, int] = {}
|
||||
for adjacent in point.iter_adjacent():
|
||||
if adjacent.y >= len(grid) or adjacent.x >= len(grid[adjacent.y]):
|
||||
continue
|
||||
if grid[adjacent.y][adjacent.x].isnumeric():
|
||||
point, part_num = read_part(grid, adjacent)
|
||||
parts[point] = part_num
|
||||
|
||||
return parts
|
||||
|
||||
|
||||
def part1(input: Path) -> int:
|
||||
|
||||
with input.open() as f:
|
||||
grid = [line.strip() for line in f]
|
||||
|
||||
all_parts: dict[Point, int] = {}
|
||||
for y, row in enumerate(grid):
|
||||
for x, cell in enumerate(row):
|
||||
p = Point(x, y)
|
||||
if is_symbol(cell):
|
||||
parts = find_parts(grid, p)
|
||||
all_parts.update(parts)
|
||||
|
||||
return sum(all_parts.values())
|
||||
|
||||
|
||||
def part2(input: Path) -> int:
|
||||
with input.open() as f:
|
||||
grid = [line.strip() for line in f]
|
||||
|
||||
total = 0
|
||||
for y, row in enumerate(grid):
|
||||
for x, cell in enumerate(row):
|
||||
p = Point(x, y)
|
||||
if cell != "*":
|
||||
continue
|
||||
parts = find_parts(grid, p)
|
||||
if len(parts) != 2:
|
||||
continue
|
||||
gear_ratio = reduce(lambda x, y: x*y, parts.values(), 1)
|
||||
total += gear_ratio
|
||||
|
||||
return total
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
result1 = part1(Path("./input.txt"))
|
||||
print("part 1", result1)
|
||||
|
||||
result2 = part2(Path("./input.txt"))
|
||||
print("part 2", result2)
|
10
d03/sample1.txt
Normal file
10
d03/sample1.txt
Normal file
@ -0,0 +1,10 @@
|
||||
467..114..
|
||||
...*......
|
||||
..35..633.
|
||||
......#...
|
||||
617*......
|
||||
.....+.58.
|
||||
..592.....
|
||||
......755.
|
||||
...$.*....
|
||||
.664.598..
|
Loading…
Reference in New Issue
Block a user