summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Segundo2023-12-03 11:36:43 +0100
committerChristian Segundo2023-12-03 11:41:30 +0100
commitaf54dee0ed31b94cb56bc95c0aacc750743d6a2c (patch)
treef80c844e383356fed0be4f6b196d2d9e60046a7f
parent73353e0e5e01f0702c0a8aa99397474c40af2a4c (diff)
downloadadvent-of-dotslash-2023-af54dee0ed31b94cb56bc95c0aacc750743d6a2c.tar.gz
add day 3
-rwxr-xr-x03.lua110
-rw-r--r--03.txt140
2 files changed, 250 insertions, 0 deletions
diff --git a/03.lua b/03.lua
new file mode 100755
index 0000000..4cf692f
--- /dev/null
+++ b/03.lua
@@ -0,0 +1,110 @@
+#!/usr/bin/env lua
+
+local function expand(l, i)
+ local p = { i, i }
+ while p[1] > 1 and string.gmatch(l:sub(p[1] - 1, p[1] - 1), "%d")() ~= nil do
+ p[1] = p[1] - 1
+ end
+ while p[2] < #l and string.gmatch(l:sub(p[2] + 1, p[2] + 1), "%d")() ~= nil do
+ p[2] = p[2] + 1
+ end
+ return p
+end
+
+local function replace(l, s, e)
+ local t = {}
+ for token in string.gmatch(l, ".") do
+ table.insert(t, token)
+ end
+ for i = 1, #t do
+ if i >= s and i <= e then
+ t[i] = "."
+ end
+ end
+ return table.concat(t)
+end
+
+local function copy(v)
+ local j = {}
+ for i = 1, #v do
+ j[i] = v[i]
+ end
+ return j
+end
+
+local function adj(i, j)
+ return {
+ { i - 1, j },
+ { i + 1, j },
+ { i, j - 1 },
+ { i, j + 1 },
+ { i - 1, j - 1 },
+ { i - 1, j + 1 },
+ { i + 1, j - 1 },
+ { i + 1, j + 1 },
+ }
+end
+
+local function p1(l)
+ local v = copy(l)
+ local s = 0
+ for i = 1, #v do
+ for j = 1, #v[i] do
+ if string.gmatch(v[i]:sub(j, j), "[*#+$=@%%/&-]")() ~= nil then
+ local p = adj(i, j)
+ for k = 1, #p do
+ if
+ (p[k][1] < 1 or p[k][2] < 1 or p[k][1] > #v or p[k][2] > #v[p[k][1]])
+ or (string.gmatch(v[p[k][1]]:sub(p[k][2], p[k][2]), "%d")() == nil)
+ then
+ goto nextkp1
+ end
+ local pos = expand(v[p[k][1]], p[k][2])
+ s = s + tonumber(v[p[k][1]]:sub(pos[1], pos[2]))
+ v[p[k][1]] = replace(v[p[k][1]], pos[1], pos[2])
+ ::nextkp1::
+ end
+ end
+ end
+ end
+ return s
+end
+
+local function p2(l)
+ local v = copy(l)
+ local s = 0
+ for i = 1, #v do
+ for j = 1, #v[i] do
+ if string.gmatch(v[i]:sub(j, j), "[*]")() ~= nil then
+ local p = adj(i, j)
+ local n = {}
+ for k = 1, #p do
+ if
+ (p[k][1] < 1 or p[k][2] < 1 or p[k][1] > #v or p[k][2] > #v[p[k][1]])
+ or (string.gmatch(v[p[k][1]]:sub(p[k][2], p[k][2]), "%d")() == nil)
+ then
+ goto nextkp2
+ end
+ local pos = expand(v[p[k][1]], p[k][2])
+ table.insert(n, tonumber(v[p[k][1]]:sub(pos[1], pos[2])))
+ v[p[k][1]] = replace(v[p[k][1]], pos[1], pos[2])
+ ::nextkp2::
+ end
+ if #n == 2 then
+ s = s + n[1] * n[2]
+ end
+ end
+ end
+ end
+ return s
+end
+
+local f = io.open("03.txt", "r")
+local content = f:read("*all")
+f:close()
+local l = {}
+for line in string.gmatch(content, "[(%w%p)]+") do
+ table.insert(l, line)
+end
+print(p1(l))
+print(p2(l))
diff --git a/03.txt b/03.txt
new file mode 100644
index 0000000..d8894bd
--- /dev/null
+++ b/03.txt
@@ -0,0 +1,140 @@
+...................15....904...........850.................329...................13....................................871....816....697....
+...........53.497........................%....906...610.......*.............735#..&...*......558...68...............68..*......&....*.......
+..........*....$....................132.........*..........844....875................350............*...............*..336.364...649........
+.......726.......341..................*...186...358..................*244........57.......@.........738......*.....663.................584..
+.............952.*......33......660..704............949......................518*....234.967....551........971..&.......................*...
+.......738...*....222......................706.......*..825.............474%...........*...........*.405.........779..............542...405.
+.74.........366....................192..........542.737....*760...................623/..730.....718.../.....................$17......%......
+...*126.....................%........*.504...=..*.........................................................974...............................
+........331/..901.........337..........*...461.698...............*461.....814............................*............975...............165.
+..../.........*.....................262.......................313........*........530.56.....567.......897.....*.........*.9................
+....953....355...@703..................................609..............462.......%........./...............108.557...501.../...724.........
+..............................................=.........%.......46......................533....670...............................*..%630....
+.........................91...382*204.........154..%.............+.524.995..............=.....*...........7..........692.92*56...73.........
+.685....*....70.189.......*.........................773...830/....../....*........=.........565.............464................$....738..130
+.........938..*........993..............*.................................243...340...753...........*...882...............108.647....*......
+..............762..........348.......280...............364*526...........................*........552.....=....25..682....*.........164.....
+.....948..............813../....644......62........................................#.....657......................*.........................
+......*...........................*.................$745.......739.....*...399...30............&..@...........924.117..........309..........
+...883....544.....33.........585=.428.146................288.....*..853....*...........*891.409....429..460...*..........997....*........187
+.............*818........829..........*....846..............................248.....574..................*....789.......*.....965....-..*...
+......=.....................*..........370.......850+.............313...........................573....621...............268.......58..800..
+....67....287.............481..709...............................*.......#74...................*.................965........................
+............@.291.............*.........607*....950.475..309...66..932........395..374..........155.891....472..*......774.............&....
+....207..........%..262......543..887/......711....*.......+......*............*...*........823............*...93...........377.....764.....
+.....*...968.951.......#................................$.........453...366..736.972........*.............697........*618...&...............
+....984..*...............-.......................884..23......492.....*..*................70..523.....25........$.....................370...
+..................870...187.......548#.522..458.....*..........*....956......535....../.........*.525*........197....@..*266...123.....*....
+.........501.....*..........................&.....323........257........956..*........80..946.592.................211.........*.........311.
+.....380*.....867...653..347....................*........93=...........*......515..........-...................................678..........
+..........876......&....*.......&631.950.647...631...@...........=...705..914................739..............319......713.........*97.#918.
+.....805...*..........118................-.........790....559..51........../........*.........*......550......*........./.......647.........
+......-..428.....599......813................413..................280............840.654.......91.....*...........236.......$...............
+.............=...%.......*.....77...................#.492............................................96..........@.......175....%...........
+......*427..569..........47......................999......314.....636*253.................764.................27......-..........415..386...
+...142................$................@..320........969...................882*311...............#..751...........=....649...........*......
+.........*723..993.976....638........475................=..800.......................*764.710...574....*964....831..........473......531....
+...%..486...................*....#..................................831...........375........*........................=824......21..........
+559.........................441...316................................./....................618.407.......83.......972...............91......
+......*.....25..741...................%...............*63.546$..905......27........861.756........*.......*..........*...28...57............
+.......794....*./........782...236....47...........937...........*..755....*505..............23.948.......560.532...421....*..#.........405.
+............566.................*........-850..872.......90....229...+..........978..684............225..................675.....591...*....
+.............................296..243...........+....691...................311.........$......321......@......827....$13.......$....&..530..
+.....664..422$....613.....@.........%.401/.$974.....-.........%.145....729......*........./.......106............%.......=.....611..........
+.......$.........*.......857...147*.............591........+.46..*.....=........306.67*...818.............................261....../........
+............823...785..............340.........-....564..777......456.......%....................891.................560...........642..181.
+.....394.....*................226..........423..............................539.................*............640&.............535...........
+.......@.....626..317..329....*...92........+..................374....827............*.683+....771....529.........303..........*............
+.........172.....-........*......*.....332...........288..229..+.........*.786=....468.............*....*...........*....461...249..=.......
+....974...*............901..@....130..*..............$...*..........4.573................163......429....808.464*47..231....@......964......
+........183.................582........11...............310.....774.*.....567.............*....36...........................................
+.......................939.....................*826............@.....892..........481......266.*...-253.........106.830....235......*..841..
+727.........177#.........&.......507........301..........................550..242*.....+./.....686.......@.446.*.....*.......*....894..*....
+....67...............468.....&......&..596......................817.600...............85.5.............973...$.805...513......378.......388.
+...........*247.........*.....974.........*263....329....476....*............721............723.....................................358.....
+........784.....434.....667.......................*............615.195.612...............................540#........347...........*........
+...............*.................76......121...659........@555..........-.............201......................866............628.505.509...
+.............515........../.................#....................281..%...656............*670.419.......799.......*...510.786...*.......&...
+....993.................540.373....709.............705............*...132..#........298$......*...232....*..@..878.......*....528...#.......
+....$.........615.............*..........948..........*........565................%..........465..#.....497.67....................631.......
+.........138....#....417......123...........*.......546...821...................114..=............................258.859=.380-.............
+.....734*.............../.............833..399..........................+............780...288..............117..@...................925....
+................*860..........228........*...............................956....390*........=..........%...*..........839...373......*......
+..802........369........641.............763.....154.24...............302............620..............150.403.......*.........*....647.......
+...................................&........466*.....@..................*827....530.............................129.628.....923.........=866
+..........&......&.............824.573.................669.........................$.....374..627...........698.....................759.....
+.......499....%.812.857*653...................668..........879.......974................../......*926...852.........................-....832
+...646......284..............708...369...........*808................-.......705.......@...............%.............492.462............*...
+....................959......#.......*....872..........................102....*.........80..839....996..............*.....%........83...49..
+.785............363..*.............49.......*.......667.....797....224.......586..............&....*...34..673.......650....................
+....*..*132....*.....225...................631..350..*.........*....*.............941....=.......52....*.................406...546..........
+.543............760.........305..325...330.......+.................621...........*.......63..#.......268..239...................#...........
+........658..................*............*...........735......820.....145....419...........91..489.........*......404.......*....#.........
+..........=....415+.....38$....844...+..366.............*.......*......*..............................43....945.....#.....563.205..211..183.
+......267.......................*...519.....730........836..........277...........808...........504...&................................#....
+.....*..................705/....575..........*....../..........$866.........=.......*...975......#.......183.931........%.......611.........
+.......135.......284........................246.653.972..............365..191.....376...*.....&.........*......*.........994...@.....11.....
+...440../.........*.............................*..............415.....................985..838......677.......109...................*......
+...@............224....399.727$......68#..........................$......432.....214$.....................#.................591....686......
+..........&.......................................658........143....779.+....942......$.............885....567..........$...................
+.461.......33....277.407......108..............47.*.............*...........*.......$.811............................390....................
+..........................907*.....#397..307...*....197.12.....3...738....254.85..393...............713..700..741...........176.....883.....
+..316........180...........................*.758...................-...........................................*............*...............
+....*..../........871...338..165.........683............455...701*......................540....255.......$....858........277....28....+.....
+...660.469..912...#..........%......743.........439.....-.........206......363..........*.......*.......640............................144..
+..............*.........443...............610.............803.............*.............879...658............$................189...........
+...........172......794........98..............646......................662..............................*....49.-210.523.257....*..........
+...87..662.....#.......*667....%..408..........*............220...524............=.....742..39..160....64.636..........*..*....974..378.....
+...*.....*.....42..&.............=....371*.....804.................*..#....../.240.....*........................395%..461..818.....*........
+....706.398........452....500.............406..........57*380....365.42...635.......131...........18.....538.....................403........
+..............143........*.........80............740..........................*245......784........-...........708...................&.297..
+.230...........*.......373..341...........................$438.......*.................=.............874&..959*...........192......829.#....
+...#..........476..647.....*......................................431.728..........................................50.....$.................
+........334...........*731.930......=........966........*323...................301.....%....404...............879....*372.....208.134.......
+...........*.....................163..........*......509......................%.....&..785.......................*...............*..........
+...768..329....199........................................797......*368..........873..........26.565....651.....664......111..........217...
+................*.....26.......705*76....415.............*................................749..........*..................#......545-..%....
+....-....473..517......*...............5*....449..........68........................751.......*399......401.................................
+.730......#.........240...&..65.718.87......*.....532..............-....567............*....................675.......67..463...............
+.....289#....509........200......*...*....852....................885...+....663..72..507......998.&954..213....$.....*.........672..........
+..............................403.....129........377-....................../....&.................................473...........*...........
+.........855=.........250...................961........860*916.......981..........326.........633..404................676.%566..120.........
+892...........532.............754.......866*....790..................#........819*..............*.........%.44..=......*............29......
+....@527.......*..................600............../...$568.....800.....................179..528........613.....358...949...................
+................302...807............*..895.................+.....@.....-...........................980...........................736.......
+........217...=......*............879.....+.-..........%.....793.......442.......422............209*.......&.......969....240.378...*.......
+....340*.....145...%.596....................23....703...217................372..........610.................129.......*........../.....=....
+.................790.....&............904............=............795......*.......385=...+.....88*143...............891....406.......79....
+............*749.........31..............*....318.................+.......317.................................%419.............*392.........
+....854..797......*..500...............614.1...*..............803.....451............330.159.143.598.......+......./827...............717...
+...@............924.*........................245............-.&..........*...606................*...........461............604....#....*....
+....................73....160..406.150...............933.957...................%.......419.........665..*.........-.......*.....721..573....
+....*915.........40................*...%.............*........584.......929......377....*..404.935....&..870.....93........395..............
+.781.............@...........632.......710....769.323............$.........*.........904.....*...*.....................859..................
+.....=.......................*...646............-.........................52................149...414....................*........%.........
+...51....524.625..........328...*.................................295.734......@..........................856.291.695....367..218..787..8...
+.........../.*................339........................576/.417*...........445...@........................%....................-..........
+....869.85...316.....308...............345.......749.............................264.............775..777...............................89..
+.......*...............#.........$....*..........*....../.....786.713*52.................357.......&./.........#......971....74.305....-....
+............................325..770..167..@.....265..+..883................................+...57..........312.......*........*............
+......+.....266.....788.111....*..........342........588.......939..393*717.............488....*....................401....249...255........
+.......308..*............#.....816....465..........*.....492..@.............581.........-.......397..709*.................$.....*...........
+.............511.....881...+.........+..........178..524*..............150..../..720.......843...........964....129.../......908............
+.......749.............*.526.$............800............................*.........*...500....*.../.................487..........200........
+..668......*639......932......139.726................#...51..436$..................775...*...834..874.......%..............859+......439....
+........810........................*.......805.......100..*...........999.....743......169............477...961......973............$.......
+.574...........6*262........398....204......*.....%.......525...........*.........................412..*.........376...*.@43....=......=....
+....*836....................................25...619............658.....172.......................*...408...........*........%...776..802...
+.............307.......&........537..988..............128..-.....*..........................118...327......296.......967..991...............
+.....899...$...*....788.....829......=....................559.722.......519.........385$...+..................*.323*..............*123......
+........*.930...674...........*..........447.......801..............957....................................111......767..34....556..........
+..565.644..............18.....472.........*...8........................*........258........901.................296.......*..........*.......
+....*............995=....*................649.*...151.........437%...445.747......-.........&......#......%.....*.........800....357.240....
+....476.491/.931.......121..732*940..682......975..$.....*..................+.358.............../.363....152.264........$...................
+.............=....730*..................*584...........234.........996.................*.....701........................499............649..
+......................672......@.............................958.....&.+...........983.673........233.@981........760.......................
+..942.993@......293...........939..&....@.........867..92.....*........679.........................*.............*.......27...998...........
+....#.......230.$...................36.24....809..#....*...660.....$.......748..199.-.............717...@......................../..........
+......*95..............647...$..............-.........461..........757...........*...68...............728..210*680..708......$.....246......
+...355.........*..........*.538...%..............................-...............977....209*.......................*.........141.....*......
+...............680.....670.........784........171..799.........317..........................844........166........289.................463...