diff --git a/2024/go/day20/day20.go b/2024/go/day20/day20.go index d3a2c94..4e30d28 100644 --- a/2024/go/day20/day20.go +++ b/2024/go/day20/day20.go @@ -52,14 +52,54 @@ func Part1(input string) int { return dist } func Part2(input string) int { + const saves int = 100 + count := 0 maze := Maze{}.Parse(input) - fmt.Println(maze) + // fmt.Println(maze) data := inputGraph(*maze) graph := dijkstra.CreateGraph(data) - _, count := dijkstra.GetShortestPath(data.From, data.To, graph) + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + cost := make(map[Vec]int) + cheats := []Cheat{} + + for i, p := range path { + cost[Vec{p.X, p.Y}] = i + } + cheat_data := cheatGraph(*maze) + + for _, s := range path[:len(path)-saves] { + fmt.Println("Checking start:", s) + for _, e := range path[saves:] { + fmt.Println("\tChecking end", e) + cheat_data_1 := cheatGraphAdd(maze, cheat_data, s) + cheat_data_2 := cheatGraphAdd(maze, cheat_data_1, e) + cheat_graph := dijkstra.CreateGraph(cheat_data_2) + _, cheat_dist := dijkstra.GetShortestPath(dijkstra.Point{X: s.X, Y: s.Y}, dijkstra.Point{X: e.X, Y: e.Y}, cheat_graph) + fmt.Println("\t\tcheat distance:", cheat_dist) + if cheat_dist <= 20 { + cheat := Cheat{start: Vec{s.X, s.Y}, end: Vec{e.X, e.Y}, cost: cost[Vec{s.X, s.Y}] + cheat_dist + dist - cost[Vec{e.X, e.Y}]} + fmt.Println("\t\tSaving cheat:", cheat) + cheats = append(cheats, cheat) + } + } + } + for _, cheat := range cheats { + save := dist - cheat.cost + // fmt.Println("[", i, "]", "save", save) + if save >= saves { + count++ + } + } return count } +func abs(in int) int { + if in < 0 { + return in * -1 + } + return in +} + func inputGraph(maze Maze) dijkstra.InputGraph { data := dijkstra.InputGraph{} data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} @@ -89,6 +129,58 @@ func inputGraph(maze Maze) dijkstra.InputGraph { return data } +func cheatGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == CORRIDOR { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == CORRIDOR { + continue + } + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + } + } + + return data +} + +func cheatGraphAdd(maze *Maze, in dijkstra.InputGraph, s dijkstra.Point) dijkstra.InputGraph { + x := s.X + y := s.Y + out := dijkstra.InputGraph{} + out.From = in.From + out.To = in.To + out.Graph = append([]dijkstra.InputData{}, in.Graph...) + + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == CORRIDOR { + continue + } + out.Graph = append(out.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + return out +} + func (m Maze) Parse(input string) *Maze { m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) m.height, m.width = m.grid.SizeY(), m.grid.SizeX() diff --git a/2024/go/day20/day20_test.go b/2024/go/day20/day20_test.go index 0174040..9ceaea0 100644 --- a/2024/go/day20/day20_test.go +++ b/2024/go/day20/day20_test.go @@ -26,6 +26,20 @@ func TestPart1(t *testing.T) { } func TestPart2(t *testing.T) { - r := Part2("") + r := Part2(`############### +#...#...#.....# +#.#.#.#.#.###.# +#S#...#.#.#...# +#######.#.#.### +#######.#.#...# +#######.#.###.# +###..E#...#...# +###.#######.### +#...###...#...# +#.#####.#.###.# +#.#...#.#.#...# +#.#.#.#.#.#.### +#...#...#...### +###############`) require.Equal(t, 0, r) } diff --git a/2024/go/day21/day21.go b/2024/go/day21/day21.go new file mode 100644 index 0000000..86753be --- /dev/null +++ b/2024/go/day21/day21.go @@ -0,0 +1,181 @@ +package day21 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/memo" + "fmt" + "math" + "strings" +) + +type Pair struct { + s dijkstra.Point + d dijkstra.Point +} + +type Path struct { + path []dijkstra.Point + path_str string + cost int +} + +type State struct { + code string + depth int + isNumericPad bool +} + +var numericPad = map[dijkstra.Point]string{ + {X: 0, Y: 0}: "7", {X: 1, Y: 0}: "8", {X: 2, Y: 0}: "9", + {X: 0, Y: 1}: "4", {X: 1, Y: 1}: "5", {X: 2, Y: 1}: "6", + {X: 0, Y: 2}: "1", {X: 1, Y: 2}: "2", {X: 2, Y: 2}: "3", + {X: 1, Y: 3}: "0", {X: 2, Y: 3}: "A", +} + +var directionPad = map[dijkstra.Point]string{ + {X: 1, Y: 0}: "^", {X: 2, Y: 0}: "A", + {X: 0, Y: 1}: "<", {X: 1, Y: 1}: "v", {X: 2, Y: 1}: ">", +} + +var directions = []dijkstra.Point{{X: 0, Y: 1}, {X: 0, Y: -1}, {X: 1, Y: 0}, {X: -1, Y: 0}} + +var lookup_np = get_paths(numericPad) +var lookup_dp = get_paths(directionPad) + +var m *memo.Memo + +func init() { + m = memo.New(get_shortest_path) +} + +func Part1(input string) int { + codes := strings.Split(input, "\n") + cost := 0 + for _, code := range codes { + initialState := State{ + code: code, + depth: 2, + isNumericPad: true, + } + result := m.Get(initialState).(int) + cost += result * utils.MustAtoi(code[:len(code)-1]) + } + return cost +} + +func Part2(input string) int { + codes := strings.Split(input, "\n") + cost := 0 + for _, code := range codes { + initialState := State{ + code: code, + depth: 25, + isNumericPad: true, + } + result := m.Get(initialState).(int) + cost += result * utils.MustAtoi(code[:len(code)-1]) + } + return cost +} + +func get_paths(in map[dijkstra.Point]string) map[Pair][]Path { + lookup := make(map[Pair][]Path) + data := dijkstra.InputGraph{} + for p := range in { + for _, dir := range directions { + np := dijkstra.Point{X: p.X + dir.X, Y: p.Y + dir.Y} + if in[np] != "" { + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: p, + Destination: np, + Weight: 1, + }) + } + } + } + graph := dijkstra.CreateGraph(data) + for s := range in { + for d := range in { + paths, cost := dijkstra.GetAllShortestPaths(s, d, graph) + + for _, path := range paths { + path_str := "" + for x := 1; x < len(path); x++ { + f := path[x-1] + t := path[x] + + switch { + case f.X == t.X && f.Y < t.Y: + // Moving verticallY down + path_str += "v" + case f.X == t.X && f.Y > t.Y: + // Moving verticallY up + path_str += "^" + case f.Y == t.Y && f.X < t.X: + // Moving horizontallY right + path_str += ">" + case f.Y == t.Y && f.X > t.X: + // Moving horizontally left + path_str += "<" + default: + // No matching case or invalid input + fmt.Println("Invalid direction") + } + + } + lookup[Pair{s, d}] = append(lookup[Pair{s, d}], Path{path, path_str, cost}) + } + + } + } + return lookup +} + +func find_point(in string, lookup map[dijkstra.Point]string) dijkstra.Point { + for k, v := range lookup { + if v == in { + return k + } + } + return dijkstra.Point{} +} + +func get_shortest_path(key interface{}) interface{} { + state := key.(State) + + if state.depth < 0 { + return len(state.code) + } + + // (Optional) If you need to modify the state, work on a copy. + newState := state + newState.code = "A" + state.code + + cost := 0 + for x := 0; x>^A v<A>^AvAA<^A>AvA<^A>vA^A +>^A vA A <^A >A >^AvA^A^A^A>AAvA^AA>^AAAvA<^A>A + v < < A > > ^ A AvA<^AA>A^A + < A ^A>^^AvvvA +0 29A + + + diff --git a/2024/go/day22/__debug_bin1539271134 b/2024/go/day22/__debug_bin1539271134 new file mode 100755 index 0000000..4590449 Binary files /dev/null and b/2024/go/day22/__debug_bin1539271134 differ diff --git a/2024/go/day22/day22.go b/2024/go/day22/day22.go new file mode 100644 index 0000000..e593dc7 --- /dev/null +++ b/2024/go/day22/day22.go @@ -0,0 +1,91 @@ +package day22 + +import ( + "adventofcode2024/utils" + rb "adventofcode2024/utils/ringbuffer" + "strconv" + "strings" +) + +func Part1(input string) int { + var secret uint + total := 0 + secrets := strings.Split(input, "\n") + for _, secret_str := range secrets { + secret = uint(utils.MustAtoi(secret_str)) + for i := 0; i < 2000; i++ { + secret ^= secret * 64 + secret %= 16777216 + secret ^= secret / 32 + secret %= 16777216 + secret ^= secret * 2048 + secret %= 16777216 + } + total += int(secret) + } + return total +} + +func Part2(input string) int { + var secret uint + var banannas0, banannas1, banannas2, banannas3, banannas4 int + seq_map := make(map[string]int) + total := 0 + ringBuffer := rb.NewRingBuffer[uint](5) + + secrets := strings.Split(input, "\n") + for _, secret_str := range secrets { + found_map := make(map[string]bool) + secret = uint(utils.MustAtoi(secret_str)) + for i := 0; i < 2000; i++ { + secret = get_next_secret(secret) + ringBuffer.Add(secret) + if ringBuffer.Len() < 5 { continue } + ring := ringBuffer.Get() + banannas0 = get_bannnas(ring[0]) + banannas1 = get_bannnas(ring[1]) + banannas2 = get_bannnas(ring[2]) + banannas3 = get_bannnas(ring[3]) + banannas4 = get_bannnas(ring[4]) + map_str := diff_bannanas(banannas1, banannas0) + + diff_bannanas(banannas2, banannas1) + + diff_bannanas(banannas3, banannas2) + + diff_bannanas(banannas4, banannas3) + if _, ok := found_map[map_str]; !ok { + seq_map[map_str] += banannas4 + found_map[map_str] = true + } + } + } + for _, v := range seq_map { + if v > total { + total = v + } + } + return total +} + +func get_next_secret(in uint) uint { + in ^= in * 64 + in %= 16777216 + in ^= in / 32 + in %= 16777216 + in ^= in * 2048 + in %= 16777216 + return in +} + +func get_bannnas(secret uint) int { + return int(secret) % 10 +} + +func diff_bannanas(a, b int) string { + ret := "" + diff := a - b + if diff >= 0 { + ret = "+" + strconv.Itoa(diff) + } else { + ret = strconv.Itoa(diff) + } + return ret +} diff --git a/2024/go/day22/day22_test.go b/2024/go/day22/day22_test.go new file mode 100644 index 0000000..ec2597c --- /dev/null +++ b/2024/go/day22/day22_test.go @@ -0,0 +1,20 @@ +package day22 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1("1") + require.Equal(t, 8685429, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`1 +2 +3 +2024`) + require.Equal(t, 23, r) +} diff --git a/2024/go/day22/input.txt b/2024/go/day22/input.txt new file mode 100644 index 0000000..1d8acde --- /dev/null +++ b/2024/go/day22/input.txt @@ -0,0 +1,2154 @@ +10590136 +875287 +8199820 +5057663 +10702159 +2754412 +7435555 +224859 +15992449 +11622350 +932944 +435700 +3170120 +2139512 +586809 +5333029 +5303723 +9686900 +2143023 +9428881 +10397494 +5457662 +9809458 +15073442 +9359276 +12646399 +7156069 +8446180 +508851 +13263334 +200901 +16434731 +4146302 +2574407 +13529343 +475977 +12176151 +3286326 +14938937 +8457867 +4182397 +9067317 +9785655 +3106707 +14474698 +6619846 +9276488 +9411552 +16176842 +12659264 +8547512 +14246121 +4596141 +11017854 +4676777 +8838515 +2233654 +14522909 +6622027 +9353154 +6111099 +15261908 +14538909 +16058393 +14096232 +13321747 +16130278 +8992043 +866927 +6845363 +6170143 +14247712 +11010113 +1447901 +15191962 +5907515 +11250205 +1649267 +11911440 +9299031 +10676279 +9079687 +12490080 +5432569 +13761991 +4112148 +1524223 +428863 +592554 +1802290 +8974899 +13846900 +7307294 +1501283 +9297883 +9879789 +232409 +8136743 +3466888 +4457334 +16535993 +14030397 +10195018 +10293167 +1021850 +3279915 +11939212 +1533565 +12943402 +137868 +4974035 +12106491 +852068 +731007 +2001459 +15003488 +1752841 +12070722 +9172652 +5100977 +12017099 +8577908 +844173 +15622231 +1906637 +13968100 +8237652 +2050630 +4452627 +4991742 +1716311 +12963273 +4400342 +8224484 +9377731 +10889695 +282091 +13561919 +1355094 +3192212 +15539075 +4994158 +6666596 +12889312 +12119276 +13127523 +1809766 +5711917 +9767081 +9225686 +11593627 +15832331 +14116100 +13892551 +2458045 +9381978 +13644367 +9436240 +4896268 +16389806 +3412057 +7853519 +9460842 +14791640 +3641605 +14549793 +2218854 +10556399 +16406734 +4024673 +313979 +7496885 +6341307 +146171 +14296809 +3033799 +8769468 +6727266 +16688850 +9849003 +10401895 +9060764 +3469927 +1645489 +6720515 +3237423 +4115487 +4352330 +14921565 +5407608 +10261239 +8176803 +8851715 +12993145 +2711548 +14191927 +2016959 +2569854 +13719068 +15814985 +8599722 +14345065 +7132332 +2422873 +13152456 +12113599 +11146388 +12261164 +4735525 +5389445 +361073 +7233069 +14589801 +4269831 +10735511 +16538036 +1719892 +8007993 +13524218 +3790624 +4627199 +1134895 +4270261 +13477793 +7772834 +3656561 +2940131 +2324266 +14217616 +7277377 +11653144 +8628488 +15893078 +13078579 +15907015 +12001675 +13065306 +761886 +14499935 +9464402 +1717755 +954277 +8092888 +156378 +6936857 +12739548 +4541145 +11187804 +8802301 +14716773 +5927811 +8747083 +16319461 +14972281 +15864395 +11650868 +472344 +8003496 +16688403 +4798575 +9436662 +10598683 +3415571 +16284296 +2467504 +15371521 +4388821 +2969395 +8822072 +3714948 +6695627 +3624014 +12686515 +8483404 +8629685 +10628215 +770048 +4733154 +16599359 +4956090 +8774682 +1978263 +1744853 +4465149 +15151046 +13331121 +6993890 +8737790 +11593394 +12237951 +4893716 +5733126 +12746045 +7891411 +5484167 +13060078 +10991674 +16330224 +3591171 +11261280 +14725025 +10072970 +7212951 +3556627 +12622973 +14145706 +12992586 +8237367 +4817059 +2582922 +14785914 +10604591 +6017403 +13712253 +13704943 +4328057 +8138172 +5902010 +1699456 +496325 +15929417 +3591598 +6776448 +6347783 +5744471 +1420271 +10347757 +11564729 +16395959 +14708574 +7764896 +13937303 +10360224 +4558120 +11136128 +11281022 +7928672 +7179129 +12429801 +10003077 +9718364 +11645341 +13412890 +3033591 +1934653 +10550273 +4973742 +9859417 +9881245 +15835692 +2500039 +6503809 +3704667 +1667888 +10459008 +10015074 +1014462 +12364645 +9159414 +2508362 +4434119 +2067801 +16046615 +4307744 +3626606 +7303645 +2070013 +7386212 +16427096 +4374769 +183922 +10968526 +2694712 +7241960 +10342849 +6949050 +14246761 +7152560 +16405451 +11623905 +5229402 +16436601 +2040752 +547429 +10546727 +3239217 +11439176 +8676789 +15727180 +3158085 +11853770 +916593 +371585 +8962314 +14350062 +12243531 +11639755 +1086429 +14539255 +3309210 +16218734 +8821678 +2167497 +3552080 +2046933 +2555111 +8959338 +12151061 +632206 +4374312 +5153750 +6058821 +442715 +9153569 +15093319 +11962606 +3951049 +15281658 +902544 +12241425 +2656534 +1467235 +6466882 +7358458 +6184977 +16720927 +5700286 +11409861 +1125724 +4018238 +4501641 +2384132 +4881881 +11112350 +8346971 +10748644 +3288122 +6047858 +147614 +7751206 +11319131 +7588742 +2225459 +3267323 +4713687 +1498586 +6062948 +6735082 +775767 +1462745 +8720149 +12762571 +13263950 +1333508 +15797029 +9034040 +4411221 +9484861 +14103092 +4730590 +13027844 +13034272 +2390716 +11154851 +10880790 +8039662 +12911763 +8335053 +11692727 +9900392 +12485552 +10472729 +12980546 +6320847 +14684947 +804099 +309558 +9739707 +3309165 +6135691 +7936254 +16743700 +9700624 +8244293 +1915672 +16015758 +10037348 +12398738 +3677046 +8364134 +3688200 +13422040 +13557572 +9609694 +7688000 +9397402 +15565829 +13816053 +5090136 +10740864 +3124155 +1139805 +5921789 +12125873 +8163595 +6745693 +13755254 +15007281 +9535337 +11460461 +9096206 +1764974 +11022362 +5742542 +1050548 +11165882 +11986025 +7872556 +16626261 +15770381 +1062790 +12804710 +4433659 +11211568 +12689045 +2734903 +16209194 +3698242 +10488583 +5553439 +2165641 +12630897 +4571578 +3786307 +16771620 +4396761 +9130104 +8851274 +492832 +11738240 +502342 +6124111 +13126644 +8253608 +2515285 +5611512 +9673901 +16756748 +3093220 +3237762 +2839025 +13472987 +2792730 +7304770 +3348693 +11817709 +8974531 +949625 +5319856 +6449968 +15247384 +11080668 +16494202 +10922465 +3088381 +10523673 +13030981 +6042157 +7600603 +3173600 +7543705 +11190614 +6240486 +8858283 +1458316 +12249555 +7988675 +12675387 +4341398 +5929102 +10282676 +1104981 +5535502 +6547940 +11698153 +8510880 +8945503 +1738220 +2049866 +4989616 +1926629 +15172165 +14247914 +14498695 +14783344 +15683499 +7732103 +11970707 +1008188 +936324 +15309493 +12073216 +12011817 +8876503 +16031487 +2429146 +2419902 +9122583 +2094079 +3891938 +4037242 +7837651 +10927467 +220727 +356763 +11709524 +6422376 +11201849 +14338653 +9653545 +14568369 +12722897 +8521076 +480439 +3809541 +4073306 +11125786 +8296202 +6490607 +15353804 +8735195 +11692930 +586836 +768655 +808658 +4097325 +13501252 +5543542 +11386791 +2540093 +5638210 +4934602 +7945038 +13989492 +7053273 +3094067 +1431773 +10283302 +3921504 +7944764 +464271 +4492045 +15363306 +11406308 +11999070 +10903583 +8125150 +4326991 +2479889 +5024618 +9625144 +10965229 +4419881 +908317 +12274280 +16018919 +13699662 +11053267 +3333049 +16109955 +2494042 +8529585 +5859973 +13466701 +5088110 +1919459 +15134189 +5245819 +409771 +11911858 +13830291 +7515587 +4388265 +13341371 +1854120 +15523892 +348083 +3364484 +5812983 +776216 +4612178 +1263157 +4645810 +11253210 +7954588 +7856685 +16560039 +11455290 +5909002 +10975973 +1632280 +4242843 +2317206 +5766296 +7860890 +2330155 +5362709 +10169395 +4974735 +11312657 +2833579 +8304948 +9539152 +10468921 +11334479 +1437018 +327360 +8714871 +12171600 +6909033 +8429562 +15329280 +13717433 +4542875 +14350035 +4405471 +4296535 +12929787 +4378724 +439048 +4697891 +3422825 +14912039 +13271835 +798085 +6870484 +9112136 +10971768 +410337 +6556132 +12401019 +3098487 +3715466 +8464734 +7536150 +16764617 +11678740 +5289313 +9061505 +14514171 +10973853 +12098773 +16282322 +7744992 +1916288 +14803295 +16555030 +13856861 +16612196 +4236227 +11483949 +12091523 +2270560 +15240604 +16022551 +10863695 +7369080 +9345302 +5238121 +507275 +12467526 +7497137 +1284383 +1065301 +10515518 +13893856 +13644841 +7189705 +14831989 +11241447 +9141780 +4597971 +8681541 +10543970 +9680331 +10982661 +4891832 +10191270 +185554 +5705842 +14585839 +4991309 +9578342 +8634878 +9484592 +8937022 +8578270 +14610588 +10907043 +939748 +2107393 +13422819 +6470160 +7271002 +15897204 +11186733 +5322555 +8694007 +10942515 +6775590 +11689425 +3935207 +1349588 +2426372 +13925874 +9792584 +592302 +9382175 +10357703 +13294527 +16224794 +1931945 +15784326 +3435884 +9746917 +5412699 +12350372 +15059933 +5098133 +1023408 +1655001 +11113644 +9261665 +13683482 +6658270 +8520306 +16016607 +15302655 +4375990 +6170358 +14328031 +5487568 +10491754 +9899926 +10865070 +7744942 +13161741 +15252076 +3219673 +796971 +5249761 +13086962 +15451546 +8229798 +5539923 +10007190 +3655569 +2406004 +6104175 +14169123 +10412754 +5760682 +13496391 +527818 +6359871 +14833101 +9850780 +12504616 +2360327 +13297914 +6851804 +10449619 +308596 +10848039 +4606305 +11418534 +1521273 +16606522 +9593208 +4113254 +15038558 +1310818 +6856842 +600907 +13963374 +14474958 +16597078 +392550 +529912 +1906057 +15301084 +9523488 +2015493 +7262536 +11797298 +13036183 +7483343 +5024139 +3343872 +10718999 +7878070 +8905254 +7697168 +1311669 +3313009 +7770468 +13720238 +5332120 +7563605 +12067207 +11705417 +16122258 +16633631 +861472 +2982924 +10126436 +12193794 +9560056 +10631075 +2481199 +1776113 +4144041 +8373967 +15822232 +15557334 +1620242 +1354927 +15887732 +15225320 +10223547 +12525320 +2847246 +13159858 +14040082 +16252198 +496253 +3993129 +388616 +7015197 +15352324 +8499463 +464146 +13018245 +3308570 +15293162 +11263447 +9217524 +7799350 +8669422 +2278163 +2761374 +2614405 +4797492 +5846817 +14612159 +5615435 +10885756 +10666119 +13206372 +2430423 +6056982 +4287120 +3420275 +16080607 +10684315 +13405565 +5751202 +11407954 +697954 +11034953 +16277071 +16266217 +4806994 +1721382 +4677089 +12961026 +7519124 +15199220 +1945234 +2116062 +307152 +6638042 +4582969 +12379848 +11037689 +10041833 +2437042 +4814664 +9688862 +14960714 +11913027 +16070999 +5231549 +7148271 +14706749 +955944 +9830084 +14214148 +1780207 +7003954 +6105068 +11399034 +14464176 +11402741 +3195477 +2006791 +12557688 +13036853 +1944596 +7609552 +1755760 +1837168 +10866730 +16580473 +10438697 +4642738 +13281168 +5495821 +10035770 +12703793 +13683499 +3107914 +14628160 +3936949 +9857328 +13229151 +11493406 +11543844 +7619602 +6240975 +1737120 +7479928 +10624832 +10588793 +856692 +5345492 +2971113 +10232348 +746636 +880273 +11104674 +4636824 +15946961 +12710335 +6066490 +11711036 +1963306 +10121187 +3826434 +7341079 +3999598 +4465294 +11301051 +12551923 +14117143 +7948012 +1508818 +8089328 +1859331 +12463986 +16749016 +6993722 +16602025 +6385002 +4131100 +8787228 +1479831 +13384059 +8477433 +10320928 +15935805 +4066287 +3737810 +11798333 +14905389 +14751017 +3315933 +2372411 +12514616 +16613739 +11855017 +750979 +6966506 +7898899 +14609382 +3717718 +13683967 +2482236 +6760494 +15050542 +8325262 +3542754 +9412017 +568194 +10294681 +3180999 +14403103 +7935132 +9769940 +16150130 +9348834 +670278 +15084874 +14985015 +9048238 +9651038 +625836 +11634788 +1526885 +5856261 +10122698 +12125018 +11857871 +12387620 +3206858 +12963569 +1624864 +8617815 +15865708 +2866995 +14212630 +13659141 +2456203 +4344132 +1640541 +11558772 +11280606 +753743 +4140130 +4532225 +8975780 +930596 +3484874 +12614254 +582345 +658788 +15037397 +15209267 +9231520 +10709066 +5664630 +12016206 +6787597 +13751110 +11072838 +1667985 +13336484 +5450271 +5383580 +12925656 +6510279 +3572157 +6024379 +4647604 +10672244 +6773807 +3500957 +6070036 +5241335 +9491796 +1087257 +6172046 +1387322 +14749991 +4483842 +16327496 +5136104 +12761237 +2150292 +11038587 +5879558 +8531879 +4546789 +13189526 +2941219 +7417052 +7979528 +12971411 +13557380 +16585639 +8525727 +12638440 +9145132 +4120624 +12400333 +13318325 +16729318 +3956434 +9930255 +11013966 +16639415 +16317249 +3503147 +13549101 +2776701 +4499340 +8566364 +5481097 +1301153 +6653975 +4036868 +16687206 +13297663 +6906879 +10089872 +6873822 +8442464 +6543211 +13282258 +14496400 +7379692 +13782002 +1285345 +3960297 +1560104 +14516306 +14246039 +6380458 +2115875 +3832255 +7243018 +10569886 +4639870 +10222378 +2215889 +9553627 +10374406 +1757224 +12542861 +2634000 +10305917 +10317424 +3997734 +11147396 +16183114 +1153120 +16511294 +12773961 +15259520 +4917614 +8534975 +14704889 +8455884 +7072018 +11454696 +14605763 +2558063 +15220333 +1946133 +13547339 +16165513 +2503858 +3632249 +10991549 +14510967 +6050646 +11066928 +13715477 +2642203 +11426527 +7917188 +10329366 +2346576 +2299246 +8360189 +14300589 +16002243 +15517228 +4332919 +12665555 +13393128 +15204891 +546532 +15231152 +9434749 +13335828 +14769508 +1739019 +4273567 +13167702 +15480602 +12771661 +1224210 +8886884 +8756411 +15746128 +10212305 +8260555 +14189299 +10566466 +12458155 +12017396 +9387977 +16095830 +12826095 +6387761 +5477038 +2746353 +11467489 +10943461 +14155364 +4505587 +8425443 +1661162 +13427948 +8332156 +11742916 +3166787 +376459 +7733296 +8074744 +2393722 +7740770 +3595090 +13748685 +12464723 +4028024 +2538896 +12400637 +6226138 +4904685 +9936416 +15698505 +9314899 +9547736 +9738304 +16769009 +11825975 +1778839 +1261184 +12891948 +6447607 +15541670 +12651854 +15725272 +15008552 +9958582 +10556270 +8093893 +5160316 +16598390 +16104616 +5910038 +4054764 +5460149 +10597079 +705628 +2347151 +11803779 +10423543 +853739 +9397164 +8039343 +14459952 +9754669 +1939163 +1271930 +4595228 +2534762 +10373736 +10033518 +8641177 +15513789 +6264200 +12133177 +12575840 +6340492 +5115775 +286446 +7784276 +9278468 +9733750 +5566585 +15327260 +15299763 +11058797 +10114303 +8619800 +5194350 +12663684 +5460917 +12398318 +5788996 +14119117 +10751273 +2493989 +7323944 +290221 +9536553 +4500797 +3460520 +8725796 +14782558 +15943799 +6698170 +7428416 +8459337 +11438121 +12654428 +2299775 +13362859 +3073309 +7036514 +13723150 +1012102 +12515732 +9834078 +12090235 +13327982 +11138310 +10601022 +2861003 +1605830 +14610806 +13538470 +10312889 +9945408 +1353545 +3735463 +7323767 +7818083 +8005932 +12525803 +7962699 +6507552 +8928824 +15339727 +12885018 +13226001 +9864921 +2621815 +9725746 +6019084 +9165387 +14502422 +14326422 +15047297 +5296289 +3192634 +3475295 +1943439 +13822251 +14222605 +14027249 +9815084 +7633112 +11180257 +3044966 +1492336 +9496815 +9365163 +2773184 +10383373 +8242638 +4761893 +8296014 +9619481 +12959950 +12034993 +8508968 +4174520 +3064185 +13645597 +14736031 +992464 +10629725 +9439658 +10654237 +5121955 +3421837 +12024504 +13857074 +11011430 +1365915 +5760667 +10305092 +14693365 +11176524 +11987763 +7372754 +2804325 +9028573 +5647558 +5725491 +15869640 +13400986 +9144502 +14138677 +12716916 +5582569 +1270671 +12237672 +12650029 +12958108 +5094873 +10907997 +12779254 +3838779 +4987384 +4565694 +12707794 +8576387 +5888339 +188145 +16628110 +9263580 +8823468 +12977826 +15217573 +4168874 +3435397 +8141968 +568727 +10260409 +16114968 +7474412 +10231381 +12911035 +5246757 +14531249 +9189954 +4731362 +14320282 +3884171 +3279103 +9839881 +3755966 +5871644 +2683223 +6578082 +6550053 +9111784 +15942397 +10630588 +2391117 +6225027 +9863762 +15807189 +10651768 +2874945 +13167122 +14855953 +9191331 +9582160 +15069416 +3481713 +1156682 +16019652 +4084970 +14175812 +2544605 +13831717 +6677650 +7967913 +11172215 +10292671 +6525759 +14862181 +1216932 +6563889 +4552258 +12320656 +12968348 +6325169 +3939962 +8671405 +16217965 +9232585 +10414284 +5552314 +4791346 +15573887 +8901948 +13034903 +7082109 +16562029 +6434875 +9372079 +974730 +4135581 +12897172 +8363095 +11067117 +4468914 +13702031 +7471280 +16089025 +4590466 +13064534 +8819169 +11016033 +6888738 +13372441 +14012082 +3709965 +12494620 +14753633 +15190576 +3545269 +12544167 +11652352 +12821751 +5219965 +4921257 +12811310 +12250101 +10982752 +5766012 +13997336 +3332155 +2382728 +2378415 +4986764 +6748242 +11591614 +6605634 +11801755 +5873878 +12382851 +10720615 +4508903 +5114086 +10892807 +2752563 +11257837 +5812426 +3634022 +9555045 +12143336 +1816501 +9913892 +9439250 +15216629 +3754522 +6959594 +15873227 +14171864 +7413294 +8678706 +11638228 +4409407 +5040496 +3862895 +12432080 +8769947 +6115837 +291283 +16573080 +4719212 +7973463 +4237492 +5424869 +12295078 +12251073 +11510815 +9505265 +5989912 +4410402 +606161 +608338 +8979646 +11312485 +13855088 +9769243 +13646805 +4730820 +1373814 +9132413 +15614954 +5863235 +13714864 +2493978 +2810188 +8636577 +4219878 +15454149 +4711280 +8066229 +16281473 +5568854 +3148838 +13290418 +4208053 +8861222 +13290551 +10697294 +10282985 +6879678 +7198940 +15002102 +7271855 +14790522 +12807017 +11364697 +7268801 +4485372 +12618249 +2757777 +4535042 +11750057 +8357041 +10372566 +6508712 +4567761 +15979598 +11545227 +6385160 +514188 +9810685 +673172 +10572466 +10233873 +3308154 +1147289 +4659656 +5963979 +3373320 +2376867 +5084049 +2859870 +15095037 +195804 +8972692 +3223699 +1643168 +14513342 +4600684 +9560867 +1222480 +9000451 +7107794 +2755423 +13039349 +12363487 +6096693 +16228833 +5496164 +450236 +11402849 +4801446 +13380566 +10692518 +14197658 +7154516 +946880 +16470493 +8052881 +6500032 +7612718 +7950529 +9588592 +8401538 +13425757 +9981237 +5882435 +591038 +4922281 +6458116 +5787061 +14522942 +11785696 +10796659 +3886346 +8227480 +11392209 +3655248 +14498557 +3671846 +2452058 +2617090 +10919913 +7463527 +5482122 +1598986 +14579062 +12412849 +15824917 +15068247 +7875985 +2452228 +2082627 +3557946 +11973191 +14558293 +8275608 +14994328 +7870634 +11335123 +14920628 +7337737 +4521602 +10379080 +11210115 +3586297 +11432998 +14624524 +10093200 +15066567 +8484203 +3051772 +5833286 +11134165 +3150085 +1675839 +6467072 +8635433 +14545224 +15000528 +1813106 +9384410 +11777695 +14160502 +5322301 +5099489 +1828730 +13629190 +4507555 +723259 +7063008 +11664046 +3326006 +7968326 +228383 +5383827 +15022508 +11201369 +15555449 +8325365 +12096141 +7088438 +3712236 +4463306 +5810975 +8795335 +7342204 +3572741 +6070994 +3167193 +15986323 +2111602 +508878 +7020823 +15346793 +497826 +14845006 +8749939 +7021391 +6066006 +11400290 +14702178 +3006238 +9103735 +1335622 +5763580 +5418229 +3676887 +16299418 +2962927 +6761639 +16536032 +3630858 +3811730 +16455724 +8949134 +7097695 +15716329 +1845366 +6363465 +3488940 +10695053 +3054102 +1406598 +14013240 +16689551 +1446123 +7619209 +13417408 +12427079 +15656229 +1463332 +2573643 +8554186 +5529531 +1458163 +1913338 +15490652 +6813000 +5054013 +4130419 +15538588 +12138277 +8069753 +15135246 +12340605 +14468941 +521834 +10753436 +2546494 +10493819 +4478872 +6941093 +8111745 +16460426 +15401777 +4699632 +13395068 +6716398 +15284082 +3494352 +10015220 +7866291 +5308408 +4986618 +15883286 +6979883 +9961934 +8806082 +13246392 +5083893 +901478 +13357915 +5145519 +15453104 +11892308 +14750529 +2353137 +15133482 +7983919 +12702757 +10521892 +12711785 +12841420 +1051548 +8032486 +10920796 +6121945 +13651592 +4338625 +13880708 +5105587 +11547529 +16605189 +5873478 +16459919 +9054423 +8492601 +15384825 +11840741 +7596483 +5084587 +8357672 +7909505 +14162837 +4390870 +6849996 +12309948 +8917961 +4070640 +6283920 +15176937 +10640028 +3944638 +1938038 +6350684 +6886291 +5599759 +3450216 +4924467 +6584827 +4114127 +11095681 +9357694 +4026528 +16550813 +828920 +10386535 +7838119 +5220835 +7050434 +13648790 +283956 +12217415 +4460061 +14718542 +16034462 +9457668 +3998526 +11984255 +8831012 +16682030 +14312823 +10967147 +10999701 +12734309 +939559 +4307358 +9927437 +12485271 +4804026 +6248526 +4899534 +10749336 +10272508 +15494063 +6259795 +9126440 +14448112 +16365132 +7168562 +8920302 +6671412 +7367944 +11840442 +14406465 +3450077 +16282925 +11586120 +5466723 +3082635 +4758709 +4235268 +1884601 +11601475 +4183262 +11022383 +7405582 +9045072 +8468254 +13998954 +3304599 +8725060 +3181729 +10801704 +7561591 +16044742 +1040017 +16464963 +10293255 +4133277 +13977315 +15027671 +12945608 +3645703 +699258 +10479301 +9681693 +8953076 +11105837 +1585879 +5168443 +1120626 +16435348 +2837551 +4156587 +4522236 +11829318 +14178227 +14179515 +6144525 +2809058 +13067071 +15813577 +14027934 +6705683 +1154799 +15797277 +3644393 +7303859 +6176078 +2251319 +2767345 +6796343 +1863982 +2245345 +12547322 +13346957 +16298730 +15603799 +9846325 +2960914 +9648411 +9410785 +14708839 +5424693 +10478165 +6577109 +10705039 +12249623 +4039982 +12459493 +5131455 +6671800 +5761464 +13702072 +4612801 +7005194 +15031015 +6624382 +13886243 +10538415 +15410798 +5561860 +2118302 +15249219 +6626977 +7318294 +3096017 +14325651 +7115328 +3746966 +620141 +15423592 +11680399 +14229409 +3635217 +14453349 +10327793 +13254760 +475649 +4737976 +1451788 +5856232 +11296010 +6512518 +11001840 +3046382 +12254658 +1687160 +10362311 +13724091 +7368292 +15029494 +1331605 +15824561 +4330578 +13623170 +13981958 +2957340 +7577420 +8367573 +12672189 +8771023 +5445415 +11012231 +4802419 +6298542 +7316421 +15683437 +16016673 +472737 +10542519 +806678 +13563063 +8746607 diff --git a/2024/go/day23/day23.go b/2024/go/day23/day23.go new file mode 100644 index 0000000..82d8c7a --- /dev/null +++ b/2024/go/day23/day23.go @@ -0,0 +1,242 @@ +package day23 + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +type Lan struct { + nodes []*Node +} + +type Node struct { + key string + adjacent []*Node + loops [][]*Node +} + +func Part1(input string) int { + total := 0 + + lan := &Lan{} + + pattern := `^([a-z]{2})-([a-z]{2})$` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindAllStringSubmatch(line, -1) + for _, match := range matches { + lan.AddNode(match[1]) + lan.AddNode(match[2]) + lan.AddConnection(match[1], match[2]) + lan.AddConnection(match[2], match[1]) + } + } + for _, node := range lan.nodes { + if node.key[0] == 't' { + connections := node.adjacent + for _, connection := range connections { + c := lan.getNode(connection.key) + for _, n1 := range c.adjacent { + for _, n2 := range connections { + if n1.key == n2.key { + already_found := false + for _, loop := range node.loops { + if contains(loop, c.key) && contains(loop, n2.key) { + already_found = true + break + } + } + + for _, loop := range c.loops { + if contains(loop, node.key) && contains(loop, n2.key) { + already_found = true + break + } + } + + for _, loop := range n2.loops { + if contains(loop, c.key) && contains(loop, node.key) { + already_found = true + break + } + } + + if !already_found { + already_found = true + total++ + loop := make([]*Node, 0) + loop = append(loop, node) + loop = append(loop, c) + loop = append(loop, n2) + node.loops = append(node.loops, loop) + fmt.Printf("%v,%v,%v\n", node.key, c.key, n2.key) + } + } + } + } + } + } + } + lan.Print() + t := 0 + for _, node := range lan.nodes { + if node.key[0] == 't' { + t += len(node.loops) + fmt.Printf("Node: %v\n", node.key) + for _, loop := range node.loops { + for _, n := range loop { + fmt.Printf(" %v ", n.key) + } + fmt.Println() + } + } + } + fmt.Printf("Total: %d\n", t) + return total +} + +func Part2(input string) int { + total := 0 + + lan := &Lan{} + + pattern := `^([a-z]{2})-([a-z]{2})$` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindAllStringSubmatch(line, -1) + for _, match := range matches { + lan.AddNode(match[1]) + lan.AddNode(match[2]) + lan.AddConnection(match[1], match[2]) + lan.AddConnection(match[2], match[1]) + } + } + for _, node := range lan.nodes { + connections := node.adjacent + for _, connection := range connections { + c := lan.getNode(connection.key) + for _, n1 := range c.adjacent { + for _, n2 := range connections { + if n1.key == n2.key { + already_found := false + for _, loop := range node.loops { + if contains(loop, c.key) && contains(loop, n2.key) { + already_found = true + break + } + } + + for _, loop := range c.loops { + if contains(loop, node.key) && contains(loop, n2.key) { + already_found = true + break + } + } + + for _, loop := range n2.loops { + if contains(loop, c.key) && contains(loop, node.key) { + already_found = true + break + } + } + + if !already_found { + already_found = true + total++ + loop := make([]*Node, 0) + loop = append(loop, node) + loop = append(loop, c) + loop = append(loop, n2) + node.loops = append(node.loops, loop) + fmt.Printf("%v,%v,%v\n", node.key, c.key, n2.key) + } + } + } + } + } + } + lan.Print() + maxLoop := 0 + var maxNode *Node + for _, node := range lan.nodes { + if len(node.loops) > maxLoop { + maxLoop = len(node.loops) + maxNode = node + } + } + fmt.Printf("Max: %d\n", len(maxNode.loops)) + nodeList := make([]*Node, 0) + keyList := make([]string, 0) + for _, loop := range maxNode.loops { + for _, l := range loop { + if !contains(nodeList, l.key) { + nodeList = append(nodeList, l) + keyList = append(keyList, l.key) + } + } + } + sort.Strings(keyList) + fmt.Println(strings.Join(keyList, ",")) + return len(nodeList) +} + +func (g *Lan) AddNode(key string) { + if !contains(g.nodes, key) { + g.nodes = append(g.nodes, &Node{key: key}) + } +} + +func (g *Lan) AddConnection(from, to string) { + fromNode := g.getNode(from) + toNode := g.getNode(to) + + if fromNode == nil || toNode == nil { + err := fmt.Errorf("Error: Invalid edge (%v --> %v)", from, to) + fmt.Println(err.Error()) + } else if contains(fromNode.adjacent, to) { + err := fmt.Errorf("Error: Existing edge (%v --> %v)", from, to) + fmt.Println(err.Error()) + } else { + fromNode.adjacent = append(fromNode.adjacent, toNode) + } +} + +func (g *Lan) getNode(key string) *Node { + for i, v := range g.nodes { + if v.key == key { + return g.nodes[i] + } + } + return nil +} + +func (g *Lan) Print() { + for _, v := range g.nodes { + fmt.Printf("\nNode %v : ", v.key) + for _, v := range v.adjacent { + fmt.Printf(" %v ", v.key) + } + fmt.Println() + for _, loop := range v.loops { + for _, v := range loop { + if v != nil { + fmt.Printf(" %v ", v.key) + } + } + fmt.Println() + } + } +} + +func contains(list []*Node, key string) bool { + for _, v := range list { + if key == v.key { + return true + } + } + return false +} diff --git a/2024/go/day23/day23_test.go b/2024/go/day23/day23_test.go new file mode 100644 index 0000000..375e70f --- /dev/null +++ b/2024/go/day23/day23_test.go @@ -0,0 +1,79 @@ +package day23 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`kh-tc +qp-kh +de-cg +ka-co +yn-aq +qp-ub +cg-tb +vc-aq +tb-ka +wh-tc +yn-cg +kh-ub +ta-co +de-co +tc-td +tb-wq +wh-td +ta-ka +td-qp +aq-cg +wq-ub +ub-vc +de-ta +wq-aq +wq-vc +wh-yn +ka-de +kh-ta +co-tc +wh-qp +tb-vc +td-yn`) + require.Equal(t, 7, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`kh-tc +qp-kh +de-cg +ka-co +yn-aq +qp-ub +cg-tb +vc-aq +tb-ka +wh-tc +yn-cg +kh-ub +ta-co +de-co +tc-td +tb-wq +wh-td +ta-ka +td-qp +aq-cg +wq-ub +ub-vc +de-ta +wq-aq +wq-vc +wh-yn +ka-de +kh-ta +co-tc +wh-qp +tb-vc +td-yn`) + require.Equal(t, "co,de,ka,ta", r) +} diff --git a/2024/go/day23/input.txt b/2024/go/day23/input.txt new file mode 100644 index 0000000..3cfb7c6 --- /dev/null +++ b/2024/go/day23/input.txt @@ -0,0 +1,3380 @@ +qn-ub +ra-sg +zx-kx +go-xf +kz-fc +vb-sp +mt-oc +da-xb +hu-gq +cg-nn +le-lw +zk-uf +ss-wn +yg-mf +vw-pe +bc-jp +xb-qi +jd-fj +en-os +du-ha +zo-rx +ss-jf +xs-zt +an-wj +ua-pj +am-tq +ae-pb +gy-ce +yp-qk +qs-cw +da-qi +nu-cr +wp-ui +jn-im +zm-pq +gc-yl +cs-xs +wo-xx +bo-cg +nu-nt +pr-op +ha-bm +qm-ld +go-ef +wo-jp +cq-sf +dh-sm +wy-bl +av-wg +fa-ue +eo-qz +fk-mj +mh-bi +ui-lt +ep-og +jg-oa +yb-ft +sz-oo +jl-yu +cb-lo +ln-hu +ak-ou +yx-gg +cr-ag +pj-al +kl-os +hl-zp +yj-lp +li-rz +qr-uh +qs-tx +mj-eq +bd-ev +jm-kh +et-oy +br-ku +na-em +mw-rn +sx-fw +og-wq +rs-bu +bl-tt +hg-ba +qs-sb +la-tu +ab-ma +eq-ca +ex-uz +iz-we +kn-of +nd-jf +wh-gb +pj-gz +et-lz +xq-ga +tw-ew +sv-im +uv-xl +ud-hx +jf-eo +kd-xo +jb-sa +og-vz +jm-sg +cg-lg +ol-vd +dm-qv +vq-mw +id-pr +tk-cp +dw-hn +ai-oy +rm-xe +vy-xb +gx-rw +di-to +fl-gc +vm-go +db-kh +ap-vm +nv-ua +eu-zi +gt-la +df-xa +xz-ig +lv-bs +ch-mj +za-bz +mh-vz +ta-wc +qp-qv +gv-mw +ju-xo +tt-sa +pc-js +cc-vn +ca-it +hw-mc +qy-rq +iw-xg +di-if +an-gf +gi-wj +yn-rk +sp-fz +ps-fq +gy-zp +hq-fc +uw-jx +pd-zm +ho-uo +gm-ni +ei-wv +vj-gn +dt-de +ss-ys +oc-jy +bw-nm +hl-ci +uv-ry +jn-bb +vn-yz +sg-ms +jf-dr +ox-dp +pe-yy +he-dd +ei-gw +fr-ic +ag-qw +ht-pa +sf-gl +hq-ea +xx-rs +bc-fh +uf-yu +bf-qz +pl-ye +dg-xo +rf-ui +uu-xc +gi-xp +yt-ll +qm-zc +zp-yy +qf-sa +sq-od +rz-yg +gh-sp +ui-rx +lp-qk +jb-hf +fp-ru +xv-gy +uo-un +dm-ug +ln-hx +ux-zc +zr-ic +tv-jz +kz-wx +xx-ed +ld-ij +ab-yt +wm-vx +rv-ww +tn-ym +fj-vm +se-sp +yy-mz +ds-qq +nd-od +tl-jc +ym-xz +ro-ql +vj-jh +fj-zv +yv-kh +zb-ff +lv-tq +nc-dp +mp-ko +aj-hk +yx-ch +vx-hn +vh-zw +py-xk +ue-rg +ek-ma +co-ed +ll-qn +ox-nc +lo-tw +uw-as +sk-sv +at-bi +cj-rx +bi-wq +za-fx +ui-zo +di-qp +fq-sp +bf-dq +vo-gb +lk-yd +gp-mp +zu-jk +ch-je +sm-rh +gm-fm +nq-gl +ig-aa +vd-sp +zt-cs +dx-uy +ld-uo +sk-wx +ka-pl +jh-ht +ha-yk +wu-xz +hm-fk +tl-xf +io-uf +jj-yb +zd-lz +fq-je +ht-kl +ee-le +qf-bl +yn-xp +mb-nv +xa-nz +ji-sb +gb-jl +nx-vv +ff-bb +vr-ow +rs-sr +ok-nc +cw-gx +wy-hf +dn-sp +cc-mw +ou-gw +ep-dy +rb-ld +sf-nq +rg-kc +qy-sw +eu-nh +yp-ij +py-ah +bz-zb +ai-ul +ga-rn +mp-nn +wp-sn +cu-as +jf-aw +ky-ze +eu-bp +hm-zb +wl-bf +yt-xa +pc-ao +az-ty +pq-kx +lw-kd +jh-pd +qr-nh +qs-ou +by-bu +wu-so +fm-ve +kd-ok +ds-yg +eq-it +ix-nx +bc-jj +uy-zm +mc-sx +av-yk +bt-uz +mj-gg +cb-me +ul-oy +fu-vt +ro-cr +lv-oj +ng-rr +rs-gn +xs-hk +dt-zb +ah-at +xq-dx +gx-ak +ca-er +qw-yq +dw-vv +rq-yb +ps-ab +nh-uh +vn-as +zo-sn +bq-pl +lw-dp +fj-ap +rv-nm +se-fz +du-va +vn-zu +fz-it +ti-gi +ze-jm +cx-bt +rz-ow +wi-gm +at-xh +xe-sa +or-ub +dm-qp +sj-zu +en-qn +ng-df +ab-xc +gf-uu +tk-no +nz-jk +od-dr +qk-fa +jx-cc +ka-oj +er-yx +ph-vc +pk-vj +yw-jr +xo-ok +rv-zd +we-bl +pd-pq +bu-iv +yc-mp +zu-vh +dm-oc +hu-ht +la-iw +kh-sg +pb-yk +nd-aw +qj-aj +uz-qf +bz-jn +ic-nu +wg-yk +ix-dw +qm-rw +ye-dl +df-iq +iz-gg +jp-by +mn-hk +id-uq +kc-td +xp-hf +yp-sl +aj-nq +ry-go +kv-ed +iz-ca +aa-fu +sz-hw +li-hy +gy-or +cj-sn +sg-gz +lv-kh +io-jl +yz-rg +ao-hz +tq-bs +iw-oo +ot-gw +rm-ak +zt-qj +ol-gh +ky-fx +lt-zo +fu-hq +or-yy +mu-kk +vm-zv +hk-qb +iv-ed +dr-nd +ym-fn +rn-dx +zd-ww +se-vb +sx-iw +cx-ex +ow-mf +kv-gn +ux-fa +ek-xa +bt-bl +vc-vo +xw-cv +sw-pm +ga-hv +mc-in +yz-ux +bo-ao +rl-sw +wl-cp +qz-ba +oa-yr +yg-jg +ow-li +gp-nn +as-jx +wc-uz +xv-yy +rf-kp +dp-ee +vw-ce +ds-li +rg-fi +br-fn +rh-nv +ln-nx +hm-iz +un-gy +xh-ep +in-iw +ou-tx +ba-oq +mc-iw +bb-im +xo-st +jh-pq +ng-mb +zc-kc +od-ss +we-mj +nv-sm +mb-cb +sw-jj +sx-oo +vr-of +jk-as +yp-lp +pd-sl +sg-db +wh-vl +kq-tq +yo-co +ou-xe +ve-rw +rb-hx +jq-uu +zm-pk +mx-vb +or-tj +rl-rq +vx-jh +bi-xh +fy-hf +py-ru +kr-lg +in-xo +fr-hl +os-ev +aw-lq +cb-tr +uu-yn +qk-wk +du-av +uu-uf +kc-au +vq-vh +ra-jm +gt-hw +wj-rk +hq-tb +jg-sm +im-yf +tr-mb +qk-yj +wq-ep +sk-su +et-nm +fo-ot +ea-gd +jh-sl +sq-dr +if-qh +dm-di +lr-rn +av-ha +an-uu +gb-cq +ul-jn +wp-lt +zs-nc +kd-nc +gc-ff +hz-to +bp-qr +sa-ex +cc-pd +bd-uw +ak-gw +gm-da +gv-uw +jd-ap +lc-vy +mq-iv +gz-jm +yf-xa +bx-uv +mu-oo +dy-wu +nb-eg +ai-bw +sx-la +nx-em +mw-uw +rf-ty +gc-zb +cw-ak +yk-pr +qf-cx +bo-lg +lm-sn +fk-ca +lo-me +ha-fc +ef-ap +rb-qm +fd-pq +xv-jz +ae-av +hs-xp +sn-ui +sz-la +gq-ev +hb-dd +hq-aa +fu-kz +zx-sl +zv-ef +nj-wp +nq-hk +er-ch +hw-sx +ox-kd +vq-gv +fy-uz +xe-ak +vr-rz +iz-eq +oq-tk +kp-ui +cj-ty +tn-ku +no-dq +ib-il +wv-pj +le-zs +hn-sl +te-ds +vw-or +sd-ys +nn-lg +nb-sp +zt-mn +qd-mp +ig-ku +eo-oq +gm-vy +lq-jf +xp-xc +og-mh +zi-xq +tn-xz +cz-ba +as-sj +ro-nu +ia-hl +ae-op +cd-ps +tt-jb +to-dm +bu-hg +yf-dq +fp-ls +dl-oj +nj-ui +st-ee +mc-kk +ix-bh +vd-gh +sm-yr +st-zs +sb-ak +ue-ux +it-yx +jg-yr +lp-il +zw-vq +dd-rw +zb-fl +gx-gw +gv-vh +dh-pj +ot-cw +xk-xh +la-mc +ql-ww +fk-me +iv-lg +qf-hf +lv-cn +zs-ye +ah-bi +wk-lk +to-ml +rq-fp +vb-vd +bo-gp +vw-gs +yv-fx +ka-bs +vb-pi +rv-ai +fw-mu +zd-ac +vy-ni +nq-cs +tj-ce +mu-hu +ul-ac +dt-jn +po-tq +py-bi +zw-on +dg-st +xu-nx +lr-bj +hb-he +ze-ra +ws-yw +no-cz +xf-fj +hg-cp +eq-er +kc-bj +pq-wm +bs-bq +ew-iq +ah-xk +zb-im +ql-et +cq-yu +wu-tn +fz-ol +ng-ew +fd-pl +on-dn +ys-wg +qn-bd +ju-lw +iw-fw +yr-fg +az-rx +zx-vx +pi-sp +ib-wk +zk-po +sc-ij +ua-jg +ty-rx +ek-cd +gd-kz +du-bm +os-am +rl-bc +wa-ij +ca-mj +lg-ko +aj-gl +lr-ux +nj-sn +dl-ji +ot-tx +zv-do +ru-og +vt-jj +tn-fn +uh-vl +rs-wo +gn-th +wi-qi +yw-jk +oy-lz +rg-td +ds-mf +gy-yy +ta-ps +no-bf +jd-do +jg-pj +lr-zc +xe-ff +vd-nb +yv-gx +cu-pm +gn-ed +wk-yj +yl-qw +id-yk +go-jd +vb-eg +vw-gy +xs-nq +az-lt +bd-en +vt-fp +ht-gq +qi-jr +lt-lm +ff-ol +jl-cq +tq-pl +pg-bl +ah-ep +ma-wc +jg-zz +vy-jr +ai-nm +il-ph +cx-tt +hv-eu +hy-te +am-pl +ku-dy +so-tn +tk-hg +tj-vw +ex-fy +jl-wh +xx-th +qi-ws +vi-ti +uw-vq +dz-mf +pc-kr +tj-tv +js-sb +le-xo +tt-bt +hg-eo +dr-ss +dt-gc +ei-pj +ef-do +dl-ka +ow-hy +kv-wo +en-kl +yu-vo +hs-an +bs-oj +zv-xf +ka-am +xb-yw +nt-ir +sj-uw +dm-hz +hv-dx +pc-qd +pe-gy +ua-ei +yw-wi +er-fk +cb-iq +bo-qd +tz-tl +bf-tk +rn-eu +ft-bc +og-hi +ey-fa +nn-kr +yc-bo +fi-kc +sx-sz +ro-fr +tl-go +bt-ex +fy-cx +mt-ba +qw-ff +ox-le +ps-xa +mu-hw +yr-rh +ag-ia +ld-ve +tz-sz +am-kq +jc-zv +il-wk +sn-kp +nh-xq +ds-rz +bf-cp +jj-rq +sm-wv +wv-rh +ds-hy +xh-yu +sb-tx +xu-vv +vm-xf +vl-cq +dz-te +dz-rz +le-st +eq-ch +zi-bp +wa-yp +ir-ro +jz-tj +po-cq +jy-mt +yq-bb +zk-vo +ku-xl +td-xm +dg-ju +oo-kk +tb-sv +go-ap +gi-vi +xj-qm +au-yv +tz-zv +ze-fx +pc-gp +if-ug +qy-zg +vy-wi +qk-sc +tk-qz +sr-cr +hn-pq +ve-uo +lz-ac +vc-io +wm-hn +nz-ta +fj-rl +lv-ye +wq-py +id-va +dl-tq +bh-nx +jy-if +dd-xj +cd-yf +at-nj +hk-qj +kk-hw +nz-ps +uo-rw +en-pn +mx-dw +iw-mu +py-hi +ud-ix +fs-bf +uv-tn +ij-lk +vc-zk +ub-os +wn-co +ng-te +tq-mi +eo-tk +if-hz +je-cd +os-ll +vi-xp +pf-hx +aa-ea +rv-oy +zm-hn +lo-ng +pn-hu +he-ve +bu-gn +if-mt +sz-fw +as-zw +fi-ey +jr-da +pq-vj +cz-cp +vr-ds +qq-vr +al-dh +uh-rn +cq-vc +bs-ye +lt-sn +vr-li +ok-ox +wn-dr +mt-qh +no-qz +xw-cb +ao-nn +gg-ca +mw-jx +oo-gt +dy-so +at-wq +yd-eq +gt-gd +gq-qn +ef-tl +nx-mx +lt-rf +su-tb +jp-xx +tv-or +xe-fo +hn-xj +wk-yp +cd-xa +xj-hb +vh-mw +ta-xa +ze-za +qb-zt +tv-mz +fz-vb +nc-ee +oc-ml +df-lo +tx-ak +st-ok +li-yg +xt-ij +ym-ku +yl-fl +ka-tq +hn-kx +qi-lc +id-av +lr-xm +wj-yn +dq-oq +ic-ro +fi-lr +gi-uu +ef-vm +fe-zi +dy-ym +gb-vw +hw-oo +jd-xf +kp-az +vc-gb +ix-mx +od-aw +yf-ps +kk-sz +rg-ey +jc-ef +ro-ia +ql-ai +qp-ml +bw-ql +yu-zk +bg-er +pq-vx +ww-ny +le-dp +cc-vq +po-gb +ty-zo +cv-tr +eu-kl +dl-bq +pi-dn +kv-by +by-th +fo-tx +ek-fq +cz-bf +zr-cr +uv-so +wy-qf +ng-xw +da-vy +yb-fh +rr-tw +dp-kd +ue-td +he-ld +sl-pk +jq-ti +kv-di +xv-mz +uy-eu +lc-xb +ql-rv +am-dl +qw-fl +wm-zm +kl-gq +ek-ab +jg-al +vq-kk +re-vz +ag-ci +ft-qy +wc-ab +df-tr +rg-bj +dt-bz +br-xl +fe-uh +cb-ng +oq-wl +xh-ah +or-jz +zc-ey +rf-wp +su-fc +cd-wc +xz-uv +qq-yg +fx-tn +po-uf +xv-gs +ry-jc +se-on +nj-az +qf-ex +ev-pa +wm-ta +pm-xs +wg-du +fn-so +mc-tu +ga-bp +rq-sw +yd-ib +nd-yo +vt-ft +wp-ty +wx-tb +te-rz +yy-ce +kz-sk +in-la +jc-tz +ty-lm +rm-tx +pk-wm +zu-uw +fz-oz +ua-yr +eu-fe +hg-dq +jj-fp +oz-pi +sx-tk +to-ug +pr-wg +lo-xw +pf-ud +de-ff +ah-mh +jp-mq +dw-pf +gd-wx +jm-mo +pi-se +hz-jy +va-bm +pg-uz +dm-if +zk-gb +rm-fo +wg-ae +dh-ua +wl-hg +dx-fe +lr-kc +qm-ve +ab-fq +fi-yz +gh-fz +uo-kn +ew-mb +yu-ph +jb-fy +it-iz +ue-xm +os-ht +td-ey +fk-we +em-hx +dh-jg +fd-pk +mj-hm +vt-sw +tv-xv +xp-gf +sm-zz +mn-pm +le-ok +su-sv +jj-qy +br-uv +ix-hx +ok-zs +ch-iz +gw-xe +fm-yw +yc-nn +rq-bc +bc-ls +li-dz +am-cn +ni-qi +nb-pi +il-wa +xw-tr +wo-xg +aj-sf +wj-ti +co-ys +qk-ij +ot-gx +fw-in +ed-mq +jq-gf +sr-nt +yz-td +qs-me +pa-en +xv-or +xz-qy +or-pe +cw-ji +kk-in +ng-iq +gq-ll +se-oz +uf-wh +jz-gy +on-gh +qm-ms +do-ry +ga-qr +tz-fj +uh-bp +qd-cg +hv-fe +jk-vq +oz-dn +ho-qm +uq-ha +mj-bg +hs-rk +et-ai +th-rs +cw-tx +yj-yp +xj-un +rb-uo +qp-to +sk-kp +qd-ko +fy-pg +wu-xl +yg-ow +qb-cb +bx-ku +az-ui +dq-fs +fc-ea +pm-hk +oy-nm +xh-mh +bw-lz +xl-xz +na-xu +au-fx +uw-vn +ds-kn +rf-zo +gg-it +jh-zm +ek-cs +sj-gv +bw-ww +dd-ve +yj-wv +cp-qz +zi-uy +wu-ig +gp-js +rq-vt +ew-xw +wh-po +jq-hs +fn-xz +tj-gs +un-ho +za-ra +an-ti +vo-cq +xm-wh +fl-bz +ju-ee +sz-gt +bl-sa +na-ix +ux-ey +lk-qk +mq-kv +bx-tn +fl-nq +sq-lz +ug-oc +lq-sd +jb-cx +ga-dx +rh-zz +ze-db +by-aa +ul-bw +ul-nm +ub-hu +tq-oj +fk-iz +fl-dt +ru-at +ud-em +gb-yu +vt-rl +cg-mp +xe-cw +hf-cx +gv-jx +jx-vh +bj-tv +kd-xl +by-iv +mf-fk +zw-sj +fl-ff +of-dz +ef-xf +sq-nd +ju-dp +ug-qp +xt-yd +lc-wi +pk-pd +eg-vd +qy-bc +ot-ia +av-pb +ko-js +tb-fu +zd-bw +tn-br +kh-ky +gn-xg +fo-gw +zi-rn +er-we +xb-gm +fh-zg +ao-cg +gn-xx +xm-fi +vb-nb +oo-in +gh-eg +eq-yx +ha-pb +qf-fy +vr-te +wl-cz +ce-gs +kl-qn +dr-vm +cw-rm +wl-dz +aj-xs +wx-su +av-op +js-bo +vt-ls +ps-ek +op-pb +ei-oa +rg-ux +pf-xu +zz-oa +yz-ue +oa-dh +qj-gl +wg-id +gq-pn +zz-dh +un-he +lk-ib +bz-de +tw-ng +wy-bt +sk-hq +gz-kh +ds-dz +ln-ix +pa-bd +hz-ls +fk-yx +ug-qv +uz-qh +na-hx +cs-aj +vi-yn +yv-sg +qi-hy +ci-ic +lc-en +he-qm +ao-ko +un-ld +sx-ah +fn-dy +ba-dq +xq-eu +kh-mo +hn-zx +ny-zd +lk-sc +ma-yt +gh-ny +vy-gs +du-uq +nn-pc +mz-pe +kd-ju +qy-fp +sc-lp +pe-ce +il-lk +za-db +iq-xw +cb-df +rr-iq +fq-xa +ew-df +hl-ic +oo-fw +ao-qd +ca-hm +zd-ql +ee-zs +je-ma +ep-at +vm-ry +xo-nc +mz-vw +qi-fm +za-iz +uy-ga +rb-he +ko-nn +rq-ls +nq-mn +bm-wu +zi-ma +uv-ig +hf-sa +st-ju +ol-eg +on-pi +xt-lp +hq-su +ox-lw +et-ul +dn-fz +pl-oj +ug-qh +sl-vx +bd-gq +fa-rg +ji-tx +ny-ql +xl-ga +bj-yz +ln-ud +mh-ep +hs-yn +kh-za +oo-la +og-xh +wl-eo +nc-dg +rb-hb +bm-wg +vr-ey +pg-qf +ah-hi +fd-hn +nv-dh +oz-vb +dq-wl +by-mq +iz-er +go-jc +bb-yl +bz-gc +it-er +if-to +wp-rx +qn-yp +mf-hy +as-vh +qb-xs +lp-jd +fc-sv +ba-tk +lo-iq +zt-aj +nd-if +we-yx +ni-wi +jb-wy +tt-pg +cz-oq +xf-qp +mh-wq +hm-gg +jl-vl +kn-ow +ia-ic +je-ab +fi-bj +yj-il +sl-fd +we-bg +tv-pe +sd-co +lg-pe +gx-ou +ae-du +ju-ok +xl-so +dl-kq +sv-re +ux-fi +im-fl +ab-nz +pf-na +wa-ib +am-bq +dm-qh +hi-mh +ed-by +kn-yg +fs-ku +tj-it +zz-nm +hw-la +bi-ru +al-nv +ms-xj +pe-zp +zv-go +ky-ra +nn-js +rk-uu +ws-wi +il-yd +ey-lr +py-mh +av-pr +ib-xt +dx-eu +cj-lt +de-qw +bi-tw +dx-ac +di-ug +ra-mo +bm-pr +zu-jx +sb-fo +jy-to +cw-zp +ga-zi +ea-tb +eq-gg +ry-zv +xv-tj +xj-kl +tv-zp +tv-gs +pd-vj +yj-sc +ex-pg +rm-sb +fu-sk +jd-zv +jy-qv +xo-dp +ef-jd +ji-gw +mb-iq +am-ye +nh-zi +ta-yf +na-dw +qq-rz +wa-xt +fg-qi +yw-ni +lg-js +re-kz +tl-ap +wq-pb +fy-sa +yo-ss +di-ml +fi-rq +he-xj +aw-ys +zo-az +dm-ml +ei-zz +uq-pb +ho-dd +fq-nz +po-vc +lw-ee +sk-gd +du-pr +am-mi +fg-fm +kp-rx +ql-lz +zm-vx +vo-vl +de-yl +pr-oq +co-jf +an-vi +ft-rq +cr-ia +ro-nt +nd-ys +by-wo +nv-ei +gf-xc +eq-hm +yb-zg +ig-ym +gy-tv +hg-fs +vo-wh +rg-xm +ru-vz +jk-sj +ud-zk +fh-ls +rx-lt +gg-ch +st-ox +cw-sb +xw-mb +bd-ub +ev-ht +qv-to +ir-ua +ea-sv +va-av +fg-gm +wn-yo +cz-dq +su-ea +al-wv +ea-re +qq-li +jm-yv +bq-ye +fg-xb +aw-kz +fu-fc +ta-cd +tu-gt +aa-gd +fr-nu +dt-im +oc-qp +zp-ce +ag-ro +bw-ny +mq-wo +xg-jp +cx-pg +rb-rw +ry-tl +of-yg +mp-kr +uu-hs +sn-az +pm-aj +ms-rw +xo-ee +qh-ml +wa-db +mz-gy +dy-ig +no-oq +eu-uh +jp-gn +zr-ag +qi-gm +rn-bp +yu-po +ys-wn +jb-pg +iv-xx +so-ig +jp-kv +bo-pc +oo-mc +rx-nj +ky-jm +cd-ma +ci-nt +mu-la +yk-uq +tw-tr +jm-fx +sb-ou +cp-oq +wn-aw +tz-xf +aa-sk +so-fw +nz-ek +xb-ws +zc-fi +gs-rz +ul-ww +lz-ny +gf-zw +ma-xa +wx-hq +yq-pf +fu-re +yx-mj +ic-ir +au-mo +sk-tb +gd-sv +iz-mj +jx-vq +dh-jb +vn-mw +tb-kz +og-py +xb-ni +cq-wh +ao-gp +wv-ua +qk-xt +qm-un +pk-jh +ag-sr +bg-ch +xf-ap +og-at +pj-yr +xj-rb +xc-vi +xm-yz +xq-qr +uf-jl +lp-ij +lw-dg +tt-hf +ht-bd +xk-ep +gv-as +pb-wg +yp-lk +wc-xa +dt-bb +xw-df +xk-mh +ps-ma +fx-gz +rf-lm +jc-jd +rl-fp +dl-lv +gw-tx +qy-ls +kx-fd +wj-gf +pn-bd +wj-ai +ag-nu +de-zb +lq-ys +rm-qs +pj-rh +zg-bf +ac-ww +so-br +kc-yz +pm-qj +bl-cx +vl-gb +nb-se +of-mf +fh-sw +jx-jk +sd-jf +hs-vi +yl-zb +nj-lm +mo-ze +qp-hz +so-bx +ib-li +cd-ab +cp-ba +va-pr +ry-ap +jz-rh +an-gi +ic-nt +op-wg +pe-tj +pf-nx +mx-ud +yl-jn +au-za +su-kz +ma-ta +xq-fe +rn-xq +fs-tk +ub-pn +tv-vw +yp-ib +hq-gd +pr-ae +ww-iq +co-od +de-ds +ci-fr +mi-pl +pb-du +db-au +ye-kq +wg-ha +di-qv +qp-mt +db-mo +cz-eo +cu-sf +rv-bw +ev-pn +bi-hi +da-vo +mu-tu +sc-il +kd-st +we-hm +qs-ji +ew-me +do-ap +xb-jr +bu-wo +na-oy +dd-qm +tr-rr +yz-zc +dx-qr +hy-yg +qs-xe +za-jm +fu-su +fx-db +ed-jp +bx-br +mf-qq +su-aa +yo-ys +cq-uf +mq-lt +yr-nv +uq-pr +yl-yq +ht-en +ey-kc +vh-uw +hk-cs +za-yv +yd-lp +da-wi +de-yq +ue-lr +nm-ny +fm-ws +oz-ol +wh-ph +xt-wk +ka-lv +jq-gi +bx-xz +mx-hx +az-cj +sb-gx +iv-jp +ix-pf +cd-xu +tz-jd +oq-bf +cv-ew +kx-zm +qr-yn +qy-vt +oc-hz +jf-sq +an-rk +xf-jc +gf-hs +ch-fk +wo-bx +jl-vc +gh-pi +rb-ms +br-wu +ph-vo +mx-ln +yq-jn +vx-fd +yd-sc +ig-tn +tk-cz +hk-zt +rr-df +lo-cv +od-wn +sg-au +bl-uz +dz-kn +da-yw +rm-gw +ph-io +jq-tr +ml-mt +gt-iw +ru-xh +rk-vi +pb-pr +sc-wk +jy-ix +cb-ew +rv-cx +ba-bf +ra-gz +qj-pa +em-hs +ms-dd +yy-vw +sv-wx +qh-oc +al-zz +js-cg +vx-rk +eq-fk +fw-mc +zb-qw +rs-ed +yp-sc +ui-ml +yf-yt +aj-cu +rf-nj +qj-qb +ku-wu +vc-uf +xb-yx +pk-hn +fl-yq +im-yl +tz-do +yf-wc +uq-ae +cz-fs +hm-yx +al-yr +ak-ot +jb-ex +nx-bs +fq-cd +yg-te +ra-io +kc-ue +se-pk +fo-ou +bu-xx +li-mf +ce-tv +aw-ss +sk-ea +gd-fu +te-qq +jq-rk +vr-mf +ep-ru +ti-yn +qp-jy +yn-jq +ew-tr +pg-sa +he-uo +cu-nq +lz-rv +fy-tt +dn-ol +uz-jb +ft-sw +uy-rn +fn-uv +ls-jj +ir-ag +ue-fi +xl-tn +mt-ug +gp-ko +wl-fs +lp-wa +xc-wj +fh-qy +sn-rf +em-dw +tu-oo +we-gg +it-ch +lr-td +wx-aa +zt-nq +ps-wc +zw-vn +ua-al +cg-kr +tn-dy +sf-xs +sd-yo +de-bb +zu-cc +de-jn +mj-it +ma-nz +sx-tu +vi-wj +nx-ud +or-ce +hm-bg +pn-ux +va-ae +oc-hq +ps-je +th-kv +kr-ao +ox-ee +tu-sz +bs-pl +vz-xh +fw-tu +xw-me +yp-il +cw-ou +mz-or +ht-qn +wl-ba +xo-ox +xu-ud +pl-kq +mt-dm +ml-qv +di-yk +uq-av +os-pa +iq-cv +rl-yb +fo-ji +pc-lg +hx-xu +mi-kq +zt-sf +zr-fr +yu-vc +vv-na +vv-ud +ub-ll +xq-uy +cu-xs +xl-fn +au-ze +gs-gy +ae-ha +ab-ta +cn-tq +rb-un +zr-ia +fh-jj +re-hq +hb-un +sg-ze +ux-bj +jl-po +di-mt +xm-ey +je-xa +qd-js +wp-lm +dw-hx +wy-pg +je-yt +mz-gs +cg-yc +sv-fu +eg-se +hy-kn +gz-yv +dy-uv +eg-pi +ta-fq +vj-vx +st-nc +di-qh +je-ta +sl-vj +qn-ev +lq-ig +ys-he +sz-in +yg-ky +vd-on +td-zc +fs-qz +on-ol +cx-sa +yl-dt +wi-xb +do-go +ky-db +lw-xo +xc-ti +fz-on +fo-gx +tu-kk +fg-ni +yt-cd +jp-rs +je-wc +em-bh +th-xg +rr-xv +yu-wh +rk-xc +qz-dq +ps-yt +ji-ou +qk-il +sm-bg +nz-yf +gz-ze +os-bd +oq-fs +fa-yz +vz-bi +hy-of +ql-ac +vd-dn +pe-gs +wv-yr +re-su +bl-jb +yd-yj +nu-ia +pn-pa +sz-mc +mc-gt +ds-ow +mo-za +vl-uf +nq-qj +on-oz +fr-ir +xz-so +bq-mi +jb-bt +vy-ws +th-ef +cn-pl +zm-fd +bc-vt +xc-hs +bp-ho +ox-dg +qz-wl +nx-hx +pf-bh +vb-dn +gv-zu +in-sd +ty-ui +ed-xg +eo-no +vj-zm +le-zv +ib-yj +vi-ev +nu-zr +ij-yj +hf-uz +uq-op +qq-ow +yp-xt +xe-sb +pf-ln +pj-sm +rw-ho +hs-wj +mo-fx +ui-lm +vj-fd +ek-ta +st-qz +fe-uy +pa-qn +ey-ue +xh-wq +ia-sr +hi-ug +os-pn +en-ll +fh-rq +cr-fr +lg-ao +bz-yl +xo-zs +wn-ep +fz-nb +xs-mn +bi-xk +ls-sw +hq-sv +ew-lo +kr-bo +em-jx +io-vo +gt-kk +bb-zb +tb-re +iv-xg +nm-ww +fh-rl +cr-gi +fq-ma +sq-lq +ic-ca +yq-bz +wa-qk +db-yv +sf-qb +bs-am +kp-lm +tz-ap +vw-xv +ru-xk +cj-kp +oj-bq +dq-eo +rw-he +bz-im +vz-xk +tl-fj +ex-bl +jl-ph +sc-ib +qp-qh +mx-xu +bj-td +gx-ji +qv-oc +fm-vy +tb-fc +mu-gt +ue-zc +sl-zm +xj-rw +se-ol +mq-bu +jc-fj +iv-wo +th-ed +re-sk +hl-cr +kh-ze +yn-gi +yo-od +nh-rn +fs-cp +wc-yt +ft-fp +sr-zr +gl-xs +ra-au +pr-ha +cr-nt +gf-vi +le-dg +ft-jj +nj-cj +jk-cc +sq-wn +pk-vx +tt-wy +et-bw +nu-qf +dd-rb +pn-ht +qv-qh +os-hu +nm-lz +mi-ye +ku-fn +wo-ed +hm-ch +fa-bj +aw-co +vh-sj +kx-vx +lz-ai +oo-gp +hl-ag +mq-xx +gt-fw +nh-hv +ae-yk +uv-ku +ye-oj +ee-xg +uy-hv +yt-nz +bx-ym +kl-pa +rz-mf +rb-ho +hk-nm +kq-bq +mu-sx +zg-ls +ro-zr +ib-ij +td-fa +gc-de +fa-kc +by-xx +ll-hu +nh-fe +yx-ca +zx-vj +vc-sj +cb-rr +yc-js +rh-jg +ij-wk +ms-ho +in-tu +ae-bm +fc-gd +hf-pg +kl-pn +ci-ia +ht-ub +rb-ve +qm-hb +lw-su +un-ve +tl-jd +fk-bg +ko-yc +zt-gl +gb-ph +tj-mz +oc-to +oa-nv +xp-uu +fa-zc +kl-ev +ga-fe +vl-io +tw-mb +ee-kd +rv-et +zd-ul +pa-gq +lw-st +jk-vh +jz-gs +go-fj +ao-js +pc-yc +yv-ra +bt-qr +or-zp +br-dy +zx-zm +of-li +ab-xa +xc-gi +oy-ac +lv-mi +sp-ol +cu-gl +qb-pm +xw-rr +nt-wi +fj-ry +bc-fp +kn-mf +zi-hv +op-id +jg-wv +wa-lk +zs-lw +qn-hu +tw-cb +fx-kh +iq-me +ek-yt +vd-nh +xs-ex +bt-sa +dd-cn +hz-mt +ka-kq +mb-rr +fg-vy +st-dp +ma-zd +ji-rm +xe-ji +il-ij +dl-mi +ei-dh +cr-ir +dw-ud +ow-sr +fq-yf +xp-rk +hx-bh +iz-bg +mo-sg +wy-ex +hb-uo +jz-zp +jr-td +zz-pj +zr-ci +lq-yo +sz-iw +em-mx +gx-rm +tq-bq +cs-mn +zz-yr +vy-yw +wa-yj +ny-ul +ir-hl +en-hu +mw-as +mf-te +xv-pe +vv-mn +sx-kk +dz-ow +oa-on +hv-uh +tu-hw +ps-ir +zr-nt +po-vl +df-cv +qq-kn +fn-bx +ni-fm +vz-ep +jy-di +ci-ro +oj-bj +tt-ex +jn-qw +fl-jn +dg-ee +ac-rv +fw-kk +du-dn +pm-nq +bb-bz +lz-ww +jn-zb +rn-fe +tk-dq +jd-ry +sq-ss +db-ra +gs-or +vr-yg +wx-fu +mb-lo +vn-gv +hl-sr +dl-zt +kx-jh +zw-cc +gt-sx +ln-em +da-lc +yk-op +gz-mo +gc-yq +lt-kp +sf-mn +ls-ft +vi-uu +ka-mi +qk-ib +lq-dr +ky-au +ap-zv +tj-gy +uo-ms +sj-vn +gw-cw +zp-xv +zd-et +ln-xu +rs-kv +fn-ty +cx-uz +mn-cu +pf-mx +ss-co +vr-kn +an-ox +ru-mh +hg-oq +mc-mu +xg-by +ia-ir +zx-ql +fr-oz +gn-mq +yx-iz +le-nc +sn-rx +xt-vh +sl-kx +jy-qh +dd-ld +hb-ld +qv-mt +wu-bx +rx-od +hi-ru +rk-gi +kz-hq +do-tl +mi-oj +gg-fk +uz-wy +zr-xw +oy-ww +ka-bq +aa-re +vz-hi +ye-tq +ml-hz +cr-ic +zs-kd +ju-le +eo-fs +vl-ph +dt-yq +of-ds +pm-gl +bh-vv +vm-jd +ch-we +qr-zi +mh-yc +fq-yt +tw-cv +gz-db +ha-op +xp-ti +uf-gb +ze-jr +fx-ra +du-fh +nv-wv +kv-bu +kx-xm +nu-hl +nc-ju +az-wp +gv-kq +xf-ry +ql-ul +df-tw +ei-rh +hg-qz +bp-uy +nd-lq +lc-ws +nd-sd +cc-vh +qs-ot +mo-ci +fd-zx +hz-ug +fp-yb +sg-za +yy-gs +fm-da +xv-ce +ig-bx +na-mx +gm-ws +ra-kh +gh-oz +aj-an +wc-nz +jc-py +fw-hw +bh-dw +rs-xg +uq-wg +no-cp +yw-lc +dz-tx +al-sm +jp-bu +cs-nb +kk-la +ak-ji +id-bm +ou-sc +zu-vq +bb-gc +bc-sw +qq-hy +fz-vd +hu-ev +yc-gp +ys-sq +of-rz +uy-uh +at-mh +cd-nz +tu-iw +pc-mp +zg-la +yr-dh +cs-qj +gh-se +bo-mp +pq-sl +pf-vv +hw-to +od-ys +mo-ky +yf-ab +sv-kz +gx-qs +xg-bu +jm-yy +un-ms +yr-ei +jr-lc +hn-vj +ha-id +tv-yy +ol-nb +gh-dn +pd-hn +cu-cs +kx-vj +ho-ve +pd-kx +yt-ta +wk-lp +fw-la +uf-vo +kz-ea +kk-iw +cj-lm +fs-no +kv-xg +xm-kc +nx-na +et-qq +yb-qy +gn-wo +cb-cv +lq-od +im-qw +mw-jk +al-oa +ia-nt +yq-zb +en-ub +ub-ev +rm-ot +jr-ni +so-ym +ka-cn +wk-yd +kr-jf +tr-lo +wm-sl +sw-fp +zs-ft +fg-da +ss-sd +jj-yc +nv-zz +oa-pj +gf-rk +qq-of +wn-sd +vl-vc +ac-et +gf-ti +hy-vr +ss-nd +tl-vm +dz-hy +rn-hv +ok-nn +wm-vj +gd-su +eg-wy +ek-yf +gl-hk +dt-yn +rl-ls +wc-fq +sq-yo +tb-aa +ot-xe +jq-xc +rq-zg +on-vb +nt-hl +un-dd +bp-dx +io-gb +oa-sm +fe-xu +vt-yb +nc-hi +dr-ys +bo-rf +bs-dl +jc-ap +qf-tt +og-xk +pn-qn +sf-hk +yc-kr +zo-nj +to-qh +wn-jf +mz-wk +dp-dg +ww-ai +oj-am +kn-rz +dx-nh +xx-kv +fr-nt +hv-mi +aw-yo +eq-bg +zc-rg +ci-cr +qb-aj +jq-wj +lg-gp +jq-vi +mb-df +ix-xu +ho-hb +co-sq +tu-wp +lk-lp +zw-gv +zw-jx +lr-rg +gq-ub +dr-aw +th-wo +kc-ux +zi-dx +eq-we +ud-na +yu-io +lc-gm +wa-wk +sz-mu +wq-hi +yd-qk +gx-tx +xh-hi +dy-bx +gl-pq +ak-qs +zp-tj +pk-kx +bh-xu +cs-gl +te-li +bc-zg +ae-dp +kq-cn +ml-jy +ev-en +lq-co +bh-ln +bg-ca +ws-da +ia-fr +en-gq +fd-pd +qw-bz +ka-lk +aa-sv +zi-uh +uo-dd +ah-wq +ju-dm +hg-cz +ny-oy +ga-eu +br-xz +wg-va +zr-ir +co-dr +bj-zc +qr-hv +rl-zg +xl-dy +sr-ro +jr-wi +qb-cu +ol-vb +wx-re +bi-og +ji-ot +sr-ci +cj-do +of-tt +uw-cc +hw-iw +ll-ev +cu-qj +qf-bt +fo-cw +cg-ko +tw-xw +du-yk +vn-jx +nj-lt +fo-gg +au-gz +ag-ic +gf-yn +ek-je +dh-rh +te-of +yv-ze +nm-zd +gi-gf +do-vm +eg-sp +gz-za +pc-cg +pi-ti +ws-ni +dm-jy +zp-mz +me-mb +gq-os +qi-vy +lg-qd +cj-rf +uu-ti +xt-il +pq-pk +jq-xp +fl-de +xf-do +ea-wx +te-ow +ok-dg +dz-qq +gl-qb +va-vm +rx-rf +yb-ls +zx-wm +lv-am +au-kh +td-fi +qv-ym +qz-oq +ky-gz +bm-uq +ym-uv +ve-hb +bp-xq +mo-yv +xz-ku +go-tz +he-ho +xj-ho +zw-mw +av-bm +rs-by +as-zu +ac-ai +iq-tw +jz-yy +ow-of +kx-wm +no-lm +tr-me +jq-an +fm-lc +qb-nq +cs-pm +ko-bo +gd-re +yq-im +ah-ru +iq-tr +py-ep +ty-nj +rh-oa +ok-ee +bl-hf +ga-nh +eg-dn +dw-ln +lz-ul +sj-jx +ce-mz +qr-fe +pl-dl +ru-wq +ac-nm +zw-uw +aw-sq +al-rh +bs-cn +sm-ei +ww-et +eo-ba +sg-fx +gv-cc +ed-bu +mn-aj +wu-uv +cp-eo +hv-bp +ai-zd +ok-dp +av-mj +id-ae +wm-pd +sk-fc +bd-hu +er-gg +rl-ft +dg-ss +gc-qw +jk-gv +fh-fp +sp-oz +ig-fn +xq-sf +xq-hv +mi-bs +pb-bm +uw-jk +go-gm +sw-yb +ue-rm +br-ym +ff-dt +bg-gg +vc-wh +uz-sa +ud-bh +sr-fr +oc-di +uu-wj +ln-vv +pj-nv +op-bm +wh-io +fc-re +ms-hb +lr-yz +bh-na +ox-ju +vl-zk +jz-ce +jg-ei +oj-kq +ku-so +lm-az +yo-jf +kl-ub +yq-ff +xj-ve +jm-db +wp-kp +fr-ag +kp-ty +zs-ju +zx-pd +id-pc +bd-kl +ni-da +uh-dx +vo-jl +sw-zg +zw-zu +zo-kp +ht-ll +cg-gp +qf-jb +xx-id +kr-js +qd-kr +cn-bq +hm-er +jg-nv +as-cc +vh-vn +xp-an +hi-xk +qj-mn +oz-nb +jh-wm +wa-yd +oy-zd +qd-tz +pn-ll +dp-az +ql-oy +de-im +nj-kp +te-kn +rf-az +dz-vr +je-yf +ph-uf +cv-rr +rr-me +ib-lp +yv-ky +ff-yl +in-mu +vz-ah +bd-ll +ll-kl +vv-mx +cn-mi +nc-lw +ey-bj +th-jp +ag-nt +kd-dg +zk-wh +yj-xt +hx-vv +zp-vw +gm-cn +ix-em +ig-br +bq-lv +zk-io +ty-sn +vw-jz +qb-mn +os-qn +dg-zs +on-eg +sr-nu +sm-ua +bg-it +uh-xq +nd-co +ry-ef +bq-ce +fz-eg +ws-fg +lt-ty +yj-lk +vm-jc +em-pf +hb-rw +qp-if +xk-cp +jk-vn +pb-id +zo-cj +xl-ym +ph-cq +bh-fy +ln-na +ci-nu +qj-sf +op-va +pa-ub +cj-wp +jy-ug +yw-gm +hs-gi +uy-nh +fm-jr +jh-zx +bb-qw +qb-cs +mn-gl +fc-aa +kr-ko +jn-gc +rl-jj +cu-zt +fa-xm +pl-lv +mp-lg +ld-ms +wu-fn +th-mq +ny-et +sj-cc +rl-qy +wl-mp +lq-ss +bg-yx +wx-dh +hl-zr +tj-yy +iv-kv +og-mq +lk-xt +yc-ao +wi-fm +wm-fd +ot-sb +li-kn +pm-zt +vz-py +fy-wy +ot-ou +yn-xc +gp-qd +eo-bf +vv-em +io-cq +zg-jj +cz-qz +ua-zz +va-ha +du-op +ng-me +bj-ue +iv-th +pg-bt +un-rw +sf-pm +hg-bf +le-kd +zg-ft +ix-vv +mw-zu +zx-pk +rg-al +sn-yb +wx-fc +fe-bp +cj-ui +me-df +va-uq +pa-ll +bh-mx +vn-vq +fo-ak +xk-at +dn-nb +ew-tt +py-xh +at-hi +if-oc +mb-cv +yo-vt +vo-po +bo-nn +yo-dr +bz-ff +ap-kz +ey-yz +fg-jr +xu-dw +ew-rr +sc-wa +pb-va +tl-tk +sb-gw +hz-qh +tw-ky +me-cv +do-jc +sg-ky +ep-bi +ij-yd +fs-ba +au-jm +fo-qs +gw-qs +yc-qd +va-yk +gn-iv +gn-by +we-it +pe-jz +ou-rm +je-nz +ok-lw +ca-we +ve-ms +rs-iv +xb-fm +tr-ng +hz-qv +wp-zo +pc-ko +td-ux +ux-xm +oa-wv +ng-cv +tb-gd +nu-ir +if-ml +vt-fh +oa-ua +ml-ug +uq-zo +ef-fj +rz-hy +zk-ph +eu-qr +mp-js +cu-hk +mz-jz +wv-zz +xl-bx +jr-ws +no-hg +it-hm +fl-bb +ah-og +ic-sr +no-wl +ny-rv +ac-bw +ea-cz +fz-pi +yl-pg +ym-wu +ni-lc +cn-oj +vx-pd +rs-mq +pi-ol +ga-uh +nn-qd +ws-yd +br-cg +he-ms +sq-sd +eg-oz +hf-ex +jh-po +er-bw +zk-cq +xk-wq +qi-yw +zk-jl +xe-tx +xs-qj +lv-kq +nh-bp +ea-fu +wn-nd +rv-ul +xt-sc +oz-vd +gt-in +al-ei +lc-fg +rx-lm +nx-dw +gh-nb +bt-hf +uy-qr +bm-yk +bb-wv +gq-ph +mt-to +xj-ld +hw-in +at-vz +wq-vz +ft-fh +ny-ac +ba-no +jl-hb +xz-dy +op-mc +sj-vq +xm-zc +rk-ti +zx-pq +dn-se +cx-wy +cv-gc +yw-fg +ff-jn +bt-fy +ao-mp +nb-on +dt-qw +wn-lq +fa-fi +fg-wi +as-vq +py-at +io-po +fa-lr +ni-ak +sj-mw +gc-im +rw-ld +tz-ry +se-vd +yb-bc +ua-rh +kr-gp +do-fj +wj-xp +aw-sd +ai-ny +ef-tz +zu-uo +dq-cp +gh-vb +lm-zo +bs-kq +sp-lo +qm-uo +rr-lo +th-bu +wy-sa +ca-ch +zs-ox +fy-bl +xg-xx +od-sd +ti-hs +jf-od +xc-an +hu-pa +ye-ka +hl-ro +yu-vl +ye-cn +fp-zg +qv-if +ko-tb +oy-bw +jh-fd +er-mj +wc-ek +pi-vd +ir-ci +zv-tl +sd-dr +ho-ld diff --git a/2024/go/day24/day24.go b/2024/go/day24/day24.go new file mode 100644 index 0000000..d8d1d2b --- /dev/null +++ b/2024/go/day24/day24.go @@ -0,0 +1,297 @@ +package day24 + +import ( + "adventofcode2024/utils" + "fmt" + "regexp" + "sort" + "strings" +) + +type Network struct { + gates []*Gate + wires []*Wire +} + +type State int + +const ( + NA State = iota - 1 + ZERO + ONE +) + +type Wire struct { + name string + state State +} + +type Operation int + +const ( + AND Operation = iota + OR + XOR +) + +type Gate struct { + in [2]*Wire + out *Wire + op Operation +} + +func Part1(input string) int { + + network := &Network{} + network.wires = make([]*Wire, 0) + + data := strings.Split(input, "\n\n") + + network.AddWires(data[0]) + network.AddGates(data[1]) + for { + if network.OutputKnown() { + break + } + for _, gate := range network.gates { + // fmt.Printf("%d: %v\n", i, gate) + if gate.out.state == NA && gate.in[0].state != NA && gate.in[1].state != NA { + switch gate.op { + case AND: + gate.out.state = And(gate.in[0].state, gate.in[1].state) + case OR: + gate.out.state = Or(gate.in[0].state, gate.in[1].state) + case XOR: + gate.out.state = Xor(gate.in[0].state, gate.in[1].state) + } + } + } + } + return int(network.Output()) +} + +func Part2(input string) int64 { + + data := strings.Split(input, "\n\n") + + inputs := strings.Split(data[0], "\n") + num_inputs := len(inputs) / 2 + fmt.Println(num_inputs) + var x_value int64 + var y_value int64 + var z_value int64 + y_value = 0 + for i := 0; i < num_inputs; i++ { + // y_value = 1 << i + x_value = 1 << i + network := &Network{} + network.wires = make([]*Wire, 0) + network.AddWires2("x", num_inputs, x_value) + network.AddWires2("y", num_inputs, y_value) + network.AddGates(data[1]) + // for i, gate := range network.gates { + // fmt.Printf("%d: %v\n", i, gate) + // } + network.SwapOutputs("z07", "rts") + network.SwapOutputs("z12", "jpj") + network.SwapOutputs("z26", "kgj") + network.SwapOutputs("vvw", "chv") + + // for i, gate := range network.gates { + // fmt.Printf("%d: %v\n", i, gate) + // } + for { + if network.OutputKnown() { + break + } + for _, gate := range network.gates { + // fmt.Printf("%d: %v\n", i, gate) + if gate.out.state == NA && gate.in[0].state != NA && gate.in[1].state != NA { + switch gate.op { + case AND: + gate.out.state = And(gate.in[0].state, gate.in[1].state) + case OR: + gate.out.state = Or(gate.in[0].state, gate.in[1].state) + case XOR: + gate.out.state = Xor(gate.in[0].state, gate.in[1].state) + } + } + } + } + z_value = network.Output() + if x_value + y_value != z_value { + fmt.Printf("(%d):\t x:%4d\t: y:%4d z:%4d\n", i, x_value, y_value, z_value) + } + } + ans := []string{"z07", "rts", "z12", "jpj", "z26", "kgj", "vvw", "chv"} + sort.Strings(ans) + fmt.Println(strings.Join(ans, ",")) + return z_value +} + +func (n *Network) AddWires(data string) { + for _, line := range strings.Split(data, "\n") { + v := strings.Split(line, ": ") + n.AddWire(&Wire{name: v[0], state: to_state(v[1])}) + } +} + +func (n *Network) AddWire(wire *Wire) { + n.wires = append(n.wires, wire) +} + +func (n *Network) AddWires2(w string, count int, value int64) { + for x := 0; x < count; x++ { + name := fmt.Sprintf("%s%02d", w, x) + v := fmt.Sprintf("%d", (value>>x)&1) + n.AddWire(&Wire{name: name, state: to_state(v)}) + } + +} + +func (n *Network) AddGates(data string) { + // ntg XOR fgs -> mjb + pattern := `^([a-z0-9]{3}) (AND|OR|XOR) ([a-z0-9]{3}) -> ([a-z[0-9]{3})$` + + re := regexp.MustCompile(pattern) + for _, line := range strings.Split(data, "\n") { + matches := re.FindAllStringSubmatch(line, -1) + for _, match := range matches { + n.AddGate(match[1], match[2], match[3], match[4], &n.wires) + } + } +} + +func (n *Network) SwapOutputs(a, b string) { + _, wire1 := to_wire(a, n.wires) + _, wire2 := to_wire(b, n.wires) + for _, gate := range n.gates { + if gate.out.name == a { + gate.out = wire2 + } else if gate.out.name == b { + gate.out = wire1 + } + } +} + +func (n *Network) AddGate(in0, op, in1, out string, wires *[]*Wire) { + var in [2]*Wire + var outw *Wire + *wires, in[0] = to_wire(in0, *wires) + *wires, in[1] = to_wire(in1, *wires) + *wires, outw = to_wire(out, *wires) + n.gates = append(n.gates, &Gate{in: in, + op: to_operation(op), + out: outw}) +} + +func (n *Network) OutputKnown() bool { + for _, gate := range n.gates { + if gate.out.name[0] != 'z' { + continue + } + if gate.out.state == NA { + return false + } + } + return true +} + +func (n *Network) Output() int64 { + var ret int64 + ret = 0 + for _, gate := range n.gates { + if gate.out.name[0] != 'z' { + continue + } + addr := utils.MustAtoi(gate.out.name[1:]) + if gate.out.state == ONE { + ret += 1 << addr + } + } + return ret +} + +func (n Gate) String() string { + return n.in[0].name + "(" + n.in[0].state.String() + ")\t" + n.op.String() + " " + n.in[1].name + "(" + n.in[1].state.String() + ")\t ->\t" + n.out.name + " (" + n.out.state.String() + ")" +} +func to_state(in string) State { + switch in { + case "1": + return ONE + case "0": + return ZERO + } + return NA +} + +func to_operation(in string) Operation { + var val Operation + switch in { + case "AND": + val = AND + case "OR": + val = OR + case "XOR": + val = XOR + } + return val +} + +func to_wire(in string, wires []*Wire) ([]*Wire, *Wire) { + for _, v := range wires { + if in == v.name { + return wires, v + } + } + wire := Wire{name: in, state: NA} + wires = append(wires, &wire) + return wires, &wire +} + +func And(a, b State) State { + if a == ONE && b == ONE { + return ONE + } + return ZERO +} + +func Or(a, b State) State { + if a == ONE || b == ONE { + return ONE + } + return ZERO +} + +func Xor(a, b State) State { + if (a == ONE && b == ZERO) || (a == ZERO && b == ONE) { + return ONE + } + return ZERO +} + +func (state State) String() string { + switch state { + case NA: + return "NA" + case ZERO: + return "0" + case ONE: + return "1" + default: + return "Invalid" + } +} + +func (op Operation) String() string { + switch op { + case OR: + return "OR" + case AND: + return "AND" + case XOR: + return "XOR" + default: + return "Invalid" + } +} diff --git a/2024/go/day24/day24_test.go b/2024/go/day24/day24_test.go new file mode 100644 index 0000000..f60e8d1 --- /dev/null +++ b/2024/go/day24/day24_test.go @@ -0,0 +1,17 @@ +package day24 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1("") + require.Equal(t, 0, r) +} + +func TestPart2(t *testing.T) { + r := Part2("") + require.Equal(t, 0, r) +} diff --git a/2024/go/day24/input.txt b/2024/go/day24/input.txt new file mode 100644 index 0000000..d45e7eb --- /dev/null +++ b/2024/go/day24/input.txt @@ -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: 0 +x14: 1 +x15: 1 +x16: 1 +x17: 1 +x18: 1 +x19: 1 +x20: 0 +x21: 1 +x22: 0 +x23: 1 +x24: 0 +x25: 1 +x26: 1 +x27: 1 +x28: 1 +x29: 0 +x30: 0 +x31: 1 +x32: 0 +x33: 1 +x34: 1 +x35: 0 +x36: 0 +x37: 1 +x38: 0 +x39: 1 +x40: 1 +x41: 1 +x42: 1 +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: 1 +y14: 0 +y15: 1 +y16: 1 +y17: 1 +y18: 1 +y19: 0 +y20: 0 +y21: 1 +y22: 1 +y23: 1 +y24: 1 +y25: 0 +y26: 0 +y27: 1 +y28: 1 +y29: 1 +y30: 1 +y31: 0 +y32: 0 +y33: 0 +y34: 1 +y35: 1 +y36: 1 +y37: 0 +y38: 1 +y39: 1 +y40: 1 +y41: 1 +y42: 0 +y43: 1 +y44: 1 + +x03 AND y03 -> htr +gwb AND kvf -> pkd +x04 AND y04 -> jjm +qcm XOR twv -> z21 +rrq XOR bmp -> z44 +x43 AND y43 -> pnn +x06 XOR y06 -> qmt +x26 AND y26 -> z26 +y00 AND x00 -> whb +jfq XOR fbb -> z36 +y33 AND x33 -> mmb +x38 AND y38 -> vqt +bbh OR qtd -> jfq +cbs AND ttb -> qtd +wqs OR cmf -> tpf +x10 AND y10 -> bfm +djp OR pfb -> qvr +x20 XOR y20 -> vhb +kkd XOR cjg -> z32 +qpp XOR stg -> z41 +kkd AND cjg -> mdv +tpp OR pfj -> twv +www AND qdf -> vjf +y15 XOR x15 -> hmr +mtg XOR sqm -> z09 +x33 XOR y33 -> chc +x41 AND y41 -> pkj +x31 AND y31 -> cvn +x09 AND y09 -> nvw +mtg AND sqm -> chg +pkr AND kcv -> thc +x07 XOR y07 -> cds +x15 AND y15 -> fpr +mwv AND jsg -> wdw +mwv XOR jsg -> z38 +y16 XOR x16 -> svs +y14 XOR x14 -> fnq +wth OR vjf -> btv +bvp AND gdb -> stc +cjb XOR rjc -> z04 +x13 AND y13 -> pfb +x30 AND y30 -> qgf +htq AND rtk -> dsm +x18 XOR y18 -> kvf +y12 AND x12 -> mqn +bcj XOR bkh -> z03 +x07 AND y07 -> sdj +bdf OR wbw -> qkf +y30 XOR x30 -> kbn +tpf AND vhb -> tpp +hqd OR fpr -> hgh +vfm XOR hbw -> z23 +x01 AND y01 -> bdf +nvw OR chg -> vgp +x21 XOR y21 -> qcm +bwg AND mfn -> djp +dnf OR pkj -> ksp +y44 AND x44 -> gqr +y11 AND x11 -> smr +smr OR dsm -> ksn +jkm OR pkd -> rjf +thc OR sqt -> rbd +qvr XOR fnq -> z14 +cjb AND rjc -> fsb +svg XOR fmt -> z31 +x06 AND y06 -> ssv +dtj OR vvq -> jvp +chv XOR fqf -> z34 +cvr AND hck -> pjd +dqp AND nbm -> hvv +x29 AND y29 -> vvq +y13 XOR x13 -> mfn +ksn AND nft -> z12 +jjd XOR whb -> z01 +chc AND rnq -> vjh +y36 AND x36 -> kfn +cwh OR vvw -> ttb +qkf AND wsv -> pqc +rdj OR kfv -> gdb +x08 AND y08 -> jrr +x02 AND y02 -> vdf +x12 XOR y12 -> nft +ptf OR jrr -> sqm +tdv OR wjp -> cjw +qvr AND fnq -> mch +x28 XOR y28 -> cfj +gtn XOR qmt -> z06 +mqn OR jpj -> bwg +x36 XOR y36 -> fbb +qht OR bfm -> htq +y42 AND x42 -> mkg +ksn XOR nft -> jpj +x20 AND y20 -> pfj +cmt AND nbq -> gmc +rbd XOR knm -> z25 +pvj XOR ksp -> z42 +kgj OR stc -> www +tpf XOR vhb -> z20 +pjd OR dsg -> mwv +cbs XOR ttb -> z35 +bfk OR jvm -> gwb +ffj XOR rpg -> z17 +vjr OR kwg -> pkr +pvj AND ksp -> dkc +y37 XOR x37 -> cvr +btv XOR cfj -> z28 +gtq OR qgf -> fmt +nbq XOR cmt -> z39 +wgq AND dqj -> tws +x24 AND y24 -> sqt +whj OR pnn -> bmp +x02 XOR y02 -> wsv +stg AND qpp -> dnf +kbn XOR jvp -> z30 +y39 AND x39 -> gwq +cds AND rkv -> nph +kvf XOR gwb -> z18 +mkg OR dkc -> sch +bqh XOR rjf -> z19 +hck XOR cvr -> z37 +jmk OR ssv -> rkv +x21 AND y21 -> cgd +pqc OR vdf -> bkh +rff OR mts -> rpg +bkh AND bcj -> rhq +bnv OR bst -> stg +bwg XOR mfn -> z13 +sgt AND scc -> bnv +btv AND cfj -> tdv +svs AND hgh -> rff +hbw AND vfm -> kwg +x40 XOR y40 -> scc +y17 AND x17 -> jvm +y34 AND x34 -> chv +y35 AND x35 -> bbh +mdv OR rft -> rnq +fqf AND chv -> cwh +y28 AND x28 -> wjp +sch AND srj -> whj +htr OR rhq -> rjc +x05 XOR y05 -> dqp +cvn OR qnk -> cjg +y14 AND x14 -> tfr +y11 XOR x11 -> rtk +jfq AND fbb -> trr +ppb AND hmr -> hqd +gtb OR hvv -> gtn +y44 XOR x44 -> rrq +rtk XOR htq -> z11 +x01 XOR y01 -> jjd +hmv XOR rts -> z08 +y10 XOR x10 -> vpc +jvp AND kbn -> gtq +cjw AND ntj -> dtj +x22 AND y22 -> prp +ppb XOR hmr -> z15 +y18 AND x18 -> jkm +x39 XOR y39 -> nbq +jjd AND whb -> wbw +x34 XOR y34 -> vvw +x19 AND y19 -> wqs +gwq OR gmc -> sgt +rbd AND knm -> rdj +srj XOR sch -> z43 +y05 AND x05 -> gtb +x08 XOR y08 -> hmv +y25 AND x25 -> kfv +cgd OR jth -> dqj +vpc XOR vgp -> z10 +tws OR prp -> hbw +jjm OR fsb -> nbm +wdw OR vqt -> cmt +rrq AND bmp -> cbv +rts AND hmv -> ptf +svs XOR hgh -> z16 +y41 XOR x41 -> qpp +ntj XOR cjw -> z29 +ffj AND rpg -> bfk +gqr OR cbv -> z45 +x25 XOR y25 -> knm +chc XOR rnq -> z33 +y43 XOR x43 -> srj +vgp AND vpc -> qht +x00 XOR y00 -> z00 +cds XOR rkv -> rts +x24 XOR y24 -> kcv +x32 AND y32 -> rft +nbm XOR dqp -> z05 +x35 XOR y35 -> cbs +mch OR tfr -> ppb +x16 AND y16 -> mts +www XOR qdf -> z27 +x23 AND y23 -> vjr +x26 XOR y26 -> bvp +gtn AND qmt -> jmk +x29 XOR y29 -> ntj +y19 XOR x19 -> bqh +rjf AND bqh -> cmf +y38 XOR x38 -> jsg +x32 XOR y32 -> kkd +y03 XOR x03 -> bcj +y31 XOR x31 -> svg +y22 XOR x22 -> wgq +qkf XOR wsv -> z02 +bvp XOR gdb -> kgj +x04 XOR y04 -> cjb +x17 XOR y17 -> ffj +y37 AND x37 -> dsg +y27 AND x27 -> wth +y23 XOR x23 -> vfm +sgt XOR scc -> z40 +mmb OR vjh -> fqf +qcm AND twv -> jth +y09 XOR x09 -> mtg +sdj OR nph -> z07 +wgq XOR dqj -> z22 +trr OR kfn -> hck +y27 XOR x27 -> qdf +kcv XOR pkr -> z24 +x42 XOR y42 -> pvj +x40 AND y40 -> bst +svg AND fmt -> qnk diff --git a/2024/go/day25/day25.go b/2024/go/day25/day25.go new file mode 100644 index 0000000..9cefd4e --- /dev/null +++ b/2024/go/day25/day25.go @@ -0,0 +1,76 @@ +package day25 + +import ( + "fmt" + "strings" + "math" +) + +type Lock struct { + diagram string + combination int +} + +type Key struct { + diagram string + combination int +} + +type Pair struct { + l Lock + k Key +} + +func Part1(input string) int { + data := strings.Split(input, "\n\n") + locks := make([]Lock, 0) + keys := make([]Key, 0) + pairs := make([]Pair, 0) + + for _, in := range data { + if in[0] == '#' { + locks = append(locks, Lock{diagram: in, combination: combination(in, '.') }) + } else { + keys = append(keys, Key{diagram: in, combination: combination(in, '#')}) + } + } + + for _, l := range locks { + for _, k := range keys { + if key_fits(l.combination, k.combination) { + pairs = append(pairs, Pair{l: l, k: k}) + } + } + } + fmt.Printf("locks: %d, keys: %d\n", len(locks), len(keys)) + fmt.Printf("pair0 lock\n%s\n%d\n", pairs[0].l.diagram , pairs[0].l.combination) + fmt.Printf("pair0 key\n%s\n%d\n",pairs[0].k.diagram, pairs[0].k.combination) + return len(pairs) +} + +func Part2(input string) int { + return 0 +} + +func combination(d string, k rune) int { + comb := 0 + rows := strings.Split(d, "\n") + columns := len(rows[0]) + for _, r := range rows { + for i, c := range r { + if c == k { + comb += 1 * int(math.Pow10(columns - i - 1)) + } + } + } + return comb +} + +func key_fits(l int, k int) bool { + for i:=1;i<6;i++ { + ll := l % int(math.Pow10(i)) + kk := k % int(math.Pow10(i)) + if ll < kk { return false } + } + return true +} \ No newline at end of file diff --git a/2024/go/day25/day25_test.go b/2024/go/day25/day25_test.go new file mode 100644 index 0000000..61113a2 --- /dev/null +++ b/2024/go/day25/day25_test.go @@ -0,0 +1,24 @@ +package day25 + +import ( + "log" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + data, err := os.ReadFile("input.txt") + if err != nil { + log.Fatalf("failed to read file: %s", err) + } + + r := Part1(string(data)) + require.Equal(t, 0, r) +} + +func TestPart2(t *testing.T) { + r := Part2("") + require.Equal(t, 0, r) +} diff --git a/2024/go/day25/input.txt b/2024/go/day25/input.txt new file mode 100644 index 0000000..5e3b588 --- /dev/null +++ b/2024/go/day25/input.txt @@ -0,0 +1,3999 @@ +##### +#.### +..### +..##. +..#.. +..#.. +..... + +..... +.#... +.#.#. +.#.#. +##### +##### +##### + +..... +..... +.#..# +.#.## +.#.## +.#.## +##### + +..... +..... +..... +..#.# +.##.# +.#### +##### + +##### +###.# +###.# +.##.# +..#.# +....# +..... + +..... +...#. +.#.#. +.#.#. +##.#. +##.## +##### + +..... +....# +..#.# +.##.# +.#### +.#### +##### + +..... +#.#.. +###.. +####. +####. +####. +##### + +##### +.#### +.#### +..### +...## +...#. +..... + +##### +##.## +.#.## +.#.## +...#. +..... +..... + +##### +##### +##.## +##..# +.#... +.#... +..... + +##### +.#.#. +.#.#. +...#. +...#. +..... +..... + +##### +##### +.#### +.##.# +.#..# +.#..# +..... + +..... +..... +#.... +#.#.. +#.##. +####. +##### + +..... +#.... +#.... +#.#.# +#.### +#.### +##### + +..... +.#..# +.#..# +.#.## +##### +##### +##### + +..... +.#... +.##.. +####. +####. +##### +##### + +..... +#.... +#.... +##... +###.# +##### +##### + +..... +..... +.#.#. +.#.#. +.#.## +.#### +##### + +..... +..... +..#.. +..##. +#.### +##### +##### + +..... +#.... +#.... +#.... +##..# +###.# +##### + +##### +####. +.###. +.###. +.###. +.#.#. +..... + +..... +.#... +.#... +.#.#. +.###. +##### +##### + +..... +#..#. +##.#. +##.## +##.## +##### +##### + +##### +.#.## +....# +....# +....# +....# +..... + +..... +..... +..... +..... +....# +.#.## +##### + +##### +#.#.# +..#.# +..#.# +..#.# +....# +..... + +##### +.#### +.##.# +..#.. +..#.. +..... +..... + +##### +##### +#.### +#..## +#...# +....# +..... + +##### +####. +####. +#.#.. +..#.. +..... +..... + +##### +##.## +##.#. +##... +#.... +#.... +..... + +..... +...#. +...#. +.#.#. +.###. +####. +##### + +##### +####. +###.. +###.. +#.#.. +#.... +..... + +..... +#...# +#..## +#..## +#.### +#.### +##### + +..... +..... +..#.. +..#.. +.###. +####. +##### + +..... +...#. +...#. +...#. +.#.#. +##### +##### + +##### +##### +#.### +#.#.# +#...# +..... +..... + +..... +#..#. +#..## +#.### +#.### +##### +##### + +..... +....# +..#.# +..#.# +..### +.#### +##### + +##### +##### +.#.## +....# +..... +..... +..... + +##### +###.# +##... +##... +.#... +.#... +..... + +##### +##### +.##.# +.##.# +..#.. +..#.. +..... + +##### +##.## +##.## +##.## +#..#. +...#. +..... + +..... +..... +...#. +..### +..### +#.### +##### + +##### +##### +#.### +#.### +#.#.# +#.#.. +..... + +..... +#.... +##.#. +##.#. +##.#. +##.## +##### + +##### +##### +###.# +###.# +.##.. +..#.. +..... + +##### +#.### +#.#.# +..#.# +..#.# +..#.. +..... + +##### +####. +###.. +###.. +#.#.. +..#.. +..... + +##### +##### +.#### +.##.# +.#..# +.#... +..... + +..... +.#... +##.#. +##.#. +####. +####. +##### + +##### +##### +####. +.##.. +..#.. +..... +..... + +..... +.#... +.#.#. +##.## +##.## +##.## +##### + +..... +.#... +.#... +.#... +.##.# +.#### +##### + +##### +####. +####. +.#.#. +.#.#. +..... +..... + +..... +....# +....# +#...# +#.#.# +###.# +##### + +..... +...#. +...#. +.#.#. +##.#. +####. +##### + +##### +##### +##### +##.#. +.#.#. +.#.#. +..... + +##### +.#### +.#### +.###. +..#.. +..... +..... + +..... +..... +....# +....# +#...# +#.#.# +##### + +..... +..... +#...# +##..# +##.## +##.## +##### + +##### +#.### +..### +..#.# +....# +....# +..... + +..... +..... +...#. +#..#. +##.#. +##.## +##### + +##### +.#.#. +.#.#. +.#.#. +...#. +...#. +..... + +##### +##### +.#### +.#.## +.#.## +.#..# +..... + +##### +#.### +#.#.# +....# +....# +..... +..... + +..... +#.... +#.... +#...# +#.#.# +###.# +##### + +##### +#.##. +#.#.. +#.... +..... +..... +..... + +##### +.#### +..#.# +..#.# +..#.. +..#.. +..... + +..... +....# +....# +#..## +#..## +#.### +##### + +##### +##.#. +#..#. +#..#. +#..#. +..... +..... + +..... +..... +#.... +#..#. +#.##. +####. +##### + +##### +#.#.# +#.... +#.... +..... +..... +..... + +..... +..... +..... +.#... +.##.. +####. +##### + +..... +....# +....# +.#..# +.#..# +.##.# +##### + +##### +##.## +#..## +....# +....# +....# +..... + +##### +#.##. +#.#.. +#.#.. +..... +..... +..... + +..... +..... +..... +..... +.#..# +###.# +##### + +..... +...#. +...#. +.#.#. +.#.#. +.#.## +##### + +..... +..... +..... +.#... +.#.#. +.#.## +##### + +##### +#.##. +#.##. +#.##. +#.#.. +#.#.. +..... + +..... +.#... +.#.#. +.#.#. +.###. +##### +##### + +..... +....# +....# +..#.# +.##.# +###.# +##### + +..... +..... +#.... +#.#.. +#.#.# +#.#.# +##### + +..... +.#..# +.#..# +.#..# +.#..# +##.## +##### + +..... +...#. +#..#. +#.### +##### +##### +##### + +##### +#.### +#.#.# +#.#.# +#.#.# +..... +..... + +##### +##### +##### +##.## +##.## +#..#. +..... + +..... +.#... +.#.#. +##.#. +####. +####. +##### + +..... +..#.. +..#.. +..#.# +.##.# +###.# +##### + +##### +#.### +#..## +#..## +...#. +...#. +..... + +..... +..... +#.... +##... +##.#. +##.## +##### + +##### +.##.# +.##.. +.#... +..... +..... +..... + +##### +##### +#.#.# +..#.# +..#.# +..#.# +..... + +##### +.##.# +.##.# +.#..# +..... +..... +..... + +..... +....# +....# +#...# +#...# +#.#.# +##### + +##### +#.### +#.#.# +#.#.# +#...# +....# +..... + +##### +##### +#.### +#.#.# +..#.# +..... +..... + +##### +#.##. +#.##. +#.##. +#.##. +#.#.. +..... + +..... +...#. +#..#. +##.## +##.## +##### +##### + +..... +..... +#.... +#..#. +#.### +#.### +##### + +..... +..#.# +..#.# +#.#.# +##### +##### +##### + +..... +.#..# +.#.## +##### +##### +##### +##### + +##### +#.### +#.#.# +#...# +#...# +..... +..... + +##### +.#### +.#### +.#.#. +.#.#. +.#... +..... + +##### +#.### +..#.# +....# +..... +..... +..... + +##### +##### +##### +##.## +#...# +#...# +..... + +..... +#.#.. +#.#.. +#.#.. +#.#.# +###.# +##### + +##### +#.### +#.#.# +....# +....# +....# +..... + +..... +...#. +...#. +#..#. +##.#. +##.#. +##### + +..... +.#... +.#... +.#... +##.#. +##.#. +##### + +##### +##### +####. +.###. +.##.. +.#... +..... + +##### +#.### +..##. +..#.. +..... +..... +..... + +..... +....# +....# +....# +..#.# +#.#.# +##### + +..... +....# +#.#.# +#.#.# +#.#.# +##### +##### + +..... +#.... +#..#. +##.## +##### +##### +##### + +##### +##### +####. +####. +.#.#. +.#.#. +..... + +..... +...#. +.#.#. +##.## +##.## +##### +##### + +..... +.#..# +##..# +###.# +###.# +###.# +##### + +..... +.#... +##.#. +##### +##### +##### +##### + +..... +#...# +#...# +##..# +###.# +##### +##### + +..... +.#... +##.#. +##.#. +##.#. +##.## +##### + +##### +.###. +.###. +.###. +..#.. +..#.. +..... + +..... +..... +#.#.. +#.#.. +#.#.. +#.#.# +##### + +##### +###.# +#.#.# +#.#.. +#.... +..... +..... + +..... +....# +...## +...## +.#.## +.#.## +##### + +##### +#.### +..##. +..##. +...#. +...#. +..... + +..... +..... +#..#. +##.#. +##.#. +##.#. +##### + +..... +#.#.. +#.#.. +###.# +##### +##### +##### + +..... +..... +#..#. +#..#. +##.#. +##.## +##### + +##### +###.# +.##.. +..#.. +..... +..... +..... + +##### +#.##. +#.##. +...#. +...#. +..... +..... + +..... +..#.. +#.#.. +#.##. +#.##. +####. +##### + +..... +#.... +#.... +#..#. +##.#. +##### +##### + +##### +#.### +#.#.# +..#.. +..#.. +..... +..... + +..... +..#.. +..##. +.###. +.###. +.#### +##### + +..... +...#. +...#. +..##. +.###. +.###. +##### + +##### +##### +#.##. +..#.. +..... +..... +..... + +..... +#.... +##... +##... +##... +###.# +##### + +##### +##### +##.## +#..## +#..## +....# +..... + +##### +##### +#.### +#.### +#..## +#..#. +..... + +..... +.#..# +.#.## +.#.## +##.## +##.## +##### + +..... +.#... +.#.#. +##.#. +##.#. +##.#. +##### + +..... +.#.#. +.#.#. +.#.#. +.#.#. +##### +##### + +..... +..... +..... +..#.. +..##. +.###. +##### + +##### +###.# +###.# +###.. +#.#.. +#.... +..... + +..... +#.... +##... +###.. +###.# +###.# +##### + +##### +##### +.###. +..#.. +..#.. +..#.. +..... + +##### +###.# +###.# +#.#.# +#.#.# +..... +..... + +##### +##.## +##.## +#..## +#..## +#..#. +..... + +##### +##### +##.#. +.#... +.#... +..... +..... + +##### +##### +#.### +#.### +..#.# +..#.# +..... + +..... +..... +..#.# +.##.# +###.# +##### +##### + +..... +#..#. +#.##. +#.##. +##### +##### +##### + +..... +#.... +#.#.. +#.#.# +#.#.# +###.# +##### + +##### +##.#. +##.#. +#..#. +#..#. +#..#. +..... + +..... +..... +....# +#...# +##.## +##### +##### + +..... +#.#.. +###.. +###.. +###.. +####. +##### + +..... +..#.# +#.#.# +###.# +##### +##### +##### + +..... +..... +....# +.#.## +##.## +##### +##### + +..... +..... +..#.. +..##. +..### +#.### +##### + +..... +..#.# +.##.# +##### +##### +##### +##### + +..... +..... +.#..# +.#.## +##### +##### +##### + +##### +#.### +#.#.# +#.#.# +#.#.# +..#.. +..... + +..... +..... +..... +.#.#. +####. +####. +##### + +..... +..... +..... +..#.. +.##.# +###.# +##### + +..... +....# +.#.## +.#.## +.#### +.#### +##### + +..... +..... +.#... +.##.. +.###. +.###. +##### + +..... +..... +..... +....# +#.#.# +#.#.# +##### + +..... +..... +.#... +.#... +.#..# +###.# +##### + +##### +.#### +..### +..### +...## +...#. +..... + +##### +####. +###.. +.##.. +.##.. +.#... +..... + +##### +##.## +##.## +.#..# +.#..# +..... +..... + +..... +...#. +#.##. +##### +##### +##### +##### + +..... +..... +#.... +#..#. +#..#. +##.## +##### + +..... +..... +..... +#.#.. +#.#.. +####. +##### + +##### +####. +####. +##.#. +#..#. +..... +..... + +##### +##.## +.#.#. +.#.#. +.#.#. +.#... +..... + +..... +.#.#. +##.#. +##.#. +##.#. +##.## +##### + +##### +#.### +..#.# +..#.# +....# +....# +..... + +##### +##### +##.## +##.## +.#.#. +...#. +..... + +##### +##### +##### +.#.## +.#.#. +.#.#. +..... + +..... +.#... +.#... +.##.# +.#### +##### +##### + +##### +####. +#.##. +..#.. +..#.. +..#.. +..... + +##### +##### +###.# +#.#.# +..#.# +....# +..... + +..... +#.... +#.... +##.#. +##### +##### +##### + +##### +#.##. +#.#.. +..#.. +..#.. +..... +..... + +..... +#..#. +#..#. +#.##. +#.##. +#.##. +##### + +##### +####. +#.##. +#.##. +#.##. +#..#. +..... + +..... +.#... +##.#. +##.#. +####. +##### +##### + +..... +..... +.#.#. +####. +####. +####. +##### + +##### +##### +###.# +###.. +##... +.#... +..... + +##### +#.### +#.### +#.##. +#.##. +#.#.. +..... + +..... +....# +#...# +##..# +##.## +##.## +##### + +..... +..... +.#..# +.#..# +.#..# +.#.## +##### + +..... +.#..# +.#..# +##..# +##..# +###.# +##### + +##### +###.# +##..# +.#..# +..... +..... +..... + +##### +#.### +#.#.# +#.#.. +..... +..... +..... + +..... +..... +.#... +.#... +##.#. +##.#. +##### + +##### +##### +#.### +#.#.# +#.#.# +#...# +..... + +..... +..... +.#... +.#.#. +.#.#. +.#.#. +##### + +..... +..... +.#... +.#.#. +##.#. +####. +##### + +##### +##### +##.## +##.## +##.## +#...# +..... + +..... +..... +#.... +#.#.. +####. +##### +##### + +..... +..... +#.... +#.... +#..#. +#.##. +##### + +..... +.#..# +.#..# +.#..# +.#..# +.#.## +##### + +##### +##### +##### +##### +.#.## +.#..# +..... + +##### +.#.## +...## +...## +...#. +...#. +..... + +##### +###.# +.##.# +.#..# +.#..# +.#..# +..... + +..... +..#.. +..#.. +.###. +####. +####. +##### + +##### +#.#.# +#.#.# +..... +..... +..... +..... + +##### +.##.# +.##.# +..#.. +..#.. +..... +..... + +##### +###.# +###.# +#.#.# +..#.# +..#.. +..... + +..... +.#.#. +##.#. +####. +##### +##### +##### + +..... +..... +...#. +...## +...## +#.### +##### + +..... +....# +#..## +#..## +##.## +##.## +##### + +##### +##.## +##.## +##..# +##... +.#... +..... + +..... +.#..# +##..# +##.## +##### +##### +##### + +..... +.#... +.#.#. +.#.#. +##.#. +##.## +##### + +##### +##.## +##..# +##... +##... +.#... +..... + +..... +...#. +...## +...## +.#.## +.#### +##### + +..... +..#.. +#.#.. +####. +##### +##### +##### + +..... +....# +...## +...## +#..## +#.### +##### + +..... +#.... +#.... +#...# +##.## +##.## +##### + +..... +....# +.#..# +##..# +##..# +##.## +##### + +##### +.#### +.#### +..### +...#. +...#. +..... + +..... +..... +....# +.#..# +.#.## +##### +##### + +..... +..... +.#.#. +.#.#. +##.#. +##### +##### + +##### +#.#.# +#.#.# +..#.# +..#.# +..#.. +..... + +##### +.#### +.#### +.##.# +..#.. +..... +..... + +..... +....# +...## +.#.## +.#.## +.#### +##### + +##### +####. +##.#. +##... +##... +.#... +..... + +##### +#.### +#.### +#.### +..#.# +..#.# +..... + +##### +####. +.###. +..##. +..#.. +..... +..... + +##### +##### +##.## +##.## +.#.#. +.#... +..... + +..... +.#... +###.. +###.# +##### +##### +##### + +..... +..... +....# +....# +#.#.# +###.# +##### + +##### +.###. +.###. +.##.. +..#.. +..#.. +..... + +##### +####. +###.. +#.#.. +#.... +..... +..... + +##### +###.# +.##.# +..#.. +..... +..... +..... + +##### +##### +#.### +#.##. +#.##. +...#. +..... + +..... +..... +.#.#. +.#.## +.#### +##### +##### + +##### +##### +##### +##### +.#.#. +.#.#. +..... + +##### +###.# +#.#.. +#.#.. +..#.. +..#.. +..... + +..... +..#.. +.##.. +####. +####. +##### +##### + +##### +##### +#.### +#.#.# +....# +....# +..... + +..... +#...# +#...# +#...# +##.## +##### +##### + +##### +##### +.#### +..#.# +..#.# +..#.. +..... + +##### +##### +#.#.# +#.#.# +..#.# +..#.. +..... + +..... +#.... +##... +##... +###.. +###.# +##### + +##### +###.# +.##.. +.#... +.#... +..... +..... + +##### +##### +##### +#.##. +#..#. +#.... +..... + +..... +..... +..#.. +..#.# +#.#.# +###.# +##### + +..... +...#. +...#. +...#. +...#. +#.### +##### + +..... +..#.. +#.#.. +#.#.# +###.# +##### +##### + +..... +..... +....# +#...# +##.## +##.## +##### + +##### +##.#. +##.#. +.#.#. +.#... +..... +..... + +##### +##.#. +.#.#. +...#. +...#. +..... +..... + +##### +.##.# +.##.# +.##.. +.##.. +.#... +..... + +##### +##### +#.#.# +..#.. +..#.. +..... +..... + +##### +###.# +##... +.#... +.#... +..... +..... + +##### +##### +.#### +.#.## +....# +....# +..... + +..... +#.#.# +#.#.# +#.#.# +###.# +##### +##### + +##### +###.# +.#..# +....# +..... +..... +..... + +..... +....# +.#..# +.#..# +.##.# +###.# +##### + +..... +...#. +...#. +..##. +#.##. +#.##. +##### + +..... +..#.# +.##.# +.##.# +###.# +##### +##### + +##### +.#### +.#### +..##. +...#. +..... +..... + +##### +##### +##### +.#### +.#### +..#.# +..... + +..... +...#. +..##. +.###. +.#### +.#### +##### + +##### +#.### +#.### +#.#.# +..#.# +..#.# +..... + +##### +##### +.#.#. +..... +..... +..... +..... + +..... +.#.#. +.#### +##### +##### +##### +##### + +..... +#..#. +#..#. +#..#. +#.##. +##### +##### + +..... +..#.. +..#.. +#.#.. +#.##. +##### +##### + +##### +##### +####. +####. +####. +.#.#. +..... + +..... +....# +..#.# +..#.# +..### +#.### +##### + +..... +.#... +.#..# +.#.## +.#.## +##.## +##### + +##### +.##.# +.#..# +....# +....# +..... +..... + +..... +..... +..... +.#.#. +.#.## +##.## +##### + +##### +#.##. +...#. +...#. +...#. +...#. +..... + +##### +.#### +.#.## +.#.## +.#.#. +...#. +..... + +##### +.#.#. +.#... +..... +..... +..... +..... + +..... +.#... +.#.#. +.#.## +##### +##### +##### + +##### +.###. +.##.. +.##.. +.##.. +.#... +..... + +..... +..#.. +..#.. +..#.. +.##.. +.##.# +##### + +##### +####. +#.#.. +#.... +#.... +#.... +..... + +..... +..... +..... +..... +.#..# +##.## +##### + +##### +##.#. +.#.#. +...#. +...#. +...#. +..... + +##### +.##.# +..#.. +..... +..... +..... +..... + +..... +..... +..... +#.#.# +#.#.# +#.#.# +##### + +##### +###.# +###.# +#.#.# +....# +..... +..... + +..... +..... +..... +..#.. +#.##. +#.### +##### + +##### +####. +###.. +###.. +###.. +.#... +..... + +..... +..#.. +..#.# +..### +..### +.#### +##### + +##### +#.### +...## +....# +....# +..... +..... + +##### +##### +##.## +#...# +....# +....# +..... + +..... +.#... +.#.#. +.#.#. +####. +####. +##### + +..... +#..#. +##.## +##.## +##### +##### +##### + +##### +####. +####. +####. +####. +.#.#. +..... + +##### +###.# +#.#.# +#.#.# +#.#.# +#.#.. +..... + +##### +#.### +#..#. +#..#. +...#. +..... +..... + +..... +..... +..... +#.... +#.#.. +#.##. +##### + +##### +##### +##### +#.### +#..## +#...# +..... + +##### +##### +##### +#.### +#.##. +..#.. +..... + +..... +.#... +.#... +.#... +.##.. +.##.# +##### + +..... +..... +.#... +##... +##.#. +##.#. +##### + +##### +####. +####. +####. +#.#.. +..#.. +..... + +##### +#.### +#.##. +#.##. +#.##. +#.#.. +..... + +##### +##### +.#### +.#### +..##. +...#. +..... + +..... +#...# +#...# +##.## +##.## +##.## +##### + +##### +##### +##### +##.## +.#..# +.#..# +..... + +##### +##.## +#..#. +#..#. +#..#. +#.... +..... + +..... +#.#.# +#.### +#.### +##### +##### +##### + +..... +.#..# +##..# +###.# +##### +##### +##### + +##### +####. +##.#. +##... +##... +#.... +..... + +..... +..... +#.... +#.#.. +#.#.. +####. +##### + +..... +.#..# +.#.## +##.## +##.## +##### +##### + +..... +#..#. +#.##. +####. +##### +##### +##### + +..... +#..#. +#.##. +####. +####. +####. +##### + +##### +###.# +.##.# +..#.# +..#.# +..#.# +..... + +..... +..... +..#.# +#.#.# +#.### +##### +##### + +..... +..... +#.#.. +#.#.# +#.#.# +##### +##### + +..... +....# +..#.# +.##.# +.##.# +.##.# +##### + +##### +#.##. +#.##. +#.#.. +#.#.. +..#.. +..... + +##### +##### +##.#. +##.#. +##... +.#... +..... + +##### +####. +####. +.#.#. +.#.#. +...#. +..... + +##### +##### +#.##. +#.##. +#.#.. +#.#.. +..... + +##### +##### +###.# +.#..# +....# +....# +..... + +##### +.#### +.#.## +...#. +..... +..... +..... + +..... +..#.# +#.#.# +#.#.# +###.# +###.# +##### + +##### +##.## +##.#. +##.#. +##.#. +.#... +..... + +##### +###.# +###.# +###.. +###.. +.#... +..... + +##### +##### +##### +#.### +#..## +....# +..... + +..... +..... +..#.. +..#.# +.#### +.#### +##### + +##### +#.### +#.##. +#.#.. +#.#.. +#.#.. +..... + +..... +....# +.#..# +.#.## +##### +##### +##### + +##### +##.## +##.## +#...# +#...# +#...# +..... + +..... +..... +..... +.#... +###.. +####. +##### + +..... +..... +.#... +.#..# +.#..# +.#.## +##### + +##### +##### +##### +.#### +.##.# +.#..# +..... + +##### +##### +##.## +##.#. +#.... +..... +..... + +..... +..... +.#..# +.#..# +.#.## +.#### +##### + +..... +..#.. +..##. +..### +#.### +#.### +##### + +..... +...#. +.#.#. +.#.#. +####. +##### +##### + +##### +####. +.##.. +.##.. +.##.. +..#.. +..... + +##### +#.##. +#.#.. +#.#.. +..#.. +..... +..... + +..... +....# +....# +#...# +#.#.# +##### +##### + +##### +##.#. +##.#. +#..#. +#.... +#.... +..... + +..... +..... +..... +.#... +.##.# +###.# +##### + +##### +####. +#.##. +#.##. +#.##. +...#. +..... + +##### +###.# +###.# +.#..# +.#..# +.#..# +..... + +..... +.#... +.#... +##.#. +##.#. +##.## +##### + +##### +.#### +.##.# +..#.# +..#.# +....# +..... + +##### +##.#. +##... +#.... +..... +..... +..... + +##### +##### +##### +##### +#.### +...#. +..... + +##### +##.## +#..## +#..## +...#. +...#. +..... + +..... +#.... +#.... +##... +##..# +###.# +##### + +..... +..#.. +..##. +.###. +####. +####. +##### + +##### +#.#.# +#.#.# +..#.. +..#.. +..#.. +..... + +##### +.#### +.###. +.###. +.#.#. +...#. +..... + +##### +###.# +.#... +..... +..... +..... +..... + +..... +#.#.. +###.. +###.# +###.# +###.# +##### + +..... +#.... +#.#.. +#.#.. +#.#.# +###.# +##### + +..... +..#.. +..#.. +..#.. +.###. +##### +##### + +##### +.###. +.##.. +.##.. +.#... +.#... +..... + +..... +...#. +...## +#.### +#.### +##### +##### + +##### +##### +#.### +#.### +#.##. +#.#.. +..... + +##### +##### +.#### +..### +...#. +...#. +..... + +##### +####. +##.#. +.#... +..... +..... +..... + +..... +.#... +.#... +.#... +.#.#. +##.## +##### + +##### +##### +##.## +.#..# +.#..# +.#... +..... + +##### +.#### +..#.# +..#.. +..#.. +..... +..... + +..... +...#. +...#. +#..## +##.## +##### +##### + +##### +##.## +.#.## +.#.## +.#.## +.#.#. +..... + +##### +##### +####. +.###. +.#.#. +.#... +..... + +##### +#.#.# +..#.# +..#.# +....# +..... +..... + +##### +.#### +.##.# +.##.# +.#..# +..... +..... + +##### +##### +.#### +.##.# +.##.. +..#.. +..... + +..... +#...# +#..## +#.### +#.### +#.### +##### + +##### +###.# +.#..# +.#... +..... +..... +..... + +..... +..... +#.... +##... +###.# +##### +##### + +..... +...#. +..##. +#.##. +#.### +##### +##### + +..... +...#. +..##. +..### +#.### +#.### +##### + +..... +..... +#.#.# +#.#.# +#.#.# +#.### +##### + +##### +##### +###.# +#.#.# +#.#.. +..#.. +..... + +##### +##.## +##.## +.#..# +.#..# +....# +..... + +..... +.#.#. +##.#. +##.#. +##.#. +##.#. +##### + +..... +..... +..#.# +#.### +##### +##### +##### + +##### +##### +##### +.##.# +.#..# +....# +..... + +##### +####. +####. +#.#.. +..... +..... +..... + +..... +.#... +.#.#. +.#.## +##.## +##### +##### + +##### +##### +#.### +..#.# +..#.# +..#.. +..... + +..... +..#.# +#.#.# +###.# +###.# +##### +##### + +..... +..... +#.#.. +#.#.# +#.#.# +###.# +##### + +..... +..#.# +..### +.#### +.#### +##### +##### + +..... +.#.#. +##.#. +##### +##### +##### +##### + +..... +..... +#.#.. +#.##. +#.##. +##### +##### + +##### +##### +#.#.# +#.#.# +#.#.# +..... +..... + +##### +##.#. +#.... +..... +..... +..... +..... + +##### +##### +##### +#.##. +#..#. +...#. +..... + +##### +##### +##### +####. +####. +#.#.. +..... + +..... +.#... +.#... +.#... +##... +##.#. +##### + +##### +###.# +##..# +##..# +#.... +#.... +..... + +##### +####. +.###. +..##. +...#. +..... +..... + +..... +.#..# +.#..# +##..# +###.# +##### +##### + +..... +...#. +.#.#. +##.#. +##.#. +##.#. +##### + +..... +..... +...#. +...#. +#..#. +##.## +##### + +##### +##### +###.# +.##.# +..#.. +..#.. +..... + +##### +##.## +.#.## +.#.## +.#.#. +...#. +..... + +##### +#.### +#.### +#.### +#.##. +...#. +..... + +##### +##### +#.### +#..#. +#.... +..... +..... + +##### +#.### +#.### +#.### +#.#.# +..... +..... + +..... +..#.. +#.#.. +#.##. +#.##. +#.##. +##### + +##### +##### +##### +##.## +#..## +...#. +..... + +##### +###.# +###.# +#.#.# +#...# +#...# +..... + +..... +#..#. +#..## +#..## +#..## +#.### +##### + +..... +.#.#. +.#.## +.#.## +##.## +##.## +##### + +##### +.#### +.#.## +.#.## +.#.#. +..... +..... + +..... +.#..# +##.## +##.## +##.## +##### +##### + +##### +###.# +##..# +##..# +#...# +#...# +..... + +..... +..... +....# +.#..# +.##.# +.#### +##### + +##### +##### +.#.## +.#..# +.#..# +....# +..... + +..... +....# +....# +....# +.#.## +##### +##### + +##### +.#.## +.#.## +...## +...## +....# +..... + +##### +#.### +..#.# +..#.. +..... +..... +..... + +##### +#.### +...## +...## +...#. +...#. +..... + +..... +..... +..#.. +..##. +#.##. +#.### +##### + +..... +#.... +##.#. +##.#. +##.## +##### +##### + +..... +.#... +.#.#. +####. +##### +##### +##### + +..... +#..#. +#..#. +##.#. +##.#. +####. +##### + +##### +##### +##.## +##..# +#...# +....# +..... + +##### +##.## +.#.## +.#.## +.#..# +.#..# +..... + +..... +....# +....# +#...# +#.#.# +#.### +##### + +..... +..... +#.#.# +#.#.# +#.### +##### +##### + +..... +..#.. +..#.. +..#.. +..#.. +.###. +##### + +##### +#.##. +..##. +...#. +...#. +..... +..... + +##### +##### +.#.## +.#.## +.#.#. +..... +..... + +##### +##### +###.# +#.#.# +....# +....# +..... + +##### +.#### +.#.## +.#.#. +.#.#. +...#. +..... + +..... +...#. +#..#. +##.## +##### +##### +##### + +##### +##### +#.#.# +#.#.# +#.#.# +..#.# +..... + +..... +..... +..#.. +..#.. +..#.. +.##.# +##### + +##### +###.# +###.# +###.# +###.# +.#..# +..... + +##### +#.##. +#.##. +..##. +..##. +..#.. +..... + +..... +..... +....# +....# +#..## +#.### +##### + +##### +.#### +..### +..#.# +..... +..... +..... + +..... +..#.. +..#.. +.##.. +.##.. +####. +##### + +..... +..... +..#.. +.###. +.###. +.###. +##### + +##### +##### +#.### +#.### +..#.# +....# +..... + +..... +...#. +...#. +..##. +..##. +.#### +##### + +..... +....# +...## +.#.## +##### +##### +##### + +..... +..... +#.... +#.... +#.... +##.#. +##### + +##### +##### +#.#.# +#.#.# +#.#.# +#.... +..... + +..... +.#... +.#... +.#... +.#..# +.#.## +##### + +##### +#.### +...## +...#. +...#. +..... +..... + +..... +.#... +.#... +.#... +.##.# +###.# +##### + +..... +.#... +.#... +.#... +###.# +##### +##### + +..... +.#... +.##.. +###.. +###.# +###.# +##### + +..... +.#... +##... +##..# +###.# +###.# +##### + +##### +##### +##### +.##.# +.##.# +.#..# +..... + +..... +..#.. +..#.# +..#.# +..### +#.### +##### + +##### +#.### +#.#.# +#.... +..... +..... +..... + +##### +##### +##### +##.#. +#..#. +#..#. +..... + +..... +..#.. +.##.. +.##.# +###.# +###.# +##### + +##### +##### +##.## +##.## +#...# +..... +..... + +..... +..#.. +..#.# +.##.# +.##.# +.#### +##### + +##### +#.### +#.### +..### +...#. +..... +..... + +..... +..... +...#. +#.##. +#.##. +####. +##### + +##### +#.### +..#.# +..#.# +..#.# +..#.# +..... + +..... +.#... +.##.. +.##.. +###.# +##### +##### + +..... +.#.#. +.#.#. +.#.#. +.#.#. +##.## +##### + +##### +##.## +##..# +##..# +#...# +#.... +..... + +##### +##### +##### +.#### +.#.## +....# +..... + +..... +..#.. +..#.. +.###. +.###. +.#### +##### + +##### +##### +.###. +.#.#. +.#... +..... +..... + +..... +.#... +.#..# +.##.# +###.# +##### +##### + +##### +#.##. +#.#.. +#.#.. +#.#.. +..#.. +..... + +..... +..... +#.#.# +###.# +##### +##### +##### + +..... +..... +#.... +#..#. +#..#. +#.##. +##### + +..... +..#.# +..#.# +..### +..### +#.### +##### + +##### +##### +###.# +.##.. +..#.. +..... +..... + +..... +...#. +#.### +#.### +#.### +##### +##### + +..... +.#... +##..# +##..# +##.## +##.## +##### + +..... +..... +.#.#. +.#.#. +.#.#. +##.## +##### + +##### +##.## +##.## +#...# +#.... +#.... +..... + +..... +....# +.#..# +##.## +##.## +##### +##### + +##### +##### +#.##. +#.##. +#.#.. +..... +..... + +..... +..... +.#.#. +.#.#. +.#.#. +####. +##### + +..... +..... +..#.. +..#.. +#.#.# +##### +##### + +##### +##.## +#...# +#...# +....# +....# +..... + +##### +.#### +..### +...#. +...#. +...#. +..... + +##### +####. +##.#. +#..#. +...#. +..... +..... + +##### +#.### +#.### +#.##. +#..#. +#.... +..... + +..... +..... +#..#. +#..#. +#.##. +#.##. +##### + +##### +####. +.#.#. +.#.#. +.#... +..... +..... + +##### +####. +####. +.###. +..#.. +..#.. +..... + +##### +#.### +#.##. +..##. +..##. +...#. +..... + +##### +.#### +.#### +.#.## +....# +..... +..... + +##### +###.# +###.# +##..# +##... +#.... +..... diff --git a/2024/go/main.go b/2024/go/main.go index d5d0946..bb71205 100644 --- a/2024/go/main.go +++ b/2024/go/main.go @@ -26,6 +26,11 @@ import ( "adventofcode2024/day17" "adventofcode2024/day18" "adventofcode2024/day19" + "adventofcode2024/day21" + "adventofcode2024/day22" + "adventofcode2024/day23" + "adventofcode2024/day24" + "adventofcode2024/day25" "adventofcode2024/utils" ) @@ -90,6 +95,21 @@ func main() { case 19: fmt.Printf("part 1: %d\n", day19.Part1(utils.Readfile(d))) fmt.Printf("part 2: %d\n", day19.Part2(utils.Readfile(d))) + case 21: + fmt.Printf("part 1: %d\n", day21.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day21.Part2(utils.Readfile(d))) + case 22: + fmt.Printf("part 1: %d\n", day22.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day22.Part2(utils.Readfile(d))) + case 23: + fmt.Printf("part 1: %d\n", day23.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day23.Part2(utils.Readfile(d))) + case 24: + fmt.Printf("part 1: %d\n", day24.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day24.Part2(utils.Readfile(d))) + case 25: + fmt.Printf("part 1: %d\n", day25.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day25.Part2(utils.Readfile(d))) default: panic(fmt.Errorf("no such day: %d", d)) } @@ -99,7 +119,7 @@ func main() { // Reads day from os.Args. func day() int { - latest := 19 + latest := 24 if len(os.Args) == 1 { return latest } diff --git a/2024/go/utils/dijkstra/graph.go b/2024/go/utils/dijkstra/graph.go index 7b2554e..1836523 100644 --- a/2024/go/utils/dijkstra/graph.go +++ b/2024/go/utils/dijkstra/graph.go @@ -1,7 +1,6 @@ package dijkstra import ( - "fmt" "math" "sync" ) @@ -92,7 +91,7 @@ func getShortestPath(startNode *Node, endNode *Node, g *ItemGraph) ([]Point, int pathval = prev[pathval] } finalArr = append(finalArr, pathval) - fmt.Println(finalArr) + // fmt.Println(finalArr) for i, j := 0, len(finalArr)-1; i < j; i, j = i+1, j-1 { finalArr[i], finalArr[j] = finalArr[j], finalArr[i] } diff --git a/2024/go/utils/memo/memo.go b/2024/go/utils/memo/memo.go new file mode 100644 index 0000000..de52d55 --- /dev/null +++ b/2024/go/utils/memo/memo.go @@ -0,0 +1,47 @@ +package memo + +import "sync" + +type Func func(key interface{}) interface{} + +type result struct { + value interface{} +} + +type Memo struct { + f Func + cache map[interface{}]result + mu sync.RWMutex // Allows concurrent reads. +} + +func New(f Func) *Memo { + return &Memo{ + f: f, + cache: make(map[interface{}]result), + } +} + +func (memo *Memo) Get(key interface{}) interface{} { + // First, try to read the cache using a read lock. + memo.mu.RLock() + res, ok := memo.cache[key] + memo.mu.RUnlock() + if ok { + return res.value + } + + // Compute the result without holding the lock. + computed := memo.f(key) + + // Now acquire a write lock to update the cache. + memo.mu.Lock() + // Double-check: another goroutine may have stored the result in the meantime. + res, ok = memo.cache[key] + if !ok { + res.value = computed + memo.cache[key] = res + } + memo.mu.Unlock() + + return res.value +} diff --git a/2024/go/utils/ringbuffer/ringbuffer.go b/2024/go/utils/ringbuffer/ringbuffer.go new file mode 100644 index 0000000..70724c9 --- /dev/null +++ b/2024/go/utils/ringbuffer/ringbuffer.go @@ -0,0 +1,56 @@ +package ringbuffer + +import ( + "sync" +) + +type RingBuffer[T any] struct { + buffer []T + size int + mu sync.Mutex + write int + count int +} + +// NewRingBuffer creates a new ring buffer with a fixed size. +func NewRingBuffer[T any](size int) *RingBuffer[T] { + return &RingBuffer[T]{ + buffer: make([]T, size), + size: size, + } +} + +// Add inserts a new element into the buffer, overwriting the oldest if full. +func (rb *RingBuffer[T]) Add(value T) { + rb.mu.Lock() + defer rb.mu.Unlock() + + rb.buffer[rb.write] = value + rb.write = (rb.write + 1) % rb.size + + if rb.count < rb.size { + rb.count++ + } +} + +// Get returns the contents of the buffer in FIFO order. +func (rb *RingBuffer[T]) Get() []T { + rb.mu.Lock() + defer rb.mu.Unlock() + + result := make([]T, 0, rb.count) + + for i := 0; i < rb.count; i++ { + index := (rb.write + rb.size - rb.count + i) % rb.size + result = append(result, rb.buffer[index]) + } + + return result +} + +// Len returns the current number of elements in the buffer. +func (rb *RingBuffer[T]) Len() int { + rb.mu.Lock() + defer rb.mu.Unlock() + return rb.count +}