From 915c7fee37f6dfa3d3f35c6232e82d23be9b9e4f Mon Sep 17 00:00:00 2001 From: oabrivard Date: Mon, 8 Jan 2024 00:27:25 +0100 Subject: [PATCH] Completed part 2 of Day 24 puzzle (with the approach proposed by tckmn on reddit (https://www.reddit.com/r/adventofcode/comments/18q40he/2023_day_24_part_2_a_straightforward_nonsolver/) --- day24/Parts2_Solution.xlsx | Bin 0 -> 13670 bytes day24/day24.go | 83 +++++++++++++++++++++++++++++++++++++ day24/day24_test.go | 26 ++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 day24/Parts2_Solution.xlsx diff --git a/day24/Parts2_Solution.xlsx b/day24/Parts2_Solution.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c9835e992ef431dbcff7bbada212784f80d9f7cc GIT binary patch literal 13670 zcmeHuW0WOZwsqRJZJU*q&Pv<1ZQH1{?MmCIv~8=>w(;e?_w~5l)&2f{e_qEKBjTJ9 zd#w|($C_)+SbK)71TY8+02lxS0000XKmo|)ksTlaKnf@T05SjskcOa*wWE=>qmH7R zt&xKkovW24K^_PYMGgSa=lK6_|A%LwFJaQUhXH2bBK{susZs%Zi$MxG2zd27_RJEn zVOTDr8B)Jr_v$394~rBogq&Hjh}F);%W@PCj*WSI1!0bJqv2cLAXD`Wr4>5qOG?Ks zJWVe}Insa{#WGq<)VC(~-sJ^gV-%|zL#4>~Sce4EIUwkR?wN_TAax;kSm^U0&2Z35 z{wkNr!a79DF@yYWkzVqYh{Ukvo8Ye(qCgmi%Z4u1S5&E&8>W;*vDXbsKQ*sA1o>l+ zV3b#W;p#DL98aCTT2)7TT7(n)4klLWcKz#cdev+R+g#JXTj=hnk z13ldz`~M>J|1d27>DJ5Rq-1&-V1h41Uqgl-=GS8o1SDMeMcW7!y?w>j;2WayNwC*{ zlH(vKVg&$y^Xc$@9a&xf5_LR8c)!C^9)X0yP2A{G5uE&N=LAkgW}hTtSH9hc=sbTn zf1mnI+>OGyBbutL`A4qA@Fuay?3GXr!X%vv79?^ZPB0ozs-OCRl-h>=V5L(HA{L}arpa%Eq&as!>h&yFqnU1f?2x@>Lzlz;5%@ngK8x1BgXG=p zSOx0y%os2L02TlQpsOYQUpR5GvA58-v9b80p#1|gfS**;oNFMnl&?pBE{fwfU zPo4z-86uyN^v^L=t|VuZ&w=30d-M*xlZnO62Vvgo56~)pRw`b1cCN7JOQ{Ta5NRf_ z^s?z9DUfEZT&DSu*Z2Kw`-Yu)6XqbB&B^Es^RoT4q?D&|I+z7h?9INNxwl$Dk_}cx zo|H88baly7kNVAQ|E5o7RgkAT)RiFs->mewe2J2;Yt0lgFvKn;MjnOhfPSnKtHm6eP;EF>&SsM5Je;YMGnA&(o20I~Zv}`xwJX%>&y>ad&*fy|bEjb_UB2Ml3M1J9S6`S9~FdhqX{QJMGKx zb*n;)srh5(3a28f*&n85aT(M}GUJRi{b?PmG3!*vuAs#j$Xh{l_x7E!A`?(6O6Gt9 zcw605H)MVDNd%GA@{(+dHL0d3hqecc+2)mlS&2X>)?>>*ag$-7pl?AtdqnGe=~l5z z#q;Cm=Y(|BZSf#m6JAqCaQgMv6@kQIa82X!(0hDj$;azQAv`y(SKdFCeR9YH`2E<$ zu`WNDI{j(ZW=w`44Zm(Co)*GAALb4l`r>QjGGWEf-P0^ads5eArm_;6nRD8mjw59w zoRV#JV;+H~=44X294$;K%=)e2;cCr}+xnm7{CdKUQt^1GxqY2w$naW(I~i~uTyFJ3 z4%Ws>_t@Cghedw`$#BO^GJsb;c|XlMD9uRgYs!4v;Em)>;=_o>?SOn<>?_*0K#9sj z2{_UFQd{A88d)BOPNp13lFLk(l|Cja1A)tM%uT^?Vv>KPgs&i+D|fQ7@@q`j)D-&o z1lZU2f^ZoE#U$D{FJ6BNJ8MZ9#qImvz|j!yFW02zBW$%Z@2l>tz5I7G5hd`ua)}ll zaCb?UwwH1Jwwlr7HUZfEn(r^?N1K=%{tu|!(;OY#)3*0d?si^zXG*oM%`!5qa8>yn zU)H~7O!nGD?4HYO_8PFy+dG*zG+`lY5>ByMf>4ThFzqH9_qykaJf1O5ExGbC#k%v~OBXlytpfzt2gF1? zndbL!ydMA(hYa?#_55fkfZu^k

YY`$17Xt(uvW6zyxy#@9Qgg?hP${buNLHUvL3 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 literal 0 HcmV?d00001 diff --git a/day24/day24.go b/day24/day24.go index ebba12d..f19866e 100644 --- a/day24/day24.go +++ b/day24/day24.go @@ -1,6 +1,7 @@ package day24 import ( + "math" "strings" "gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils" @@ -69,3 +70,85 @@ func Part1(lines []string, min, max float64) int { return result } + +// Adapted from Java code given here : https://github.com/ash42/adventofcode/blob/main/adventofcode2023/src/nl/michielgraat/adventofcode2023/day24/Day24.java +// Explanations can be found here : https://www.cs.emory.edu/~cheung/Courses/170/Syllabus/09/gaussian-elim.html +func gaussianElimination(coefficients [][]float64, rhs []float64) { + size := len(coefficients) + for i := 0; i < size; i++ { + // Select pivot + pivot := coefficients[i][i] + // Normalize row i + for j := 0; j < size; j++ { + coefficients[i][j] = coefficients[i][j] / pivot + } + rhs[i] = rhs[i] / pivot + // Sweep using row i + for k := 0; k < size; k++ { + if k != i { + factor := coefficients[k][i] + for j := 0; j < size; j++ { + coefficients[k][j] = coefficients[k][j] - factor*coefficients[i][j] + } + rhs[k] = rhs[k] - factor*rhs[i] + } + } + } +} + +// Adapted from solution given here : https://www.reddit.com/r/adventofcode/comments/18q40he/2023_day_24_part_2_a_straightforward_nonsolver/ +// and from Java code given here : https://github.com/ash42/adventofcode/blob/main/adventofcode2023/src/nl/michielgraat/adventofcode2023/day24/Day24.java +func getCoordinates(stones []Hailstone) Hailstone { + coefficients := [][]float64{{0.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0}} + rhs := []float64{0.0, 0.0, 0.0, 0.0} + + // Get X,Y,VX,VY + for i := 0; i < 4; i++ { + s1 := stones[i] + s2 := stones[i+1] + coefficients[i][0] = float64(s2.vy - s1.vy) + coefficients[i][1] = float64(s1.vx - s2.vx) + coefficients[i][2] = float64(s1.py - s2.py) + coefficients[i][3] = float64(s2.px - s1.px) + rhs[i] = float64(-s1.px*s1.vy + s1.py*s1.vx + s2.px*s2.vy - s2.py*s2.vx) + } + + gaussianElimination(coefficients, rhs) + + var x int64 = int64(math.Round(rhs[0])) + var y int64 = int64(math.Round(rhs[1])) + var vx int64 = int64(math.Round(rhs[2])) + var vy int64 = int64(math.Round(rhs[3])) + + // Get X,VZ + coefficients = [][]float64{{0.0, 0.0}, {0.0, 0.0}} + rhs = []float64{0.0, 0.0} + for i := 0; i < 2; i++ { + s1 := stones[i] + s2 := stones[i+1] + coefficients[i][0] = float64(s1.vx - s2.vx) + coefficients[i][1] = float64(s2.px - s1.px) + rhs[i] = float64(-s1.px*s1.vz + s1.pz*s1.vx + s2.px*s2.vz - s2.pz*s2.vx - ((s2.vz - s1.vz) * x) - ((s1.pz - s2.pz) * vx)) + } + + gaussianElimination(coefficients, rhs) + + var z int64 = int64(math.Round(rhs[0])) + var vz int64 = int64(math.Round(rhs[1])) + + return Hailstone{x, y, z, vx, vy, vz} +} + +func Part2(lines []string) int64 { + stones := []Hailstone{} + + for _, line := range lines { + values := utils.ParseInt64Array(strings.Replace(line, " @", ",", -1), ", ") + stone := Hailstone{values[0], values[1], values[2], values[3], values[4], values[5]} + stones = append(stones, stone) + } + + stone := getCoordinates(stones) + + return stone.px + stone.py + stone.pz +} diff --git a/day24/day24_test.go b/day24/day24_test.go index 00452c4..b5e16f6 100644 --- a/day24/day24_test.go +++ b/day24/day24_test.go @@ -31,3 +31,29 @@ func TestPart1WithInput(t *testing.T) { t.Fatalf("expected 21785, got %d", result) } } + +func TestPart2(t *testing.T) { + lines := []string{ + "19, 13, 30 @ -2, 1, -2", + "18, 19, 22 @ -1, -1, -2", + "20, 25, 34 @ -2, -2, -4", + "12, 31, 28 @ -1, -2, -1", + "20, 19, 15 @ 1, -5, -3", + } + + result := Part2(lines) + + if result != 47 { + t.Fatalf("expected 47, got %d", result) + } +} + +func TestPart2WithInput(t *testing.T) { + lines := utils.ReadLines("input.txt") + + result := Part2(lines) + + if result != 554668916217145 { + t.Fatalf("expected 554668916217145, got %d", result) + } +}