From 40da8b1a0a7cb5fb912a601e4f211bfb428018fb Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Tue, 24 Dec 2024 09:07:12 -0600 Subject: [PATCH 1/2] 2024 Day 24 complete Part 2 solved manually, working on a programmatic solution --- .gitignore | 1 + 2024/day24/input | 313 ++++++++++++++++++++++++++++++++++++++++++ 2024/day24/main.go | 192 ++++++++++++++++++++++++++ 2024/day24/testinput | 10 ++ 2024/day24/testinput2 | 47 +++++++ 2024/day24/testinput3 | 19 +++ 6 files changed, 582 insertions(+) create mode 100644 2024/day24/input create mode 100644 2024/day24/main.go create mode 100644 2024/day24/testinput create mode 100644 2024/day24/testinput2 create mode 100644 2024/day24/testinput3 diff --git a/.gitignore b/.gitignore index 88a7921..d9c9149 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ _testmain.go */day24/day24 */day25/day25 +*.ignore diff --git a/2024/day24/input b/2024/day24/input new file mode 100644 index 0000000..a7710ef --- /dev/null +++ b/2024/day24/input @@ -0,0 +1,313 @@ +x00: 1 +x01: 0 +x02: 1 +x03: 1 +x04: 0 +x05: 0 +x06: 1 +x07: 1 +x08: 0 +x09: 1 +x10: 1 +x11: 1 +x12: 1 +x13: 1 +x14: 1 +x15: 1 +x16: 1 +x17: 0 +x18: 0 +x19: 0 +x20: 0 +x21: 0 +x22: 0 +x23: 0 +x24: 0 +x25: 1 +x26: 1 +x27: 1 +x28: 1 +x29: 0 +x30: 1 +x31: 1 +x32: 0 +x33: 0 +x34: 1 +x35: 0 +x36: 1 +x37: 1 +x38: 0 +x39: 0 +x40: 1 +x41: 1 +x42: 0 +x43: 0 +x44: 1 +y00: 1 +y01: 0 +y02: 0 +y03: 1 +y04: 1 +y05: 0 +y06: 0 +y07: 0 +y08: 0 +y09: 0 +y10: 0 +y11: 1 +y12: 0 +y13: 0 +y14: 1 +y15: 0 +y16: 1 +y17: 1 +y18: 1 +y19: 1 +y20: 1 +y21: 0 +y22: 0 +y23: 1 +y24: 0 +y25: 0 +y26: 0 +y27: 1 +y28: 1 +y29: 1 +y30: 0 +y31: 1 +y32: 0 +y33: 1 +y34: 1 +y35: 0 +y36: 0 +y37: 0 +y38: 1 +y39: 1 +y40: 1 +y41: 1 +y42: 0 +y43: 1 +y44: 1 + +y13 AND x13 -> dct +y19 XOR x19 -> qww +x40 AND y40 -> vvt +bpj AND jmc -> qvd +x34 AND y34 -> qkf +y07 XOR x07 -> shj +x12 XOR y12 -> msr +dqf OR wvh -> mqr +y04 XOR x04 -> cwp +x16 AND y16 -> qsm +x10 XOR y10 -> fpp +y31 AND x31 -> mfb +y24 XOR x24 -> swf +kbw XOR cnq -> z20 +x36 AND y36 -> fbv +y26 XOR x26 -> vwb +pnt OR nwb -> bnk +pdk AND fpp -> fnn +x18 XOR y18 -> fcm +y05 AND x05 -> mkq +y15 AND x15 -> mht +cnq AND kbw -> tdh +dvg OR vvt -> hfj +msr AND rfj -> qnh +y36 XOR x36 -> fmw +wgp OR ncj -> jjg +bkm OR bwr -> fgc +mht XOR fgc -> z15 +fcm XOR qnk -> z18 +bnk XOR qww -> z19 +mgr AND vfc -> vsh +y42 XOR x42 -> jmc +cdh OR wjj -> qnk +rtc AND fkn -> dbr +bfg XOR rsw -> z21 +y24 AND x24 -> dwp +y33 XOR x33 -> vfc +x13 XOR y13 -> fpd +qdw XOR mhh -> z29 +x29 XOR y29 -> mhh +y38 XOR x38 -> cds +y42 AND x42 -> fcg +wnb XOR qjh -> z34 +y30 AND x30 -> kqh +hdk OR qtc -> mgr +pbk OR sdq -> ggp +y43 XOR x43 -> psg +jsd AND kbc -> jbf +x17 XOR y17 -> jhw +grs XOR whw -> z39 +x08 AND y08 -> hrv +y06 AND x06 -> wgp +vwb XOR dgc -> z26 +tsw XOR wwm -> hdt +tqf XOR grc -> z25 +x09 AND y09 -> z09 +y25 AND x25 -> dmw +x23 XOR y23 -> tqk +x11 XOR y11 -> jrm +cwp AND rsk -> dmh +y00 AND x00 -> jfb +tmd AND fsp -> rtw +qww AND bnk -> frn +jbf OR bmh -> qdw +rtc XOR fkn -> z02 +cwp XOR rsk -> z04 +mqr XOR fmw -> z36 +y40 XOR x40 -> dqk +y29 AND x29 -> jnk +y14 XOR x14 -> hsh +x32 XOR y32 -> vtg +mhh AND qdw -> hdf +x23 AND y23 -> sjk +x03 AND y03 -> ttc +qhs OR vkm -> z45 +y25 XOR x25 -> tqf +y28 AND x28 -> bmh +y19 AND x19 -> sgc +tdw OR ndp -> grs +rrc AND bsn -> vfs +y41 AND x41 -> pkb +tsw AND wwm -> rnk +tqk XOR chk -> z23 +x05 XOR y05 -> wwm +kqh OR nbf -> rrc +whw AND grs -> rtb +fcg OR qvd -> drc +vsk AND djp -> wkn +y37 AND x37 -> hbg +vkd XOR wqr -> gbf +gmj XOR swf -> z24 +y41 XOR x41 -> gfs +sdb XOR cds -> z38 +x21 AND y21 -> rkv +pdk XOR fpp -> z10 +chk AND tqk -> mnm +hbg OR kjf -> sdb +pkb OR nvj -> bpj +grv AND jnv -> kjf +x00 XOR y00 -> z00 +jjj XOR jfb -> z01 +x44 XOR y44 -> wdq +ttc OR vkp -> rsk +x27 XOR y27 -> vsk +dbr OR vrb -> psp +x32 AND y32 -> qtc +hdt AND gwg -> ncj +nqw OR tdh -> bfg +y03 XOR x03 -> fhp +y15 XOR x15 -> jgt +x43 AND y43 -> ndc +fmw AND mqr -> pqm +fnn OR cpd -> tfh +bsn XOR rrc -> z31 +dpr AND nvv -> z30 +x34 XOR y34 -> qjh +wnb AND qjh -> pnf +y20 AND x20 -> nqw +hfj AND gfs -> nvj +y22 AND x22 -> dvc +nwr OR jgt -> shs +x04 AND y04 -> dsn +x02 XOR y02 -> fkn +fhp AND psp -> vkp +x33 AND y33 -> pwh +mht AND fgc -> nwr +jfb AND jjj -> pss +y26 AND x26 -> hts +hts OR hqr -> djp +dct OR ffq -> gnt +ndc OR gqn -> ggg +y27 AND x27 -> sfr +pwh OR vsh -> wnb +vtg XOR ssr -> z32 +sjk OR mnm -> gmj +jjg XOR shj -> z07 +gbf OR ttm -> pdk +ggg AND wdq -> vkm +mvt XOR jnw -> z35 +ggg XOR wdq -> z44 +swf AND gmj -> ccj +gnt AND hsh -> bkm +mfb OR vfs -> ssr +wnd AND shs -> pgd +x16 XOR y16 -> wnd +x11 AND y11 -> fqp +vsk XOR djp -> z27 +x28 XOR y28 -> kbc +rtb OR fvv -> fkp +y01 XOR x01 -> jjj +rnk OR mkq -> z05 +cjc XOR ggp -> z08 +y39 XOR x39 -> whw +fkp AND dqk -> dvg +y37 XOR x37 -> jnv +x02 AND y02 -> vrb +prk XOR jhw -> z17 +wvc OR hrv -> vkd +hfj XOR gfs -> z41 +kbc XOR jsd -> z28 +shj AND jjg -> pbk +dmh OR dsn -> tsw +x10 AND y10 -> cpd +rsw AND bfg -> mbt +jhw AND prk -> wjj +hmn OR qnh -> sjh +fqp OR rng -> rfj +y07 AND x07 -> sdq +vfc XOR mgr -> z33 +sjh XOR fpd -> z13 +ggp AND cjc -> wvc +y35 XOR x35 -> mvt +fsp XOR tmd -> z22 +y09 XOR x09 -> wqr +dpr XOR nvv -> nbf +hdt XOR gwg -> z06 +mvt AND jnw -> dqf +x35 AND y35 -> wvh +grd OR dmw -> dgc +psp XOR fhp -> z03 +x08 XOR y08 -> cjc +x39 AND y39 -> fvv +x38 AND y38 -> ndp +ssr AND vtg -> hdk +frn OR sgc -> kbw +qsm OR pgd -> prk +cds AND sdb -> tdw +ccj OR dwp -> grc +psg XOR drc -> z43 +mbt OR rkv -> tmd +y18 AND x18 -> nwb +jmc XOR bpj -> z42 +y12 AND x12 -> hmn +jrm AND tfh -> rng +qnk AND fcm -> pnt +cpp OR pss -> rtc +sjh AND fpd -> ffq +jnk OR hdf -> nvv +grv XOR jnv -> z37 +x20 XOR y20 -> cnq +y31 XOR x31 -> bsn +rfj XOR msr -> z12 +vkd AND wqr -> ttm +y17 AND x17 -> cdh +dgc AND vwb -> hqr +y14 AND x14 -> bwr +y06 XOR x06 -> gwg +y22 XOR x22 -> fsp +fkp XOR dqk -> z40 +jrm XOR tfh -> z11 +y30 XOR x30 -> dpr +hsh XOR gnt -> z14 +x21 XOR y21 -> rsw +rtw OR dvc -> chk +x44 AND y44 -> qhs +qkf OR pnf -> jnw +fbv OR pqm -> grv +grc AND tqf -> grd +drc AND psg -> gqn +shs XOR wnd -> z16 +y01 AND x01 -> cpp +sfr OR wkn -> jsd diff --git a/2024/day24/main.go b/2024/day24/main.go new file mode 100644 index 0000000..c4ed5de --- /dev/null +++ b/2024/day24/main.go @@ -0,0 +1,192 @@ +package main + +import ( + "fmt" + "sort" + "strconv" + "strings" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +func main() { + inp := h.StdinToStringSlice() + part1(inp) + fmt.Println() + part2(inp) +} + +func part1(inp []string) { + fmt.Println("# Part 1") + dev, gates := parseInput1(inp) + // Perform all logic + gateDone := make(map[int]bool) + for len(gateDone) != len(gates)-1 { + for i := range gates { + if _, ok := gateDone[i]; !ok { + pts := strings.Split(gates[i], " ") + var w1, w2, ok bool + if w1, ok = dev[pts[0]]; ok { + if w2, ok = dev[pts[2]]; ok { + switch pts[1] { + case "AND": + dev[pts[4]] = w1 && w2 + case "OR": + dev[pts[4]] = w1 || w2 + case "XOR": + dev[pts[4]] = w1 != w2 + } + gateDone[i] = true + } + } + } + } + } + fmt.Println(findValueOf(dev, "z")) +} + +// Not fully working yet... I solved this part manually. +func part2(inp []string) { + fmt.Println("# Part 2") + gates := parseInput2(inp)[1] + + var swapped []string + var c0 string + + for i := 0; i < 45; i++ { + n := fmt.Sprintf("%02d", i) + var m1, n1, r1, z1, c1 string + + m1 = find("x"+n, "y"+n, "XOR", gates) + n1 = find("x"+n, "y"+n, "AND", gates) + + if c0 != "" { + r1 = find(c0, m1, "AND", gates) + if r1 == "" { + m1, n1 = n1, m1 + swapped = append(swapped, m1, n1) + r1 = find(c0, m1, "AND", gates) + } + + z1 = find(c0, m1, "XOR", gates) + + if strings.HasPrefix(m1, "z") { + m1, z1 = z1, m1 + swapped = append(swapped, m1, z1) + } + + if strings.HasPrefix(n1, "z") { + n1, z1 = z1, n1 + swapped = append(swapped, n1, z1) + } + + if strings.HasPrefix(r1, "z") { + r1, z1 = z1, r1 + swapped = append(swapped, r1, z1) + } + + c1 = find(r1, n1, "OR", gates) + } + + if strings.HasPrefix(c1, "z") && c1 != "z45" { + c1, z1 = z1, c1 + swapped = append(swapped, c1, z1) + } + + if c0 == "" { + c0 = n1 + } else { + c0 = c1 + } + } + + // Sort and join swapped wires + sort.Strings(swapped) + fmt.Println(strings.Join(swapped, ",")) +} + +func parseInput1(inp []string) (map[string]bool, []string) { + dev := make(map[string]bool) + var gates []string + var inGates bool + for i := range inp { + if len(inp[i]) == 0 { + inGates = true + } + if !inGates { + if inp[i][3] == ':' { + wire := inp[i][:3] + v := inp[i][5] == '1' + dev[wire] = v + } + } else { + gates = append(gates, inp[i]) + } + } + return dev, gates +} + +func parseInput2(inp []string) [][]string { + var parts [][]string + var currPt []string + for _, line := range inp { + if line == "" { + if len(currPt) > 0 { + parts = append(parts, currPt) + currPt = []string{} + } + } else { + currPt = append(currPt, line) + } + } + if len(currPt) > 0 { + parts = append(parts, currPt) + } + return parts +} + +func findHighestReg(dev map[string]bool) int { + var highest string + for i := range dev { + if i > highest { + highest = i + } + } + ret, _ := strconv.Atoi(highest[1:]) + return ret +} + +func findValueOf(dev map[string]bool, register string) int64 { + var highest string + for i := range dev { + if i > highest { + highest = i + } + } + get, _ := strconv.Atoi(highest[1:]) + var val int64 + for i := get; ; i-- { + key := fmt.Sprintf("%s%02d", register, i) + v, ok := dev[key] + if !ok { + break + } else { + val = val << 1 + if v { + val += 1 + } + } + } + return val +} + +func find(w1, w2, op string, gates []string) string { + for _, gate := range gates { + if strings.HasPrefix(gate, fmt.Sprintf("%s %s %s", w1, op, w2)) || + strings.HasPrefix(gate, fmt.Sprintf("%s %s %s", w2, op, w2)) { + parts := strings.Split(gate, " -> ") + return parts[len(parts)-1] + } + } + return "" +} diff --git a/2024/day24/testinput b/2024/day24/testinput new file mode 100644 index 0000000..8e277c1 --- /dev/null +++ b/2024/day24/testinput @@ -0,0 +1,10 @@ +x00: 1 +x01: 1 +x02: 1 +y00: 0 +y01: 1 +y02: 0 + +x00 AND y00 -> z00 +x01 XOR y01 -> z01 +x02 OR y02 -> z02 diff --git a/2024/day24/testinput2 b/2024/day24/testinput2 new file mode 100644 index 0000000..94b6eed --- /dev/null +++ b/2024/day24/testinput2 @@ -0,0 +1,47 @@ +x00: 1 +x01: 0 +x02: 1 +x03: 1 +x04: 0 +y00: 1 +y01: 1 +y02: 1 +y03: 1 +y04: 1 + +ntg XOR fgs -> mjb +y02 OR x01 -> tnw +kwq OR kpj -> z05 +x00 OR x03 -> fst +tgd XOR rvg -> z01 +vdt OR tnw -> bfw +bfw AND frj -> z10 +ffh OR nrd -> bqk +y00 AND y03 -> djm +y03 OR y00 -> psh +bqk OR frj -> z08 +tnw OR fst -> frj +gnj AND tgd -> z11 +bfw XOR mjb -> z00 +x03 OR x00 -> vdt +gnj AND wpb -> z02 +x04 AND y00 -> kjc +djm OR pbm -> qhw +nrd AND vdt -> hwm +kjc AND fst -> rvg +y04 OR y02 -> fgs +y01 AND x02 -> pbm +ntg OR kjc -> kwq +psh XOR fgs -> tgd +qhw XOR tgd -> z09 +pbm OR djm -> kpj +x03 XOR y03 -> ffh +x00 XOR y04 -> ntg +bfw OR bqk -> z06 +nrd XOR fgs -> wpb +frj XOR qhw -> z04 +bqk OR frj -> z07 +y03 OR x01 -> nrd +hwm AND bqk -> z03 +tgd XOR rvg -> z12 +tnw OR pbm -> gnj diff --git a/2024/day24/testinput3 b/2024/day24/testinput3 new file mode 100644 index 0000000..7709fe2 --- /dev/null +++ b/2024/day24/testinput3 @@ -0,0 +1,19 @@ +x00: 0 +x01: 1 +x02: 0 +x03: 1 +x04: 0 +x05: 1 +y00: 0 +y01: 0 +y02: 1 +y03: 1 +y04: 0 +y05: 1 + +x00 AND y00 -> z05 +x01 AND y01 -> z02 +x02 AND y02 -> z01 +x03 AND y03 -> z03 +x04 AND y04 -> z04 +x05 AND y05 -> z00 From 521b8c2bcfcf513f587b49992a6dc92286494dfd Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Wed, 25 Dec 2024 08:10:36 -0600 Subject: [PATCH 2/2] 2024 All Complete! --- 2024/day25/input | 3999 ++++++++++++++++++++++++++++++++++++++++++ 2024/day25/main.go | 81 + 2024/day25/testinput | 39 + 3 files changed, 4119 insertions(+) create mode 100644 2024/day25/input create mode 100644 2024/day25/main.go create mode 100644 2024/day25/testinput diff --git a/2024/day25/input b/2024/day25/input new file mode 100644 index 0000000..460d75c --- /dev/null +++ b/2024/day25/input @@ -0,0 +1,3999 @@ +##### +.#### +.#### +..### +...#. +...#. +..... + +##### +####. +###.. +#.#.. +..... +..... +..... + +..... +..#.. +.##.# +##### +##### +##### +##### + +..... +..... +...#. +...#. +.#.#. +##### +##### + +..... +..... +..#.. +.###. +####. +##### +##### + +..... +#.#.. +#.##. +#.##. +#.### +##### +##### + +##### +.#.## +.#.#. +.#.#. +.#.#. +..... +..... + +..... +..... +..... +..... +#.#.. +####. +##### + +##### +##### +###.# +#.#.# +#.#.# +..#.# +..... + +..... +..#.. +..#.. +..##. +#.### +##### +##### + +##### +##### +##.## +##..# +#...# +..... +..... + +..... +...#. +..##. +..##. +..##. +#.### +##### + +..... +..... +.#... +.#... +.#... +##.#. +##### + +##### +##### +.#.## +....# +..... +..... +..... + +..... +#.#.. +#.#.. +#.#.. +#.#.. +#.#.# +##### + +##### +##### +.##.# +.##.# +.#... +.#... +..... + +##### +#.### +#..#. +#.... +..... +..... +..... + +##### +.#### +.#.## +.#..# +.#..# +..... +..... + +..... +..... +...#. +.#.#. +.#.## +.#### +##### + +##### +##.## +##.## +#..## +#..#. +...#. +..... + +..... +.#.#. +####. +####. +##### +##### +##### + +..... +#...# +#...# +#...# +#.#.# +###.# +##### + +..... +..... +..#.. +..#.# +.##.# +##### +##### + +..... +..... +..#.# +#.#.# +##### +##### +##### + +..... +..... +...#. +...## +..### +#.### +##### + +..... +#.... +#.#.. +#.##. +#.### +#.### +##### + +##### +.##.# +.##.# +.##.# +.##.# +.#... +..... + +##### +####. +####. +##.#. +##.#. +.#... +..... + +##### +##.## +#..## +....# +..... +..... +..... + +##### +#.### +#.#.# +#.... +#.... +..... +..... + +..... +.#..# +.#..# +.#..# +##..# +##.## +##### + +##### +##.## +#..#. +#..#. +..... +..... +..... + +..... +#.... +##... +##..# +###.# +##### +##### + +..... +..... +..#.# +..#.# +.##.# +##### +##### + +..... +.#.#. +.#.#. +##.#. +##.#. +##.## +##### + +..... +....# +.#..# +.##.# +##### +##### +##### + +..... +...#. +...## +...## +#..## +#.### +##### + +..... +..... +..... +.#..# +.#.## +.#.## +##### + +..... +.#..# +##..# +##..# +##.## +##### +##### + +..... +..... +..#.# +#.### +#.### +#.### +##### + +##### +##### +###.# +##... +##... +.#... +..... + +..... +.#... +.#... +.#... +.#..# +.#.## +##### + +..... +..#.. +.###. +####. +##### +##### +##### + +##### +##### +##### +#.##. +...#. +...#. +..... + +##### +##.## +#..## +#..## +#..## +#..#. +..... + +..... +.#... +##... +##..# +##.## +##### +##### + +..... +#.... +#.... +#.#.# +#.#.# +###.# +##### + +##### +##### +.#### +..### +..##. +...#. +..... + +##### +####. +#.##. +...#. +..... +..... +..... + +##### +####. +.###. +.###. +..##. +...#. +..... + +##### +###.# +###.# +#.#.. +#.#.. +#.... +..... + +##### +###.# +###.# +##..# +.#..# +.#... +..... + +##### +####. +#.##. +..##. +...#. +..... +..... + +##### +##### +##### +###.# +##..# +.#..# +..... + +..... +...#. +...#. +...## +.#.## +.#.## +##### + +##### +#.##. +..##. +..##. +..#.. +..#.. +..... + +##### +###.# +###.. +.##.. +.##.. +.#... +..... + +##### +####. +.#.#. +.#.#. +.#... +..... +..... + +..... +.#..# +.#..# +.#..# +###.# +###.# +##### + +..... +..#.. +..#.. +..##. +#.##. +#.##. +##### + +..... +..... +..#.. +.##.. +###.. +####. +##### + +..... +..... +...#. +..### +.#### +.#### +##### + +..... +..... +.#.#. +.#### +.#### +##### +##### + +..... +..... +....# +....# +.#.## +##### +##### + +..... +..... +#.#.. +#.#.# +#.#.# +#.#.# +##### + +..... +....# +....# +....# +#.#.# +#.### +##### + +##### +.#.## +.#.## +.#.#. +.#.#. +.#... +..... + +##### +#.### +#.### +..### +...## +...#. +..... + +..... +...#. +...#. +..### +.#### +##### +##### + +##### +##.## +##.## +##.## +##..# +.#... +..... + +..... +....# +.#..# +.#..# +###.# +##### +##### + +##### +#.#.# +#.#.. +..#.. +..#.. +..#.. +..... + +..... +.#.#. +.#.#. +##.#. +##.#. +####. +##### + +##### +##### +##### +#.### +#..#. +...#. +..... + +##### +##### +###.# +.#... +..... +..... +..... + +..... +..... +..... +..... +#.#.# +##### +##### + +..... +..... +.#..# +.#..# +###.# +##### +##### + +##### +##### +#.### +#..## +#..## +...#. +..... + +##### +##### +###.# +##..# +#.... +#.... +..... + +##### +##### +##### +##.## +#...# +#.... +..... + +##### +.#### +..### +...#. +...#. +..... +..... + +##### +.#### +.#### +.#.#. +..... +..... +..... + +..... +..... +..... +#...# +#.#.# +#.### +##### + +##### +##### +.#.#. +.#.#. +...#. +..... +..... + +..... +..... +....# +#...# +#..## +##.## +##### + +##### +##### +###.# +#.#.# +..#.. +..... +..... + +..... +#.... +#.#.# +#.#.# +###.# +##### +##### + +##### +##### +##### +.#### +.#### +.#.#. +..... + +..... +....# +#..## +##.## +##.## +##.## +##### + +##### +.#### +.#### +.#.#. +.#... +..... +..... + +..... +.#..# +.#.## +.#.## +##.## +##### +##### + +..... +..... +..#.. +..#.# +#.#.# +#.#.# +##### + +..... +.#..# +.##.# +###.# +###.# +##### +##### + +..... +..... +..... +#..#. +#.##. +##### +##### + +..... +#.... +##... +##.#. +##.#. +##.#. +##### + +..... +..... +..#.. +#.#.. +###.# +##### +##### + +##### +##### +###.# +.##.# +.#..# +..... +..... + +..... +..#.. +..##. +.###. +.#### +.#### +##### + +##### +##### +###.# +.#..# +.#..# +.#... +..... + +##### +##### +##### +.##.# +..#.# +..#.# +..... + +##### +##.## +##.## +.#.## +.#..# +.#... +..... + +##### +##.## +##.#. +.#.#. +.#.#. +..... +..... + +..... +..#.. +..#.# +#.#.# +#.### +##### +##### + +##### +##.#. +##.#. +.#.#. +.#... +.#... +..... + +..... +..#.. +#.#.. +####. +####. +##### +##### + +##### +###.# +###.# +###.# +##... +.#... +..... + +..... +....# +....# +..#.# +#.#.# +#.#.# +##### + +##### +##### +###.# +###.# +.##.# +.#..# +..... + +..... +..#.. +#.#.. +####. +##### +##### +##### + +..... +....# +....# +.#.## +.#.## +##.## +##### + +##### +##### +#.#.# +#.#.# +#.#.# +#.#.# +..... + +##### +##### +#.### +#.#.# +#.#.. +..#.. +..... + +..... +.#... +.#..# +.##.# +##### +##### +##### + +##### +##### +.###. +.###. +..##. +..#.. +..... + +##### +####. +##.#. +##.#. +.#.#. +.#.#. +..... + +..... +....# +.#.## +.#.## +##### +##### +##### + +##### +###.# +#.#.# +#.#.# +#.#.# +#.... +..... + +..... +..#.. +#.#.# +#.#.# +#.#.# +#.#.# +##### + +##### +###.# +#.#.# +#.... +#.... +..... +..... + +##### +.###. +.##.. +..#.. +..#.. +..#.. +..... + +##### +##### +.#.## +...#. +..... +..... +..... + +##### +#.### +#.### +#.### +#.#.# +#.#.. +..... + +..... +..... +...#. +#.### +#.### +##### +##### + +..... +...#. +...#. +.#.#. +.#.## +.#### +##### + +##### +#.### +..### +..##. +..#.. +..#.. +..... + +..... +..#.# +..#.# +..#.# +#.#.# +#.#.# +##### + +##### +##### +.###. +.##.. +.#... +..... +..... + +..... +..... +...#. +.#.## +##### +##### +##### + +##### +###.# +.#..# +.#... +..... +..... +..... + +..... +...#. +.#.#. +##### +##### +##### +##### + +##### +#.##. +#.##. +#..#. +#..#. +#..#. +..... + +##### +.#### +.#### +..#.# +....# +....# +..... + +##### +##### +##### +##### +.#.#. +...#. +..... + +..... +...#. +.#.#. +.#.#. +.#.#. +.#### +##### + +##### +##.## +.#.## +.#.## +.#.## +.#.#. +..... + +..... +..#.. +..#.# +.#### +##### +##### +##### + +##### +##### +##.#. +.#... +.#... +..... +..... + +##### +#.#.# +#.#.# +..#.# +..#.. +..#.. +..... + +##### +.#### +.#### +.#.## +...#. +...#. +..... + +##### +##### +#.### +#.### +#.#.# +#.#.. +..... + +##### +##### +###.# +#.#.. +#.... +..... +..... + +..... +..... +#.#.. +#.#.. +#.##. +#.### +##### + +..... +...#. +..##. +#.##. +#.##. +#.##. +##### + +##### +##### +##### +.##.# +.#... +.#... +..... + +..... +.#... +.#... +.#... +##... +##.#. +##### + +##### +##.## +.#.#. +.#.#. +.#.#. +...#. +..... + +##### +.#### +.#### +.#.#. +...#. +...#. +..... + +..... +....# +#...# +#...# +#..## +#.### +##### + +##### +.##.# +.##.# +.##.# +.#..# +.#... +..... + +##### +##### +#.### +#.### +...#. +...#. +..... + +##### +####. +.###. +.###. +.#.#. +...#. +..... + +##### +#.#.# +#.#.# +..#.# +..#.# +..... +..... + +##### +##### +###.# +#.#.# +..#.# +..#.# +..... + +##### +##### +##### +##### +###.# +.#..# +..... + +..... +..#.. +..#.. +.##.. +.##.. +.##.# +##### + +##### +####. +##.#. +##.#. +.#... +.#... +..... + +##### +##.## +##.## +##.#. +.#.#. +..... +..... + +..... +..... +...#. +...#. +#.##. +#.##. +##### + +##### +##### +##.## +#..## +#..## +....# +..... + +..... +#.#.. +#.#.# +#.#.# +###.# +##### +##### + +..... +....# +#...# +#.#.# +###.# +###.# +##### + +##### +##### +.##.# +.##.. +..#.. +..... +..... + +##### +##### +####. +#.##. +..##. +...#. +..... + +..... +..... +.#... +.#... +###.. +###.# +##### + +..... +..... +.#.#. +.###. +.###. +##### +##### + +..... +..#.. +..#.# +.##.# +.##.# +.#### +##### + +##### +##.## +##..# +.#..# +....# +..... +..... + +..... +...#. +#..## +##.## +##.## +##### +##### + +..... +..#.. +..#.. +..#.. +.###. +.###. +##### + +##### +##### +#.### +#.### +..### +..#.# +..... + +..... +....# +#...# +##..# +##..# +##.## +##### + +##### +##### +.#### +.###. +.#.#. +.#... +..... + +##### +#.#.# +#.#.# +#.#.. +#.#.. +..#.. +..... + +..... +..#.. +..#.. +.##.. +.##.. +###.# +##### + +##### +#.##. +#.#.. +#.#.. +#.#.. +..... +..... + +..... +....# +...## +.#.## +.#### +.#### +##### + +##### +.#### +.#### +..##. +..##. +...#. +..... + +##### +.#### +..### +..#.# +..#.# +..... +..... + +..... +#.#.. +####. +####. +##### +##### +##### + +..... +..... +#.... +##..# +##..# +###.# +##### + +##### +####. +#.##. +#.#.. +..#.. +..... +..... + +##### +##### +#.### +#.### +#.#.# +..#.# +..... + +##### +##### +##.#. +#.... +..... +..... +..... + +##### +###.# +###.# +#.#.. +#.#.. +..#.. +..... + +##### +##### +##.#. +##... +##... +.#... +..... + +..... +..... +..... +..... +.#..# +###.# +##### + +##### +.##.# +.#... +.#... +.#... +.#... +..... + +..... +..#.. +..#.. +.##.# +.##.# +.##.# +##### + +##### +###.# +##..# +#...# +#...# +#...# +..... + +..... +...#. +#.##. +#.##. +##### +##### +##### + +..... +..... +..#.# +.##.# +.#### +.#### +##### + +##### +.###. +.###. +.###. +.##.. +.#... +..... + +##### +###.# +##..# +##... +#.... +..... +..... + +##### +##### +#.### +#.### +#.##. +#.#.. +..... + +..... +#.... +#.#.. +#.#.# +##### +##### +##### + +##### +##### +.###. +.##.. +.#... +.#... +..... + +..... +..#.# +..#.# +#.#.# +#.#.# +###.# +##### + +..... +..#.. +..##. +#.##. +#.##. +##### +##### + +..... +....# +.#..# +.##.# +.##.# +###.# +##### + +##### +##### +####. +###.. +#.#.. +..... +..... + +##### +##### +##.## +#..## +....# +..... +..... + +..... +#.... +##... +###.. +####. +####. +##### + +..... +#..#. +#..#. +#..#. +#..## +#.### +##### + +..... +..#.# +..#.# +..#.# +#.### +#.### +##### + +..... +.#... +.#... +##... +##.#. +##### +##### + +..... +..... +#...# +#..## +#.### +##### +##### + +..... +..#.. +..#.. +..#.. +..##. +#.##. +##### + +..... +..... +.#..# +.#.## +.#.## +.#### +##### + +..... +..... +..#.. +#.##. +#.### +##### +##### + +..... +...#. +..##. +#.##. +####. +####. +##### + +..... +..... +...#. +...#. +#..#. +#.##. +##### + +..... +.#.#. +.#.#. +##.## +##.## +##.## +##### + +..... +..... +#.#.. +#.#.. +#.#.. +#.##. +##### + +..... +..... +..... +.#... +.#... +.##.# +##### + +##### +##.## +.#..# +.#..# +....# +..... +..... + +..... +..#.. +#.#.. +#.#.# +#.#.# +###.# +##### + +..... +..... +#.#.. +#.##. +#.##. +##### +##### + +..... +..... +#.#.. +#.##. +####. +##### +##### + +##### +##### +##### +#.### +#..## +#..#. +..... + +..... +..... +....# +#...# +#.#.# +#.#.# +##### + +##### +#.#.# +..#.# +....# +..... +..... +..... + +..... +.#... +##..# +##.## +##.## +##### +##### + +..... +..#.. +..#.. +..##. +.###. +##### +##### + +##### +.#### +.#### +..### +..##. +...#. +..... + +##### +##### +##.#. +.#.#. +..... +..... +..... + +##### +#.##. +#.##. +#..#. +#..#. +...#. +..... + +##### +.#### +.##.# +..#.# +..#.# +..#.# +..... + +##### +##### +##### +.#.## +.#.#. +.#... +..... + +##### +##### +###.# +#.#.# +#.#.# +#.... +..... + +##### +###.# +###.# +###.# +#.#.# +..... +..... + +##### +#.### +#..## +#..#. +#.... +#.... +..... + +..... +#.... +#.... +#.... +##.#. +##### +##### + +##### +#.##. +..##. +..#.. +..#.. +..... +..... + +..... +..... +.#... +.#..# +.#..# +###.# +##### + +##### +##.## +#..#. +#..#. +#.... +..... +..... + +##### +####. +#.#.. +#.... +#.... +#.... +..... + +..... +...#. +...#. +...#. +...## +#.### +##### + +..... +..... +...#. +..##. +.#### +##### +##### + +..... +....# +....# +..#.# +..#.# +.#### +##### + +..... +..... +...#. +#.##. +#.### +##### +##### + +..... +..... +..... +..#.# +#.#.# +###.# +##### + +..... +..#.. +#.#.. +#.#.# +#.#.# +#.### +##### + +..... +..#.. +#.#.# +#.#.# +#.#.# +#.### +##### + +##### +##### +.#### +.#.## +...## +...#. +..... + +##### +##### +##### +.#.## +...#. +..... +..... + +##### +##.## +##..# +##..# +#...# +..... +..... + +..... +..#.. +..#.. +..#.. +.##.# +##### +##### + +##### +##### +###.# +.##.# +.##.# +.#..# +..... + +..... +#.... +#.... +##.#. +####. +##### +##### + +..... +.#... +##... +##... +###.. +###.# +##### + +..... +...#. +#..## +##.## +##.## +##.## +##### + +##### +##.#. +#..#. +...#. +...#. +..... +..... + +..... +....# +..#.# +.##.# +.#### +.#### +##### + +##### +##.## +.#.## +...## +....# +..... +..... + +##### +####. +####. +#.#.. +#.... +#.... +..... + +##### +##.## +##..# +##..# +##... +#.... +..... + +##### +###.# +##..# +.#..# +.#..# +.#... +..... + +##### +##### +##### +.#### +.#.## +...#. +..... + +..... +..... +...#. +#.##. +#.##. +##### +##### + +..... +....# +..#.# +..#.# +..#.# +#.### +##### + +..... +..... +..... +#.#.. +#.#.# +##### +##### + +..... +.#..# +##..# +##..# +###.# +###.# +##### + +##### +##.## +.#.## +...#. +...#. +...#. +..... + +..... +..... +.#.#. +.#.#. +.#.#. +##.#. +##### + +##### +###.# +.##.. +.##.. +..#.. +..... +..... + +##### +##.## +##.## +##.## +#...# +....# +..... + +##### +##.## +##.## +##..# +.#..# +....# +..... + +##### +##### +##.#. +##.#. +#..#. +..... +..... + +##### +.###. +.###. +.#.#. +.#... +..... +..... + +..... +#.... +#...# +#.#.# +#.### +##### +##### + +..... +#..#. +##.#. +##.#. +##.## +##.## +##### + +##### +####. +##.#. +##.#. +.#.#. +.#... +..... + +##### +##.## +##.#. +##.#. +#.... +..... +..... + +..... +..#.. +.##.. +.##.. +.##.. +####. +##### + +##### +#.##. +#.##. +...#. +...#. +..... +..... + +..... +..... +...#. +...#. +.#.## +##.## +##### + +##### +##### +##### +#.#.# +....# +..... +..... + +##### +##### +###.# +.#..# +.#... +.#... +..... + +..... +.#... +.#.#. +.#.#. +.#.#. +.#.#. +##### + +..... +..... +.#... +.#... +###.# +###.# +##### + +##### +##### +#.### +#.##. +#..#. +...#. +..... + +##### +###.# +.##.. +..#.. +..... +..... +..... + +##### +##### +#.#.# +#.#.. +..... +..... +..... + +##### +.#### +.#.## +.#.## +.#.## +.#..# +..... + +##### +###.# +##..# +##..# +##..# +.#..# +..... + +##### +.#.## +.#.## +.#.#. +...#. +..... +..... + +##### +##### +.#.## +....# +....# +..... +..... + +..... +#.... +#.... +##... +##..# +###.# +##### + +##### +##### +#.### +#..#. +..... +..... +..... + +..... +..#.. +.##.# +.#### +##### +##### +##### + +##### +##.#. +##.#. +.#.#. +.#.#. +.#.#. +..... + +..... +..... +..... +#.... +##.#. +####. +##### + +..... +....# +.#.## +.#.## +##.## +##### +##### + +..... +#..#. +##.#. +####. +##### +##### +##### + +##### +##.## +.#.## +.#..# +....# +..... +..... + +##### +####. +####. +####. +.#.#. +..... +..... + +..... +....# +....# +..#.# +..### +#.### +##### + +..... +....# +..#.# +.##.# +.#### +##### +##### + +..... +..... +..... +..#.. +.###. +.###. +##### + +##### +##### +#.#.# +#.#.# +#...# +..... +..... + +..... +....# +....# +#.#.# +#.#.# +##### +##### + +..... +..... +..... +#.... +#.#.. +#.#.# +##### + +##### +##### +##.## +.#.## +.#..# +.#... +..... + +..... +..... +.#... +.##.# +###.# +##### +##### + +..... +..... +#...# +#...# +##..# +###.# +##### + +##### +##### +.#### +..##. +...#. +...#. +..... + +..... +..... +..... +#.#.. +###.. +###.# +##### + +##### +##.## +##.## +##.## +.#..# +.#..# +..... + +..... +..#.# +.##.# +.##.# +.##.# +###.# +##### + +##### +##.## +##.## +#..#. +#..#. +...#. +..... + +##### +##.## +##..# +#.... +#.... +#.... +..... + +..... +.#.#. +.#.## +.#.## +.#.## +##.## +##### + +..... +....# +.#.## +.#.## +.#.## +##### +##### + +##### +##### +###.# +###.# +.##.# +..#.# +..... + +..... +.#... +.#.#. +.#.#. +.#.#. +##### +##### + +##### +###.# +#.#.# +....# +..... +..... +..... + +..... +..... +#..#. +#..#. +#..## +#.### +##### + +..... +....# +..#.# +..### +..### +#.### +##### + +##### +#.### +#.### +..#.# +..#.# +..... +..... + +##### +##### +.#.## +.#.#. +.#.#. +.#... +..... + +##### +####. +#.##. +#.##. +...#. +...#. +..... + +##### +####. +.###. +.#.#. +...#. +..... +..... + +##### +#.### +#.##. +#..#. +#.... +..... +..... + +##### +#.##. +#.##. +..##. +..##. +..#.. +..... + +..... +...#. +..### +#.### +#.### +##### +##### + +..... +#.... +#..#. +##.#. +##.#. +####. +##### + +##### +.#### +..#.# +..#.. +..#.. +..... +..... + +##### +##### +#.### +#.##. +...#. +...#. +..... + +##### +##### +##.## +.#..# +..... +..... +..... + +##### +.#### +.###. +.#.#. +.#... +.#... +..... + +##### +.#### +..### +...## +....# +..... +..... + +..... +..#.. +..#.# +..#.# +.##.# +##### +##### + +..... +..... +...#. +.#.#. +####. +##### +##### + +##### +###.# +###.# +##..# +#.... +..... +..... + +..... +...#. +...#. +#..#. +#.##. +##### +##### + +..... +#.... +#.... +##... +###.# +##### +##### + +..... +..... +#.... +#.#.. +#.##. +##### +##### + +##### +##### +.#.## +...## +...## +....# +..... + +##### +##### +##### +##.## +.#.## +....# +..... + +##### +##### +##.## +##.#. +.#.#. +...#. +..... + +##### +####. +.###. +.#.#. +.#.#. +..... +..... + +..... +.#.#. +##.## +##.## +##.## +##### +##### + +##### +###.# +###.# +###.. +#.#.. +..#.. +..... + +##### +##.#. +##.#. +##.#. +##.#. +.#.#. +..... + +..... +#.#.. +#.#.. +#.#.# +#.### +##### +##### + +##### +.#### +.#.## +.#.#. +.#... +..... +..... + +..... +#.... +#.... +##..# +###.# +###.# +##### + +..... +.#.#. +.#.#. +.#.## +.#### +##### +##### + +..... +..#.. +..##. +..### +..### +.#### +##### + +..... +...#. +#.### +#.### +#.### +#.### +##### + +..... +.#... +.#..# +.##.# +.#### +.#### +##### + +..... +.#... +.##.. +.###. +.#### +##### +##### + +..... +..... +...#. +.#.#. +##.## +##.## +##### + +##### +#.### +#.### +#.### +#.#.# +..#.# +..... + +##### +###.# +##..# +##..# +.#..# +.#... +..... + +##### +##### +##.#. +#.... +#.... +#.... +..... + +##### +.###. +.##.. +.##.. +..#.. +..#.. +..... + +##### +##### +##### +.###. +.#.#. +.#.#. +..... + +##### +##.## +.#.## +.#.#. +...#. +...#. +..... + +##### +##### +##.#. +#..#. +#.... +#.... +..... + +..... +..... +#.#.. +###.# +###.# +##### +##### + +##### +#.#.# +#.#.# +..#.# +..#.# +..#.# +..... + +##### +####. +####. +.###. +.##.. +..#.. +..... + +##### +#.### +#.##. +#..#. +#..#. +...#. +..... + +..... +#.... +#..#. +#..#. +##.#. +##.#. +##### + +##### +####. +####. +####. +.###. +..#.. +..... + +##### +.#### +.##.# +..#.# +....# +....# +..... + +..... +..... +..... +..... +...#. +#.### +##### + +..... +#.... +#..#. +##.## +##.## +##.## +##### + +##### +#.#.# +..#.. +..#.. +..... +..... +..... + +##### +#.### +#.### +#.### +#..#. +#.... +..... + +..... +..#.. +..##. +#.##. +####. +##### +##### + +..... +..... +..... +..#.# +.##.# +###.# +##### + +..... +..... +#.... +#...# +##..# +##.## +##### + +..... +#..#. +#..#. +#.##. +#.##. +#.### +##### + +..... +..... +..... +..... +..#.. +.###. +##### + +..... +..... +.#..# +.##.# +.##.# +###.# +##### + +..... +..... +..#.. +..#.. +..##. +#.##. +##### + +..... +..... +.#.#. +.#.#. +.#.#. +.#### +##### + +..... +.#... +.#... +.#... +.#.#. +.#.#. +##### + +##### +##### +##.## +##..# +.#... +..... +..... + +..... +..... +..#.. +.###. +.###. +##### +##### + +..... +..... +#.... +#..#. +#.### +#.### +##### + +..... +..#.. +.##.# +.##.# +.#### +.#### +##### + +##### +.#### +.##.# +.##.# +.##.. +.#... +..... + +..... +..... +.#.#. +.#.#. +##.#. +##.#. +##### + +..... +..... +.#.#. +.#.## +.#### +.#### +##### + +..... +#.... +##... +##.#. +##.#. +##.## +##### + +..... +..#.# +..#.# +..#.# +#.#.# +#.### +##### + +##### +##### +##### +##.## +.#.#. +.#.#. +..... + +..... +..... +..... +#..#. +#..#. +##.#. +##### + +##### +#.### +..### +..##. +..##. +..#.. +..... + +..... +..... +...#. +#..#. +#..#. +##.#. +##### + +..... +..#.# +.##.# +.##.# +.#### +##### +##### + +##### +##### +##### +.##.# +.#... +..... +..... + +..... +#.... +#.#.. +###.. +###.. +####. +##### + +##### +##### +##.## +##.#. +##.#. +.#.#. +..... + +..... +#.#.# +#.#.# +#.#.# +#.#.# +##### +##### + +##### +##### +##### +.##.# +.##.# +..#.. +..... + +..... +..... +..... +.#... +.##.. +###.# +##### + +..... +....# +#...# +#..## +#.### +##### +##### + +..... +.#... +##... +##... +##..# +##.## +##### + +##### +##### +##### +##.#. +#..#. +..... +..... + +##### +##.## +##.## +##.#. +#..#. +..... +..... + +##### +####. +#.##. +#.##. +...#. +..... +..... + +##### +##### +###.# +##..# +.#..# +..... +..... + +..... +..... +...#. +#..#. +#.### +#.### +##### + +..... +..... +..#.. +..#.. +.###. +####. +##### + +..... +..... +.#... +.#.#. +##.## +##.## +##### + +..... +..... +.#.#. +.#.## +.#### +##### +##### + +##### +##### +##.#. +#.... +#.... +..... +..... + +..... +..... +#.... +#.#.# +#.#.# +#.### +##### + +##### +#.### +#.#.# +#.#.# +#.#.. +..#.. +..... + +##### +##.#. +#..#. +#..#. +#.... +#.... +..... + +##### +###.# +##... +##... +.#... +..... +..... + +##### +#.##. +..##. +...#. +...#. +...#. +..... + +##### +####. +.###. +.###. +..##. +..#.. +..... + +##### +##.## +#..#. +#..#. +#..#. +#.... +..... + +..... +..#.. +#.#.. +###.# +###.# +##### +##### + +..... +..... +..#.# +..### +.#### +##### +##### + +##### +####. +###.. +#.#.. +#.#.. +..... +..... + +..... +.#.#. +.#.#. +.#### +.#### +##### +##### + +..... +..... +..... +#.#.. +#.#.. +###.# +##### + +##### +##.## +##.#. +##.#. +#..#. +..... +..... + +..... +..#.# +.##.# +###.# +###.# +###.# +##### + +##### +##### +##### +##### +#.##. +#..#. +..... + +..... +.#... +.#... +.#.#. +.#.#. +.#.## +##### + +##### +##.## +#..#. +#.... +..... +..... +..... + +..... +..... +..... +#.... +#..#. +##.## +##### + +..... +...#. +..##. +..##. +.###. +.###. +##### + +..... +#...# +#...# +#.#.# +#.### +#.### +##### + +##### +.#### +.#### +.#### +..#.# +....# +..... + +##### +##### +###.# +###.. +#.#.. +..#.. +..... + +##### +##.#. +#..#. +#..#. +#..#. +#..#. +..... + +..... +..... +...#. +...#. +#.##. +##### +##### + +##### +##.## +##.## +##.## +#...# +#.... +..... + +##### +#.##. +#.##. +#..#. +..... +..... +..... + +..... +..... +.#... +.#... +.#.#. +.#.#. +##### + +..... +.#... +.##.. +.##.# +.#### +##### +##### + +..... +...#. +...#. +..##. +..##. +#.### +##### + +..... +.#..# +.##.# +.##.# +.##.# +.##.# +##### + +..... +..... +..#.# +#.### +##### +##### +##### + +..... +..... +.#... +.##.. +.##.# +###.# +##### + +##### +##### +####. +.#.#. +..... +..... +..... + +..... +...#. +...#. +#..#. +##.## +##### +##### + +##### +##### +.#.## +.#.## +.#..# +..... +..... + +..... +.#..# +.#.## +.#### +.#### +.#### +##### + +..... +.#... +.#... +.#... +.##.# +.##.# +##### + +..... +#.... +#..#. +##.## +##.## +##### +##### + +##### +##### +#.#.# +#.#.. +#.... +..... +..... + +..... +....# +....# +.#..# +##..# +###.# +##### + +##### +##### +##### +##.## +##.## +#...# +..... + +##### +.##.# +..#.# +..#.# +..#.. +..... +..... + +##### +###.# +.#..# +.#..# +....# +....# +..... + +..... +..... +..... +...#. +#.##. +#.##. +##### + +..... +..#.. +..#.. +#.##. +#.##. +#.### +##### + +##### +#.### +#..## +#...# +..... +..... +..... + +..... +...#. +...#. +.#.## +.#.## +.#.## +##### + +##### +##### +.##.# +..#.. +..#.. +..#.. +..... + +##### +.#### +..### +..#.# +..#.# +..#.. +..... + +..... +.#.#. +.#.#. +.#.#. +.#.## +##.## +##### + +##### +##### +##.#. +#..#. +#.... +..... +..... + +..... +..... +....# +....# +#...# +##.## +##### + +##### +#.### +#.#.# +#.#.# +..#.# +..... +..... + +##### +#.#.# +#.#.# +#.#.# +#.... +..... +..... + +##### +#.### +#.##. +#.#.. +#.#.. +#.... +..... + +..... +..... +#.#.# +#.#.# +#.### +##### +##### + +##### +.##.# +.##.# +..#.. +..#.. +..#.. +..... + +##### +##### +##### +.##.# +..#.# +....# +..... + +##### +####. +####. +####. +##.#. +#.... +..... + +##### +###.# +###.# +.##.. +..#.. +..... +..... + +##### +#.#.# +#.#.# +#.#.# +#.#.# +#.... +..... + +..... +..... +#..#. +#..#. +##.## +##### +##### + +..... +..#.. +#.#.. +#.#.. +####. +##### +##### + +..... +...#. +..##. +#.##. +#.##. +#.### +##### + +##### +##.## +.#.#. +.#.#. +.#.#. +..... +..... + +##### +##.## +.#..# +.#..# +.#... +..... +..... + +##### +##### +##### +#.##. +#.#.. +#.... +..... + +##### +##.#. +##.#. +##.#. +##.#. +.#... +..... + +##### +##### +.#### +.#.#. +.#.#. +.#.#. +..... + +..... +..... +#..#. +##.#. +##.## +##.## +##### + +..... +#...# +#..## +#..## +#..## +##.## +##### + +..... +..#.. +..#.. +#.#.. +#.##. +#.##. +##### + +..... +#.... +#.... +#.#.# +#.### +#.### +##### + +##### +##.## +#..## +#..## +...## +....# +..... + +##### +.##.# +.##.. +..#.. +..#.. +..#.. +..... + +..... +..#.. +..#.. +..#.# +#.#.# +###.# +##### + +##### +##.## +##.## +##.## +##..# +.#..# +..... + +##### +##### +####. +#.#.. +#.#.. +..#.. +..... + +..... +..#.. +..#.# +#.#.# +#.### +#.### +##### + +..... +..... +..... +..#.. +#.#.# +#.### +##### + +##### +.##.# +..#.# +..... +..... +..... +..... + +..... +.#... +.##.# +.#### +.#### +##### +##### + +##### +.#.## +....# +..... +..... +..... +..... + +..... +...#. +.#.#. +##.#. +##.## +##.## +##### + +..... +...#. +#..## +#..## +##.## +##.## +##### + +..... +#.... +#.... +#.#.. +#.#.# +###.# +##### + +##### +.#### +.#.## +.#..# +.#..# +.#... +..... + +..... +#.... +##... +##... +##..# +###.# +##### + +..... +..... +..... +.#..# +###.# +##### +##### diff --git a/2024/day25/main.go b/2024/day25/main.go new file mode 100644 index 0000000..ec04879 --- /dev/null +++ b/2024/day25/main.go @@ -0,0 +1,81 @@ +package main + +import ( + "fmt" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +func main() { + inp := h.StdinToStringSlice() + part1(inp) +} + +func part1(inp []string) { + fmt.Println("# Part 1") + keys, locks := parseInput(inp) + var pairs int + for k := range keys { + for l := range locks { + if fits(keys[k], locks[l]) { + pairs++ + } + } + } + fmt.Println("Unique Pairs:", pairs) +} + +func parseInput(inp []string) ([][]int, [][]int) { + var keys, locks [][]int + for i := 0; i < len(inp); i += 8 { + switch inp[i] { + case "#####": + locks = append(locks, findPinDepths(inp[i:i+7])) + case ".....": + keys = append(keys, findToothDepths(inp[i:i+7])) + } + } + return keys, locks +} + +func findPinDepths(inp []string) []int { + pins := make(map[int]int) + for i := range inp { + for pin := range inp[i] { + if _, ok := pins[pin]; !ok { + if inp[i][pin] == '.' { + pins[pin] = i - 1 + } + } + } + } + ret := []int{pins[0], pins[1], pins[2], pins[3], pins[4]} + return ret +} + +func findToothDepths(inp []string) []int { + teeth := make(map[int]int) + for i := range inp { + for tooth := range inp[i] { + if _, ok := teeth[tooth]; !ok { + if inp[i][tooth] == '#' { + teeth[tooth] = 6 - i + } + } + } + } + ret := []int{teeth[0], teeth[1], teeth[2], teeth[3], teeth[4]} + return ret +} + +func fits(key, lock []int) bool { + if len(key) != len(lock) { + return false + } + for i := 0; i < len(key); i++ { + if key[i]+lock[i] > 5 { + return false + } + } + return true +} diff --git a/2024/day25/testinput b/2024/day25/testinput new file mode 100644 index 0000000..8e29855 --- /dev/null +++ b/2024/day25/testinput @@ -0,0 +1,39 @@ +##### +.#### +.#### +.#### +.#.#. +.#... +..... + +##### +##.## +.#.## +...## +...#. +...#. +..... + +..... +#.... +#.... +#...# +#.#.# +#.### +##### + +..... +..... +#.#.. +###.. +###.# +###.# +##### + +..... +..... +..... +#.... +#.#.. +#.#.# +#####