Compare commits
43 Commits
0034691f2a
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bcd7daea9e | |||
| 9c2e2c68dd | |||
|
|
90083f28e5 | ||
|
|
7f6c31c003 | ||
|
|
015607cde3 | ||
| 358249e78a | |||
| d730d3c444 | |||
| 759b9c9544 | |||
|
|
a529516bab | ||
|
|
ba588cbc77 | ||
|
|
225d74acf9 | ||
| 3e69c5b463 | |||
| 6ab021face | |||
| 1ee00e8d45 | |||
| 952def48a0 | |||
| 08b38c2bd3 | |||
| 29387606b0 | |||
|
|
4619bc7775 | ||
|
|
305ce52a98 | ||
|
|
a5b1227979 | ||
|
|
53557adddb | ||
|
|
5b8676f6e0 | ||
|
|
ee128f3aa8 | ||
|
|
d93049c434 | ||
|
|
507cb1a907 | ||
|
|
a64c3ef3c4 | ||
|
|
2c9b7766e3 | ||
|
|
ae293fe5a2 | ||
|
|
c1c89faef8 | ||
| b1a4969f6d | |||
|
|
e2ab6dce9a | ||
| f8c29be7ef | |||
| 19c4afdc98 | |||
|
|
616618c7e2 | ||
|
|
360ae5edbd | ||
|
|
88938a8627 | ||
| 235999524b | |||
|
|
f6f5a10270 | ||
| 8f4649e0aa | |||
| e0b4f292c2 | |||
|
|
8f5cb6b236 | ||
|
|
c133fe757c | ||
| ab9bdc63b1 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
2024
|
||||
2023/*
|
||||
|
||||
16
2024/.vscode/launch.json
vendored
Normal file
16
2024/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch Package",
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"mode": "auto",
|
||||
"program": "${fileDirname}",
|
||||
"args": ["2"]
|
||||
}
|
||||
]
|
||||
}
|
||||
54
2024/gareth/day01/day01.go
Normal file
54
2024/gareth/day01/day01.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package day01
|
||||
|
||||
import (
|
||||
"math"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
var leftList, rightList []float64
|
||||
total := 0.0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
sides := strings.Fields(line)
|
||||
leftNum, _ := strconv.ParseFloat(sides[0], 64)
|
||||
rightNum, _ := strconv.ParseFloat(sides[1], 64)
|
||||
leftList = append(leftList, leftNum)
|
||||
rightList = append(rightList, rightNum)
|
||||
}
|
||||
|
||||
sort.Float64s(leftList)
|
||||
sort.Float64s(rightList)
|
||||
|
||||
for i := 0; i < len(leftList); i++ {
|
||||
total += math.Abs(leftList[i] - rightList[i])
|
||||
}
|
||||
return int(total)
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
var leftList, rightList []int
|
||||
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
sides := strings.Fields(line)
|
||||
leftNum, _ := strconv.Atoi(sides[0])
|
||||
rightNum, _ := strconv.Atoi(sides[1])
|
||||
leftList = append(leftList, leftNum)
|
||||
rightList = append(rightList, rightNum)
|
||||
}
|
||||
|
||||
counts := make(map[int]int)
|
||||
for _, num := range rightList {
|
||||
counts[num]++
|
||||
}
|
||||
|
||||
similarityScore := 0
|
||||
for _, num := range leftList {
|
||||
similarityScore += num * counts[num]
|
||||
}
|
||||
|
||||
return similarityScore
|
||||
}
|
||||
27
2024/gareth/day01/day01_test.go
Normal file
27
2024/gareth/day01/day01_test.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package day01
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3`)
|
||||
assert.Equal(t, 11, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3`)
|
||||
assert.Equal(t, 31, r)
|
||||
}
|
||||
1000
2024/gareth/day01/input.txt
Normal file
1000
2024/gareth/day01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
76
2024/gareth/day02/day02.go
Normal file
76
2024/gareth/day02/day02.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package day02
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
total := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
var report []int
|
||||
nums := strings.Fields(line)
|
||||
for _, num := range nums {
|
||||
intnum, _ := strconv.Atoi(num)
|
||||
report = append(report, int(intnum))
|
||||
}
|
||||
if isSafe(report) {
|
||||
total++
|
||||
}
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
total := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
var report []int
|
||||
nums := strings.Fields(line)
|
||||
for _, num := range nums {
|
||||
intnum, _ := strconv.Atoi(num)
|
||||
report = append(report, int(intnum))
|
||||
}
|
||||
if isSafeWithDampener(report) {
|
||||
total++
|
||||
}
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func isSafe(report []int) bool {
|
||||
increasing := report[1] > report[0]
|
||||
decreasing := report[1] < report[0]
|
||||
|
||||
for i := 1; i < len(report); i++ {
|
||||
diff := report[i] - report[i-1]
|
||||
absDiff := int(math.Abs(float64(diff)))
|
||||
|
||||
if absDiff < 1 || absDiff > 3 {
|
||||
return false
|
||||
}
|
||||
|
||||
if (diff > 0 && !increasing) || (diff < 0 && !decreasing) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func isSafeWithDampener(report []int) bool {
|
||||
if isSafe(report) {
|
||||
return true
|
||||
}
|
||||
|
||||
for i := 0; i < len(report); i++ {
|
||||
modifiedReport := append(report[:i], report[i+1:]...)
|
||||
if isSafe(modifiedReport) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
27
2024/gareth/day02/day02_test.go
Normal file
27
2024/gareth/day02/day02_test.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package day02
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9`)
|
||||
assert.Equal(t, 2, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9`)
|
||||
assert.Equal(t, 4, r)
|
||||
}
|
||||
1000
2024/gareth/day02/input.txt
Normal file
1000
2024/gareth/day02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
45
2024/gareth/day02/poc.py
Normal file
45
2024/gareth/day02/poc.py
Normal file
@@ -0,0 +1,45 @@
|
||||
def is_safe(report):
|
||||
increasing = report[1] > report[0]
|
||||
decreasing = report[1] < report[0]
|
||||
|
||||
for i in range(1, len(report)):
|
||||
diff = report[i] - report[i - 1]
|
||||
abs_diff = abs(diff)
|
||||
if abs_diff < 1 or abs_diff > 3:
|
||||
return False
|
||||
if (diff > 0 and not increasing) or (diff < 0 and not decreasing):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def is_safe_with_dampener(report):
|
||||
if is_safe(report):
|
||||
return True
|
||||
for i in range(len(report)):
|
||||
modified_report = report[:i] + report[i+1:]
|
||||
if is_safe(modified_report):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def read_reports_from_file(filename):
|
||||
reports = []
|
||||
with open(filename, 'r') as file:
|
||||
for line in file:
|
||||
report = list(map(int, line.split()))
|
||||
reports.append(report)
|
||||
return reports
|
||||
|
||||
def main():
|
||||
filename = 'input.txt'
|
||||
reports = read_reports_from_file(filename)
|
||||
|
||||
safe_count = 0
|
||||
for report in reports:
|
||||
if is_safe_with_dampener(report):
|
||||
safe_count += 1
|
||||
|
||||
print("OUTPUT:", safe_count)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
49
2024/gareth/day03/day03.go
Normal file
49
2024/gareth/day03/day03.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package day03
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
total := 0
|
||||
|
||||
regex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||
matches := regex.FindAllStringSubmatch(input, -1)
|
||||
|
||||
for _, match := range matches {
|
||||
if len(match) == 3 {
|
||||
x, _ := strconv.Atoi(match[1])
|
||||
y, _ := strconv.Atoi(match[2])
|
||||
total += x * y
|
||||
}
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
total := 0
|
||||
isEnabled := true
|
||||
|
||||
mulRegex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||
doRegex := regexp.MustCompile(`do\(\)`)
|
||||
dontRegex := regexp.MustCompile(`don't\(\)`)
|
||||
|
||||
tokenizeRegex := regexp.MustCompile(`(mul\(\d+,\d+\)|do\(\)|don't\(\))`)
|
||||
tokens := tokenizeRegex.FindAllString(input, -1)
|
||||
|
||||
for _, token := range tokens {
|
||||
if doRegex.MatchString(token) {
|
||||
isEnabled = true
|
||||
} else if dontRegex.MatchString(token) {
|
||||
isEnabled = false
|
||||
} else if mulRegex.MatchString(token) && isEnabled {
|
||||
mulMatch := mulRegex.FindStringSubmatch(token)
|
||||
x, _ := strconv.Atoi(mulMatch[1])
|
||||
y, _ := strconv.Atoi(mulMatch[2])
|
||||
total += x * y
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
17
2024/gareth/day03/day03_test.go
Normal file
17
2024/gareth/day03/day03_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package day03
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))`)
|
||||
assert.Equal(t, 161, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))`)
|
||||
assert.Equal(t, 48, r)
|
||||
}
|
||||
6
2024/gareth/day03/input.txt
Normal file
6
2024/gareth/day03/input.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
-:-]what()(+/mul(957,396)?mul(550,844)%+why())-? #}from()mul(488,628)%} ~**mul(770,931)$~mul(791,733)<{mul(985,350)<#why()don't()what()select()$what())]what()who()mul(327,185))<^^mul(542,68)#?who()<from()';^how()mul(619,952)/where(){(!);'@,mul(551,161)select()>when()do()from()mul(51,291)[where()!{]/}'@?mul(233,511)@what()]mul(311,967))&who()how()mul(839,578)^who()]}mul(266,735){mul(176,670)mul(154,710)*select()](':^,mul(531,801)# *why()why()mul(30,325)~,where();select()select()}-/when()mul(512,729)+where();[mul(720,339)[~*when()mul(722,867)!);{+mul(582,286)^:)what()@mul(604,485) (who()why()who()from()[mul(128,295)how()?!%~~<what()mul(156,267)'how(689,161):where()mul(206,221) mul(835,81);] %mul(562,798)^{%where()mul(38,166)#!what()mul(185,550)^! ?,+;}}mul(685,101)select()mul(316,869)>[~}{[&;mul(548,186))(%];mul(841,290)when()where()'?mul(646,803)mul(553,782)how()when()-mul(569,604)@ ++:/%why()]select()mul(257,598)#mul(897,819)how()what()from()how()]when()~/!}mul(856,271)+&why(){}why()>who()mul(373,408)-who()^&%>';,when()mul(54,88)what()!mul(663,711)$#(?;^from()mul(898,810)when()from()%@mul(776,102)why()mul(303,842)!/,%<^;mul(840,791){[@mul(909,714)don't()>who()why()from(545,686)%~mul(483,956)^'why()from()where()$>*:mul(931,649) mul(800,313)):mul(31,69)mul(549,670)$;mul(327,976)@who()^mul(627,907)/[@what(925,706) ;^who()!mul(629,813)when(){$&where(){#mul(504,147)?mul(222,429)#who()*/!select()<what()mul(310,934)])^/$]mul(917,911)-%how()?[;,mul(823,273)*[~select()/select()~%mul(703,815)what()where()?what():'?[who()mul(966,52)how()&-~(%[(^mul(913,694)mul(190,570),&<%'from()where()what(979,309):+mul(662,926)/<!when()'select(),/&*mul(655,410) how()}mul(386,934)where()[mul(159,595)@']from()when()#?@mul(356,559)&)>?$ mul(439,336)?from()*select()*}when()]who()mul(148,356)(who()+mul(271,905)mul(564,172)@?(~mul(628,470)#} mul(301,170)?@,^don't();&:^&how(605,264))(what()'mul(896,108),$mul(413,431):<>where();how()>!}when()do()!}/&:when()>mul(754,737)~:#:* mul(962,620)}mul(26,490)!~,mul(450,234){/]who() <;{mul(938,932)?--#%};}mul(140,314)(-}/,[mul(202,839)^why()-!},mul(459,716),mul(600,932)}when()]who()}who())&mul(752,142$mul(174,573)mul(231,182)from()mul(308,661)what()} mul(178,99)&^*[(mul(858,730)~}from()^mul(17,545)what()~{~*^what(90,714)how(),mul(63,969)-]mul(364,49);mul(130,598<:&why()select(879,794)mul(46,169)>&how()%mul(564,506)/what(255,868)mul(415,375)':@who()mul(525,772)<$mul(277,787)[~mul(314,321)'&@$^%mul(741,325)?(%#;*mul(459,703)why()~what()mul(250,38)what()<-$)when()%(don't()mul(296 ',mul(673,933)?#<@who()from()^?mul(831,912)?/*mul(407,853)mul(119what()why()>mul(816,762) how()<}~from()how()/@:mul(792,799)()@?%:$:mul(289,264)
|
||||
why(),'*),from()mul(767,350):>~mul(123,684)@from()>mul(722,338)<'<select()what()}*select()mul(993,866)where()[;'select()what()select()?why()mul(357,705)what(){+&mul(590,928)how()[why()how()+what()><why()how()mul(417,421)/[?where()mul(298,609)*%who()#where()}why()(~+mul(233,280)when()mul(740,13)where()#why()!/mul(702,342)@;mul(945,10)[}!#mul(758<mul(969,595)+how()from(573,280)what()mul(351,944)what()where()]+<how()&[^mul(211,333)what(590,707)<'mul(579,209)do()^what(324,278):<+)!mul(482,641,^why()/<$from()select()mul(302,432);$where(){*mul(58,633)#]+,select()'$mul(534,736)@+~@what()/mul(492,990)'mul(606,447)~}, #@$)$/mul(878,726)'++'who()!where()what(777,25)why()mul]@>mul(252,529)do()%)%^when()!mul(731,123)mul(582,378)-mul(934,355}where()what()how()@%<[>;<do()(mul(709,553)])?&~mul(936,634)when()who(),do()#$$mul(917,683)select()when()+mul(858,234)!mul(828,850)@(?)^)mul(244,230)*^/%what()[^$who()@mul(716,56)from()/mul(312,20)!)mul(333,734)select()from()from():$how()+$${mul(443,208) &when()&$-&:mul(4,320):*;&#~~mul(261,16)&select()'@who()~^+mul(597,905)]]()who()(mul(273,2)who()how()#+?when(263,200)/mul(699,563)$don't()why()]!mul(744,844)>:mul(5,63) who()!mul(946,479)+}select()$@mul(478,71)~<()-#mul(500,398)'from(612,869)select(98,846)!!<]:select()mul(785,98)',select()//:-mul(192,182):{ why(){;mul(910,471)&^+&who(424,579)/:select()[mul(217,829)where()how(423,674)$*mul(318,444)[!?~mul(254,793)who()select(521,861)how()mul(54,186)why()[:^;-mul(109,234)mul(465,266)+?([-mul(518,485)^mul(403,383)mul(726:how()when()#mul(344,785)/}+?mul(97,996)+@'mul(637,749)how()-%+mul(302,591)don't()%^]}!)]mul(524,902)$[]/*mul(839,651)}^)$when()'what()mul(270,805)#mul(566,750){ how()/mul(716,302)/&*>@-what()>when()what()mul(602,574)+where(619,83)mul(235,585)?where()[%select()+>where(){]mul(209,404)~where(),why()how()-/-mul(123,125)^'how()who()$}/;mul(851,629)how()who()'#;$ do():select()!when()[>+>mul(576,669)what()!,'?from()&mul(423,260) how()-mul(910,922)?<@'->(mul(274,173)why()}<~from(601,667)mul(282,816)<how()when()when()' ^from()mul(939,359)mul(385,79)who()&when()-^?-^don't()how()+*/mul~@, @/!$mul(526,30)}(:~from()do()who()$/!~)what():%mul(366,255)(*+>from(953,125)~mul(98,837)&[how()[what()mul^%} '$from()^-;mul(439,801)mul(761,498))>$'-why()<</mul(557,979)[mul(224,700)*mul(917,173)[-(~;mul(44,236)%select()what()( ![(who()mul(153,275?how()(!/mul(627,465)%/>who():mul(109,723)from()who()mul(391,416)& -how()>mul(496,170)^'${mul(657,96)why(611,959)why())from()%+mul(62,175)>}~,%from() >mul(92,927)mul(17,279)!why(){+where()}how()mul(939,286){;mul(744,904) from()?''who()&who()how()mul(170,192)@,mul(499,985)';from()})!{+who(){mul(572,653)#:why()mul(720,626who()from()(%:mul(676,779)!why() when(58,261)^ *mul +from(){)')@!*mul(802,646)how()(-+[;#when() {mul(742,576)<where()>]* ;mul(38,717)?what()}'how(184,130)mul(126,115)]@>mul(512,978)/where()+*why()mul(705,242)?{$how();when()mul(173,898)'(~who()mul(536,621)&^from()select()when()?@mul(52,680)] -%@;][mul(971,573)^mul(879,466)
|
||||
mul[!-,why()(?mul(770,624)~:mul(197,580){{(%mul(678,337)what()mul(951,457)'<#mul(679,253)?do()who();& who()select()mul(105,231)+{&!when()who()how()!')mul(262,609)):,{'from()/?@}don't()*:mul(471,462):([(@;from()mul(734,965)/&/where()mul(885,324)why(){>/#<:mul(390,818)!mul(684,730)*>>{[!what()what()mul(824,893)mul(801,597/why()!when()how() '>from()%mul(165,825)who(837,795)?? why(187,949)mul(703,551) when()'mul(759,898)select()#$$ where()where()mul(694,292)%(who()%#}mul(884,767)^<mul(900,512)^what(862,782)%*}mul(484,385)]where()where()mul(593@{what()?{{@&who()^*mul(511,975)+%from(193,630)@-~how()/<mul(161,30)mul(462,217)mul(283,656)when()mul(733,613)what()^what()why()/where()what()^!mul(777,858)^select()mul(732,203)how()<mul(574,457)select()where()$who()when()~where()#}mul(525,448)*mul(5,230)mul(347,280)<from()#what()mul(613,165)@who(609,769)@~/,%#;*mul(298,242)what()+~when():($-(mul(118,981)mul(72,529)$^~select(306,809),!/(mul(864,257))what()-?mul(308,631)? //*&,/!don't())>:$mul(945,214) where()how(837,748)(mul(537,489)(%{mul(594,245)who()from()from()%}!)])why()mul(832,704)^~mul(902,18)how()what()who()/#'-#mul(345}who()when()?]&^mul(873,161)^mul(81,518)]$mul(875,700)how()where()(mul(735,369)/-< why()@>mul(703,274)-<mul(949,449)what()+(>from()when()**,)mul(204,896)]+mul(28,596);why()#select()'#]mul(774,171< why() !from()mul(29,711)mul(28,600)}when()!@(^why()~{mul(555,761)%}do()from()-mul(139,179){how()'?mul(294,354)}where()mul(317,957)]select()#;where() where()^@from()mul(461,831)~who(75,120)%who()@-&;,)mul(563,131)mul(607,401)select())from())&,mul(26,412)select(726,797)&)how()@select()mul(416,615)(what()select()!()<<what()who(299,911)mul(628,777){mul(712,971)(*]what()from()<>#;&mul(921,158)>- mul(245,598)select()what()*({mul(468,522)]^select(574,638)]@};do()from(799,930)%who()#:[how()mul(413,674)[how()*mul(327,432)%?@'mul(486,644)}~>-mul(637,16)how(254,818){%where()#where()who():who()mul(431,749)$$where(228,303)<!why(109,819) ]mul(693,21) where(396,89)[mul(60,538){mul(738,595))-&why()how()why()(mul(698,770))*>,%+&mul(593,337)}#:where(){why()[+&!mul(520,180)^mul(723,959)mul(492,739){/?mul(327,463)?-select()-<,mul(102,950)!#do()@when()-when()},select()/mul(274,979/from())who()(~)!^$mul(78,739)why()@{~mul(819~?~+]>@mul(824,208)}mul(338,41)where() &*;;&what()mul(888,646)from(),$:-who(263,596)!!-from()mul(396,204)>{)>{?(%{mul(885,937);!what()&%!<mul(178,507)mul(833,974)^mul(842,332)>from()}mul(207,417)(<;what()mul(187,893)((&&}&why()*)-mul(589,985)^how(310,10)when(),]:mul(989,534)$where()mul(552,604;(!;select(){){where()#mul(152,511)+/$!;+/<+]mul@select()::when()who()how()!what()mul(446,994)from()<}what()select()'why(244,102)+<select()mul(516,369)]&mul(707,483):@}%?what()from()don't()mul(407,712)$:{&:,,,?mul(112,3)-~- what()>)%}who()mul(693,903)?*/}select()mul(282,115)[];why(){mul(925,276)how()&{what()&$when()&-!mul(191,385)*)mul(446,703)[>what()?*}what()^who()*mul(997,718)!>$)@,^*)mul(788,724)from()#&]~/<,)how()mul(181,531)[(why()[mul(409,206)what(604,231) when()why(921,229)]>where()//mul(199,96)when()why()#!/usr/bin/perl~%>~ &:mul(239,884)
|
||||
what())[$^+why()mul(118,89)mul(689,203)#,,what()what()mul(633,394)from();~from()!where()*?@mul(568,753)/[+when()?%:mul(828,475)what()don't()-;@ mul(509,544)[when()};<+'(mul(235,757)<+:%select():mul(241,373)$mulselect() (%where()where()]-)mul(306,62)from()what()mul(285,414)!*&&>who()#mul(543,866)/~select()[+don't()/><why()from() ~#mul(983,515)#mul(731,258)mul(894,831){>)where()!when(),'mul(701,189)/';!:]+how(902,507)-^mul(847,104)mul(883,112){'~}&mul(697,190)what()%-mul(220,860)+^mul(765,74)select(),$who()<mul(685,855)!what()where()why()#{,-;mul(302+^(who()]from()~<?where():mul(383,623)::~(>,@mul(639,551);(mul(26,80)why(480,988)^why():? <[mul(672,116@mul(316,879)}mul(498,582) @,:{'why(589,887)mul(39;]mul(855,31)^from()?mul(93,510)mulwho(){@-what()<where()~select()mul(225,679) 'mul(305,662)/:,mul(887,727)?:~:&/select()#:<mul(755,830)^#}+@)how()?^mul(14,79)-mul(433,926)what()'mul(458,711)>from();where()from()~:(mul(688,799)~when()>from()-select()who()~<mul(71,560)( who()? +#^who()[mul(70,477)}>#+{ >mul(275,916)#?-mul(359,865)where(441,672)'}what()[from()when()<>who()mul(909,227)$:!'mul(330,478)!?[;(+#what(919,466)&/mul(73,181)[{how()mul(403,182);mul(249,968):!from()?!{#-mul(661,975)!-;}'mul(999,285)select(565,140)+>@,$:from(47,825)~!mul(599,436))<when(603,518)@mul(567,365)?(}}where()<{:who()?mul(755,613) <*who()mul(448,608)$$mul(507,887)mulwhen()]when()^$+@();+mul(846,707)]mul(932,511)who()}}where()#mul(122,316)#>+ [>%!mul(959,617)mul(5,150)where()@;&mul(630,775)<select(686,710)who()/';[*%select()mul(859,837)'mul(451,3)(when()($/+mul(499,794){]mul(194,78)from()'?don't();mul(47,314){who()~/]mul(526,464)why(666,133)#}/;]:mul(223,721)how()><&-:;mul(114,820[don't()when()#how()mul(976,290;+-from()where()]mul(338,47)when()what()where()%]mul*who() #+what()mul(679,324)mul(859,321)%'mul(446,297),#select();<mul(797,938)who()mul(531,845)}*select()@{mul(661,677)/)'*mul(837,800)<who()select()<]}<@mul(844,594))when()where():'mul(75,307)mul(676,67)(]what()<select()?mul(851,92)+&)mul(683,41)?<,/:~'mul(179where()from()~<mul(674,897)/!how(529,298) *[}from(),mul(362,131)}! % $mul(168,955)mul(517,218)[(,mul(740,567)}~[)$@from(),do();]mul%/%]why()mul(777,920)what()what()$;<what()mul(307,462)-+from()what()/$select()select()do()<select()&from()why()why()&mul(522,562))<how()-!+when(413,672)&)mul(621~(?select()<*-why()mul(372,852)}]~mul(668,335)mul(512,514){%mul(873,547)[*(mul(887,814)]>';from()mul(206,301)why()-'mul(87,734)<where()+:mul(844,819){#^^mul(130,409)[('@what() ;mul(916,629)@@who()-?}mul(320,288)what()?mul(184,677)[@#select()+::-select(929,36)/mul(329,568)
|
||||
{^mul(75)<:from(){select()select()mul(833,211):[-'mul(702when()who(21,237)+)&!>mul(735,118)] {/what()*@^what()where()mul(685,883)when()what()mul(91,84)}]<select()why(795,767)@why()]}$mul(711,291)select()--+<*who()mul(898,469^how()>-~where(){when(374,912)$do()>~,' how()mul(67,939),)&~@where()(mul(923,997)~,*$when()[from()from()mul(699,705)~/when()+}mul(214,775)'%mul(715,142)-;mul(290,853)from()$why()what()select()-@-mul(682,729)+^$}, !mul(197,39)mul(269,573)@^mul(819,945)/select()-do()%$~'#select() 'mul(64,956)[who()*who()@,)>+}mul(519,356);*/%>why()[[)mul(184,666)what()mul(892,160)+*&where(764,214)--]?(>mul(996,338)>when()what()]))&?mul(865,864))?@[::when()>what()>mul(218,296)&)%:<?mul(903,712),+mul(102,86)' ^,[>[~why()how(416,393)mul(118,100)from()select()#: $mul(7,742)how()&~how()>who()^mul(667,218)?/mul(218,898)!:$from()>mul(746,995)(+select()] when()}mul(971,429), !,&mul(505,165):!-)?-how()from()%mul(921,456)@mul(491,404)#how()-mul(284,834)#?(mul(667,960)]where():how()what(963,920)% what()don't())mul(236,336) why()why()select()where()^mul(33,901)mul(253,866)<#>$]%-mul(216,512),)from()what()what(464,183)where()select()@'}mul(98,640)' :)what()$%~#/mul(283,893)(mul(520,959)#^?{>@*when()when()]mul(80,420)where()mul(751,106)when()when()! how()mul(148,813)@><^[mul(740,246) how()where()!!/mul(242,262) who()who()%,mul(308(#/when()$mul(359,332)from()why()from()~$$^where()@mul(270,445)why()}%mul(623,449)where()how()?& />mul(759,849)-} (mul(84,200),$;who()[!mul(934,76)(@^:where()why()/'mul(650,46)[mul(105,265):)when()+ &'what()^mul(334,290)] $what()/mul(930,226,>^!%don't()mul(243,460){'#/what()+/mul(437,684)mul(501,579)/mul(243,174)mul(988( +<#where(206,306)where()[,from()mul(331,170)(?^~}#mul(940,949)>(,*+mul(925,961)^*from()select()^--^)(mul(994,182)+'+mul(153,816)~<!?[mul(31,276)don't()how():/!*] !^~mul(404,438)from()<]?)})>&mul(260,998)~:],],who()why(348,109)why()<don't()]#?)select()<<where(999,395)mul(342,366);what()select()~&~mul(120,353)when()]mul(198,41)][;(]:select()-[mul(947,937)$$when()-{mul(672,675);/!mul(14,647)>who()when(290,863)why(735,89)!from()@ >#mul(205,831)'$ %'mul(981,644)!<mul(100,956):{#select()#*mul(168,493)who()-%)#;{don't()^]who()~~ *mul(47,958)mul(130,976)how()~how()?what();mul(983who()(why()/)},]*:/mul(374,969)>#,*>mul(910,535))[who()#mul(220,934)how(271,592)-,*$,+mul(11,63)mul(783,580)^&*}~<mul(677,425))select()when()/how()mul(181,298)??why()how()&/mul(670,720)/@!when()where()#mul(403,306)]from()(from()why()*why()don't()^~from()[select()who()select()mul(516,37)what())}-*>(;from(){mul(21,444$what(274,202)<where(),}mul(706,78);select(275,134)]{&}why())@mul(302,87)[@[who()!when())mul(196,98)mul(918,675):,>how()mul(293,78)mul(189,814)#{}why(80,738)}from()mul(456,691)*@{(,[%mul(916,89)how())(]@mul(524,412)];:(mul(374,851)where()[mul(473,999)select()$what()}don't();];(}mul(327,69)%&+;:/what()don't()-%,'()mul(377,536)mul(31,322))@what()^select()mul(719,58)$why()~&what()']}mul(39,890)(+<#who(){how()!<mul(559,894);-&what()from()#$do()mul(256,3)where()^how()when()$:<what() mul(664^-from()}mul(469,922)from()>mul(299,824)(]](+mul(205,11)
|
||||
{mul(602,646)!% ^mul(384,953)do()&&:]<<select()#<mul(766,701)&@(what()who()+>mul(228,736){({}don't()-when()@*>-mul(278,494))/&<mul(596,290)select()when()),{ ~mul(563,584)mul(351,221)how():#where()[{%what(128,820)[ mul(754,363)!{)how()&''from()mul(388,712)?;'>?><(select()mul(916,219)select(),:{(<*mul(360,209)why();~}where()-(,mul~when()when()!where()@:;:#/do()select()select()!,how(972,480)~-how()who()mul(726,867):>mul(549,954)](how(802,821)select()how()[+^mul(535#select()}why()[what()]why()*{#mul(72,525)mul(809,41who()!~where(82,230)}mul(961,563)}who()what(417,588)<how()mul(756,106)!)when() [mul(733,591)how()[why(),<+@,mul(889,603)when()when()mul(60,212)mul(955,930)]~&)/!}-}&mul(206,66)where(882,366)~/<{mul(745,261)'<where()<why();select()(how()mul(74,146)where():~who()what()>&*mul}{,+?%^[when(34,108)who()mul(71,111)$+,}#~-<mul(265,932)]$what();^mul(775,136)mul(192,60)how(){)mul(212,476<who()?mul(264,266)[,^&/how(215,234)mul(447,79)!!+;,who()@{mul(897,924)^what()-%((don't()mul(259,393)who()when(956,639)&where()]@{,mul(637,712)%(mul#'select()!~<+<do(),#&<:% -{)mul(914,330)when()-)?@]{where(240,411)*select()mul(191,984),%?-what()+{mul(623,7)+mul(899,145)</why()select()what()<{~mul(849,743)!where() mul(43,318)when()!~$)mul(607,51)!?<mul(123,500)<]how()!what(){(mul(380,536),mul(367,657)~{,why()?-*$mul(589,520)(#mul(568,853)!-how()'^what()}'^mul(924,205),};'/^!!@mul(765,625)*!+where()[@select()-~do()!!,who()+%mul(369,495)()/mul(530,282)mul(148,870)]*where()mul(668,764)%who()how()how()&![who()mul(678,727)>^]@ when(){:@mul(545,335) &how()from()<:mul(958,59)$ (what()mul(886,155)how()&+mul(525,132)<&}who(502,340)select()when()#^mul(339,398)who(),(how())@@how()$$mul(831,852)when()don't()>mul(935,45) select(930,598)!:select()mul(693,62)(mul(681,508)how()^@*;)mul(235,731)who(468,32)#~>don't()#:what()where()when()~<who()-/mul(137,827)!who()!why()mul(806,939)from()mul(492,899)why()^),who()]#from()$ mul(384,731)>~^>@#{mul(2,62)mul(866,617),>% mul(806,586)how():{/mul(669,407)!/mul(457,522)mul(40,474)>)]select()who()}mul(451,794)]#mul(115,471)~mul(331,456)@^who(){#when()mul(672,70)where()who())(#how()what()!mul(438,748)-/mul(605,224)mul(46,34)~?'</'$#how()&mul(278,426) mul(710,864)mul(296,109);mul(481,73)&<,]mul(650,979) mul(575,478)how()$@%#;mul(319,368)][select()where()/ /,:when()mul(399,630)from()mul(9,26)~'do()mul(953,316)%''%{>mul(650,523)?mul(871,731)?%from(966,980)>when()mul(790,779) from()#$:,'mul(428,763)@# why()mul(724,6)select() ,mul(208,11)why()how()mul(287,562)$[:select()},?mul(531,36)/mul(12,351)#$+,:#:$when():mul(941,380)-[from()!)?-select()mul(102,544)when();~{select()~^;-do() ]who()from(),<who()]/>mul(959,599)>why()/,<%-,!mul(517,558)%])$mul(945,968)mul(854,265)?<when()mul(98,913)<&&}]+mul(830,92)where()]why(132,949)why()from()when()'when();{mul(615,131)(,;}^~!mul(973,226)how()^}){}mul(45,238) where()#)'!~ <
|
||||
91
2024/gareth/day04/day04.go
Normal file
91
2024/gareth/day04/day04.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package day04
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
var directions = [8][2]int{
|
||||
{0, 1},
|
||||
{0, -1},
|
||||
{1, 0},
|
||||
{-1, 0},
|
||||
{1, 1},
|
||||
{1, -1},
|
||||
{-1, 1},
|
||||
{-1, -1},
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid := parseInput(input)
|
||||
return countXMAS(grid)
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
grid := parseInput(input)
|
||||
return countXMASPatterns(grid)
|
||||
}
|
||||
|
||||
func parseInput(input string) [][]rune {
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
grid := make([][]rune, len(lines))
|
||||
for i, line := range lines {
|
||||
grid[i] = []rune(line)
|
||||
}
|
||||
return grid
|
||||
}
|
||||
|
||||
func countXMAS(grid [][]rune) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
target := "XMAS"
|
||||
total := 0
|
||||
|
||||
for r := 0; r < rows; r++ {
|
||||
for c := 0; c < cols; c++ {
|
||||
for _, d := range directions {
|
||||
dr, dc := d[0], d[1]
|
||||
found := true
|
||||
|
||||
for k := 0; k < len(target); k++ {
|
||||
nr := r + k*dr
|
||||
nc := c + k*dc
|
||||
if nr < 0 || nr >= rows || nc < 0 || nc >= cols || grid[nr][nc] != rune(target[k]) {
|
||||
found = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if found {
|
||||
total++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func countXMASPatterns(grid [][]rune) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
total := 0
|
||||
|
||||
for r := 1; r < rows-1; r++ {
|
||||
for c := 1; c < cols-1; c++ {
|
||||
|
||||
topLeft := grid[r-1][c-1]
|
||||
topRight := grid[r-1][c+1]
|
||||
center := grid[r][c]
|
||||
bottomLeft := grid[r+1][c-1]
|
||||
bottomRight := grid[r+1][c+1]
|
||||
|
||||
if center == 'A' && ((topLeft == 'S' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'M') ||
|
||||
(topLeft == 'S' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'M') ||
|
||||
(topLeft == 'M' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'S') ||
|
||||
(topLeft == 'M' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'S')) {
|
||||
total++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
35
2024/gareth/day04/day04_test.go
Normal file
35
2024/gareth/day04/day04_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package day04
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX`)
|
||||
assert.Equal(t, 18, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX`)
|
||||
assert.Equal(t, 9, r)
|
||||
}
|
||||
140
2024/gareth/day04/input.txt
Normal file
140
2024/gareth/day04/input.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
XASXMAXXMSXXSMMSXMMSMXSMXMSSMSSSMMSMAMXMXSMMMMAXAMXSASXSSMMSSMXAMXMSAMXMMXAXXXSAMXXXXXMMXSXMXXSMASAMXMXAXXMASAMXXXMAMMMSXSXMXMMMSAASXSMSSMMS
|
||||
XASAMSSMAMMMAMAAAMASMAMAAXMASAAASAAMAMAMAAAAASMSSSSMAXAAAXASASMMMMMMXMASXMAMXXXXSMSMSXSAAXAMXMASMXMMSMSAXSXMMSXSMMAAMXAMAAMMAAAAXMXSAAAAXAAM
|
||||
MXSXMAAMXAAAXMMSSMAXMASXSSSSMMSMMSXSASMSMSSMMMAAAXXXXMMMMMXXAMMAAAASMMAAAXMASMXXXAAASAMMXSASASMMMAMXSASASASMAXXMAMSSSMSSMMAXSMMSXMMMMMMMXAMX
|
||||
SAMMMSSMMXXSXXXAAMSMSASXAAXMXXAAXXXMAXAAAXXMASMMMMMMXMXXXXSMXMSSMSASASMMXMMXMAAMASMSMSMAASXSAAAASAXAMAMXAAXMASMSSMXAMMMAMXSAMAMAASXMMSSMSAMX
|
||||
MASAAAAMSMMMMMMSMMMAMAXMMMMMXMSSMMXMSMMMMMAMXASAXAASXMMASAAXAXAXMXMXMXAASXMAMSXSAMMXMMMMMSAMXMSMSMSMMAMSMXMMASAMXAMMSASAMMXASAMSXMAMXAAXSAMA
|
||||
SSMXMSMAAMAAXXAMXASMMSMAMXSXSAMXXMAAAAXSXSAMXMASMSXMASXAMSAMXMMMSASMXMXMMAMSMXAMASXMXAASXMMMMXMMXAAXXAMXXAAMAMAMXXXASXSASXMMSAMMASXMMMMMMMMS
|
||||
XXXXMAMMMSSSMXSXSASXAXSXMASAMXSMXMASMSMSXMASXXMMXMXSAMMXMAXAMAXXSXSAASMASXMXAMXMMMAASMXXAMXMMAXMXMSMSAMSSMSMMSSSSMMMSXMXMASXSMMXAXAXSSSMXAAX
|
||||
MMXSSXSMXAMAMAAAMSXMXMMXMASXMMSAMXXAAMXSASAMMXXSXMXMASXSSSMXSSMXXMXMMSAXMASMMMSMASAMXMASXSAMSSMSMAAAMAMAXAMAMAMXAXAXSAMXMXAXMMSMMSXMAAAMSAMX
|
||||
AXMXMASMMASAMXSXMMXSAMAAMXMMMAXMMSMMXMASAMXSXMXMAAMAMSAMAAAMSAMMSXMXSXMXAXMASAMXAXMASXMAMMAMAAASMMMSSSMSSMXSAMXSMSMXXAMXSSMASAMAMMASMMMASMMM
|
||||
XMAMSXSASASASMXXMAMMAASXSAAAMMXAAXXAMMMMSMSMXMAXMXMAMXAMSMMMSAMASAMXSAMMMMXMMAMMSXXAMAXXAMSMMSMMAXXXMAAAAMAMAXXAMXXSMSAXAAXAMMMAMSXMAXXMSASX
|
||||
MSSMXASAMXSMMMAXASMSMMAXMAMSASXMAXMMSAXSASAAASMXMASMSSMMMAAXSAMMSAMAMAMMSAMSSSMSAMMSSSMSMXMAXXASXMMMMMMMSMASASXSXMASAXXMSSMMXMXMMMMSAMMXSAMX
|
||||
MAMMMMMMMMMASAMMMXAAXXMASAAXASMMSXMAXMXSMSMSMSXAMMXXAMXASXMXXAMASAMSSXAAMAMAAMXMASAAAAAAXSSSMMAMASASXXXXMMXSASAXXAAMAMAXXMXSASASAMASAMXAMAMX
|
||||
MASXAXAMXXSAMMAAXMSMMXMAMXXMMMAAMMMSXMMSXMXAAXXMSAMMSSMMSMMMMAMASAMAXMASXMMMSXAXXMMMSMMMAXAAXXSSMSASMMSAMXXMAMAMXSSMSMSMAMAXXSXSASXMSSMXSAMM
|
||||
SXMXMSSSMMMASMSMSMAAMASXMMXSASMMXXAMXXASASMMXMAMAAXAMAMAXAASXMMXMMSMXXAXMSXMAXXSSSXAXAAXMMMMMMXAXMMMXAAMAMMMXMAMAMXAMAXAAMASAMASAMXMAMMXSASA
|
||||
MMMXMXXAXAMAMMAAAMSMMAXAASASAXXXSMSSSMAMXMAMXXASXSMMSMMXSMMXAXSXMAXAMMMXXMAMSAMXAAMSSSMMXAAAAXSAMXXAASMXAASMASXMSSMAMAMMXSAAAMAMAMSMAXSAXAMM
|
||||
SASASMXMMSXSXSMSMMXSMXXXMMASAXSXMAXAAMMMSSMMMXASXMXMAAXMXMMMXMSAMXSXSASMASAMMSSMMMMAAAXMSSSSMXXAMXMAXXXMSMSAAMAMAMAMMMMXXMMSSMMXAMXXAXMASXSM
|
||||
MASMMAMSAMMMMAMMXSAMXSMSAMXMMMAAMAMXMAMAMAAAAMSMXSASMXMAAAXSAMXAMAAMSAMSAMXSAMMASAMXSSMMMAMMXXMSMMXMSSMMXAMMXSAMMSAAAAMXAAMAXASXSMSMMSMAMAAX
|
||||
MMMMMSMMAMXAAMMAAMMXAMMAAAXAXSSXMAMXMAMASMMMXMAAXSASAMSSMSASASXMMMSXMAMXXMMMMXMAMAXAMXAXXSAAASAAAXXXAAMAMAMAAXAMXSASMXSASXMSSMMAMASAMSMMMSXM
|
||||
SAAMAMAMAMSSSXMMXSSMSSSSSMSSXAAMSXSXSASASAMAMSMSMMMMXAAXAXMSAMASXSMMXSMSMSXSSSMMXMMXSSSMAXMXSXMMAMXMSXMASMMMXSAMAXAXMASMMMMASAMXMAMAMXAXAMXA
|
||||
SSSMASXMMXMAMXMMAMXAAAAMMAAXAASMSXAAXAMASMMAXAMAAMSAMMMMSMMMXSAMXMAAMXAMAAXMAAXAAMMXMAMMAMMXXAXMAXSAAXSXSXXAASAMAMSMMMXXMXMMSMMSMXSXMSXMXMMS
|
||||
XAMMAMAMXMMSMMSMAXMMMSMMSMMXMAMAXXMSMSMMMXXMMSSSSMMXMAAAMAXXMMMSXMMMSMAMSMMMSMMSXXASMAMMASMMMAMSSMASMXSAXXMMMXXXMXMXXAMMSASMMMAXMXMXAMXSAMXA
|
||||
MMXMXSAMMXAXAXMSMSXXAAAAAMSMMXMAMXXAAMASMSXSAAXXAAMAMSSSSSMSXAAXMSMXAMXMAMAMXAMASXXMMMSMMMAMMSMMAMMAXAMAMSXSSMSSMMMASAXASMXAAMXSXAMXMAMXASMS
|
||||
AXMSMSXXAMXSMMMMXAMMMSMMMSAASAMMMSSMSSXMAAAMXSMXSSMAMMAMMAASXMMSAAXSXSSSSSSMMAMASXAXXASXSSMXAMAXAMXAMMMSMMASXAAXAASAMXMMXXSSMMSMMXSAMSMSMMMA
|
||||
SMAAAMASXMMSMMXMMMMXAAXASMMMMASXAAAXAXAMSMMMAAAXXAMXXMAMSMMMAXSMMMMMSAAAAAXAXSMMSMMMSAMAXXXMSSMSSSMMSAAXAMSMMMMXSMSASXXSXMMXAXMAAXXASMAAXASM
|
||||
XMSMSMAMAAAMMSASAAAMSSSXSAMXSAMMMSSMMSMMAMAXSXSXSAMAXSAMXMMSSMXAAXASMMMMMSMMXMAXMASASAMSMMSAMXXMXAAASMSSMMASAAXAXASAMAMMASMXSMSMMSSMMMSMSMSX
|
||||
MXXMAXASMMSSXMASMMMAMXMAMXMAMAMXAAXMMAAXMSAXMSMASMMSASAXSMAAXAMXMSXXSMXSAAMMAMAMXMMXSAMXMAXMASMSMMMMSMXAMAMXSMSXMAMXMXASMMSAAAMXAXXASAMXAASA
|
||||
MMSXMMMXMAAXMMXMMMSSMMMAMSMSMSMMSSSSSSMMXSXSMAMAMXAXASMMSMMSSSMSMAXMXSAMXSASASXSSXMASMMSXMMSMMAMXSAXXMXMAXXMAXSAMAMMAMXXSAMXMMMMMSSMMAXSMMMS
|
||||
MASMSASXMMMSSMAAAAMAAXSSMSAAAAXXAAMAAAMSXMASMXMASMMMMMAAMAMMXXMASMAMAMMSMXAMAMAAXXSASAXMASMASMMMASXXAXMSMSSSMAXMXSMSAXMAMXMSMSXXMAMASXMASAAX
|
||||
MXXAXAXMXAAMASXXMSSSMMMMAXSMSMSAMXMMMMMSAMAMAMAMXXAASAMXXAMMSSSMSXAMAMXAAMXMSMMMMXMAMXMSXASAMXSMAMMSSMXAAMAAXAXSAMXSASMSMAXAAMSAXASMMASAMMSM
|
||||
MAMSMSMSXMXSAMXASMMMAMAMMMMXXXAMXAMAMAXSAMASAMSSSSSSSMAMSMSAAAAAMXMSASXMSMSAXXXXMAMXXSMXSXMMSMSMSXMAMASMSMSMMSAMXSXMAMAMSSXMXMXXMAXXXAMASAXM
|
||||
MASAAMAAXSAMXSSXMASMMMAMXAMAXMMMSMXAMSXSAMAXAMXAAAXMXMAXAMXMMMMMMSXXMAXMMMSASXSMSMMMMSAMAXMAAAXAAMMMXMXXAMXMAXXMASAMMMXMAXXMSSMMASXMMSSXMASX
|
||||
MXSMMMMMXMASAXAMSAMAASMMSASXSAXAAAMSXMASMMSMSSMMMMMMXSSSXSMMSSMXXSAMXMSMAAMAMAXAAMSSMXAMMSASMSMSMAASMSMMSSSMMSAMXXAMXSSMAMXSASAMXXAXAAMAMAXA
|
||||
XMXMAXXAXSAMMXSAMAMXMMAAXAAASMMSXSXXAMAMXXMAAAMSAMASMAXAMMMXAAMSAXSAMXSMMSSSMMMSMAAAMSMMXMAXAXAXMSMMAAAXMAXAXSXXAMSMMAAMMMXXAXMMAMSMMMSAMASM
|
||||
MAASXXMMXMAXSXMXMASMMMMMMXMAMMAXXMAMSMXMAAMMMSXMASAXMMMMMAAMSSMSAXXXMXMAXAAMXAAMXMMSMAAASMMMSMAMAXAMSSSMMMMSMMMSMMXAMSXMASMMSMAMXSXXXXSXXAXX
|
||||
AMXMSXAMMMSMXMSMSASAXAXXMMMMSMMSSMAMMMMSMSXAAMMSMMXSAAASXXXXAAXMMMSMMASAMMSMMMMXAMAMXMXMMAAAMMXMAMXMXAMXMXMAAAAXXASXMAMSXSAAAMAMXAXXSAMXMXSM
|
||||
XXAAMSSMAAMXAAAAMXSMMSAMXAAXAAASASXMAAMAAAXMMSAXAAAXXMSSMAXMSSMSAMXASMSMSMMMSMMMSMAXAXSASXMSSXSMMSXSXMSAMSSSSMMXMXSAXXAMAMMSSSMMSMSMSXSASAAX
|
||||
MSMSMAMXMSSSXSMSSMMXMMXMSSSSMSMSAMXSSXSMSMMXAMXSMMSXXXAXMSMMXMASMSSXMAXMAMAAAAMAXMMMAXMAMAAAMXMAXXMMAXSASMMMXMXSAAXMMMSMAMXAXAMMAAAASAAASXSM
|
||||
XAAXMMSXMAXXAXMAMAMMMXMXAXMXAMXMAMXAMXSXXXSAMXMXMAMMAMMMXAMMAMAMXXXASXMSMSMXSXMXSAXMSMMASMMMSMSSMMMSXMSSMASMMAAMMSMMSAAMSSMASMMSMSMSMSMAMAXX
|
||||
MMMMAAMMXSMMSMMASAMAAASMMSSMXMMMAMXAXXSASAMXMASASASAAMAAXMMSASMXSAMMMAAXMAMXMXSXMAMSAMSAXAXMAXAMSAMMAMXXSAMAMMXSAXXAMXXSAMAAMXAXAMMXXXXAMMMS
|
||||
MASMMMMXAXMAMASASXSMSXSAMAMXMMMSSMSMMXMAMMMSSMSAMXSXMMXSSXASXSMMMMSSSMMXXAMASAMXMAMMAXMXSSMMSMMSMSXMAMMMMXSXMAMMMXMSXSXMMSSMMXSSXMASMSMMMXAX
|
||||
MAXAMXSMAXMAMMAMXASAMXSXMAMSXSAAAMAAXAMXMXAAAMMXMMMAMSAMXMMMAXAXSAMMAXAMSSXSAMXASXSMXMXAXAAAAAXXAAMASXMAMXSXMASAMSAXASXAXAXAXXMXMMXMASASMMMS
|
||||
MSSMMAMMMMSSSMASMMMAMXXASMMSAMMXSASMMMSSSMMSSMAXMASAMMXMXMMSMSMMMASXSMXXAMXXAMXXSASAASMSSSMMSMMMMMSAMASASMXASXXAXSAMAMSSMMSXMSSSMMAMSMAMAAXX
|
||||
XAAXMASASMMAAXSMMSMSMMSMMSAMXMAMAAAAAASMXMMMAMASMMMMSAMXMAAAXAAXSAMAXAXMMMAMAMMSMAMSMMAXAXXMAMMAMXMASXSAAASAMMMSMMAMMMMXXXMASAAAXMASMMASXMMM
|
||||
ASMMSXSXMAMSMMMAMXSAAMASMMMSXXAMMMMSMMSAASASXMASMASAXMASMMSXSXSMMXMSMSMMXMMSMMMXMAMXXMSMXMASMMXSMMSAMMMMMMMAMAXXASXMSAMXMMMXMMSMMMXXAXAXAMXM
|
||||
MXXAXXMASMMXSASAMXSSXSASXAXMASXSXMMXXSMMMSASAMAMXAMXSSXXAAXASAMXSAMAXAASMXXAMAMASMSMSXXAMAMAAMAXAMSAMXAMXMSSMMSSMMMMSASMSASXSAMAMSMMSMSSMMAM
|
||||
MSSMMXSASAASMMSSMAMAXMAXMMSXXMXAAMAAMXXAXMAMXMSSMXSAMXMSMMMAMAMXSASMSSSMAMSASASMXMAASAMSASXSAMAMAMMASMASMXAXAAXASAAXSAMXMMAMMXXAMASAXAMXXSAS
|
||||
XAAAAAMXSMMSSXXMMXSXMASMSXMASMMSSMMSSMSSSSXSAXXMXAMXXAMASAMXMAMMSAMXMMAMSXXASAMXSMMMMAMXSMAXAMMSMMSAMMXMAMXSMSSMMSAMMMSXSAASXMSSMMMXSAMAASAS
|
||||
MSSMMSSMXXAMAXMXXAXAMXXAXASMAAXAMMXAAAMAXAASMMSMXMMSSMSASMMMSMSAMMSXMSAMXMMXMXMXAAXAMXMXXXAMASAAAMMASXMMSAMXXAAAXMXSXAXMASXSXAMAAXXAXAMXMMAM
|
||||
AXAXMXAXSMSSMSMMMMSMMMXXSAMSMMMSSSSSMMMMMMMMXAAXXAAAAAMXMAMAAMMXMAMAXXMXAMAXMASXSMMSSMMXSMSSXMXSMMMAMAAAMXXXASXMMMAMMSMMAMMMASMAMMMMSSMMXSAS
|
||||
SMSMSXMMMAMXXSAMAAAXAMSAMXAXXMAMXMAAMXAXXSAMMSSMSMMSMMMXSAMMXSAMXAXMMSMSAMXAXXMAMAAMAAAXXAXMASAMMSMMSMMSSSMMMMSAAMAMAMAMASASAMXXMAXAAAAAXSAM
|
||||
XAXASASAMSMMMSAMSSXSAMASXMAXXMAXSMSMMSMSXSASAMAMXXXAXAXXMAXMAMASXMSAAAXMMMXSMXMAMMMSSSMXMSMMMMXSAAAXXXXAAAXSAAMMSMMXXXAMAXAMXXMXSXXMSXMMXMAM
|
||||
MAMAMSMXSAAAASAMAMAMMSMXXXMASMXSAAAXXMASXXXMMSXMSMMXSSSSSSSMMSXMAAAMMMSSSSMAAASASAXXAAXAXXMASMMMXSSMMMMMSMMSMXSXMMSAXXSMXMXXXAXAASXXAMMMASXM
|
||||
MXMAMASXSXXMXSAMAMXMXAMMASMMSASAMSMSSSMXASXSAMXMASAMXAAAAAAMAMXSMMMSXXAAAASMSMSSSXSMMXSXMAXASXAXXMAMAXAXAAXXMASAMAMMSAXAMSAMMAMSAMXMMASMXMMM
|
||||
MSSXSASXMAXSXSXMAMXXXAXSASAAMMMMMAXSAAMAMAAMAMXXAMMAMMMMMMMMAXXSAMAMXSXMSAMXXMXMMMXAMAMAMSMMSMSMAMSXMXSXXAMXXAMAMXAAMXMAAMASAXMMMSXASAMXAAAX
|
||||
MXXXMAMAMAXSAMXSXXMXSSMMASMMXAMXSXMMSMMAXMSXMMSMSXSSXXAAXSASXSASXMXSAMXXMASMSMAXAAXMMAXAAAAXXAASMMAASAMASMXMMXSAMSMXSXMAMSAMMSSXMAXMMMSSSMMA
|
||||
XMXMASMMMXMMAMXXAASXXXAMAMAMSMSMMAAMMXXXMXXAMXAAAASAMSMSSMAMAAMMXMMMXSMXSAMAXMASXSSSSSSMXSSMMSMAMMXAMAMMASAXXMXMAMXASASAXMASAXAMAMMXAMXAAASX
|
||||
SAXASXAXMAASXMMMXMMAAXXMMXXMAXAAMXSMMSSSMASMMSMSMMMAMAMMMMAMAMXMAMSSXAAAMMMSMMAMAAAAAAAAAXAMAAMMXSAMSMMSAMMMSAMXSAMXMAMMXMMMXMXXAMXXMMSMSMMA
|
||||
XXAXAMXMSSXMASAMASXMMMSAMSSMSSSXSAMAMXASMAMMASAXMASXMASMASASAXXSAAAMSMXMXSXMXMSSMMMMMMMMMXAASXSAAMAMXMAMAMAAMAMAMAAMMSMMASAAMSASXXSAXAXXAAXS
|
||||
MMSSSMSXAXAMASASMMAMMXMAMAAAAAMXMXSAMMMMMSSMAMMMMXAXSAXMAMXSXMXAMMXXXMAXXAASXXXAMXMASXMASMMMMASAMSSMMMAXSAMXSMMSXSMSAXAMAAMMSAASAASXMAXXXMXM
|
||||
SXAAAAAMSSMMAXMMMSAMMXSMMSSMMMMXSXSXMAXMXMAMMSMXMAMXMAMMMMXSAMXXXMXMASXSMMMMMSSMMXMASASMMASMMAMAMAMAAXASAXXXMASMAMSMASXMXSXXXMMMMMMXMASMAMAS
|
||||
AMMSMXMAMAXMXMSAMMXMMAMMMMAMXXSMMASMSSSMASXMAMXAXSXMSXSAXSAMAMASMMMXAMXMXAMAAAAXAAMMSXMXSMMMMSXXMAMSMSSMMMSMSXMMAMAMMXMXAMXMMXXSXAXMAAAMAMAS
|
||||
MXXXMAXMMAMXSXMASMSMMASAXSAMXAMAMAMMAAAXAMMMASMMXXAMAASAMMASAMAXAAAMSSMMXSSMMSMMSASASXMXSAMAAMXSMMXAMXAAXAXAXMAMSSMMMAMMSSMAAXXMAMXSMXXMXMXS
|
||||
XXSASXSSMSSXMXSAMXAASASXXAMXXMSSMMSMMMMMMXASAMMMAMMMMXMMMSAMAMSSMMMSAAAASMXXMAXAAMMMMAMAXAXMMSXMASXMSSSMMXMAMAXMAMAAMXSAMAASMMSMXAAXMAXMAAAX
|
||||
MMSASAAAAAXMSAMASXXMMAXMXMSASXAXAAMASXXMASMMMSSMMSSMMSAAAMASXMAAMMSMMXMMSXAXSSMMMXAAMMMAXSMSASAMAMAAXMAMSAMXSMXMAXMMSAMXSXMAAASXAMASXAAAXMMS
|
||||
MAMXMMSMMMSAMXSAMAMSSSXSAAAMAMXSAMXASXXMASAAAAMAAAAAAXXMXSAMMSXMMXAAXSAMXMAMMXMAXMSSSSMMMMAMASAMASMMMXSASXSAXMASMXSAMASXMMMMMMMAMSAAMMSXSAXX
|
||||
MXSXSXAXAMAXXXMAXAAXAAAAMSMMMSXMAAMXSXXMASXMMSSMMSMMMSMMMMASASAXXSXSMAMSSMMXSAMMXMAAMMASAMXMMMXMMXXMASMMMXMMMSMSAXXAMSXMAAXAXXSMMMXSXAAAMAMX
|
||||
AMAXMXMSSSMSMMMSXSSMMMMMXAASXMASMMSXMMMSAMAAXXXXXMAXMAMAAXMMASAMXMMXMXMAXMAMXASAXXMXMMASMSMSMMXSMSSSSXXAMMXSAMMMXMSAMXASMMSXMXSXSXMAAMMSMMXX
|
||||
MMMXSAXMAAAAAAMMAMXMXXSXSSSMASMMMAMAAAMMMSXMAMMAMSMMSSSSSSMMAMMMAAAAMAMXSMMSSMMMSSXAXMAXXMAAXXAASAAXMAXAMSAMXSXMXAMXMSAMXASXSMMMMXXMXXAMASMA
|
||||
XAAAXMMMMMSMSSSMSMASMASXXXAXAMXAMAXMXMMAMAAMXAAMXSAAAXMXMAMMAXAXXMMAMSXXSAAXAXAMXMASXSMMMMSMSMXSMMSMMMMMAMXSAMAMMMSAMXSMMXXMAAAAMXSXMAXSSMAX
|
||||
SMMSMXAAXMAXXXXAMXAMMAMXASXMSMSSSSSXSXSMSSXMASXSXSMMSXSMSAMSMMSAMXXSAMXASAMXMSXSAMXMAXAASXMAXXMMXSAMXASAAXASASASAAMASAMXMMMAXSMSAAMASMXMXASX
|
||||
XAXMASXSMAMMSMMXMMSMMASXMMSMMAAAAAMAXMMMAXXMXXASAMXXMAMAMSMXMAXXMAMXASAMXAXXXAMMAMAMXMSASAMMMSSSSSXMMASMSMMMMAAMMSMASXSAAAAMXAMXMXXMAMAMXSMX
|
||||
MAMMMMAAMXAXAAXAXAMASMAXMASMMMMSMMMMSASMMSSMAMSMSMAXMAMXAMMAMAMXXSAMXMXMXMMAMMMSAMXXXMMMSMMMXMAMAMMSMXMAMAXAAMXXXXMAMAMXSXSXMMMMMSMSASAXSAMX
|
||||
MMSXMMSMMSASMSSSMASXMAAXMASMAMXXAXAAMXMAXAAXXMMAMSMSSXMMSXSAMASMMMXMXMASXXSMMSASASMSMXAAXXASXMAMAXAAMAMXXMSSXXAASMMAAAXXXAMMAMXAXAAMAMAXSASM
|
||||
XMAAXAMAMXMSXAAXMXMAAMMSMSMMAMSSMMMSSMSXMXSMXMMMMAXAMXXAAAXMSASAAAAMAMXSMAMMAMASAMXAMSAMASXSASXSMSSMASXMXMAXAMXMMXSXSASAMAMXXASMSMSMSMSMSAMA
|
||||
XAMMMAXAMAAMMMMMSXSMMMAXXAMMSMMAAMAMAXMAMAXAMXAAMXMSSMMMXSXXMMSMSMMXASAMMMMMASMMMMSSXXAXXMASAMMXMAXXXMASXMAXXSAMSAMXMASMSAMASXXMAAAXMXXAMXMX
|
||||
MMSSXMSMMSMMASXMXASMSMXSMXXAXMXSMMAXSMSAMMXXAMXXSSMAAXMAAXMSMASAMASMMMASXMAXMXAXXXAXMXMXXXXMASAAMSSSMSXMMMMXASAXXAXXMXMXSXSMMMASMSMXSAMXMMAM
|
||||
XAAMAXAMAAASASAXMXMASAXAAMMSSMAMASXMXAMASAAXSSXXAMMSMMMMXSAMMASASASASXMMASMSSSMMMMXMXXMASXMSXAAXMXAAASMAMASMAMMMMAMXSXMXMASAASAMXAAAAASAMXAM
|
||||
MMMSXMAMSMMMASAMSMMXMXMMSMAAAMASAMXASMMAMMSMMAMMAMAMAAXAAMAMXAXXMASMMAAMMMAAAAXAXMASMMMAMXAAXMASXMMMMMAXMAMMMMSMASXMAXMASXMMMMASMMXMSAAXXMMS
|
||||
XMXMAMXMXXMMXMAMAASAMXSXMMSSSMAMAXMMMSMXMMAAMAMSAMASAMXMSXMMMSMMMAMMSSMMSMMMMMXSASMMAAMMSMMMSXXMXMXMMMSXMAXSAAAAMXAXMMXASASXXSAMXMMXXXMSMSMS
|
||||
MXAMSMAXMAMXSSXMSSMAMAAAMAAMXMSSMMSMAXSXXXSMMSXSXSXAXMAXXAASAMAAMMAAXXMAMMXMAXXMAXXSSMSMAAMSXMAMMXMSAAAXSAAMMMXXXXMMXSMMMAAAMMXMAXMAXMXAAAAX
|
||||
SSMSMMSASAMXMAMMXMMSSMMSMSMMSXMAMAMMMMMMSMAAXXAMXMAXAASASXMMSSSMSSMXSMMASXSMMMSMAMMXMASMMSSMAMAMAAASMSSMMMSXSASMSMXMASAMMSMMMSMXMAMXXAXMSMSM
|
||||
XASAMXMAAASXMSSSSMMXAAXAAXXMXASAMXMAAAMAAMSMMMAMMMMSSSMAAXMXXMAAAMMMMXMSAMXAAAAMMXMAMMMAMMMMSMAMSSXXMAAMXAAAMAMAAXXSASAMAAAXSAAASXSAASXMMXAA
|
||||
SMMMSAMMMMAAXMAXAASXSMMMMMAMMAMXSXSSSSSSSXXXASAMAXXAXXMXMSMSSMMMMXASAAXAAASXMSMMXAMMSXMAMMAAMXAMXXMAMSMMMSSXMAMMMMXMMMAMSMSXSMXMSASAMMAASMSS
|
||||
AXAASASAAMSMMMMSSMMAXAAXASAMXSMASAMXAMAAMASMMSASXSMMXSAAXAMAMXSASAMXASMSAMXXXXXSSMMMAMSMSMMMSMSMSASXMXAMAMXAMMSAAAMSXSAMMXXAMXSAMMMASXMMMAAM
|
||||
MMMMXXMXXMASAXXAMAMSMSASMXSMMXAXMASMMMMMMAMXMXXMMXASASMSXSMSXMMASAXXXMAMXSMXSAXMASAMAXAMMMMSXAAAXAMMAMAMSSSXMAXXMXAAXMASXMMAMSAXMASAMXASMMMX
|
||||
XMSMSSSMMSASMSMMSSMAAMMMXMAXAMMMSSXMXAMXASXMMSXMXSXMASAMAXAMXSMMMMMSSSMSAMXMMMMSAMXMMXMXAAMXMMMSMMAXMSSMXAXMXMSAMMMSAAAMAXMAMXMXSXXAMXMXAXAS
|
||||
XSAAXAAAAMMMMXAXAASMSMSAASXMMMAMXMASXXSAAMAAASAMAMXMXMASXMAMAXAAAXXAAAAMMMAMAMXMASAMSASXSSSMAMMXAMAXMAAXMMMSAMAMXXMAMMAMAMSMMXXMMMSMMMMSSMAM
|
||||
MSMSMSMMMSSMSMSMSXMXXAMSMSXAASMSMSAMXAMXXMXMAXAMSSSMXMXMASAMXSXMSSMMXMMMMMMMAMASXMAXAAMAMAMMAMXMAMAXMMSMASAMASMSAMSAMSXMXXAXMSSMAAAMMXAAXMAM
|
||||
AMAMAXXXAAAMAAAAXXMSMMMMMSMSMSAAXMASMSMAMSMMXSAMXMAMMSMMMMMSMMMAMMMSAAAXSASXXMAMMXSXMSMAMAMMXSSXSMSXXXMMMMASAMXMAMSAMAASXSXMAAAMXSSSXMMSXSSS
|
||||
MMAMXMMMMMSMMMMMMMMXAMXAASMMAMMMMMSMXMAMMAXAMXXMASAMMASAMMAMAAAXXSAMMMMXMASAMMSMMAXAMMMXSXSMSMMAMAMXMASAMSXMXSAMAMSAMSMXAMAMMSSMMMMAXMAMASMM
|
||||
XSMSSSMMSAMXXXSSMMSSSMSMMSAMSMXSAMXMXMAMSSMMMAMSAXAMSASMXSASMMSMXMXXASMMSAMAMAXAMASXMAMXMMAXMAMAMAMXAMMXMXAAMSASAMSXMMAMSSMMAAMMAAXMAMMSXMAS
|
||||
AXAMXXAAMAMSSXMAAAAXAAAXAMAMMMMMAMAMMMMMXXAAMAMMXXAMMAMMASAXXMAMXSSSMSAAMXMXMAXAMXSAMASAMSMMMAMXSXMMSSMASXMMMSAMMXMAMMAMAAXMMSSSSSSXSAASASAM
|
||||
MMMMMSMMXAMXXASXMMXMMMMMXSMMMAASASASMSASASMMSASXSAMSMSMMXSAMSSMSAMXAMSMMSMMSMSSMSAMXSMSXMAMASASXAAAAAAMMMMSAMMAMXAXMASASMMMMSXAAAXAAMMXXAMMS
|
||||
MAAAAAMMMSSMSXMXXXSMSAXXAAAASMMSASAMASASXAXASASAMSMAAAAXAMAMXAAMMSSSMSAAXAXSAXAAAMMMMAMMSXSAAMAMMMMMMSAMSASASXMAMMMSXSASMMMXAXMMSSMXMSSMAXMX
|
||||
SSMSSSXSAAAAXMSAMXAXAASMMSSMSMMMMMMMMMAMMMSXSAMXMAMMMMXMMSAMXMMMAMAAASMMSSMMAMMMMXAMSMSASAMXXSAMXAMMMMASMASXMASMXSASMMAMAASMMXSAAAXSXAXMMMMM
|
||||
MMAAXAAMMSMMMXSXAXMASMMMXAXXXXMAMAAMMMMMAXMAMMMXSSMSASAAMMASXMXMMSMMMMMAMAXMAXSSXMXXAAMXMXXSMMAMSASAAMSMMMMMMMMAAMAMXMSMSMSAXAMMXMMMMXXAMAAA
|
||||
AMXMSMMMXAXAXAXXXAXAMAAXMASXMMSMSSSMXAMMSAMSMMMAMAASASMSMMMMAAXSMMXXAXMASMSSSSXXAMAMMSMSAMXMASAMXAXMMSXMAMXSASMMMMAMAAXAXMSAMXSAASMMAMSXSASX
|
||||
XXAXAMXXSMMMMMSMSMMMSMMMMMMXMAAMMMAASAMAXXXAAAMXSMMMAMMMMASMMMMSAMASMXSASAAAXAMXAMAAMMMMAAAXMMAMMSMSMXMSMSAXAXSAMXXASAMXMASASAMMXMAMMXAAXAAM
|
||||
MSMMMSXMXXMSAMAMAXMASXMAXAXXMSSSMMMMMAMMSMSSSMXASMSMXMAMSAXAAMAXAMMSMAMAMAMXMAASXSSSMAASXSMSXSSMAAAXMAMAAMMSMSAMXASXMXSASAMXMASMSSMMSMMMMXMA
|
||||
MAXXAMMMAAXASXSSSMMASASMSMXSAAAAXSMXSXMXMAXMAMMASAAMXSAMMSSSMMSSXMXXMAMSMSMAAXAAAXMAXMMSXAMAMAXMSMMMMMMMMMXAXMAMXMMXMMXMASXMMXXAAMAXSAMXSAXM
|
||||
SASMAMSMMSMXMMMAXXMAXMMAAASMMMSMMSMAXSMAMSMXAXMAMXAMAMXXAAMASAMAMSXSMMSAAAMMSSMMXMSAMMMMXXMASMMMMAAAXAXMASXMMSASAMXAXAMSAMSAXAMMMSSMSAMAXAMX
|
||||
MASXMAAXAAMASMMAMXMSSMMMMMMAAMAXAMMMXMMASAMMAMMXSSSMXSAMMMSAMXMAMMAAASXMSMSMXMASMAMASMAMXXXAMMAAMMSMSXSAAXAAAXXXXMXAXSMSAAASMXSMAAAMSXMXSMSS
|
||||
XMXAMSSSSMSASAMMXAAAAASMSMSMMSAMXSASASMMSAMSSMSSMAMMAXMXSXMXSAMMXMMMMMAMAAAMMXMSAMSAMMAMMSMSSSSXSAAXXAAMASMMMSSXSMSSXXASMXSXMAXMMSMMMMSXAAAX
|
||||
MMMXMXAAMXMXXMSASMMMSMMAMAAXXMASXSASASAXMMMMAAXAMAMMMSMXSAMAXMASMMSAXXSMMSXMXSXXMAMXSSMSAAAXAAAMMMMSMXMMASAXMXMAMAAXAMAXAXXAMSMMXMXSAAXSMMMS
|
||||
AXMASMMXMMSSMXXMAMXAAAMSMMMXXXAMXSXMAMMSAXSSMMMASXSXMSAAMAMXSXAAAASXSMXXXMAMSMSAMXAAXAMMXSMMMMXMASXSXMXSASMMSAMAMMMSXMSMMMXAMAAXAMASMSXMMAMA
|
||||
XSMMXXMMMXAASAMXMMSSSMMAMXSAMSSXMSAMXMXMXMXXAMSXSAAAMXMASXMMMXAMMMMASMXMXMAMAAAMXSXMMXMAXMAASASMAXXXAXXMASMASAMXMAAMAMMAMASXMSMMXSAXMMAMXMXA
|
||||
MSASMMXAXMSMMXMAXXAAMASXSAMAMAMMMSAMXSASAMXSXMMAMMMSXMXMAMAASASMXMMXMMAXASASMSMMAAAXXSMSSSMMSASMMXSSMMMMAMMMSAMSSMMSAMMXMMMAAAMAMMMXMSAMMSMX
|
||||
ASAMXAXSSXMASMSSSMMSMAMAMMMAMASXAXXMASASASAXAMMXMSAMASXMAMXMAAXAAXSMMSSMXSASAMAMXSAMAAAMXXXAMAMAAAXXSASMAMXAMAMAAAASMSMSMSSMSMMMSAMAAXAMXAAM
|
||||
XMAMMSMAAMSAMAAAAXXXMAMMMXSXSASMMSXSAMXMAMXMMMAAAMAXAMXMASMXMAMSXMSAMAAAMMXMMSAMAXAMXMXMASMMMSSMMMSASXSSXSAXSMMSSMMMXAMXAMAXMAMMSASXSMMSSMSX
|
||||
MSAMAAMMMMMSSSMSMMMMSXSAMAAAMASAAAMMXSSSSXSXMAXMSSSMSSXMMSAASXMMMXSSMMMMSAAXAMMSMXXMAMXMMSAMXXAXAXMXMAXAMMMMXMMAMMXSSMSMMMMXMAMXMXMAAAXAAMAX
|
||||
XSAMSXSAXSAAXAAXXSAAXASMSSSXMASMMSMXMAXAAAMASMSMAAMAMXMXMSMMXAAMXAMXSXAAXXMSMSMXMAMXASXMASMMMMMMMMMAMSMMMAMSAXMXXSAMMAXMXSXSXXXAXMMSSMMSSMAS
|
||||
ASAMXXXASMMXSXMMASAMSAMXAMAXMASMAAASMMMMMMMAMAAMMMMAMMMSMMXXSSMAMMSAMSMSMMMXXAMAMAMSAMAMASXMAAXAXXXAXASMMAMMXXMXMMASMMXMASXSAXSMSAMAMAAXXMAS
|
||||
MMXXXMSMMAAMMXXMAMAXMMMMSSMSMMSMMXAXAAAXAAMASXSMXSSSMSAXAXSAXASAAXMAXXMAMAMXSAXAXAMXAMXMASAMSXSAASMMSAMSMSMMSSXMASAMAXAMAXAMXMAAXAMXMSMMAMAS
|
||||
XAXSMAAMMXMAAASMXSAMXSAMXAXSAMXMAXSSMSAMMXMMXAAAAAAXAMMSXMMMSAMMSAXMMXXAXMSAMMSSSSMSSMXSASMXAAMXMXAAMMMSMXAMXAASXMMSAAXMMSXSASMMMSXMAMASXMAS
|
||||
MMSMASMXXAXMXMXAAXASASASXSMSAMAMMSMAXMASMSSSMSMMMSMMSMXXMAAAAXXAAAASASXSSMMASAAAAAAXMAXMASXMMMMAXMMMMXXMASXMMSMMAMMXMASMXAMMASMMMAASASAMXMAX
|
||||
MXAXMAMXSMSAMXMMMSMMASAMXXAXAMXAMMXMMMMAAAAXMAMXXXXAAMXSAXASMSASMXMMASMMAMSAMXSMXMMMASXMAMMXAASXSXAXMXXMXMXSXAXSXMAAXMAMMXSMAMAAMMAMAMXMXMMM
|
||||
SSSSXSXMAAAMAAMAXXAMAMMMMMAMSMSSSMASASASMMMMSMSSXAMSSSMMSXAAAXMAMAXMAMASAMXXMAXXXSSSMAMSXSAMSXMAMXMMSMASAXXXXMMMMSSSSMAMXSXMASMMSXAMXMAMAAAA
|
||||
XAXMAMSAMXMSSXSAXXMMXSMMASAMAAAXAXMSASAXMSSMSXAMAMXMAMAAXMMMXMXXXMMMMAMXXMASMASXAMAAXMMMAMXXMAMXMMSAAAMSASXSMSAAAMAAXXASXMAMAAAXMMMMAMAMXXAS
|
||||
MAMAASAMXSXAMAMXSMMAXAASASAXXMMXSMMMMMXMASAASMAXAMXXAMSMMAXAMSMSASMSMSXSAMXXMASXMMXMMXAMAXMXMAAXMAMMXSAMAMXSASMMSSMSMSMSAMAMSSMASXMSSSSSMSAA
|
||||
MXASXSASAXMASMAMAAMMSSMMXSMMSASXAMSSSMSAXSMMMSASMXSMXXAASAMXSAAMAMAAAAXAMXSXMXSASXSSXSASAMXMSASMMSSMSXMMAMXMAMAXAAXMASAMXSMMAAAAAAAAXAAAAXAM
|
||||
MXMMASAMXMAXAAAAXXMAAAMMMXMASAMSMMAAAAMSXMXXAMXXAASAMSSMMSMXMMSMSMXMMMSXMASMMAMAMAAXMMAMXAMXMSAAXMAMSAXSXSASASAMSSMSSXAXAAXMSMMMSMMMSMMMMXAX
|
||||
XMMMMMMMAASAMSSSSMMMSXXXXXMXMAMMXMMSMMMMMMAMXSSMMMMAMMAMAAXXMXAXMASXXAAAMAMAMXMSMMMMXAAMXSAMXMXSMSSMSXMXMSMSAMMXXMAXMMMMMSSXXXMAXXXXAXMMSSMM
|
||||
MAXSSXMSXSMMXMAAAXXXMMSMSMXXSAMXXMXMAXXAAMXSAAMMXXMSMMAMMSMMSMSMSMAMMMSXMSMSAMXXAXMSSMXSAMXMXSAMXMXAMMXAMMAMMMSXXMSMSMMAXAXAMXMMSMMXMMMAAAAX
|
||||
ASMXSAAXMXMASMMSMMXMAXAAMSAXMXMASXMXMASMMSAMMSMMXSXXASMMXAXMAAAAAAAXAXMMMXAAMMMSMMSAMAMMXMAXAMMXXMMSMMSSSMAMAXXAXXAAXMASXXMSMXSAAAASMSMMSSSM
|
||||
MXMMSMMSXSMAMSAXAMXMSSMMMXXSMAMAMAMSSMSAAMXMMMAMASMAMMAASAXMAXMSMSMSMXMAAMXMMAXAAXMAMSMAAMMMMSSMSMAAAXSAMXMMAMXMMSMSMMAXAMXAXAMSSSMMAAMAMAMA
|
||||
ASAMXMASMMMSSMSSSSSMAAMSMMMAMAMAMAMMAXXMXMMMAXXMAMMAMAXMMASXSMAXAAAAASXSMSMSSXSMSXSXMAMSMSASAAAXXMSSSMMAMXXMMSAXMXXAAMXSAMXMMMMMXAMMXMMMMMMA
|
||||
XSAMAMAXAXMMAAASAAAMSSMAAAAMSAXSXSMXMSMSAMSSMXAMXSMXMXSMXXMAMXAMSMSMSMAAXMAMXAXXMASMSXMAXMAMMSMSAMAAMASXMASXMSASXMMSSMMAMMAXAAAMSMMSMMMXASXS
|
||||
ASAMXMAXSMMSMMMMMSMMMAXSSMMXMAXXAMSMXAMXASXAAASXAMASXMMAXMAMXAXAXMXXMMSMMMMMXXSSMMMXMXAMMMSMMAXSAMMSMXAMMAXMAMAMXAAAAAXXMSXMXXXXAMXAAXASXSAM
|
||||
XSAMXMMMMAXSXSSXXAMAMXAMXAASMMSMAMASMASXMMXMMMXAMMAMAASMXXMMXSSSXMMXMAMXMSAMXXMAMSXMAMXAMMXASMXSAMXXMMMAMASXXMMMSMMSSSMMASXSASXMSAMMSMMXMMAM
|
||||
MSAMMAMASXMXAAMXMSMMSMMSMSMSAAXMXMAMXAMXMAMXAXAMXMSSSMMMMSMMAMAMAAAAMXSAASASMXSAMMAMAASXSMSMMXMSXMXXAAXXSASMASMAMAMAMXAXAXAMASMAAMAMMXMAAMXM
|
||||
ASMMAXSASAMMSMMSMASAAXXAAAASMMMSMMMSAMXAMASMMMMMXSAMXMAXAAAMXSMSXMSXXAMXMMXAAXAASAMXMXMAAASMSMMMAMASMMSXMAMMAMMAMMMSMMSMMSMMAMMSMXSXMASXMXAX
|
||||
XXMASXMXSAMMAXAAXMASMSAMXMXMASXMAXAXAMSSXXXAMASAMXMXASMMSSSMAMXMMMAAMSAMXMSSSMMXMAMXSAMXMAMAXXASAMXXAAMAMAMMXSXMXSAMAAXMXSXAMXAXXAMMSMMAMSXM
|
||||
AAXXAMMASXSSMMSSXSAAXMAXXXAAXMASAMSSSMAMMSSXMASAASXMXSAAAMAMSMAMAMMXMAAAXAAAXMXSSMMASASAMSMXMSXSMXSXMMMXMAMMMSAAXMASMMXSAMASXMASMXXMAMMAXMAM
|
||||
SXMASAMASAMAAAAAAMSMSAMXSSMXSXXMAMMAMMXMAMAXMMSMMSAXMSMMMSXMAAMMSSXASXMMMMXSMMAAAAMMSAMXSXSAASAMMASMAAXXMXSAAXMMMMMMAMSMMSAMAMSXMAXSMXSMXMAA
|
||||
XMAAAXMASMSSMMMMMMMXSAMXAXMASMSSSMMAMSMMSSMXXMXMXSAMAMXMASASMMXAAMXXMAAXXMAMAMXSSMMMMMMXMASMAMAMMASASMSMSASMSSXMASASAMAAAMASXMXAMSXMXXAMXSXM
|
||||
MAMXXXSXSXMMXAMASXMASAMXMXSAXAMAAXMAMMMAMAXSMMMMMMSAMXAXMXXAXAMSSSSSSSMMAMAMSMMXMASAAAMAMXMMASAMMMSAXAXXMAMAAXMXMSASXSMMMSAMXSMMMXAMASASMMSM
|
||||
ASMMSASAMMMMSXSASAXXXMAXXMMAMSMSMSSSMSMSXMMMAAXMAAAMMXMSMSMMMMMAAMAXAXMSASXSAMMASXMMSMSMSMXSASASXXMAMXMMMSMMMSSMMMXMAXXAXMASAXXXAMAMXSAMMAAX
|
||||
MXAASAMAMAAXMXMASMMMSAMXMSSSMAMMAMAMASAMASMSSMSSMXMMSAAXAASAAMMMSMMMASXMASXAAXMASAXAMXAAMAXMMSAMXAMMMASAAXASAMXASXSMSMSMSSMMMMXMSSSMXMAMMSSX
|
||||
XSMMMASMMSSXSAMXMAAMASXXMAAASXMMSMAMMMASAMXAASAXXXSASMMMSMSMSSXXAMXMXMASXMASMMMASXMASXMMMXSAAMAMSMAAAASMXSAMSSSMMASAAAAMMAXMAMXAXAAMAMAMXAXX
|
||||
AXXXSXMAXXMXSSSMSSMSXMSSMMSMMMXXXAMXSMXMXMMSSMSMSAMXSAMXXXXMMMMAMXXXSSXMXSAMXXMXMXAXXMASXMSMMSMMSXSAMMSXMMMSXMAXMAMXMSMXSAMSXSXSMSMMXSASMASX
|
||||
134
2024/gareth/day05/day05.go
Normal file
134
2024/gareth/day05/day05.go
Normal file
@@ -0,0 +1,134 @@
|
||||
package day05
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Rule struct {
|
||||
X, Y int
|
||||
}
|
||||
|
||||
func ParseInput(input string) ([]Rule, [][]int) {
|
||||
sections := strings.Split(input, "\n\n")
|
||||
|
||||
ruleLines := strings.Split(strings.TrimSpace(sections[0]), "\n")
|
||||
var rules []Rule
|
||||
for _, ruleLine := range ruleLines {
|
||||
parts := strings.Split(ruleLine, "|")
|
||||
x, _ := strconv.Atoi(parts[0])
|
||||
y, _ := strconv.Atoi(parts[1])
|
||||
rules = append(rules, Rule{X: x, Y: y})
|
||||
}
|
||||
|
||||
updateLines := strings.Split(strings.TrimSpace(sections[1]), "\n")
|
||||
var updates [][]int
|
||||
for _, updateLine := range updateLines {
|
||||
parts := strings.Split(updateLine, ",")
|
||||
var update []int
|
||||
for _, part := range parts {
|
||||
page, _ := strconv.Atoi(part)
|
||||
update = append(update, page)
|
||||
}
|
||||
updates = append(updates, update)
|
||||
}
|
||||
|
||||
return rules, updates
|
||||
}
|
||||
|
||||
func ValidateUpdate(update []int, rules []Rule) bool {
|
||||
indexMap := make(map[int]int)
|
||||
for i, page := range update {
|
||||
indexMap[page] = i
|
||||
}
|
||||
|
||||
for _, rule := range rules {
|
||||
pageX, indexX := indexMap[rule.X]
|
||||
pageY, indexY := indexMap[rule.Y]
|
||||
if indexX && indexY && pageX > pageY {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func FindMiddle(update []int) int {
|
||||
n := len(update)
|
||||
return update[n/2]
|
||||
}
|
||||
|
||||
func SortUpdate(update []int, rules []Rule) []int {
|
||||
depen := make(map[int][]int)
|
||||
for _, rule := range rules {
|
||||
depen[rule.Y] = append(depen[rule.Y], rule.X)
|
||||
}
|
||||
|
||||
visited := make(map[int]bool)
|
||||
var sorted []int
|
||||
|
||||
for _, page := range update {
|
||||
if !visited[page] {
|
||||
sorted = Visit(page, depen, visited, update, sorted)
|
||||
}
|
||||
}
|
||||
|
||||
return sorted
|
||||
}
|
||||
|
||||
func Visit(page int, depen map[int][]int, visited map[int]bool, update []int, sorted []int) []int {
|
||||
if visited[page] {
|
||||
return sorted
|
||||
}
|
||||
visited[page] = true
|
||||
|
||||
for _, d := range depen[page] {
|
||||
if contains(update, d) {
|
||||
sorted = Visit(d, depen, visited, update, sorted)
|
||||
}
|
||||
}
|
||||
|
||||
sorted = append(sorted, page)
|
||||
return sorted
|
||||
}
|
||||
|
||||
func contains(slice []int, element int) bool {
|
||||
for _, item := range slice {
|
||||
if item == element {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
rules, updates := ParseInput(input)
|
||||
total := 0
|
||||
|
||||
for _, update := range updates {
|
||||
if ValidateUpdate(update, rules) {
|
||||
total += FindMiddle(update)
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
rules, updates := ParseInput(input)
|
||||
var invalidUpdates [][]int
|
||||
total := 0
|
||||
|
||||
for _, update := range updates {
|
||||
if !ValidateUpdate(update, rules) {
|
||||
invalidUpdates = append(invalidUpdates, update)
|
||||
}
|
||||
}
|
||||
|
||||
for _, update := range invalidUpdates {
|
||||
sortedUpdate := SortUpdate(update, rules)
|
||||
total += FindMiddle(sortedUpdate)
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
71
2024/gareth/day05/day05_test.go
Normal file
71
2024/gareth/day05/day05_test.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package day05
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47`)
|
||||
assert.Equal(t, 143, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47`)
|
||||
assert.Equal(t, 123, r)
|
||||
}
|
||||
1377
2024/gareth/day05/input.txt
Normal file
1377
2024/gareth/day05/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
142
2024/gareth/day06/day06.go
Normal file
142
2024/gareth/day06/day06.go
Normal file
@@ -0,0 +1,142 @@
|
||||
package day06
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Point struct {
|
||||
x int
|
||||
y int
|
||||
direction int
|
||||
}
|
||||
|
||||
const (
|
||||
Up = 0
|
||||
Right = 1
|
||||
Down = 2
|
||||
Left = 3
|
||||
)
|
||||
|
||||
var rows, cols int
|
||||
|
||||
var moves = []Point{
|
||||
{-1, 0, Up},
|
||||
{0, 1, Up},
|
||||
{1, 0, Up},
|
||||
{0, -1, Up},
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid, start, direction := ParseInput(input)
|
||||
total := PredictPath(grid, start, direction)
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
grid, start, direction := ParseInput(input)
|
||||
total := FindLoopingPositions(grid, start, direction)
|
||||
return total
|
||||
}
|
||||
|
||||
func ParseInput(input string) ([][]rune, Point, int) {
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
rows = len(lines)
|
||||
cols = len(lines[0])
|
||||
grid := make([][]rune, rows)
|
||||
|
||||
var start Point
|
||||
var direction int
|
||||
|
||||
for i := 0; i < rows; i++ {
|
||||
grid[i] = []rune(lines[i])
|
||||
for j, char := range lines[i] {
|
||||
if char == '^' {
|
||||
start = Point{i, j, Up}
|
||||
direction = Up
|
||||
} else if char == '>' {
|
||||
start = Point{i, j, Right}
|
||||
direction = Right
|
||||
} else if char == 'v' {
|
||||
start = Point{i, j, Down}
|
||||
direction = Down
|
||||
} else if char == '<' {
|
||||
start = Point{i, j, Left}
|
||||
direction = Left
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return grid, start, direction
|
||||
}
|
||||
|
||||
func PredictPath(grid [][]rune, start Point, direction int) int {
|
||||
visited := make(map[Point]bool)
|
||||
current := start
|
||||
|
||||
visited[current] = true
|
||||
|
||||
// do while
|
||||
for {
|
||||
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, Up}
|
||||
|
||||
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||
break
|
||||
}
|
||||
|
||||
if grid[next.x][next.y] == '#' {
|
||||
direction = (direction + 1) % 4
|
||||
} else {
|
||||
current = next
|
||||
visited[current] = true
|
||||
}
|
||||
}
|
||||
|
||||
return len(visited)
|
||||
}
|
||||
|
||||
func FindLoopingPositions(grid [][]rune, start Point, direction int) int {
|
||||
possiblePositions := 0
|
||||
|
||||
for i := 0; i < rows; i++ {
|
||||
for j := 0; j < cols; j++ {
|
||||
if grid[i][j] != '.' || (i == start.x && j == start.y) {
|
||||
continue
|
||||
}
|
||||
|
||||
grid[i][j] = '#'
|
||||
if IsLooping(grid, start, direction) {
|
||||
possiblePositions++
|
||||
}
|
||||
grid[i][j] = '.'
|
||||
}
|
||||
}
|
||||
|
||||
return possiblePositions
|
||||
}
|
||||
|
||||
func IsLooping(grid [][]rune, start Point, direction int) bool {
|
||||
visited := make(map[Point]int)
|
||||
current := start
|
||||
|
||||
step := 0
|
||||
for {
|
||||
step++
|
||||
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, direction}
|
||||
|
||||
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||
return false
|
||||
}
|
||||
|
||||
if grid[next.x][next.y] == '#' {
|
||||
direction = (direction + 1) % 4
|
||||
} else {
|
||||
current = next
|
||||
|
||||
if visitStep, ok := visited[current]; ok && step-visitStep > 4 {
|
||||
return true
|
||||
}
|
||||
|
||||
visited[current] = step
|
||||
}
|
||||
}
|
||||
}
|
||||
35
2024/gareth/day06/day06_test.go
Normal file
35
2024/gareth/day06/day06_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package day06
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...`)
|
||||
assert.Equal(t, 41, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...`)
|
||||
assert.Equal(t, 6, r)
|
||||
}
|
||||
130
2024/gareth/day06/input.txt
Normal file
130
2024/gareth/day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
#.............#.#...........................................................#..........#...........................#..........#...
|
||||
............#......................#.......#..#.........#...................##....................................................
|
||||
..............#...........#..#.......#.........#.#...........................#................................#......#............
|
||||
.....#......................................#......#..#...................#....................#......................#...........
|
||||
...#............................#................................#................................................................
|
||||
..........#..................#.....#......................................................#.......................................
|
||||
..#........#.......#.#...............................................................#......#.................................#...
|
||||
.#....#................#................#.....#...................#...............................................#..#............
|
||||
.......................................................................................#...#.#....#........##......#........#.#.##
|
||||
............................................#.................#.....................#..........................#..................
|
||||
....#..........##......................#.................................................................................#........
|
||||
......#.............##.........#.......#.........#.......#.............#...#.......#..............................................
|
||||
.#............................................................................#..........#....#...................................
|
||||
...#..#....#..............................#...........................................................................#...........
|
||||
.............#....................................................................................................................
|
||||
................................#..................##...................................#...............................#......#..
|
||||
..........#.........#.................#..........###...........................................#............#...#.................
|
||||
.............#....................................#.......#.#.#............#............................................#.........
|
||||
......#.#..............................................................................................#.........................#
|
||||
...#...#.........#.........#..#......#................##.................#........................................................
|
||||
.................................#......................#........#................#........................#......................
|
||||
.......................##..............#................#................#..............................#.........................
|
||||
.......#...#.....#.....##........................#..................##.....#......................................................
|
||||
.............................................#...........................#..........................................#.....#.......
|
||||
.........................#...............#....#..............#.......#...............#.#.................#.................#......
|
||||
...........................................................#....#..................................#..............................
|
||||
..........................#.................................................#............................##....#..................
|
||||
.................#...#.........................................................#........................#.....#..#................
|
||||
.........................#....#................................................#...#.....................#....#...........#.......
|
||||
................................................##.......#.#....................................#.......##........................
|
||||
..........##...#.......................#....#..#....................#........................#....................................
|
||||
#......#.......................#............#.....................................................................#...............
|
||||
.......#.......#...#..#..........#.......................................#.............#......#...................................
|
||||
...............#............#..................#.................................................................................#
|
||||
.......#...........#.......................##.....#.........#...........#...................#......#.........#.............##....#
|
||||
...................#.........................#......#..........................................#..........#.........#......#......
|
||||
.....#............#..............#...#......#....................#.............#..................................................
|
||||
................................................#........#.....#...................#.....................................#.....#..
|
||||
......................#.#...##......................##...............................................#.................#..........
|
||||
#...................#.........................#...........#.....#................#.....................#...................#......
|
||||
....#................#.....#.............#.....................................#....#...#.................................#.......
|
||||
.........#.....................................................................................................#.#.......#........
|
||||
.........#..........##..............................#............................#.#.............................#................
|
||||
#....#.#..............................................##...#...#...............#.............#....................................
|
||||
........#..#.#...................#.......................................................................#.............#..#.#...#.
|
||||
.................................................................................................................#.......#........
|
||||
............................................#..#...............##........#..........#.......................................#....#
|
||||
........#...........................#............................#.....#........................#..........#...#..........#.......
|
||||
.#...........#...................................................#...........................................#................#.#.
|
||||
............#...............................#........#...........#..........#...........#.#..............#........................
|
||||
...............................................................................##.#................#..............................
|
||||
.#.......................#.#...........#..................................#.......................................................
|
||||
..#..............................................##................#.......#....#..............#.....................#...#........
|
||||
...................#.....#................................................#..........#.........#.........#.....................#..
|
||||
........#................#................................................................................#......#................
|
||||
...................#...#....#.........................#.........................#....................#..........................#.
|
||||
.................#.......................................................#................................................#.......
|
||||
..#...........................##.#.............#..#............................................#.......................#.#........
|
||||
..#......#.........................................................................#.......................#......................
|
||||
...........................................................................................................#............#......#..
|
||||
............................................................^..........................................#..........#...............
|
||||
..#.........#....................#..........................................#........#.........................................#..
|
||||
........#...............#....#.............#......#.........................................................................#.....
|
||||
.........#......#.....#..............#...........................................................#..............#.................
|
||||
.........#...................................................#...###...........#.......#.##.......................................
|
||||
.....................##.................#.........##.....................#................#................#.........#............
|
||||
.......................................................................#..............#..............#.................#..........
|
||||
.##.........#..........................................................................#....................................#.....
|
||||
.........................#.............................#........................................................................#.
|
||||
........#.............................................#......#....#.....................................#....................#....
|
||||
........#...#..............................................................................#.........#............................
|
||||
..............................#................................#..........#..............#..................................#.....
|
||||
........##..#...................................#................................#.................#.........#......#..#........#.
|
||||
..................#......#...................................................................#....................................
|
||||
..........#.............#..............#........#............#...............#..#..........#..............#.#...#............#....
|
||||
............................##....#..............#......................................................................#.........
|
||||
...............................................#.....#...........#.....##...............#..#......................................
|
||||
.........................#.......#...............................#...........#.........#...........#....#.........................
|
||||
.#............#...#...............#..............................................................#..........................#....#
|
||||
#...........#......................................................#.............................#......#.........................
|
||||
..................................................#....#...............#.........................#................................
|
||||
................................................#..........................#.......#..............................#....##.......#.
|
||||
........#......#..#............#................#............................#......#.##.........#....................#..#........
|
||||
.......................................................#..#.#....................#..#......................................#......
|
||||
.....................#.......................................................................#............#.......................
|
||||
.....................##........................#...................#.....................#........................................
|
||||
..........................#...........................................................................................#...........
|
||||
..#..........#...................#..............##..#.....................#...................#..............#...........#........
|
||||
#................................#....##......#.............#..............#.......................#.........#...........#........
|
||||
..................#................#...............................#.....#..........#................#..............#.............
|
||||
................#.#.........#.....##...............................................................#..............#...............
|
||||
..#...............................................................................................#...............................
|
||||
..........#.................#...........#.......#.........................#...#.......#...........................................
|
||||
..##....#......................................#.#.......................................#.................#......................
|
||||
.......................#..#...#.##......................................................................#.........#...#...........
|
||||
...............#.........#..............#.....................................................#...................#...............
|
||||
......#.................#............#......#...................#..#.........................#........................#........#..
|
||||
......................................................................#...........................#........#......................
|
||||
..........#..........#........................#.............##....................................................................
|
||||
....#................................................#.......................#................#...............#...................
|
||||
.................#....................................................#......#....................................................
|
||||
.#........#.......................................................................................................................
|
||||
......##..................#....#......#.................#....................#.....................#..#...........#...............
|
||||
#...#...#...#..............#........#.......................#.#..........#...............................#......#.................
|
||||
#...#...................#.............#........#..........#...............................................................#...#...
|
||||
..#................................#...#.........................#...................#......#.....................................
|
||||
...#...###..........#............#...............................................................#..........#.....................
|
||||
............#..............#.......#.....#..........#.....#.........................................................#............#
|
||||
..#......................#..#...#................................#......#.......#.....#..................#.........#..............
|
||||
....##......#.......................................................#..............................................#..............
|
||||
...............................#.....#....#.................................................#.......#............#................
|
||||
..........#....#......................#........#..........................#......#................................................
|
||||
......#.............................#...........#..................#...........................#................................#.
|
||||
...........................##..........................................#.....#.#.....................#................#...........
|
||||
..#..............#.........................................................#........................#.........#.................#.
|
||||
#.....#.....#......................#....................#........................................#...........#...........#......#.
|
||||
.......................................#..#................................#.........#.......#..#.....#..........................#
|
||||
..........#..............##...............#..........................................................#......#......#......#....#..
|
||||
.............#..............#..#......#........#..#......##.......................#...........#.......#...........................
|
||||
......................#.......................................#.......#..#.....................................#.........#...##...
|
||||
...........................#...........................#......#....#.............................#.............................#..
|
||||
..................#............................#....#........##.........................#..............#.............#............
|
||||
.......#....................#.....#........#.......#.#...#...............#.....#.#.........................#.......#.#............
|
||||
.....#.........#.......#..........#.................#..#...#..................................................##..................
|
||||
................#........................................................#........................................................
|
||||
....##......#........#..................#.........................#...................................#...#...................#...
|
||||
..............#....................#.......#.......................#.............#......#..............#..........................
|
||||
...........................#..............#.....#............#.....................#........#....#.......................#........
|
||||
........#..##................#.....#.#..............#..............................#........................#.........#...........
|
||||
.........................................................#...........................##..........#........#.##....................
|
||||
90
2024/gareth/day07/day07.go
Normal file
90
2024/gareth/day07/day07.go
Normal file
@@ -0,0 +1,90 @@
|
||||
package day07
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
total := 0
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
|
||||
for i := 0; i < len(lines); i++ {
|
||||
target, numbers := parseLine(lines[i])
|
||||
if validLinePart1(numbers, 1, numbers[0], target) {
|
||||
total += target
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
total := 0
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
|
||||
for i := 0; i < len(lines); i++ {
|
||||
target, numbers := parseLine(lines[i])
|
||||
if validLinePart2(numbers, 1, numbers[0], target) {
|
||||
total += target
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func parseLine(line string) (int, []int) {
|
||||
parts := strings.Split(line, ":")
|
||||
target, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
|
||||
numberStrings := strings.Fields(parts[1])
|
||||
|
||||
numbers := make([]int, len(numberStrings))
|
||||
for i := 0; i < len(numberStrings); i++ {
|
||||
numbers[i], _ = strconv.Atoi(strings.TrimSpace(numberStrings[i]))
|
||||
}
|
||||
|
||||
return target, numbers
|
||||
}
|
||||
|
||||
func validLinePart1(numbers []int, index int, currentValue int, target int) bool {
|
||||
if index == len(numbers) {
|
||||
return currentValue == target
|
||||
}
|
||||
|
||||
sum := currentValue + numbers[index]
|
||||
if validLinePart1(numbers, index+1, sum, target) {
|
||||
return true
|
||||
}
|
||||
|
||||
product := currentValue * numbers[index]
|
||||
if validLinePart1(numbers, index+1, product, target) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func validLinePart2(numbers []int, index int, currentValue int, target int) bool {
|
||||
if index == len(numbers) {
|
||||
return currentValue == target
|
||||
}
|
||||
|
||||
sum := currentValue + numbers[index]
|
||||
if validLinePart2(numbers, index+1, sum, target) {
|
||||
return true
|
||||
}
|
||||
|
||||
product := currentValue * numbers[index]
|
||||
if validLinePart2(numbers, index+1, product, target) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Turns 12 || 34 into 1234
|
||||
concatenated, _ := strconv.Atoi(strings.TrimSpace(fmt.Sprintf("%d%d", currentValue, numbers[index])))
|
||||
if validLinePart2(numbers, index+1, concatenated, target) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
33
2024/gareth/day07/day07_test.go
Normal file
33
2024/gareth/day07/day07_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package day07
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`190: 10 19
|
||||
3267: 81 40 27
|
||||
83: 17 5
|
||||
156: 15 6
|
||||
7290: 6 8 6 15
|
||||
161011: 16 10 13
|
||||
192: 17 8 14
|
||||
21037: 9 7 18 13
|
||||
292: 11 6 16 20`)
|
||||
assert.Equal(t, 3749, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`190: 10 19
|
||||
3267: 81 40 27
|
||||
83: 17 5
|
||||
156: 15 6
|
||||
7290: 6 8 6 15
|
||||
161011: 16 10 13
|
||||
192: 17 8 14
|
||||
21037: 9 7 18 13
|
||||
292: 11 6 16 20`)
|
||||
assert.Equal(t, 11387, r)
|
||||
}
|
||||
850
2024/gareth/day07/input.txt
Normal file
850
2024/gareth/day07/input.txt
Normal file
@@ -0,0 +1,850 @@
|
||||
31084: 8 67 8 735 38
|
||||
40541461584: 5 81 9 4 32 43 283 228
|
||||
6208: 915 6 2 539 148 29
|
||||
306501986: 6 3 630 45 536 64 6
|
||||
21276000: 8 5 5 91 6 5 8 6 8 985 2 8
|
||||
1432991: 3 403 4 821 591 2 236
|
||||
17115994: 69 321 254 764 3 99
|
||||
19961295: 5 311 84 6 63
|
||||
22953531: 22 95 35 2 8
|
||||
18894343830: 90 5 3 2 65 7 159 2 91 1
|
||||
4312695565: 158 8 716 615 95 59
|
||||
391: 1 326 64
|
||||
25202: 8 5 62 1 401
|
||||
5324514: 6 8 466 59 169
|
||||
658234: 3 83 592 97 57 4
|
||||
26804472776473: 7 61 1 447 29 496 71 9
|
||||
1503368: 653 23 18 824 625
|
||||
24803314445: 5 2 4 4 417 1 987 4 447
|
||||
1021069871: 7 3 2 7 9 37 2 2 8 5 58
|
||||
1614: 63 645 4 3 31 868
|
||||
4258805: 68 532 78 91 5
|
||||
4495130022: 583 78 275 37 77
|
||||
45111648: 47 98 45 855 998 46 6
|
||||
2964501691711: 9 672 76 9 754 7 4 65
|
||||
90685578359: 906 855 782 33 126
|
||||
13608006: 3 5 7 7 3 602 7 4 7 720 6
|
||||
4645623: 66 863 5 615 8
|
||||
2569495: 443 74 7 71 5
|
||||
134484: 68 55 4 77 9 2 327 4
|
||||
1143450000: 24 750 35 264 5 1
|
||||
5449: 4 2 907 7
|
||||
23061783: 854 9 5 6 1 1 7 3 2 76 5
|
||||
2930: 18 6 7 555 5
|
||||
2115475: 9 194 8 54 42 5 31
|
||||
19449: 6 1 9 4 4 769 8 1 79 905
|
||||
4595553: 298 3 4 257 5 3 345 45
|
||||
208314087: 7 3 877 815 9 9 3 2 6 51
|
||||
2905504: 46 58 514 626 763
|
||||
963368: 48 425 484 6 370
|
||||
9980664: 1 98 80 5 98 68
|
||||
652568: 7 197 871 290 68
|
||||
45827: 15 3 665 9 154
|
||||
722: 2 21 337 5 357
|
||||
27652464029930: 7 829 9 700 7 9 3 7 4 1 8
|
||||
6868809: 45 2 9 848 9
|
||||
1175: 7 5 98
|
||||
2133: 17 2 5 36 5
|
||||
528: 55 1 5 8 9 31
|
||||
8206806: 1 4 9 4 99 6 24 97 2 5 6 5
|
||||
37530658373: 1 2 8 5 8 4 5 7 3 946 373
|
||||
65484738025: 47 5 4 43 8 6 43 7 7 26 5
|
||||
2157: 8 2 1 93 8 568
|
||||
23082508: 7 5 3 3 2 5 8 477 2 3 1 1
|
||||
29090880: 45 28 37 8 78
|
||||
1262763: 1 1 27 729 93 16 2 75
|
||||
1409848204234: 7 87 622 84 820 42 34
|
||||
3304: 6 55 4
|
||||
1196013120: 8 340 179 35 192
|
||||
124278235: 4 4 69 225 78 235
|
||||
2735190615: 273 2 3 1 906 1 5
|
||||
52192: 104 89 6 45 10 72
|
||||
573777850: 680 31 807 8 50
|
||||
35694425: 82 38 921 61 871 84 2
|
||||
658877085778: 7 86 55 156 10 977 8
|
||||
20860682976: 546 3 7 930 7 954 42 6
|
||||
224616: 441 46 8 36 73 8 3 45 7
|
||||
358087: 7 236 9 45 2 9 3 9 6 4 2 5
|
||||
6354432: 55 792 7 153 639 7
|
||||
1923524: 177 175 9 3 3 528 21
|
||||
117340: 9 82 159
|
||||
1234059: 64 357 9 45 6
|
||||
2651349895: 8 526 4 7 9 1 6 42 9 89 5
|
||||
3884759: 737 251 3 5 7
|
||||
633925731: 346 4 3 5 472 9 7 9 4 8 9
|
||||
43555: 37 4 60 25 53 77
|
||||
4230519: 2 2 12 8 9 9 91 41 2 5 2 3
|
||||
5489: 69 8 9 515 6
|
||||
82630872: 33 1 2 19 81 9 4 5 6 6 33
|
||||
203340489: 181 55 1 4 112 9
|
||||
72068: 7 197 4 5 9
|
||||
168389664: 1 683 84 5 667
|
||||
30367442: 2 657 6 4 384 5 673 49
|
||||
2846739576: 4 8 743 9 3 9 829 719 6
|
||||
78401: 77 4 9 93 5
|
||||
627886555182: 1 61 78 8 65 4 57 94 82
|
||||
53361: 85 3 592 1 63
|
||||
154268: 48 43 3 892 4 8 3 8 1
|
||||
525075263: 656 34 4 8 6 6
|
||||
248294606: 6 896 24 1 83 9 4 1 7 75
|
||||
9082152: 182 66 9 8 6 7 7 2 195 2
|
||||
1657909631: 8 5 76 7 5 95 2 9 22 544
|
||||
484430: 2 5 64 7 49 961 83 3
|
||||
11192683920: 6 26 7 8 5 8 6 3 8 372 1 1
|
||||
52887178: 4 863 61 118 60
|
||||
896861: 88 9 7 671 4 187
|
||||
721710054179: 135 891 60 541 81
|
||||
12403134: 92 6 34 58 6 5 7 9 6 6
|
||||
33615296: 312 44 55 9 3 1 572
|
||||
183192: 35 8 5 5 612 28 71 3 4 8
|
||||
1244794661146: 6 4 9 6 1 6 4 57 7 685 8 6
|
||||
362827266: 86 643 395 8 738 813
|
||||
1477891785: 86 6 2 8 13 2 91 7 1 8 8
|
||||
5983: 3 888 5 291 2 57 6
|
||||
73739569: 668 6 687 89 6 69
|
||||
902757501: 855 24 627 1 63 26 9
|
||||
177442819: 6 9 401 2 4 52 256 4 3
|
||||
87403263: 95 920 3 191 7 65
|
||||
223398085: 57 3 1 8 11 50 45 8 9 85
|
||||
76471: 81 472 2 1 6
|
||||
102739: 1 284 1 8 9 1
|
||||
98723250300: 79 119 1 1 2 143 5 7 21
|
||||
37813543: 28 4 5 813 540
|
||||
21449386021: 185 4 9 9 3 6 4 46 7 1 3 8
|
||||
355140846: 39 4 6 90 845
|
||||
25511824797: 3 7 4 746 48 55 3 15
|
||||
11681963: 5 76 9 67 1 35 3 8 50 3 2
|
||||
10812636790: 3 778 3 954 790
|
||||
144: 90 14 40
|
||||
2954988: 6 3 3 16 4 95 2 1 7 3 9 3
|
||||
1666626: 282 573 74 39 1 46
|
||||
380854191760: 2 7 24 5 54 177 5 5 664
|
||||
20485976: 47 155 643 323 3 8
|
||||
562264400: 8 1 3 1 5 74 3 67 309 88
|
||||
5054: 67 3 55 599 604
|
||||
5790: 8 6 4 3 7 43 1 9 8 4 17 6
|
||||
1423: 232 6 23 2 6
|
||||
2214885600: 1 5 2 1 3 50 183 41 82 3
|
||||
586061: 507 69 31 975 3
|
||||
68594249: 2 9 373 9 50 340 3 32 6
|
||||
380980: 95 4 980
|
||||
7510: 5 4 825 4 71 9
|
||||
451918: 90 50 18 11 106
|
||||
16294: 29 134 8 65 4 1 455 3
|
||||
10536237: 6 6 3 9 1 1 4 724 4 5 1 97
|
||||
24566372: 1 34 8 3 90 592 85 87
|
||||
284990: 5 5 5 91 7 5 88 5
|
||||
1108832032: 80 93 29 3 727 88
|
||||
215422984: 63 82 417 8 70 1
|
||||
37636247: 3 875 3 39 615 6 73 5 2
|
||||
511718662: 3 505 3 718 23 42 9
|
||||
172674894: 6 76 9 6 7 5 6 6 7 7 22 2
|
||||
2494298: 21 8 468 606 6
|
||||
1164891: 12 97 891
|
||||
1303421387: 8 604 17 5 6 48 95 87
|
||||
113169: 242 889 55 7 6
|
||||
28083319654: 7 1 6 2 780 4 8 9 9 3 8 7
|
||||
689769: 2 479 72 6
|
||||
664006: 603 60 997 9
|
||||
383810: 312 123 4 7
|
||||
278838736: 254 851 15 86 76
|
||||
35266920: 4 8 65 481 94
|
||||
2342060: 5 55 2 43 99 710
|
||||
61499384: 760 4 83 423 2 4
|
||||
1337677: 769 562 5 67 3 9 13
|
||||
20708670: 1 7 8 1 9 9 6 70 6 1 3 57
|
||||
22607703347: 23 6 7 6 7 67 80 39 44
|
||||
422584: 1 6 185 2 95 23 1 878
|
||||
16961283369: 7 614 720 9 609 1 9
|
||||
7743900: 12 80 8 38 33 75 525
|
||||
5198: 5 14 5 5 3
|
||||
7706: 5 765 6
|
||||
60799047884: 9 6 5 331 7 2 2 6 3 3 5 87
|
||||
373279812855: 74 65 5 946 16 571 5
|
||||
273426612: 519 24 87 2 656 3 958
|
||||
449: 250 94 8 9 88
|
||||
69949442: 8 92 4 1 15 33 8 3 1 2 2
|
||||
2540247614: 578 3 346 73 29 5 5 9 2
|
||||
72710790952: 99 4 87 255 85 7 4
|
||||
43727113667: 3 1 333 66 106 71 2 4 7
|
||||
74125836117: 4 5 52 6 25 35 9 3 521
|
||||
527906: 54 9 9 931 29
|
||||
139782: 11 33 6 526 918
|
||||
19218: 704 402 9 522 284 8
|
||||
8668810: 40 8 6 3 6 2 84 2 2 75 7 3
|
||||
1487663526: 9 9 517 70 2 6 2 5 94 8 4
|
||||
20610: 1 152 3 2 45
|
||||
359112: 323 5 47 54 7 6 3 8 4 2 4
|
||||
3198: 1 7 8 8 24 7 1 4 41 7 27
|
||||
41189: 13 9 3 624 5
|
||||
4720776758223: 47 20 776 758 222
|
||||
195264: 4 2 339 36 2
|
||||
16012371600: 6 9 6 3 6 3 95 3 76 4 185
|
||||
3864074: 3 4 426 84 73
|
||||
45674415: 42 4 9 7 82 410 5
|
||||
1175718380: 6 340 5 911 746
|
||||
51156: 3 4 4 540 87
|
||||
4831584: 2 43 8 2 55 5 7 5 69 96
|
||||
874516400: 874 5 16 368 32
|
||||
220190: 7 974 32 38 1 7 4 172 4
|
||||
429894584: 1 9 5 7 5 98 94 9 6 9 58 4
|
||||
114640: 3 7 31 52 7 6 1 772 299
|
||||
10759: 23 1 6 12 7 2 1 4 81 28 7
|
||||
360390945715: 2 431 696 27 213 20 5
|
||||
3140056: 783 9 5 1 43 9 8 864
|
||||
15606936: 96 6 40 639 172
|
||||
1134226: 9 824 46 152 2
|
||||
640: 5 32 2 2
|
||||
46339061240: 7 20 9 987 5 715 618
|
||||
35646030: 42 1 885 137 7
|
||||
271367519: 7 45 964 127 96 893
|
||||
495104: 1 960 8 56 64
|
||||
3480: 7 1 12 3 1 40
|
||||
2608290: 91 95 46 3 3 30
|
||||
55890251: 1 65 7 9 4 81 454 3 582
|
||||
541872: 774 7 46 2 27
|
||||
309960637: 8 43 4 90 640
|
||||
14270: 44 8 875 1 9 6 1 8 3 5 5
|
||||
2461824: 1 4 1 9 7 12 61 71 1 4 1 8
|
||||
53575: 6 73 9 7 118 3
|
||||
3128658: 93 9 2 2 20 8 94 331 7
|
||||
223592: 5 43 381 5 9 4 5 884 8
|
||||
12112807054: 870 119 7 61 15 274 4
|
||||
27775914: 6 1 781 1 9 18 4 3 5 889
|
||||
279477744: 33 3 9 411 87 763
|
||||
9896932013: 647 3 331 353 343 46
|
||||
8127207475: 8 1 2 720 3 4 29 9 4 91 3
|
||||
3683665: 981 751 5 5 8
|
||||
7203976: 3 51 7 5 629 3 5 9 9 8 5 4
|
||||
12182439609: 5 57 9 9 9 7 9 8 4 320 3 3
|
||||
6547981: 9 727 2 47 84
|
||||
269451007: 9 262 62 4 992
|
||||
1760418: 99 34 1 5 99 96 4 27 6
|
||||
4881246: 5 3 46 2 4 67 57 8
|
||||
104401: 68 69 8 72 1
|
||||
57612060: 6 270 53 61 11
|
||||
65336211: 92 71 912 169 540 1
|
||||
1056886344323: 8 990 3 9 1 6 18 695 64
|
||||
431112: 3 19 108 92 69
|
||||
1497953467: 1 640 5 8 6 9 38 65
|
||||
20122455: 24 76 903 9
|
||||
112719469: 32 80 7 13 6 456 4 6
|
||||
1178483161: 18 8 6 29 75 754 4 3 4
|
||||
119908723232: 48 39 7 5 3 73 8 64 30
|
||||
21106565: 350 1 37 4 966 2 1 7 2 2
|
||||
70193: 4 53 9 2 7 701 59 746 4
|
||||
3034: 21 45 68 816 3
|
||||
3005: 2 89 24 92 7 58
|
||||
81430304: 124 4 989 2 83
|
||||
22260548: 7 15 212 54 7
|
||||
494808: 87 6 665 6 8
|
||||
6723: 4 81 13 457 13
|
||||
463069864051: 995 8 4 91 7 465 10
|
||||
913887: 3 6 7 2 752 9 5 1 36 5 2 1
|
||||
824408862: 82 43 9 86 8 94 6 5
|
||||
3431928092169: 5 3 67 76 755 15 362 6
|
||||
502132176: 9 109 624 964 702
|
||||
83412526: 1 4 7 2 27 405 3 1 721 8
|
||||
407094: 27 7 60 433 7 5
|
||||
701412: 2 5 84 648 97 836 8
|
||||
25707842242: 311 3 2 3 711 8 8 2 2 42
|
||||
505119: 1 44 41 7 40
|
||||
295936440: 9 27 963 89 272 4 38
|
||||
59813: 595 97 657 457 984
|
||||
297534: 348 61 1 1 2 7 296 46
|
||||
143500: 618 32 8 31 19 1 82 7
|
||||
138312966147: 5 29 5 3 2 2 7 50 4 8 96 2
|
||||
311740: 5 76 5 37 1 1 597 3 20
|
||||
4908292: 9 785 31 59 5
|
||||
6141663: 204 7 25 3 5 1 7 2 9 6 2 2
|
||||
746258: 1 3 61 6 48 21 4 11 81 5
|
||||
310680: 6 7 59 782 9 45 8
|
||||
170615594: 447 3 7 74 35 7 7 6 6 6 2
|
||||
160656040: 75 78 105 603 7
|
||||
5577322182: 47 49 942 2 24 5 7 1 2 7
|
||||
48328: 3 7 4 7 9 149 9 456 7 3 7
|
||||
155259452737: 56 746 874 2 8 342
|
||||
35341: 5 76 93 1
|
||||
22236341: 3 381 88 641 5 1
|
||||
44989863673: 96 6 5 6 71 2 3 381 7 3 3
|
||||
606: 4 80 50 4 70
|
||||
12733: 65 9 2 86 5
|
||||
22463298: 24 88 3 5 80 1 4 89 8
|
||||
377019478: 6 748 5 1 3 4 1 9 7 2 3 8
|
||||
19642752: 696 5 7 544 51
|
||||
702511961: 887 792 1 7 961
|
||||
6024648: 8 86 75 47 168
|
||||
104509650: 5 1 482 62 72 597 7 70
|
||||
1135227: 2 218 25 27 45 5 5
|
||||
224: 2 4 6 2 86 100
|
||||
173902: 99 277 462 89 4 99
|
||||
823929: 9 9 8 5 929
|
||||
25781529: 60 9 8 4 7 65 9 2 4 213 9
|
||||
15984006: 38 6 5 9 727 7 6 4 96 1 5
|
||||
911: 7 6 1 868 1
|
||||
1319338035: 7 6 1 7 6 438 1 448 5 87
|
||||
281978: 561 4 9 5 5 56 1 4 1 9 5 3
|
||||
26739745316256: 3 772 8 21 75 45 5 75 5
|
||||
804636: 50 6 26 542 927
|
||||
4368: 9 87 1 8 42
|
||||
1339970241787: 2 6 8 17 4 82 9 29 4 95 2
|
||||
27896197888: 8 8 849 619 66 521
|
||||
1624907806241: 9 270 3 9 649 18 9 44 1
|
||||
804053256: 531 30 7 9 25 91 6
|
||||
19887: 394 48 682 27 264
|
||||
576579196: 34 7 5 75 6 8 1 5 5 5 91 9
|
||||
4075638918: 886 5 23 97 1 5 4 7 48
|
||||
1242184922: 7 4 5 7 88 9 393 4 925
|
||||
816: 5 2 5 6 45 6
|
||||
16640: 34 60 177
|
||||
55047199922: 5 674 9 97 58 8 985 7 1
|
||||
202: 1 57 3 8 1 4 28 2
|
||||
128584480: 34 6 835 650 94 8
|
||||
14447: 166 3 28 420 83
|
||||
302594: 5 6 2 511 83
|
||||
100153: 4 389 35 70 60 43 450
|
||||
2185551: 38 3 43 19 3
|
||||
6746: 4 6 583 93 784 39
|
||||
3486469538: 8 47 3 40 786 7 9 1 19
|
||||
2105210: 7 4 8 2 6 9 8 31 7 56 3 2
|
||||
47524069: 6 4 610 811 106 4 85 8
|
||||
24206: 25 599 13 2 19
|
||||
83444222: 309 3 9 96 1 8 38 21
|
||||
1157600: 383 930 42 92 800
|
||||
135424: 274 494 29 6 33
|
||||
41759168088: 63 4 91 3 77 2 33 9 94
|
||||
912: 6 1 9 58 1 838
|
||||
1483426560: 4 6 1 69 801 406 692 6
|
||||
1291767304: 41 475 889 4 88 65 8
|
||||
4740630: 941 32 56 2 87
|
||||
145255683: 6 928 2 270 96 3 3
|
||||
2804256: 2 563 36 41 6 91 8
|
||||
3662: 592 6 91 11 8
|
||||
2070609492: 9 460 7 1 66 352 9 8 5
|
||||
58896: 73 2 5 17 5 15 8
|
||||
161664199: 5 9 8 9 746 32 2 1 9 8
|
||||
28767133: 6 69 10 43 37 96
|
||||
321150750: 6 3 33 7 6 191 1 74 355
|
||||
32221373185: 931 4 3 78 56 33 8
|
||||
125188150: 1 84 8 299 7 6 3 623 38
|
||||
529: 1 2 63 54 350
|
||||
371329981: 53 730 8 78 760 4 57 1
|
||||
8636010413: 34 6 1 516 8 4 4 82 1 1 1
|
||||
16436: 8 8 36 7 70
|
||||
2610384: 6 74 93 329 8 42
|
||||
2511598: 21 497 80 7 10 12 5
|
||||
2051303: 68 6 53 523 6 91
|
||||
3583491: 58 3 3 8 852 79 4 5 5 46
|
||||
2567: 5 3 32 4 3
|
||||
37412197: 63 94 238 46 197
|
||||
660996: 61 61 7 43 18
|
||||
772595115: 1 7 2 25 4 2 314 72 5 8 6
|
||||
1125072: 6 82 64 2 3 7 444 2 3 48
|
||||
40030036: 9 68 7 66 646
|
||||
26483808: 5 6 9 862 16 33 96
|
||||
89503594: 2 91 80 112 72 61
|
||||
34849136: 7 14 6 1 9 857 68 88
|
||||
1052469452651: 5 94 9 5 5 5 9 870 8 8 3 8
|
||||
2333026: 2 9 1 8 36 9 5 5 75 1 7 9
|
||||
2142047: 55 2 6 1 60 3 9 40 6 5
|
||||
18329059: 1 7 398 2 523 11 1
|
||||
1515: 1 5 216 3 1 214
|
||||
636751072: 65 7 58 3 967 7 759 9 4
|
||||
65121: 3 648 21
|
||||
1203384: 855 2 9 12 7
|
||||
1231: 567 1 29 21 1 612
|
||||
5830477499: 416 2 925 357 7
|
||||
39904736: 2 2 987 58 51 2 1 8
|
||||
7192: 4 881 3 11 8
|
||||
984797352: 86 84 99 3 1 459
|
||||
4330380: 444 3 8 3 797 7 6 9 1 5 6
|
||||
174675: 8 41 206 75 824 530
|
||||
644000: 2 4 89 4 17 7 92 14 1 4
|
||||
275310: 6 11 31 58 888 4 2 9 2
|
||||
2980025: 29 72 7 96 4 61
|
||||
1100140: 3 8 9 91 3 9 466 5 6 8 3 9
|
||||
26416153: 5 3 64 9 4 764 7 7 5 4 6 7
|
||||
392307: 644 22 589 2 30
|
||||
1703108: 23 789 9 532 7 8
|
||||
84496967641: 9 8 7 71 696 158 605 9
|
||||
4926: 5 47 3 5 2 6 60
|
||||
1238: 7 20 5 8 75
|
||||
4166368: 4 8 393 74 22 7
|
||||
264286: 5 5 2 6 11 26 80 115 8 6
|
||||
5390070: 38 5 77 813 35 3 54 8 6
|
||||
7109213251: 798 2 5 88 89 50
|
||||
11479038526: 245 1 5 7 333 456 3 7 9
|
||||
35577532: 71 155 500 25 5
|
||||
516: 7 4 6 4 1 70 9 66 1 5 39 2
|
||||
12159: 9 6 1 225 9
|
||||
593081: 1 92 6 4 343 2 6 8 3 41
|
||||
52698: 89 592 7
|
||||
36739952992513: 9 4 779 4 627 92 4 8 3 7
|
||||
2006: 22 8 90 75 5 8
|
||||
83601: 68 30 8 5 1 56 3 1 3 7
|
||||
478266: 1 4 8 6 3 724 612 8 286
|
||||
297000: 49 50 820 9 90 6 88
|
||||
1229910807: 262 102 46 6 600 807
|
||||
185356128: 44 5 401 7 82 115 48
|
||||
246521: 787 6 4 6 307
|
||||
86285202: 25 96 42 856 402
|
||||
23586: 70 1 3 52 9 5
|
||||
18086584: 46 6 144 8 27 534 7
|
||||
33690: 4 69 4 56 89
|
||||
46311716: 12 3 41 18 619 6
|
||||
214023: 5 793 66 7 53 9
|
||||
6755: 270 2 799 12 5
|
||||
14223284: 9 9 7 5 7 8 2 111 1 45 4 8
|
||||
2291081: 3 2 632 725 81
|
||||
284789717303: 605 3 9 3 960 30 47 49
|
||||
17262: 105 4 3 1 3 9 3 240 2 7 1
|
||||
157051: 9 7 6 181 6 9 3 3 451 81
|
||||
1349805670: 59 4 874 26 71
|
||||
2361910101: 5 623 7 3 38 6 8 1 3 1 8 2
|
||||
45459840: 8 42 71 1 3 8 4 9 8 9 384
|
||||
644841302: 7 658 2 70 62 68 2
|
||||
196349: 69 6 192 81 2 4
|
||||
25233495: 14 6 1 3 34 83 14
|
||||
2502364627: 9 73 7 1 76 4 7 95 8 5 27
|
||||
891841251: 79 62 560 2 63 6 51
|
||||
526: 95 9 4 1 417
|
||||
46610701: 46 605 5 697 4
|
||||
101160: 5 5 6 5 9 4 873 8 4 3 3 63
|
||||
74700: 86 2 765 47 83
|
||||
487499: 9 52 6 6 85 502
|
||||
12930315: 4 77 3 9 48 9 1 5
|
||||
818480: 3 4 8 966 10 3 7 1 4 5 4 1
|
||||
8956575: 6 8 827 5 676 864 35
|
||||
6467920693: 5 8 5 48 652 1 8 8 1 3 8 5
|
||||
877: 71 10 689 32 75
|
||||
53325209060: 554 965 941 2 53
|
||||
23291024284082: 9 42 193 47 6 9 515 48
|
||||
929424926: 3 6 29 42 492 5
|
||||
17829266: 6 56 4 53 63
|
||||
12276: 2 5 55 3 66
|
||||
181712606: 595 74 75 412 6
|
||||
8831966: 2 56 30 2 2 39 65 2 9 8 7
|
||||
661454663997: 231 3 453 350 8 10 78
|
||||
237094: 3 3 311 50 646 12
|
||||
5707220457: 71 82 86 966 4 920 55
|
||||
152255376595: 76 17 40 820 65 163
|
||||
1347305: 9 4 8 65 664 3 4 3 701 9
|
||||
70155: 91 2 88 257 706 58 1
|
||||
60468016: 640 1 23 5 27 726 812
|
||||
408075824: 40 74 6 758 22
|
||||
149767280436: 1 221 860 788 436
|
||||
1581985302: 83 9 258 3 8 38 72 3 6
|
||||
157694208: 94 8 52 3 5 15 56 1 3 8
|
||||
3814512: 5 6 4 8 8 5 6 5 5 37 9
|
||||
4548610: 66 9 3 3 7 57 50 1 9
|
||||
21119484: 38 822 28 29 876
|
||||
5946398: 661 589 67 71 91 57
|
||||
151648362: 894 75 5 9 93 54 317
|
||||
10321152: 99 807 712 2 8
|
||||
114489: 6 5 4 8 31 84 37 9
|
||||
145909: 75 70 909
|
||||
106820010: 722 269 10 2 55
|
||||
1480075: 44 2 198 9 3 71 691 6 7
|
||||
28827: 19 1 5 7 6 9 78 1 8 849 3
|
||||
7566: 7 244 8 141 62 23 5 83
|
||||
5508361: 495 4 214 13 1
|
||||
4988516: 5 33 55 12 568 66 2 97
|
||||
184373: 1 9 7 9 5 1 1 33 9 11 20
|
||||
199283931852: 3 5 8 4 158 6 3 539 855
|
||||
1666857472580: 77 654 23 180 331
|
||||
14487733: 557 891 68 9 9 5 828
|
||||
1198391800: 231 965 8 84 2 93 1 4 2
|
||||
126143604: 86 2 6 463 88 55 5 3
|
||||
153392452209: 6 482 7 3 939 11 5 4 9 7
|
||||
12681: 5 7 2 9 4 7 44 2 5 65 4 9
|
||||
989: 1 9 99
|
||||
93840: 98 38 46 15
|
||||
217780: 419 3 516 23 5
|
||||
33264: 447 87 973 5 22
|
||||
7178025: 995 9 5 2 87 7 527 20 5
|
||||
9028: 3 83 7 5 3
|
||||
12935: 711 5 6 3 47
|
||||
3659499181: 365 925 6 229 9 5 181
|
||||
701521: 9 4 3 64 7 61 8 26 67 53
|
||||
340704429: 52 78 84 319 7 7 99
|
||||
62241150: 7 176 842 8 77 6
|
||||
112424: 5 1 8 936 82 8 183 92
|
||||
723672: 347 67 1 2 874
|
||||
3066: 51 5 8 8 8 898
|
||||
1274880: 23 52 542 9 87
|
||||
2517506958: 37 68 780 726 9 59
|
||||
110283391: 3 52 3 53 8 3 8 6 3 903 1
|
||||
4536: 83 5 81 9 747 2
|
||||
87466: 19 46 6 3
|
||||
605783111392: 404 91 601 37 741 4
|
||||
58853775: 4 485 79 4 384 399
|
||||
47889063: 516 64 89 984 999 29
|
||||
23241016: 7 3 5 5 6 1 3 819 27 9 9 1
|
||||
27260572330: 9 9 7 9 28 57 2 3 8 2 5 5
|
||||
233756964: 61 958 6 5 1 5 26 8 314
|
||||
781268: 376 6 743 4 692 1
|
||||
69945120: 7 4 539 5 113 5 6 4 7 73
|
||||
267715242: 92 8 663 9 4 3 632 3 1 2
|
||||
1896465174: 976 920 1 4 651 72
|
||||
2800123: 203 8 17 9 384 23
|
||||
206464: 3 7 3 186 1
|
||||
127766017: 74 12 9 35 714 1 24 1
|
||||
24: 7 5 1 9 3
|
||||
10510918116: 59 46 109 181 15
|
||||
3621981: 2 248 954 2 1 3 9 78
|
||||
7258534: 70 96 523 840 898
|
||||
12932425: 928 6 43 57 8 54 1 3 9 7
|
||||
40426441: 6 8 7 7 3 8 1 2 1 18 509 9
|
||||
258400: 70 120 34 40
|
||||
895: 81 303 38 2 51
|
||||
80809920: 932 69 727 47 995
|
||||
21779938: 9 411 92 64 226
|
||||
1613: 4 401 4 7
|
||||
43158803498: 36 222 9 7 26 39 6 9 9 1
|
||||
4366703135: 57 7 93 7 2 70 982 8 6
|
||||
167694750: 9 89 350 76 598
|
||||
1913663802: 64 299 63 6 2 10 2
|
||||
1444191: 556 9 11 4 6 5 1 41 83 7
|
||||
1003880435: 19 82 746 977 863
|
||||
4155: 72 810 13 4 575
|
||||
96614034: 15 6 361 72 6 2 3 6 59
|
||||
1688: 5 9 1 5 3 8 8
|
||||
41338714328: 41 338 639 75 328
|
||||
9197318140: 2 59 6 1 690 8 1 5 227 4
|
||||
46479360: 61 7 4 2 9 7 39 272 6 5 8
|
||||
404048233: 951 7 8 576 2 4 235
|
||||
11494468882: 3 187 5 9 1 3 24 2 6 7 5 7
|
||||
1922: 6 233 457 6 61
|
||||
6955: 9 7 8 4 5 7 4 2 4 5 202 5
|
||||
31285182: 23 136 506 7 63 52
|
||||
8117862: 437 1 6 921 2 381 46 6
|
||||
47589: 9 94 374 39 7
|
||||
2256037: 60 376 39
|
||||
2527024499: 4 3 1 7 8 10 3 1 6 51 91
|
||||
37690: 3 720 52 6 1 88 1
|
||||
4175256007: 4 8 5 39 20 2 34 2 23
|
||||
380247474471: 2 4 2 45 497 88 5 7 2 7 1
|
||||
21474: 9 9 9 1 17 4 784 8 4 39 9
|
||||
3277745: 18 2 5 4 414 89 271
|
||||
20611117618: 3 3 2 4 8 1 4 9 39 76 19
|
||||
6706090709: 799 2 3 1 8 9 8 4 7 872
|
||||
5792: 618 29 68 8 3 69
|
||||
410827821: 4 927 73 453 16 409
|
||||
233173828: 3 74 634 6 896 3 4 7 5 6
|
||||
187959: 119 32 2 556 23
|
||||
486043544: 3 230 57 52 54 74 62 7
|
||||
2347696: 4 1 35 40 19 769 8
|
||||
4278588041013: 44 7 29 4 7 456 7 4 684
|
||||
5637600: 58 9 54 25 8
|
||||
4977330: 9 7 6 79 3 9 8 838 3 4 7 6
|
||||
22497: 82 79 983 1 1 3 9 102
|
||||
35382699154: 77 617 2 14 2 46 554
|
||||
16502056: 8 6 58 319 488 5 819
|
||||
756793: 88 3 3 944 192 3 1 72
|
||||
4214: 6 697 1 5 27
|
||||
12450094: 2 2 2 6 3 629 9 857 5 9 4
|
||||
1618088: 76 4 6 1 7 7 62 90 5 1 8
|
||||
1060491: 3 361 14 906 66 1
|
||||
266689086: 3 2 17 83 5 6 8 42 6 5 3 3
|
||||
68560832: 3 1 82 6 8 5 3 308 2 1 2
|
||||
1326: 423 846 4 1 8 44
|
||||
68085: 674 6 78 7
|
||||
1840707: 85 9 62 6 804 4 3
|
||||
13403416: 2 1 3 5 4 65 7 8 7 3 933
|
||||
2093: 56 6 868 26 614 9 8
|
||||
12213922: 73 703 14 1 17
|
||||
224283: 640 7 4 5 8 4
|
||||
97770: 1 214 7 27 1 8 378
|
||||
25990: 6 5 5 87 2 7 767 6 92 4
|
||||
299184551: 325 2 92 544 7
|
||||
63062194: 70 9 605 7 46 123 825
|
||||
68322843482: 28 244 28 434 82
|
||||
37380255: 80 1 935 87 493 4 5
|
||||
305472677: 509 6 7 267 7
|
||||
46: 1 45 2
|
||||
2250: 29 1 75 6 69
|
||||
191773: 19 176 5 8
|
||||
91083792: 4 7 236 878 7 5 6 4 3 1 1
|
||||
335524376: 8 53 51 68 668 158
|
||||
29640281671: 7 8 4 6 3 5 7 44 7 8 8 90
|
||||
497340: 9 3 762 7 3 6 3 5 6
|
||||
279527: 402 67 149 4 1 3
|
||||
279694: 1 935 96 765 97
|
||||
224785469: 2 1 9 5 68 10 2 3 9 3 7 23
|
||||
10732502: 15 5 477 5 60
|
||||
7497250: 8 936 1 9 249
|
||||
56971: 4 76 9 79 91
|
||||
41393070: 2 53 5 781 70
|
||||
12168228431496: 64 3 8 2 161 9 7 831 3
|
||||
117142318737: 3 6 6 9 2 60 436 3 9 6 9 3
|
||||
158260: 9 45 5 4 78
|
||||
2363212870: 2 363 212 4 52 420
|
||||
447325: 463 2 795 355 25
|
||||
4751: 11 48 9
|
||||
841: 81 9 97 2 13
|
||||
3346211520: 3 9 858 11 522
|
||||
697352492: 67 1 4 4 18 3 455 69 9 5
|
||||
7319280640: 61 45 7 709 7 656 80
|
||||
27260: 7 9 344 79 5
|
||||
10737320581: 7 8 5 5 55 7 8 6 294 70
|
||||
17943: 9 839 921 18 6 9 4
|
||||
35412: 6 724 1 9 8 580
|
||||
6453: 161 1 475 81 9
|
||||
840798: 975 287 52 3 647 517
|
||||
17854: 3 32 69 42 7 655
|
||||
1735468803: 3 86 8 5 9 91 68 3 26 80
|
||||
1955340326: 54 8 292 2 54 5 327
|
||||
7614444: 86 7 718 824 7 88 7 19
|
||||
108369902185: 3 9 115 814 7 9 5 7 1 8 6
|
||||
139223: 8 3 53 2 77 38 6 3 2 7 4
|
||||
2142640: 49 43 35 566 72
|
||||
266228026: 3 80 51 8 597 5 62 24
|
||||
68870224: 6 62 870 22 4
|
||||
393281: 5 4 109 9 32 77 2 22 9
|
||||
22257035: 29 25 685 5 6 3 597 3 5
|
||||
1480: 679 67 130 537 9 58
|
||||
11720991: 1 8 23 7 364 5 5 5 59 7
|
||||
156699: 663 9 301 5 5
|
||||
1292069: 17 760 21 42 6
|
||||
83229203: 100 1 4 7 1 808 321 9 2
|
||||
15899250: 986 375 43
|
||||
80808: 40 4 521 212 104
|
||||
10465625002: 9 77 71 47 50 1 425 2
|
||||
819408192: 31 68 991 7 3 87
|
||||
667: 8 8 2 7
|
||||
26860: 200 45 23 56 4
|
||||
49480468: 43 29 90 127
|
||||
5186813940000: 504 967 5 825 5 86 2 3
|
||||
19174057: 6 7 652 7 51 7
|
||||
72691616664: 991 7 733 662 6 38
|
||||
18573243: 343 360 489 9 900 6
|
||||
3883810560: 6 88 2 8 4 438 8 980 6
|
||||
19738: 5 2 508 38 54
|
||||
703764: 13 8 48 495 20 77 23 6
|
||||
273920: 7 629 987 89 8 20
|
||||
911: 7 5 9 4 592
|
||||
33029: 50 644 822 7
|
||||
524702: 7 153 24 79 7 3 95 17
|
||||
109342: 84 130 3 3 2 2 80
|
||||
35742400: 8 1 706 7 51 174 6 6 9 7
|
||||
1483641: 2 64 70 737 153
|
||||
7397: 364 5 8 4 85
|
||||
10622451329: 5 80 3 7 1 4 7 879 3 1 2
|
||||
1513454743: 69 31 8 732 963 91
|
||||
87816030: 47 1 7 80 3 8 1 6 417 1
|
||||
2957777379: 30 265 7 777 379
|
||||
279602: 759 1 23 4 4 274 9 7
|
||||
2793723: 2 10 66 1 6 24 2 723
|
||||
13426560: 36 37 180 8 7
|
||||
72281484: 8 25 758 6 17 9 36
|
||||
15157818475: 26 124 1 5 7 818 475
|
||||
1726473: 857 5 41 9 819 2
|
||||
69102877793: 9 997 2 91 7 17 711 7 5
|
||||
1182849: 2 249 31 38 4 129 8
|
||||
81125766: 7 2 670 17 308 3 789
|
||||
20198: 8 6 3 396 2
|
||||
130416799: 10 27 483 6 7 9 6 4
|
||||
29969: 7 62 38 7 91 5 4 907
|
||||
4071: 3 10 4 7 23
|
||||
3447616557: 858 111 362 9 54
|
||||
31720: 38 59 43 63 4 2
|
||||
10386966: 1 3 8 612 2 96 5 7 8 4 6 3
|
||||
2515969: 2 768 9 906 8
|
||||
2085272: 18 65 114 297 25
|
||||
245966149: 96 3 146 5 6 4 2 2 3 731
|
||||
936628: 57 38 19 887 90 88
|
||||
434515299: 905 64 9 8 56 99
|
||||
7751781085279: 8 7 900 819 9 389 11
|
||||
6523: 4 61 26 151 28
|
||||
507242778: 6 822 69 44 4 459 1 6 7
|
||||
4557: 2 48 3 9 169 3
|
||||
6172533: 37 9 207 43 7 9 7 7 12 9
|
||||
4528512: 7 27 871 689 5 6 63
|
||||
35178: 1 682 81 46 80
|
||||
40198: 67 4 25 6
|
||||
12418780: 54 7 6 8 351 6 164 11
|
||||
37440: 24 9 8 12 870 247 32
|
||||
7303307255: 35 695 324 6 64 8 52
|
||||
42929: 9 124 38 5 516
|
||||
101311: 2 99 31 1 3
|
||||
3786723: 1 685 92 6 3 3
|
||||
757762: 76 997 1 3 38
|
||||
728: 567 6 23 42 90
|
||||
19126995: 593 1 70 65 59 58 458
|
||||
83647: 8 828 47
|
||||
1250549: 24 939 1 71 50
|
||||
9778: 9 173 39 15 5 3 39 262
|
||||
18714: 89 265 5 13 4 43 1 3
|
||||
10446534727248: 61 465 74 62 990 8 6
|
||||
4136: 12 289 668
|
||||
986: 919 65 2
|
||||
382284584: 655 1 7 1 144 578 7 1
|
||||
2087668: 521 7 75 94 48 4
|
||||
13551: 62 69 8 36 9
|
||||
54736659: 504 52 8 38 17 261
|
||||
46609728: 5 9 6 5 78 8 818 9 3 1 5 6
|
||||
8001: 55 7 6 9 7 3
|
||||
2164: 20 62 3 7 8 8 76
|
||||
34288954: 174 227 512 141 854
|
||||
149143039: 568 157 839 4 4 8 745
|
||||
858002: 715 600 1 2 2
|
||||
355275: 3 550 5 22 6
|
||||
1161901609: 9 3 7 1 9 5 8 2 99 9 492 4
|
||||
14265505: 7 4 77 237 684
|
||||
93906: 1 23 457 4 78
|
||||
280258704: 396 16 217 528 81
|
||||
2447: 237 9 217 9 88
|
||||
21103892: 688 2 139 4 3 64 55 7
|
||||
572320: 571 889 7 8 7
|
||||
22940: 74 1 31 10
|
||||
453933144: 884 1 7 2 8 75 164 94 9
|
||||
9387402762: 447 7 134 3 70 3 57 2
|
||||
628: 2 96 5 6 10
|
||||
58729373: 53 4 53 29 373
|
||||
16162243: 2 3 90 75 92 139 927
|
||||
1806271: 4 319 283 5 13 718
|
||||
1908: 72 26 16 8 9
|
||||
87108518916: 8 349 61 129 729 4
|
||||
1120226562: 81 8 1 54 7 89 8 5 2 32
|
||||
5619463232: 7 860 2 3 9 3 24 29
|
||||
28275666: 4 35 65 440 227
|
||||
57418552: 8 96 4 18 9 6 4 142
|
||||
337848089754: 893 778 54 82 7 9 5
|
||||
101244761: 2 8 4 1 222 8 1 631 6 4 5
|
||||
31091: 2 94 6 323 9 4 4 53 8 3
|
||||
9551142: 2 7 4 4 92 9 87 2 54
|
||||
431798: 2 827 32 904 554 96
|
||||
368064: 62 5 31 10 568 6
|
||||
641856: 80 23 1 2 8
|
||||
356332: 848 13 8 38 853 4
|
||||
1530148: 107 13 11 13 33
|
||||
10595: 4 93 3 71 524
|
||||
13825: 37 88 128 73 4
|
||||
485809: 9 597 19 6 996 5
|
||||
6598799: 541 2 674 617 6 5 3 1 1
|
||||
15595884486: 6 36 560 69 8 961
|
||||
655845: 5 5 2 512 8 298 7 115
|
||||
167578404: 716 3 162 9 916 19
|
||||
539849: 3 7 1 594 25
|
||||
3430232: 9 15 29 9 2 700 7 56 4 8
|
||||
4196: 951 77 9 8 4 4
|
||||
24625387: 9 6 8 6 9 37 846 38 3 8 8
|
||||
4318272002: 10 7 2 3 80 6 5 2 7 306 2
|
||||
49392736: 80 63 4 72 34 2 944 2
|
||||
97244751876: 3 45 6 3 7 293 8 5 9 2 3 1
|
||||
2827209446: 384 6 35 4 9 6 7 3 441 5
|
||||
773376516: 7 73 37 651 5
|
||||
466781: 21 76 5 364 782
|
||||
314242938: 77 30 223 22 610 218
|
||||
654638167: 14 95 6 631 7 169
|
||||
11952: 76 23 69 7 50 439 18
|
||||
7579925: 860 37 435 47 5
|
||||
1618: 80 4 7 711 59
|
||||
33287: 1 822 40 354 48 2 3
|
||||
126232779: 6 3 841 9 5 4 77 8 34 9 3
|
||||
155627: 1 6 99 989 54 95 13 99
|
||||
713339897: 9 7 5 8 9 30 430
|
||||
131670050047: 231 19 75 12 5 1 4 8
|
||||
7727322: 2 795 9 753 513
|
||||
349733: 615 8 637 271 4 6 28
|
||||
2481710424: 1 58 9 49 1 3 96 5 9 3 8 3
|
||||
261963659: 9 7 4 7 2 308 655 650 9
|
||||
51571974: 7 5 579 7 848 1 1 3
|
||||
20290: 3 85 3 467 36 1 1 6 196
|
||||
2626: 2 6 96 545 2
|
||||
22878: 2 2 80 275 4 21 3 9
|
||||
575535: 54 4 14 18 10 8 73 6 3
|
||||
477517: 43 3 4 5 8 46 7 50
|
||||
1384703: 4 401 6 7 738 51
|
||||
891003337: 86 6 12 4 825 3 3 39
|
||||
90028742465: 608 3 1 37 4 3 4 2 4 6 2 1
|
||||
231588050: 35 3 1 586 1 2 8 1 3 65 5
|
||||
1072: 7 9 995 9 5
|
||||
11381395: 73 4 974 2 36 2 435 7
|
||||
3841: 847 4 87 358 8
|
||||
88734868: 3 6 9 8 9 2 7 5 4 838 725
|
||||
280240227: 2 981 23 1 48 94
|
||||
343965: 6 35 67 885 23
|
||||
14417393: 9 4 7 2 63 6 38 35 90
|
||||
227912: 8 183 31 19 3 72 9 8 1
|
||||
2511501082: 1 946 88 2 430 3 7 6 2 4
|
||||
9770975: 2 207 7 58 9 4 36 33 5
|
||||
181098129983: 36 3 6 1 3 399 7 9 8 1 8 6
|
||||
5511886: 749 92 63 2 9 4 104 94
|
||||
11912: 3 167 581 43 15
|
||||
54194003: 24 5 7 50 632
|
||||
40135618285: 5 5 5 4 8 7 7 38 182 8 3 5
|
||||
8817032: 460 2 2 6 4 4 7 2 57 728
|
||||
236071: 566 414 610 196 941
|
||||
1699: 874 26 799
|
||||
9082: 59 85 7 9 10
|
||||
14399715: 7 6 5 84 32 1 9 9 8 756 7
|
||||
957922: 5 76 282 265 853
|
||||
519850: 854 1 1 608 8
|
||||
494598: 8 8 8 9 1 2 4 1 3 4 17 78
|
||||
717301: 769 92 138 844 1
|
||||
79732051: 8 1 7 80 45 5 221 629 8
|
||||
193315: 5 329 577 536 60
|
||||
443120: 71 7 62 5 764 4
|
||||
799531202: 320 693 332 72 50 2
|
||||
25055194: 241 48 900 7 194
|
||||
148742749564: 341 93 73 435 240 65
|
||||
2975722: 802 811 6 919 2
|
||||
69614316: 3 9 65 34 9 9 6 3 1 96 59
|
||||
9211672: 92 116 51 20
|
||||
1384: 5 687 2
|
||||
2227754259: 312 1 75 78 952
|
||||
1980: 6 46 5 70 6
|
||||
1051: 74 41 921 7 8
|
||||
7224: 69 9 6 405 7
|
||||
100058717: 58 44 628 7 145 31 9 8
|
||||
13325842: 86 4 981 7 534 49 5 9
|
||||
135606016: 86 1 1 7 2 4 8 877 96 8
|
||||
188416: 4 8 735 32 8
|
||||
13081748: 306 58 2 737
|
||||
3408461: 654 396 4 34 348 94 9
|
||||
19518: 2 1 8 9 1 54 9 25 9 616 2
|
||||
31719: 65 6 9 78 597
|
||||
246572: 26 98 9 4 393 9 81 2 8
|
||||
127805458: 40 71 9 1 5 457
|
||||
7811: 198 16 5 7 31 1 4 794 6
|
||||
1168319105: 5 2 1 2 4 44 8 93 9 12 8 8
|
||||
7211685: 411 5 7 562 8 554 93 5
|
||||
4028985022: 77 86 48 505 604
|
||||
127755655140: 73 70 5 3 8 31 5 140
|
||||
208269903: 3 75 267 990 3
|
||||
956027222: 455 20 5 10 4 3 5 7
|
||||
332644: 63 1 8 660 4
|
||||
739903: 8 744 1 67 3 630 9 1 5
|
||||
449841: 8 6 3 1 9 9 4 9 608 73 88
|
||||
3162: 88 4 6 9 7 3 53 7 9 17
|
||||
123780: 961 528 514 51 9 60
|
||||
397: 88 299 1 1 9
|
||||
20327221321: 10 40 83 98 1 460 7 6
|
||||
22759444: 366 7 6 3 241 6
|
||||
1397068088398: 419 2 5 161 5 6 4 414 1
|
||||
5172: 6 431 2
|
||||
7637: 251 9 85 746 7
|
||||
1812: 908 35 789 3 77
|
||||
1120: 7 9 1 68 9 2 4
|
||||
770138283: 11 6 57 1 3 8 947 9 1 3 3
|
||||
163644: 610 32 344 63 156
|
||||
6168: 137 5 9
|
||||
507: 41 9 2 76 60
|
||||
593693: 77 77 16 765 9
|
||||
1214074355: 9 4 5 3 9 73 5 7 8 4 855 8
|
||||
607244471: 6 3 7 3 1 83 2 510 2 4 6 8
|
||||
275: 26 2 9 2 2
|
||||
250040507: 24 9 455 585 504
|
||||
5137920095731: 44 7 438 78 3 23 573 2
|
||||
282926819: 6 4 827 26 812 42 3 32
|
||||
80952: 37 2 6 948 2
|
||||
8890436: 635 2 7 43 8
|
||||
10600: 2 1 8 8 6 6 8 3 91 541 6 5
|
||||
23840: 5 86 1 9 4 1 7 511 57 5
|
||||
283368: 3 8 8 322 8
|
||||
1123947090: 49 3 877 8 1 323 9 342
|
||||
25775616: 8 8 6 97 692
|
||||
243687944: 650 5 815 32 92
|
||||
2855764: 2 1 912 730 1
|
||||
2736185924: 835 66 2 53 8 3 31 3 2 2
|
||||
80
2024/gareth/day08/day08.go
Normal file
80
2024/gareth/day08/day08.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package day08
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Coordinate struct {
|
||||
Row int
|
||||
Col int
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid, antennaMap := parseInput(input)
|
||||
result := findAntinodes(grid, antennaMap, true)
|
||||
return result
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
grid, antennaMap := parseInput(input)
|
||||
result := findAntinodes(grid, antennaMap, false)
|
||||
return result
|
||||
}
|
||||
|
||||
func parseInput(input string) ([][]rune, map[rune][]Coordinate) {
|
||||
lines := strings.Split(input, "\n")
|
||||
rowCount := len(lines)
|
||||
colCount := len(lines[0])
|
||||
grid := make([][]rune, rowCount)
|
||||
antennaMap := make(map[rune][]Coordinate)
|
||||
|
||||
for row := 0; row < rowCount; row++ {
|
||||
grid[row] = []rune(lines[row])
|
||||
for col := 0; col < colCount; col++ {
|
||||
frequency := grid[row][col]
|
||||
if frequency != '.' {
|
||||
antennaMap[frequency] = append(antennaMap[frequency], Coordinate{Row: row, Col: col})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return grid, antennaMap
|
||||
}
|
||||
|
||||
func findAntinodes(grid [][]rune, antennaMap map[rune][]Coordinate, onlySpecial bool) int {
|
||||
rowCount := len(grid)
|
||||
colCount := len(grid[0])
|
||||
uniqueAntinodes := make(map[Coordinate]struct{})
|
||||
|
||||
for row := 0; row < rowCount; row++ {
|
||||
for col := 0; col < colCount; col++ {
|
||||
for _, antennaPositions := range antennaMap {
|
||||
for i, firstAntenna := range antennaPositions {
|
||||
for j, secondAntenna := range antennaPositions {
|
||||
//I know I know thats too many for loops
|
||||
if i != j {
|
||||
distance1 := int(math.Abs(float64(row-firstAntenna.Row)) + math.Abs(float64(col-firstAntenna.Col)))
|
||||
distance2 := int(math.Abs(float64(row-secondAntenna.Row)) + math.Abs(float64(col-secondAntenna.Col)))
|
||||
|
||||
rowDiff1 := row - firstAntenna.Row
|
||||
rowDiff2 := row - secondAntenna.Row
|
||||
colDiff1 := col - firstAntenna.Col
|
||||
colDiff2 := col - secondAntenna.Col
|
||||
|
||||
if rowDiff1*colDiff2 == rowDiff2*colDiff1 {
|
||||
if (distance1 == 2*distance2 || distance1*2 == distance2) && onlySpecial {
|
||||
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||
} else if !onlySpecial {
|
||||
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return len(uniqueAntinodes)
|
||||
}
|
||||
39
2024/gareth/day08/day08_test.go
Normal file
39
2024/gareth/day08/day08_test.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package day08
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............`)
|
||||
assert.Equal(t, 14, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............`)
|
||||
assert.Equal(t, 11387, r)
|
||||
}
|
||||
50
2024/gareth/day08/input.txt
Normal file
50
2024/gareth/day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
||||
........................E...j......W..........L...
|
||||
............................O........E.........L..
|
||||
..q......O...........l....................K.......
|
||||
............q...................HM......W.........
|
||||
................................1..H...........IW.
|
||||
....................5.............................
|
||||
..........k........M...wl............6............
|
||||
.....O.......w...k.....5.8..l......K.........o.6..
|
||||
.......k....w.........5.........R.....o........K..
|
||||
.....q..X..............j........E...I.........K...
|
||||
............O..........E........................H.
|
||||
................Mn.h2.w.p....................H....
|
||||
..................p.......a............j.....L....
|
||||
.....X...l.p.....................m.........W..6...
|
||||
..Xq................A..................R..m.......
|
||||
.........................i..........a..........R..
|
||||
...........u.....................a........I.....2.
|
||||
k..............A..n.........R.................o...
|
||||
................n.................Qo..............
|
||||
..........u.A.........h........2..................
|
||||
...5.......Y.....p...............iN...............
|
||||
1...x.....................i.......................
|
||||
........M..............2.....Qi...................
|
||||
...............................I..e...............
|
||||
......u......A...........m..........h.............
|
||||
.......1...........U.............Qm.......j.......
|
||||
.......X.......................................9..
|
||||
.....u........U.......Y...........................
|
||||
.............................h.e..................
|
||||
..................4....e......Q.....L....N........
|
||||
.1..................4.......................y8....
|
||||
.........Y................................8.N.....
|
||||
............P.0J...........3..........8y..........
|
||||
....V3P..........J................................
|
||||
............U..P...7x...........e.................
|
||||
....................J...............r...9.........
|
||||
.........0.V......Y...............................
|
||||
...............V.4................................
|
||||
..........V..........................n............
|
||||
..............v........7..........................
|
||||
...........U..........J.......7...................
|
||||
.....v........7..........................a........
|
||||
.......................................r..........
|
||||
...........0.......x................y.............
|
||||
............6..v.x.....................N..........
|
||||
...........P......................................
|
||||
........3.......................r......4..........
|
||||
..............3......................y............
|
||||
................................................9.
|
||||
.................................................9
|
||||
104
2024/gareth/day09/day09.go
Normal file
104
2024/gareth/day09/day09.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package day09
|
||||
|
||||
func Part1(input string) int {
|
||||
files, gaps, lengthOfFinalFile := parseInput(input)
|
||||
checksum := compactFiles(files, gaps, lengthOfFinalFile)
|
||||
return checksum
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
files, freeSpaces := parseInputPart2(input)
|
||||
checksum := calculateChecksum(files, freeSpaces)
|
||||
return checksum
|
||||
}
|
||||
|
||||
func parseInput(input string) ([]int, []int, int) {
|
||||
var files []int
|
||||
var gaps []int
|
||||
lengthOfFinalFile := 0
|
||||
for i, char := range input {
|
||||
if i%2 == 0 {
|
||||
files = append(files, int(char-'0'))
|
||||
lengthOfFinalFile += int(char - '0')
|
||||
} else {
|
||||
gaps = append(gaps, int(char-'0'))
|
||||
}
|
||||
}
|
||||
return files, gaps, lengthOfFinalFile
|
||||
}
|
||||
|
||||
func parseInputPart2(input string) ([][]int, [][]int) {
|
||||
files, freeSpaces, position := [][]int{}, [][]int{}, 0
|
||||
for index, char := range input {
|
||||
length := int(char - '0')
|
||||
if index%2 == 0 {
|
||||
files = append(files, generateRange(position, position+length))
|
||||
} else {
|
||||
freeSpaces = append(freeSpaces, generateRange(position, position+length))
|
||||
}
|
||||
position += length
|
||||
}
|
||||
return files, freeSpaces
|
||||
}
|
||||
|
||||
func compactFiles(files []int, gaps []int, lengthOfFinalFile int) int {
|
||||
fileIndex := len(files) - 1
|
||||
gapIndex := 0
|
||||
position := files[0]
|
||||
checksum := 0
|
||||
fileID := files[0]
|
||||
|
||||
for lengthOfFinalFile != position {
|
||||
// If there's a gap and a file to move then move the file
|
||||
if gaps[gapIndex] > 0 && files[fileIndex] > 0 {
|
||||
files[fileIndex]--
|
||||
gaps[gapIndex]--
|
||||
checksum += fileIndex * position
|
||||
position++
|
||||
}
|
||||
|
||||
// If this file is fully moved go to next file
|
||||
if files[fileIndex] == 0 {
|
||||
fileIndex--
|
||||
fileID++
|
||||
}
|
||||
|
||||
// Update gapIndex if this gap is filled
|
||||
if gaps[gapIndex] == 0 {
|
||||
gapIndex++
|
||||
for f := 0; f < files[gapIndex]; f++ {
|
||||
checksum += gapIndex * position
|
||||
position++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return checksum
|
||||
}
|
||||
|
||||
func generateRange(start, end int) []int {
|
||||
rangeList := make([]int, end-start)
|
||||
for i := range rangeList {
|
||||
rangeList[i] = start + i
|
||||
}
|
||||
return rangeList
|
||||
}
|
||||
|
||||
func calculateChecksum(files, freeSpaces [][]int) int {
|
||||
checksum := 0
|
||||
for fileIndex := len(files) - 1; fileIndex >= 0; fileIndex-- {
|
||||
for spaceIndex := 0; spaceIndex < len(freeSpaces); spaceIndex++ {
|
||||
if len(freeSpaces[spaceIndex]) >= len(files[fileIndex]) && files[fileIndex][0] > freeSpaces[spaceIndex][0] {
|
||||
files[fileIndex] = freeSpaces[spaceIndex][:len(files[fileIndex])]
|
||||
freeSpaces[spaceIndex] = freeSpaces[spaceIndex][len(files[fileIndex]):]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for fileID, file := range files {
|
||||
for _, block := range file {
|
||||
checksum += fileID * block
|
||||
}
|
||||
}
|
||||
return checksum
|
||||
}
|
||||
22
2024/gareth/day09/day09_test.go
Normal file
22
2024/gareth/day09/day09_test.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package day09
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`12345`)
|
||||
assert.Equal(t, 60, r)
|
||||
}
|
||||
|
||||
func TestPart1Long(t *testing.T) {
|
||||
r := Part1(`2333133121414131402`)
|
||||
assert.Equal(t, 1928, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`2333133121414131402`)
|
||||
assert.Equal(t, 2858, r)
|
||||
}
|
||||
1
2024/gareth/day09/input.txt
Normal file
1
2024/gareth/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
141
2024/gareth/day10/day10.go
Normal file
141
2024/gareth/day10/day10.go
Normal file
@@ -0,0 +1,141 @@
|
||||
package day10
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
var directions = [][2]int{
|
||||
{-1, 0},
|
||||
{1, 0},
|
||||
{0, -1},
|
||||
{0, 1},
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid := ParseInput(input)
|
||||
return CalculateTotalTrailheadScore(grid)
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
grid := ParseInput(input)
|
||||
return CalculateTotalTrailheadRating(grid)
|
||||
}
|
||||
|
||||
func ParseInput(input string) [][]int {
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
grid := make([][]int, len(lines))
|
||||
for i, line := range lines {
|
||||
grid[i] = make([]int, len(line))
|
||||
for j, char := range line {
|
||||
grid[i][j] = int(char - '0')
|
||||
}
|
||||
}
|
||||
return grid
|
||||
}
|
||||
|
||||
func IsValidPosition(x, y, rows, cols int) bool {
|
||||
return x >= 0 && x < rows && y >= 0 && y < cols
|
||||
}
|
||||
|
||||
func DFS(grid [][]int, x, y, prevHeight int, visited [][]bool, reached9 map[[2]int]bool) {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||
return
|
||||
}
|
||||
|
||||
if grid[x][y] == 9 {
|
||||
reached9[[2]int{x, y}] = true
|
||||
return
|
||||
}
|
||||
|
||||
visited[x][y] = true
|
||||
for _, dir := range directions {
|
||||
nx, ny := x+dir[0], y+dir[1]
|
||||
DFS(grid, nx, ny, grid[x][y], visited, reached9)
|
||||
}
|
||||
visited[x][y] = false
|
||||
}
|
||||
|
||||
func CalculateTrailheadScore(grid [][]int, x, y int) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
visited := make([][]bool, rows)
|
||||
for i := range visited {
|
||||
visited[i] = make([]bool, cols)
|
||||
}
|
||||
|
||||
reached9 := make(map[[2]int]bool)
|
||||
DFS(grid, x, y, -1, visited, reached9)
|
||||
return len(reached9)
|
||||
}
|
||||
|
||||
func DFSForRatings(grid [][]int, x, y, prevHeight int, visited [][]bool, trailCache map[[3]int]int) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||
return 0
|
||||
}
|
||||
|
||||
if grid[x][y] == 9 {
|
||||
return 1
|
||||
}
|
||||
|
||||
cacheKey := [3]int{x, y, grid[x][y]}
|
||||
if count, exists := trailCache[cacheKey]; exists {
|
||||
return count
|
||||
}
|
||||
|
||||
visited[x][y] = true
|
||||
totalTrails := 0
|
||||
for _, dir := range directions {
|
||||
nx, ny := x+dir[0], y+dir[1]
|
||||
totalTrails += DFSForRatings(grid, nx, ny, grid[x][y], visited, trailCache)
|
||||
}
|
||||
visited[x][y] = false
|
||||
|
||||
trailCache[cacheKey] = totalTrails
|
||||
return totalTrails
|
||||
}
|
||||
|
||||
func CalculateTrailheadRating(grid [][]int, x, y int) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
visited := make([][]bool, rows)
|
||||
for i := range visited {
|
||||
visited[i] = make([]bool, cols)
|
||||
}
|
||||
|
||||
trailCache := make(map[[3]int]int)
|
||||
return DFSForRatings(grid, x, y, -1, visited, trailCache)
|
||||
}
|
||||
|
||||
func CalculateTotalTrailheadScore(grid [][]int) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
totalScore := 0
|
||||
for i := 0; i < rows; i++ {
|
||||
for j := 0; j < cols; j++ {
|
||||
if grid[i][j] == 0 {
|
||||
score := CalculateTrailheadScore(grid, i, j)
|
||||
totalScore += score
|
||||
}
|
||||
}
|
||||
}
|
||||
return totalScore
|
||||
}
|
||||
|
||||
func CalculateTotalTrailheadRating(grid [][]int) int {
|
||||
rows := len(grid)
|
||||
cols := len(grid[0])
|
||||
totalRating := 0
|
||||
for i := 0; i < rows; i++ {
|
||||
for j := 0; j < cols; j++ {
|
||||
if grid[i][j] == 0 {
|
||||
rating := CalculateTrailheadRating(grid, i, j)
|
||||
totalRating += rating
|
||||
}
|
||||
}
|
||||
}
|
||||
return totalRating
|
||||
}
|
||||
31
2024/gareth/day10/day10_test.go
Normal file
31
2024/gareth/day10/day10_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package day10
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732`)
|
||||
assert.Equal(t, 36, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732`)
|
||||
assert.Equal(t, 81, r)
|
||||
}
|
||||
45
2024/gareth/day10/input.txt
Normal file
45
2024/gareth/day10/input.txt
Normal file
@@ -0,0 +1,45 @@
|
||||
987123434330121232101001234730123456781067632
|
||||
876076576521010345692340349823212347892398701
|
||||
945087689432105676787659856714503210987445610
|
||||
332196576587654989801456787609654502376530923
|
||||
211543210298923215432321098128778901430121894
|
||||
300692340147210106523543210039569876589836765
|
||||
456781678236103267015693016543410231276745650
|
||||
576890549345234178106782187612320140345654321
|
||||
985098432100125089235493498109876056034765012
|
||||
834127102345456978340362569018765487123876678
|
||||
123236221976347869651251078729034398101985589
|
||||
014545340889298958707867897430120987012834432
|
||||
105965456770107843216950956541231276543124501
|
||||
896872378761016930345441019876501345678023670
|
||||
787901069654325321210332398545432330589012981
|
||||
107821543213034321089206787638901421432103210
|
||||
215430694102123475670115896129876548901210349
|
||||
126989780210014984308924925014578037654321458
|
||||
037878921001235675217833210123669123109452367
|
||||
549865438901045102346542106548754321278501476
|
||||
678954987432696201256430087239689870347699985
|
||||
230143006501787349961021298101236787656788014
|
||||
123272112981010458872787034010345691875107623
|
||||
054387623472129867763698125676210010961234510
|
||||
565694502561036789854567012980387121250129878
|
||||
676783411051045672343218763901296030343278569
|
||||
989872123432345891050109654812345145467303450
|
||||
012763094321056700891760345765432256958912341
|
||||
103450185789763211709851236876301967843211032
|
||||
814321276656854345612345654954101878701208983
|
||||
923434434565956745678036783063210989870345674
|
||||
874532345410345832989123192178981876781456564
|
||||
265101654323234901808765013265432185692387565
|
||||
103216765432101267814554323476501094501893474
|
||||
232109856321011876923601098789678923432102985
|
||||
343898707896540945498712367765672310567891078
|
||||
456789010987231234321203456894581455454986569
|
||||
556776125670102343100157654503490166303890432
|
||||
543895434894321765212348983212321876212761201
|
||||
432104898765010894301054581200110955211654300
|
||||
301256567656987105498765690341034567300563212
|
||||
434567430547896234787654785652123498456767843
|
||||
321798121032345375696543098743096567877854952
|
||||
210899021121036789781232143456787656928923761
|
||||
326765430110145678710123232109876543210010890
|
||||
89
2024/gareth/day11/day11.go
Normal file
89
2024/gareth/day11/day11.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package day11
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
stones := ParseInput(input)
|
||||
return len(blinkTimes(stones, 25))
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
stones := ParseInput(input)
|
||||
return getNumStones(stones, 75)
|
||||
}
|
||||
|
||||
func ParseInput(input string) []int {
|
||||
strStones := strings.Split(strings.TrimSpace(input), " ")
|
||||
stones := make([]int, 0, len(strStones))
|
||||
for _, s := range strStones {
|
||||
num, _ := strconv.Atoi(s)
|
||||
stones = append(stones, num)
|
||||
}
|
||||
return stones
|
||||
}
|
||||
|
||||
// Part 1 initial thought of recursion
|
||||
func blinkTimes(stones []int, times int) []int {
|
||||
if times <= 0 {
|
||||
return stones
|
||||
}
|
||||
result := blink(stones)
|
||||
return blinkTimes(result, times-1)
|
||||
}
|
||||
|
||||
func blink(stones []int) []int {
|
||||
result := make([]int, 0)
|
||||
for _, stone := range stones {
|
||||
strStone := strconv.Itoa(stone)
|
||||
if stone == 0 {
|
||||
result = append(result, 1)
|
||||
} else if len(strStone)%2 == 0 {
|
||||
mid := len(strStone) / 2
|
||||
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||
result = append(result, firstHalf, secondHalf)
|
||||
} else {
|
||||
result = append(result, stone*2024)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// Part 2 with maps since blinkTimes(75) would set my computer on fire
|
||||
func getNumStones(s []int, times int) int {
|
||||
stoneMap := make(map[int]int)
|
||||
for _, stone := range s {
|
||||
stoneMap[stone] = stoneMap[stone] + 1
|
||||
}
|
||||
|
||||
for i := 0; i < times; i++ {
|
||||
stoneMap2 := make(map[int]int)
|
||||
for stone, count := range stoneMap {
|
||||
stones := make([]int, 0)
|
||||
strStone := strconv.Itoa(stone)
|
||||
if stone == 0 {
|
||||
stones = append(stones, 1)
|
||||
} else if len(strStone)%2 == 0 {
|
||||
mid := len(strStone) / 2
|
||||
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||
stones = append(stones, firstHalf, secondHalf)
|
||||
} else {
|
||||
stones = append(stones, stone*2024)
|
||||
}
|
||||
for _, newStone := range stones {
|
||||
stoneMap2[newStone] = stoneMap2[newStone] + count
|
||||
}
|
||||
}
|
||||
stoneMap = stoneMap2
|
||||
}
|
||||
|
||||
result := 0
|
||||
for _, count := range stoneMap {
|
||||
result += count
|
||||
}
|
||||
return result
|
||||
}
|
||||
12
2024/gareth/day11/day11_test.go
Normal file
12
2024/gareth/day11/day11_test.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package day11
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`125 17`)
|
||||
assert.Equal(t, 55312, r)
|
||||
}
|
||||
1
2024/gareth/day11/input.txt
Normal file
1
2024/gareth/day11/input.txt
Normal file
@@ -0,0 +1 @@
|
||||
965842 9159 3372473 311 0 6 86213 48
|
||||
76
2024/gareth/day13/day13.go
Normal file
76
2024/gareth/day13/day13.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package day13
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type ClawMachine struct {
|
||||
Ax, Ay int
|
||||
Bx, By int
|
||||
Px, Py int
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
clawMachines := parseInput(input)
|
||||
total := 0
|
||||
for _, c := range clawMachines {
|
||||
x, y := solveSimEquations(c.Ax, c.Bx, c.Px, c.Ay, c.By, c.Py)
|
||||
total += x*3 + y
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
clawMachines := parseInput(input)
|
||||
total := 0
|
||||
for _, c := range clawMachines {
|
||||
prizeX, prizeY := c.Px+10000000000000, c.Py+10000000000000
|
||||
det, x, y := c.Ax*c.By-c.Bx*c.Ay, prizeX*c.By-c.Bx*prizeY, c.Ax*prizeY-prizeX*c.Ay
|
||||
if det != 0 && x == (x/det)*det && y == (y/det)*det {
|
||||
total += (x/det)*3 + (y / det)
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func parseInput(input string) []ClawMachine {
|
||||
clawMachines := strings.Split(strings.TrimSpace(input), "\n\n")
|
||||
output := make([]ClawMachine, 0, len(clawMachines))
|
||||
for _, c := range clawMachines {
|
||||
var clawMachine ClawMachine
|
||||
line := strings.Split(strings.TrimSpace(c), "\n")
|
||||
|
||||
re := regexp.MustCompile(`X\+(\d+), Y\+(\d+)`)
|
||||
matches := re.FindStringSubmatch(line[0])
|
||||
clawMachine.Ax, _ = strconv.Atoi(matches[1])
|
||||
clawMachine.Ay, _ = strconv.Atoi(matches[2])
|
||||
|
||||
matches = re.FindStringSubmatch(line[1])
|
||||
clawMachine.Bx, _ = strconv.Atoi(matches[1])
|
||||
clawMachine.By, _ = strconv.Atoi(matches[2])
|
||||
|
||||
re = regexp.MustCompile(`X=(\d+), Y=(\d+)`)
|
||||
matches = re.FindStringSubmatch(line[2])
|
||||
clawMachine.Px, _ = strconv.Atoi(matches[1])
|
||||
clawMachine.Py, _ = strconv.Atoi(matches[2])
|
||||
|
||||
output = append(output, clawMachine)
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
func solveSimEquations(a1, b1, c1, a2, b2, c2 int) (int, int) {
|
||||
det := a1*b2 - a2*b1
|
||||
if det == 0 || (c1*b2-c2*b1)%det != 0 || (a1*c2-a2*c1)%det != 0 {
|
||||
return 0, 0
|
||||
}
|
||||
x := (c1*b2 - c2*b1) / det
|
||||
y := (a1*c2 - a2*c1) / det
|
||||
if x < 0 || x > 100 || y < 0 || y > 100 {
|
||||
return 0, 0
|
||||
}
|
||||
return x, y
|
||||
}
|
||||
45
2024/gareth/day13/day13_test.go
Normal file
45
2024/gareth/day13/day13_test.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package day13
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279`)
|
||||
assert.Equal(t, 480, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279`)
|
||||
assert.Equal(t, 0, r)
|
||||
}
|
||||
1279
2024/gareth/day13/input.txt
Normal file
1279
2024/gareth/day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
172
2024/gareth/day14/day14.go
Normal file
172
2024/gareth/day14/day14.go
Normal file
@@ -0,0 +1,172 @@
|
||||
package day14
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Robot struct {
|
||||
px, py int // position
|
||||
vx, vy int // velocity
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
// Parse the input
|
||||
lines := strings.Split(input, "\n")
|
||||
var robots []Robot
|
||||
for _, line := range lines {
|
||||
robot := ParseRobot(line)
|
||||
robots = append(robots, robot)
|
||||
}
|
||||
|
||||
// Define grid size
|
||||
gridWidth := 101
|
||||
gridHeight := 103
|
||||
|
||||
// Update robot positions for 100 seconds
|
||||
for i := 0; i < 100; i++ {
|
||||
for j := range robots {
|
||||
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||
}
|
||||
}
|
||||
|
||||
// Count the robots in each quadrant
|
||||
q1, q2, q3, q4 := CountRobotsInQuadrants(robots, gridWidth, gridHeight)
|
||||
fmt.Printf("Quadrant counts: Q1=%d, Q2=%d, Q3=%d, Q4=%d\n", q1, q2, q3, q4)
|
||||
|
||||
// Calculate the safety factor
|
||||
safetyFactor := CalculateSafetyFactor(q1, q2, q3, q4)
|
||||
fmt.Printf("Safety Factor: %d\n", safetyFactor)
|
||||
return safetyFactor
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
// Parse the input
|
||||
lines := strings.Split(input, "\n")
|
||||
var robots []Robot
|
||||
for _, line := range lines {
|
||||
robot := ParseRobot(line)
|
||||
robots = append(robots, robot)
|
||||
}
|
||||
|
||||
// Define grid size
|
||||
gridWidth := 101
|
||||
gridHeight := 103
|
||||
|
||||
// Update robot positions for 100 seconds
|
||||
for i := 0; i < 6285; i++ {
|
||||
for j := range robots {
|
||||
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||
}
|
||||
}
|
||||
|
||||
DisplayGrid(robots, gridWidth, gridHeight)
|
||||
return 2
|
||||
}
|
||||
|
||||
// ParseRobot takes a line of input and converts it to a Robot struct
|
||||
func ParseRobot(line string) Robot {
|
||||
parts := strings.Split(line, " ")
|
||||
posParts := strings.Split(parts[0][2:], ",") // Extract p=x,y and split
|
||||
velParts := strings.Split(parts[1][2:], ",") // Extract v=x,y and split
|
||||
|
||||
px, _ := strconv.Atoi(posParts[0])
|
||||
py, _ := strconv.Atoi(posParts[1])
|
||||
vx, _ := strconv.Atoi(velParts[0])
|
||||
vy, _ := strconv.Atoi(velParts[1])
|
||||
|
||||
return Robot{px, py, vx, vy}
|
||||
}
|
||||
|
||||
// UpdatePosition updates the position of a robot, considering the wrap-around
|
||||
func (r *Robot) UpdatePosition(gridWidth, gridHeight int) {
|
||||
r.px = (r.px + r.vx + gridWidth) % gridWidth
|
||||
r.py = (r.py + r.vy + gridHeight) % gridHeight
|
||||
}
|
||||
|
||||
// CountRobotsInQuadrants counts the number of robots in each of the four quadrants
|
||||
func CountRobotsInQuadrants(robots []Robot, width, height int) (int, int, int, int) {
|
||||
midX := width / 2
|
||||
midY := height / 2
|
||||
|
||||
q1, q2, q3, q4 := 0, 0, 0, 0
|
||||
|
||||
for _, r := range robots {
|
||||
if r.px == midX || r.py == midY {
|
||||
// Skip robots on the middle line
|
||||
continue
|
||||
}
|
||||
if r.px < midX && r.py < midY {
|
||||
q1++ // Top-left quadrant
|
||||
} else if r.px > midX && r.py < midY {
|
||||
q2++ // Top-right quadrant
|
||||
} else if r.px < midX && r.py > midY {
|
||||
q3++ // Bottom-left quadrant
|
||||
} else if r.px > midX && r.py > midY {
|
||||
q4++ // Bottom-right quadrant
|
||||
}
|
||||
}
|
||||
|
||||
return q1, q2, q3, q4
|
||||
}
|
||||
|
||||
// CalculateSafetyFactor multiplies the number of robots in each quadrant
|
||||
func CalculateSafetyFactor(q1, q2, q3, q4 int) int {
|
||||
return q1 * q2 * q3 * q4
|
||||
}
|
||||
|
||||
// DisplayGrid displays the current state of the grid
|
||||
func DisplayGrid(robots []Robot, width, height int) {
|
||||
grid := make([][]rune, height)
|
||||
for i := range grid {
|
||||
grid[i] = make([]rune, width)
|
||||
for j := range grid[i] {
|
||||
grid[i][j] = '.'
|
||||
}
|
||||
}
|
||||
for _, r := range robots {
|
||||
grid[r.py][r.px] = '#'
|
||||
}
|
||||
for _, row := range grid {
|
||||
fmt.Println(string(row))
|
||||
}
|
||||
}
|
||||
|
||||
// FindEasterEgg determines the fewest number of seconds that must elapse for the robots to display the Easter egg
|
||||
func FindEasterEgg(robots []Robot, width, height int) int {
|
||||
smallestArea := width * height
|
||||
bestTime := 0
|
||||
for t := 6285; t < 6286; t++ { // Large upper limit to search
|
||||
// Update robot positions
|
||||
for i := range robots {
|
||||
robots[i].UpdatePosition(width, height)
|
||||
}
|
||||
// Calculate the bounding box of all robot positions
|
||||
minX, minY := width, height
|
||||
maxX, maxY := 0, 0
|
||||
for _, r := range robots {
|
||||
if r.px < minX {
|
||||
minX = r.px
|
||||
}
|
||||
if r.px > maxX {
|
||||
maxX = r.px
|
||||
}
|
||||
if r.py < minY {
|
||||
minY = r.py
|
||||
}
|
||||
if r.py > maxY {
|
||||
maxY = r.py
|
||||
}
|
||||
}
|
||||
|
||||
area := (maxX - minX + 1) * (maxY - minY + 1)
|
||||
if area < smallestArea {
|
||||
smallestArea = area
|
||||
bestTime = t + 1
|
||||
fmt.Printf("Time: %d\n", bestTime)
|
||||
DisplayGrid(robots, width, height)
|
||||
}
|
||||
}
|
||||
return bestTime
|
||||
}
|
||||
23
2024/gareth/day14/day14_test.go
Normal file
23
2024/gareth/day14/day14_test.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package day14
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`p=0,4 v=3,-3
|
||||
p=6,3 v=-1,-3
|
||||
p=10,3 v=-1,2
|
||||
p=2,0 v=2,-1
|
||||
p=0,0 v=1,3
|
||||
p=3,0 v=-2,-2
|
||||
p=7,6 v=-1,-3
|
||||
p=3,0 v=-1,-2
|
||||
p=9,3 v=2,3
|
||||
p=7,3 v=-1,2
|
||||
p=2,4 v=2,-3
|
||||
p=9,5 v=-3,-3`)
|
||||
assert.Equal(t, 12, r)
|
||||
}
|
||||
500
2024/gareth/day14/input.txt
Normal file
500
2024/gareth/day14/input.txt
Normal file
@@ -0,0 +1,500 @@
|
||||
p=38,76 v=-61,88
|
||||
p=28,22 v=-43,-40
|
||||
p=76,78 v=-98,87
|
||||
p=39,56 v=10,96
|
||||
p=38,0 v=79,-15
|
||||
p=6,44 v=-88,53
|
||||
p=40,80 v=-83,31
|
||||
p=11,2 v=28,-31
|
||||
p=41,91 v=-86,-48
|
||||
p=8,55 v=-81,95
|
||||
p=77,19 v=3,-90
|
||||
p=94,73 v=-59,42
|
||||
p=51,53 v=35,48
|
||||
p=12,52 v=72,6
|
||||
p=62,61 v=96,47
|
||||
p=78,62 v=47,-57
|
||||
p=39,54 v=53,50
|
||||
p=1,43 v=-64,-46
|
||||
p=9,21 v=28,-36
|
||||
p=92,79 v=67,-47
|
||||
p=6,15 v=-58,-48
|
||||
p=54,67 v=99,-38
|
||||
p=96,99 v=-55,30
|
||||
p=90,44 v=-10,-8
|
||||
p=23,84 v=20,77
|
||||
p=5,84 v=28,88
|
||||
p=55,20 v=-31,-36
|
||||
p=84,43 v=-37,-41
|
||||
p=12,75 v=-38,30
|
||||
p=39,2 v=-12,-29
|
||||
p=74,14 v=56,-81
|
||||
p=63,53 v=22,-53
|
||||
p=51,28 v=9,-90
|
||||
p=53,72 v=48,-61
|
||||
p=33,42 v=-43,23
|
||||
p=75,18 v=-89,-37
|
||||
p=38,83 v=27,38
|
||||
p=69,31 v=61,80
|
||||
p=73,3 v=-45,74
|
||||
p=39,29 v=92,17
|
||||
p=78,45 v=-23,-47
|
||||
p=48,59 v=-57,38
|
||||
p=2,41 v=-71,-93
|
||||
p=30,13 v=36,-82
|
||||
p=37,57 v=25,13
|
||||
p=51,73 v=56,-98
|
||||
p=76,78 v=38,91
|
||||
p=56,49 v=22,55
|
||||
p=34,47 v=10,84
|
||||
p=83,93 v=81,-16
|
||||
p=14,70 v=71,-50
|
||||
p=97,74 v=-4,70
|
||||
p=33,8 v=93,-35
|
||||
p=39,70 v=-2,19
|
||||
p=94,63 v=20,44
|
||||
p=86,4 v=-33,19
|
||||
p=17,67 v=26,44
|
||||
p=39,2 v=-70,-25
|
||||
p=47,56 v=-79,-55
|
||||
p=5,98 v=86,-75
|
||||
p=53,21 v=79,-89
|
||||
p=53,85 v=61,73
|
||||
p=46,32 v=66,54
|
||||
p=30,75 v=49,-73
|
||||
p=44,81 v=-61,-69
|
||||
p=82,66 v=-72,-6
|
||||
p=89,76 v=-13,98
|
||||
p=57,87 v=30,36
|
||||
p=12,41 v=59,-40
|
||||
p=36,56 v=10,-61
|
||||
p=60,80 v=48,39
|
||||
p=50,75 v=-44,42
|
||||
p=66,56 v=-93,-1
|
||||
p=57,96 v=83,-79
|
||||
p=98,88 v=-15,-16
|
||||
p=0,63 v=59,44
|
||||
p=90,27 v=29,-40
|
||||
p=21,60 v=-86,2
|
||||
p=85,13 v=11,61
|
||||
p=92,77 v=24,-34
|
||||
p=16,24 v=80,4
|
||||
p=47,8 v=-79,-49
|
||||
p=1,28 v=-82,-48
|
||||
p=80,55 v=6,-72
|
||||
p=60,94 v=-67,-15
|
||||
p=83,90 v=-98,78
|
||||
p=3,75 v=46,-66
|
||||
p=93,40 v=15,11
|
||||
p=52,37 v=48,7
|
||||
p=23,4 v=-47,25
|
||||
p=46,43 v=57,-98
|
||||
p=23,12 v=-98,-36
|
||||
p=11,42 v=-83,50
|
||||
p=80,33 v=25,54
|
||||
p=59,95 v=-1,36
|
||||
p=55,67 v=-44,-60
|
||||
p=90,80 v=83,-39
|
||||
p=57,61 v=-1,96
|
||||
p=51,79 v=31,39
|
||||
p=28,89 v=85,35
|
||||
p=12,98 v=28,-80
|
||||
p=25,61 v=-95,-50
|
||||
p=77,84 v=-37,78
|
||||
p=50,80 v=66,89
|
||||
p=93,32 v=-15,-45
|
||||
p=30,4 v=-96,-29
|
||||
p=81,95 v=14,-66
|
||||
p=23,3 v=42,-16
|
||||
p=33,69 v=-96,-10
|
||||
p=28,23 v=-43,68
|
||||
p=77,25 v=-45,-41
|
||||
p=27,96 v=-69,-32
|
||||
p=41,15 v=-53,-35
|
||||
p=66,81 v=-22,5
|
||||
p=5,15 v=13,-95
|
||||
p=88,1 v=-59,-26
|
||||
p=48,41 v=16,-19
|
||||
p=88,75 v=33,46
|
||||
p=21,9 v=-64,-86
|
||||
p=36,4 v=-16,-95
|
||||
p=68,22 v=-5,65
|
||||
p=8,43 v=-34,46
|
||||
p=71,68 v=-49,-59
|
||||
p=37,92 v=-48,-18
|
||||
p=59,43 v=-21,-10
|
||||
p=69,31 v=30,58
|
||||
p=90,77 v=46,-74
|
||||
p=42,42 v=-76,20
|
||||
p=58,34 v=78,55
|
||||
p=18,10 v=33,2
|
||||
p=23,92 v=45,-69
|
||||
p=23,45 v=-32,27
|
||||
p=63,50 v=39,-96
|
||||
p=8,72 v=-34,85
|
||||
p=22,102 v=-69,26
|
||||
p=73,14 v=-45,-38
|
||||
p=65,54 v=-51,68
|
||||
p=99,29 v=-16,67
|
||||
p=29,60 v=15,-19
|
||||
p=85,76 v=-54,80
|
||||
p=21,23 v=-3,-47
|
||||
p=9,37 v=94,-44
|
||||
p=99,77 v=48,80
|
||||
p=48,47 v=18,56
|
||||
p=26,61 v=36,-57
|
||||
p=80,58 v=56,90
|
||||
p=37,6 v=53,-90
|
||||
p=47,15 v=53,60
|
||||
p=4,79 v=70,52
|
||||
p=35,8 v=31,12
|
||||
p=18,8 v=25,-30
|
||||
p=80,38 v=33,45
|
||||
p=23,26 v=-69,61
|
||||
p=10,35 v=-78,-96
|
||||
p=53,17 v=48,-34
|
||||
p=24,45 v=72,-2
|
||||
p=65,75 v=-1,-38
|
||||
p=5,72 v=-49,39
|
||||
p=63,87 v=-27,-16
|
||||
p=0,46 v=-34,73
|
||||
p=14,46 v=55,-15
|
||||
p=28,70 v=45,92
|
||||
p=29,30 v=89,10
|
||||
p=98,31 v=-46,-89
|
||||
p=1,85 v=-77,82
|
||||
p=30,79 v=-43,28
|
||||
p=29,70 v=-81,65
|
||||
p=51,97 v=13,-25
|
||||
p=76,19 v=-23,18
|
||||
p=36,83 v=-17,91
|
||||
p=52,34 v=-39,-98
|
||||
p=35,46 v=-43,55
|
||||
p=97,13 v=-99,-26
|
||||
p=40,26 v=27,13
|
||||
p=18,38 v=89,57
|
||||
p=45,57 v=-79,-52
|
||||
p=86,76 v=-54,-64
|
||||
p=12,38 v=28,55
|
||||
p=6,56 v=-86,97
|
||||
p=85,100 v=-41,-22
|
||||
p=4,34 v=28,-95
|
||||
p=89,33 v=-4,-73
|
||||
p=82,20 v=-33,-15
|
||||
p=98,5 v=31,43
|
||||
p=85,81 v=73,88
|
||||
p=13,42 v=-90,-49
|
||||
p=93,60 v=-91,-64
|
||||
p=56,7 v=-5,64
|
||||
p=9,5 v=45,76
|
||||
p=61,4 v=74,86
|
||||
p=23,53 v=-7,3
|
||||
p=89,21 v=-38,-74
|
||||
p=13,44 v=-86,10
|
||||
p=96,62 v=-11,96
|
||||
p=5,98 v=-22,3
|
||||
p=26,26 v=-73,-93
|
||||
p=52,95 v=-5,42
|
||||
p=62,50 v=-57,-7
|
||||
p=11,2 v=41,-77
|
||||
p=23,73 v=-2,-97
|
||||
p=34,77 v=-47,-71
|
||||
p=91,58 v=99,43
|
||||
p=41,74 v=-53,42
|
||||
p=75,102 v=55,-81
|
||||
p=89,95 v=30,8
|
||||
p=76,28 v=-80,12
|
||||
p=82,27 v=-43,77
|
||||
p=62,63 v=-97,21
|
||||
p=94,73 v=-58,14
|
||||
p=13,35 v=-47,-46
|
||||
p=56,0 v=61,25
|
||||
p=94,39 v=11,8
|
||||
p=96,53 v=77,-53
|
||||
p=23,78 v=-43,-7
|
||||
p=24,51 v=-74,-86
|
||||
p=77,33 v=60,8
|
||||
p=84,71 v=-76,19
|
||||
p=78,96 v=82,3
|
||||
p=61,92 v=-58,-30
|
||||
p=9,75 v=94,-34
|
||||
p=89,13 v=7,-26
|
||||
p=16,67 v=-25,96
|
||||
p=95,43 v=-25,-54
|
||||
p=39,62 v=18,-40
|
||||
p=41,36 v=17,-65
|
||||
p=2,42 v=86,-10
|
||||
p=29,54 v=55,-2
|
||||
p=51,74 v=-44,92
|
||||
p=75,40 v=-36,-96
|
||||
p=60,15 v=-93,-84
|
||||
p=44,33 v=44,8
|
||||
p=88,51 v=85,-94
|
||||
p=26,60 v=43,62
|
||||
p=94,22 v=-81,-98
|
||||
p=4,50 v=-94,-96
|
||||
p=87,47 v=-55,3
|
||||
p=15,80 v=33,-14
|
||||
p=4,48 v=-24,-48
|
||||
p=57,36 v=-18,-98
|
||||
p=87,12 v=76,63
|
||||
p=53,17 v=-91,-81
|
||||
p=17,96 v=53,6
|
||||
p=91,40 v=95,-46
|
||||
p=23,28 v=-55,55
|
||||
p=81,7 v=-54,16
|
||||
p=62,102 v=-97,-77
|
||||
p=42,31 v=80,-41
|
||||
p=99,53 v=-72,57
|
||||
p=17,29 v=98,58
|
||||
p=24,57 v=84,-48
|
||||
p=98,101 v=-33,-30
|
||||
p=77,82 v=-36,-25
|
||||
p=44,8 v=83,18
|
||||
p=27,35 v=-27,16
|
||||
p=95,58 v=-29,52
|
||||
p=87,40 v=60,-91
|
||||
p=66,1 v=17,24
|
||||
p=17,11 v=63,21
|
||||
p=67,77 v=-23,-11
|
||||
p=91,30 v=-59,64
|
||||
p=22,34 v=7,84
|
||||
p=55,90 v=48,29
|
||||
p=45,45 v=31,50
|
||||
p=12,34 v=65,-86
|
||||
p=40,48 v=18,-1
|
||||
p=39,42 v=75,11
|
||||
p=28,27 v=63,-49
|
||||
p=93,44 v=-81,3
|
||||
p=8,78 v=-51,-15
|
||||
p=6,37 v=-51,-42
|
||||
p=73,89 v=-45,23
|
||||
p=2,80 v=-23,50
|
||||
p=93,37 v=55,-44
|
||||
p=16,52 v=-54,35
|
||||
p=15,17 v=-33,74
|
||||
p=84,37 v=-6,-48
|
||||
p=13,47 v=50,-48
|
||||
p=88,34 v=-79,-39
|
||||
p=16,68 v=50,94
|
||||
p=20,78 v=-99,29
|
||||
p=100,20 v=77,64
|
||||
p=79,2 v=-91,30
|
||||
p=52,0 v=-95,-86
|
||||
p=4,84 v=79,35
|
||||
p=13,74 v=19,-66
|
||||
p=57,55 v=-9,-63
|
||||
p=21,30 v=19,-94
|
||||
p=50,37 v=-66,4
|
||||
p=9,56 v=94,95
|
||||
p=91,59 v=55,-65
|
||||
p=77,15 v=34,-33
|
||||
p=5,100 v=81,-26
|
||||
p=26,96 v=-34,83
|
||||
p=36,64 v=-44,94
|
||||
p=37,65 v=-70,51
|
||||
p=74,6 v=25,-93
|
||||
p=33,78 v=-17,-48
|
||||
p=0,33 v=-6,-39
|
||||
p=3,55 v=-11,96
|
||||
p=32,19 v=-8,-33
|
||||
p=60,53 v=-5,-55
|
||||
p=75,62 v=56,45
|
||||
p=74,71 v=12,-66
|
||||
p=50,74 v=-53,91
|
||||
p=24,90 v=-19,-57
|
||||
p=58,53 v=31,5
|
||||
p=13,95 v=-33,20
|
||||
p=30,98 v=41,-70
|
||||
p=54,78 v=71,-43
|
||||
p=78,73 v=26,53
|
||||
p=66,30 v=-49,60
|
||||
p=81,87 v=-24,-15
|
||||
p=28,27 v=-31,11
|
||||
p=75,18 v=-89,10
|
||||
p=76,82 v=-89,-66
|
||||
p=44,65 v=-17,98
|
||||
p=17,42 v=-7,-5
|
||||
p=75,92 v=-54,32
|
||||
p=95,10 v=-28,-76
|
||||
p=20,36 v=-22,-62
|
||||
p=100,0 v=11,21
|
||||
p=37,39 v=5,-46
|
||||
p=80,50 v=-63,7
|
||||
p=77,28 v=-98,2
|
||||
p=61,41 v=-1,-40
|
||||
p=88,78 v=95,-17
|
||||
p=83,1 v=47,-30
|
||||
p=47,67 v=-30,-9
|
||||
p=14,81 v=-38,82
|
||||
p=40,97 v=-31,76
|
||||
p=76,27 v=37,-70
|
||||
p=25,73 v=80,35
|
||||
p=88,84 v=-33,77
|
||||
p=60,71 v=83,35
|
||||
p=14,93 v=-3,-25
|
||||
p=40,45 v=-35,4
|
||||
p=34,35 v=15,19
|
||||
p=87,100 v=90,-66
|
||||
p=20,90 v=-42,-68
|
||||
p=90,44 v=50,-52
|
||||
p=43,77 v=31,89
|
||||
p=99,81 v=33,-12
|
||||
p=28,35 v=58,-37
|
||||
p=37,52 v=57,6
|
||||
p=48,65 v=-66,23
|
||||
p=63,21 v=39,-35
|
||||
p=91,77 v=-15,-70
|
||||
p=27,28 v=93,-94
|
||||
p=18,61 v=-99,38
|
||||
p=56,36 v=-98,81
|
||||
p=90,75 v=-72,-67
|
||||
p=86,21 v=-13,-46
|
||||
p=20,88 v=89,-74
|
||||
p=17,41 v=-82,-98
|
||||
p=28,65 v=45,-72
|
||||
p=85,15 v=35,41
|
||||
p=39,43 v=-2,-36
|
||||
p=93,72 v=-94,91
|
||||
p=90,73 v=-64,77
|
||||
p=83,43 v=-94,-99
|
||||
p=50,59 v=-49,51
|
||||
p=58,25 v=13,-36
|
||||
p=25,102 v=-44,-54
|
||||
p=100,86 v=16,-23
|
||||
p=45,42 v=21,-90
|
||||
p=9,29 v=-13,18
|
||||
p=24,41 v=1,-47
|
||||
p=69,33 v=-58,55
|
||||
p=80,52 v=52,-2
|
||||
p=82,77 v=82,-11
|
||||
p=86,78 v=-41,-69
|
||||
p=89,58 v=69,-13
|
||||
p=12,91 v=-55,-65
|
||||
p=69,40 v=-93,59
|
||||
p=8,26 v=2,19
|
||||
p=21,47 v=19,3
|
||||
p=38,20 v=25,-83
|
||||
p=20,99 v=54,31
|
||||
p=20,74 v=-14,-30
|
||||
p=51,83 v=-40,24
|
||||
p=61,30 v=-27,-94
|
||||
p=84,19 v=-28,69
|
||||
p=28,33 v=-65,3
|
||||
p=58,91 v=-93,-18
|
||||
p=33,78 v=22,92
|
||||
p=86,53 v=63,-43
|
||||
p=53,79 v=-26,-42
|
||||
p=83,16 v=94,56
|
||||
p=21,0 v=-64,-35
|
||||
p=48,80 v=-97,79
|
||||
p=62,18 v=29,71
|
||||
p=17,13 v=-69,-36
|
||||
p=1,93 v=19,75
|
||||
p=7,75 v=41,93
|
||||
p=65,61 v=-45,65
|
||||
p=56,71 v=92,-63
|
||||
p=71,102 v=-53,-21
|
||||
p=64,79 v=96,49
|
||||
p=40,13 v=-74,-84
|
||||
p=28,71 v=93,91
|
||||
p=43,68 v=-39,-6
|
||||
p=10,40 v=63,55
|
||||
p=73,0 v=-97,-82
|
||||
p=26,38 v=85,-27
|
||||
p=27,94 v=36,-79
|
||||
p=1,99 v=-82,-30
|
||||
p=66,96 v=-23,31
|
||||
p=78,21 v=96,16
|
||||
p=10,93 v=-51,-76
|
||||
p=76,87 v=78,80
|
||||
p=13,20 v=-38,68
|
||||
p=31,42 v=-43,5
|
||||
p=56,10 v=-53,-33
|
||||
p=76,61 v=34,-4
|
||||
p=73,2 v=-36,74
|
||||
p=93,83 v=15,-19
|
||||
p=76,50 v=20,-51
|
||||
p=27,53 v=36,-51
|
||||
p=93,97 v=50,72
|
||||
p=59,22 v=87,21
|
||||
p=95,22 v=-29,66
|
||||
p=56,35 v=79,10
|
||||
p=60,38 v=17,-94
|
||||
p=67,41 v=-5,6
|
||||
p=97,71 v=-73,35
|
||||
p=26,10 v=-73,74
|
||||
p=74,71 v=5,64
|
||||
p=36,91 v=84,-17
|
||||
p=38,91 v=67,33
|
||||
p=19,64 v=41,-9
|
||||
p=89,15 v=-59,66
|
||||
p=5,94 v=94,-27
|
||||
p=92,21 v=7,-87
|
||||
p=87,64 v=-28,-5
|
||||
p=22,6 v=-95,25
|
||||
p=59,42 v=-51,-7
|
||||
p=50,95 v=88,29
|
||||
p=59,91 v=73,-21
|
||||
p=52,42 v=-75,56
|
||||
p=10,39 v=-30,7
|
||||
p=88,79 v=29,-62
|
||||
p=31,89 v=-21,-82
|
||||
p=43,60 v=4,52
|
||||
p=2,76 v=-68,-15
|
||||
p=13,71 v=-38,97
|
||||
p=93,38 v=1,-95
|
||||
p=53,99 v=10,16
|
||||
p=94,72 v=-98,30
|
||||
p=1,3 v=37,-82
|
||||
p=68,78 v=55,18
|
||||
p=1,78 v=42,-7
|
||||
p=80,84 v=52,-26
|
||||
p=75,46 v=-87,-20
|
||||
p=71,27 v=95,-39
|
||||
p=90,18 v=73,11
|
||||
p=99,3 v=62,52
|
||||
p=39,88 v=-80,-93
|
||||
p=85,32 v=69,-40
|
||||
p=72,23 v=-28,-75
|
||||
p=22,59 v=98,-7
|
||||
p=69,76 v=12,93
|
||||
p=56,59 v=30,50
|
||||
p=80,92 v=-49,-80
|
||||
p=4,40 v=-77,-50
|
||||
p=90,60 v=40,-28
|
||||
p=6,79 v=9,56
|
||||
p=63,47 v=57,-59
|
||||
p=33,62 v=22,37
|
||||
p=74,27 v=78,70
|
||||
p=26,101 v=-43,-49
|
||||
p=1,24 v=-29,-38
|
||||
p=73,90 v=56,79
|
||||
p=5,90 v=-20,-75
|
||||
p=16,35 v=94,8
|
||||
p=96,93 v=4,58
|
||||
p=61,43 v=4,4
|
||||
p=13,68 v=76,94
|
||||
p=5,29 v=86,-95
|
||||
p=32,81 v=39,-85
|
||||
p=94,42 v=-37,55
|
||||
p=80,20 v=60,22
|
||||
p=43,94 v=57,-19
|
||||
p=93,4 v=51,-26
|
||||
p=12,4 v=62,-58
|
||||
p=87,74 v=-98,-64
|
||||
p=81,41 v=-26,69
|
||||
p=30,54 v=-30,-13
|
||||
p=73,4 v=21,-30
|
||||
p=68,35 v=-49,-44
|
||||
p=47,2 v=19,-70
|
||||
p=92,100 v=33,79
|
||||
p=81,11 v=73,-83
|
||||
p=46,75 v=-62,-69
|
||||
p=48,56 v=-13,-56
|
||||
p=7,84 v=15,30
|
||||
p=92,10 v=28,69
|
||||
p=15,31 v=-87,61
|
||||
p=95,0 v=33,79
|
||||
p=3,61 v=-37,-50
|
||||
p=73,95 v=96,20
|
||||
156
2024/gareth/day18/day18.go
Normal file
156
2024/gareth/day18/day18.go
Normal file
@@ -0,0 +1,156 @@
|
||||
package day18
|
||||
|
||||
import (
|
||||
"container/heap"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Point struct {
|
||||
x, y int
|
||||
}
|
||||
|
||||
// Item represents a node in the priority queue.
|
||||
type Item struct {
|
||||
point Point
|
||||
distance int
|
||||
index int
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid := parseInput(input, 1024)
|
||||
_, distance := dijkstra(grid)
|
||||
return distance
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
numLines := len(lines)
|
||||
for i := 1; i <= numLines; i++ {
|
||||
grid := parseInput(input, i)
|
||||
_, distance := dijkstra(grid)
|
||||
if distance == -1 {
|
||||
println(lines[i-1])
|
||||
return 2
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func parseInput(input string, upToLine int) [][]rune {
|
||||
grid := make([][]rune, 71)
|
||||
for i := range grid {
|
||||
grid[i] = make([]rune, 71)
|
||||
for j := range grid[i] {
|
||||
grid[i][j] = '.'
|
||||
}
|
||||
}
|
||||
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
|
||||
for index, line := range lines {
|
||||
if index == upToLine {
|
||||
break
|
||||
}
|
||||
cords := strings.Split(strings.TrimSpace(line), ",")
|
||||
x, _ := strconv.Atoi(cords[0])
|
||||
y, _ := strconv.Atoi(cords[1])
|
||||
grid[x][y] = '#'
|
||||
}
|
||||
return grid
|
||||
}
|
||||
|
||||
// PriorityQueue implements a priority queue for Dijkstra's algorithm.
|
||||
type PriorityQueue []*Item
|
||||
|
||||
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||
func (pq PriorityQueue) Less(i, j int) bool {
|
||||
return pq[i].distance < pq[j].distance
|
||||
}
|
||||
func (pq PriorityQueue) Swap(i, j int) {
|
||||
pq[i], pq[j] = pq[j], pq[i]
|
||||
pq[i].index = i
|
||||
pq[j].index = j
|
||||
}
|
||||
|
||||
func (pq *PriorityQueue) Push(x interface{}) {
|
||||
n := len(*pq)
|
||||
item := x.(*Item)
|
||||
item.index = n
|
||||
*pq = append(*pq, item)
|
||||
}
|
||||
|
||||
func (pq *PriorityQueue) Pop() interface{} {
|
||||
old := *pq
|
||||
n := len(old)
|
||||
item := old[n-1]
|
||||
item.index = -1
|
||||
*pq = old[0 : n-1]
|
||||
return item
|
||||
}
|
||||
|
||||
func isValid(grid [][]rune, x, y int) bool {
|
||||
return x >= 0 && x < len(grid) && y >= 0 && y < len(grid[0]) && grid[x][y] == '.'
|
||||
}
|
||||
|
||||
func dijkstra(grid [][]rune) ([][]rune, int) {
|
||||
directions := []Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
|
||||
rows, cols := len(grid), len(grid[0])
|
||||
|
||||
// Validate start and end points
|
||||
if grid[0][0] != '.' || grid[rows-1][cols-1] != '.' {
|
||||
return grid, -1 // No path if start or end is not valid
|
||||
}
|
||||
|
||||
dist := make([][]int, rows)
|
||||
for i := range dist {
|
||||
dist[i] = make([]int, cols)
|
||||
for j := range dist[i] {
|
||||
dist[i][j] = 1 << 30
|
||||
}
|
||||
}
|
||||
|
||||
pq := &PriorityQueue{}
|
||||
heap.Init(pq)
|
||||
heap.Push(pq, &Item{point: Point{0, 0}, distance: 0})
|
||||
dist[0][0] = 0
|
||||
|
||||
path := make([][]Point, rows)
|
||||
for i := range path {
|
||||
path[i] = make([]Point, cols)
|
||||
}
|
||||
|
||||
for pq.Len() > 0 {
|
||||
item := heap.Pop(pq).(*Item)
|
||||
x, y := item.point.x, item.point.y
|
||||
if x == rows-1 && y == cols-1 {
|
||||
break
|
||||
}
|
||||
for _, dir := range directions {
|
||||
nx, ny := x+dir.x, y+dir.y
|
||||
if isValid(grid, nx, ny) {
|
||||
newDist := dist[x][y] + 1
|
||||
if newDist < dist[nx][ny] {
|
||||
dist[nx][ny] = newDist
|
||||
heap.Push(pq, &Item{point: Point{nx, ny}, distance: newDist})
|
||||
path[nx][ny] = Point{x, y}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if no path exists
|
||||
if dist[rows-1][cols-1] == 1<<30 {
|
||||
return grid, -1 // No path found
|
||||
}
|
||||
|
||||
// Reconstruct the path
|
||||
x, y := rows-1, cols-1
|
||||
for x != 0 || y != 0 {
|
||||
grid[x][y] = 'O'
|
||||
x, y = path[x][y].x, path[x][y].y
|
||||
}
|
||||
grid[0][0] = 'O'
|
||||
|
||||
return grid, dist[rows-1][cols-1]
|
||||
}
|
||||
65
2024/gareth/day18/day18_test.go
Normal file
65
2024/gareth/day18/day18_test.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package day18
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`5,4
|
||||
4,2
|
||||
4,5
|
||||
3,0
|
||||
2,1
|
||||
6,3
|
||||
2,4
|
||||
1,5
|
||||
0,6
|
||||
3,3
|
||||
2,6
|
||||
5,1
|
||||
1,2
|
||||
5,5
|
||||
2,5
|
||||
6,5
|
||||
1,4
|
||||
0,4
|
||||
6,4
|
||||
1,1
|
||||
6,1
|
||||
1,0
|
||||
0,5
|
||||
1,6
|
||||
2,0`)
|
||||
assert.Equal(t, 22, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`5,4
|
||||
4,2
|
||||
4,5
|
||||
3,0
|
||||
2,1
|
||||
6,3
|
||||
2,4
|
||||
1,5
|
||||
0,6
|
||||
3,3
|
||||
2,6
|
||||
5,1
|
||||
1,2
|
||||
5,5
|
||||
2,5
|
||||
6,5
|
||||
1,4
|
||||
0,4
|
||||
6,4
|
||||
1,1
|
||||
6,1
|
||||
1,0
|
||||
0,5
|
||||
1,6
|
||||
2,0`)
|
||||
assert.Equal(t, 0, r)
|
||||
}
|
||||
3450
2024/gareth/day18/input.txt
Normal file
3450
2024/gareth/day18/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
90
2024/gareth/day19/day19.go
Normal file
90
2024/gareth/day19/day19.go
Normal file
@@ -0,0 +1,90 @@
|
||||
package day19
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
towelPatterns, designs := parseInput(input)
|
||||
result := countPossibleDesigns(towelPatterns, designs)
|
||||
return result
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
towelPatterns, designs := parseInput(input)
|
||||
result := totalArrangements(towelPatterns, designs)
|
||||
return result
|
||||
}
|
||||
|
||||
func parseInput(input string) ([]string, []string) {
|
||||
parts := strings.SplitN(input, "\n\n", 2)
|
||||
towels := strings.Split(strings.ReplaceAll(parts[0], " ", ""), ",")
|
||||
patterns := strings.Split(strings.TrimSpace(parts[1]), "\n")
|
||||
return towels, patterns
|
||||
}
|
||||
|
||||
func countPossibleDesigns(towelPatterns []string, designs []string) int {
|
||||
memo := make(map[string]bool)
|
||||
count := 0
|
||||
|
||||
for _, design := range designs {
|
||||
if canConstruct(design, towelPatterns, memo) {
|
||||
count++
|
||||
}
|
||||
}
|
||||
|
||||
return count
|
||||
}
|
||||
|
||||
func canConstruct(design string, patterns []string, memo map[string]bool) bool {
|
||||
if design == "" {
|
||||
return true
|
||||
}
|
||||
if val, found := memo[design]; found {
|
||||
return val
|
||||
}
|
||||
|
||||
for _, pattern := range patterns {
|
||||
if strings.HasPrefix(design, pattern) {
|
||||
remaining := design[len(pattern):]
|
||||
if canConstruct(remaining, patterns, memo) {
|
||||
memo[design] = true
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
memo[design] = false
|
||||
return false
|
||||
}
|
||||
|
||||
func totalArrangements(towelPatterns []string, designs []string) int {
|
||||
memo := make(map[string]int)
|
||||
total := 0
|
||||
|
||||
for _, design := range designs {
|
||||
total += countWays(design, towelPatterns, memo)
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func countWays(design string, patterns []string, memo map[string]int) int {
|
||||
if design == "" {
|
||||
return 1
|
||||
}
|
||||
if val, found := memo[design]; found {
|
||||
return val
|
||||
}
|
||||
|
||||
totalWays := 0
|
||||
for _, pattern := range patterns {
|
||||
if strings.HasPrefix(design, pattern) {
|
||||
remaining := design[len(pattern):]
|
||||
totalWays += countWays(remaining, patterns, memo)
|
||||
}
|
||||
}
|
||||
|
||||
memo[design] = totalWays
|
||||
return totalWays
|
||||
}
|
||||
35
2024/gareth/day19/day19_test.go
Normal file
35
2024/gareth/day19/day19_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package day19
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`r, wr, b, g, bwu, rb, gb, br
|
||||
|
||||
brwrr
|
||||
bggr
|
||||
gbbr
|
||||
rrbgbr
|
||||
ubwu
|
||||
bwurrg
|
||||
brgr
|
||||
bbrgwb`)
|
||||
assert.Equal(t, 6, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`r, wr, b, g, bwu, rb, gb, br
|
||||
|
||||
brwrr
|
||||
bggr
|
||||
gbbr
|
||||
rrbgbr
|
||||
ubwu
|
||||
bwurrg
|
||||
brgr
|
||||
bbrgwb`)
|
||||
assert.Equal(t, 16, r)
|
||||
}
|
||||
402
2024/gareth/day19/input.txt
Normal file
402
2024/gareth/day19/input.txt
Normal file
@@ -0,0 +1,402 @@
|
||||
rrgbg, rgguubg, rbru, rb, rrrw, wbu, gbgb, uururg, ubru, rugb, bbru, b, rggurg, wgru, bgrwb, rrgubg, ubrrbg, wgurru, rrrrw, rbrwu, wubwb, wrbbr, bgbu, brrww, brg, gbwu, wrubuur, gur, grbr, gruwrrbg, bgwr, wgugbgb, rwbru, wuwr, rrg, ruwg, rgwgr, ubu, wbr, bwg, gbu, bgrwrb, wwrw, bb, gr, rug, grr, ubwb, rbruwbu, guggug, ugu, rwbuu, bbur, wbrww, wubw, br, gruu, gwr, wrrwwu, wug, bgu, bgb, wugb, grb, rbbg, grgbwgb, rwu, bwrbb, uwrbbru, bbu, wrg, rwg, ggbgbg, wbwru, wrgrw, bburr, bgr, rgbg, bwwwugrb, uwu, rwuwrg, gguburu, uwubwu, wb, wgguug, ugrbw, rbgu, rwwu, ggbbgb, gw, wgg, rrw, uurg, uubg, bgurgb, uwgbr, wbrwu, rrbb, rww, bwgb, uugru, ggrbub, wubgw, rwwugr, uuwur, burbrg, bbr, ggb, wgr, gwbgw, rrbu, wuwwrwb, rbbr, uubw, buuu, ubbwggu, brr, urguww, uggwwgw, ugw, ug, rub, grrrwu, wurburgg, wwww, ruu, wrb, rrur, urggr, bwbwwwrg, wwbu, bbg, uwb, ggugu, gbbr, rbrgw, bg, bbuu, uwrgrg, ggbwrgw, wwgwugr, wgbwuwb, gbrwg, bbw, wwrgu, rgrwrbwb, wwwg, gugbgbg, bwrwub, rw, gbb, ggw, rrb, urrbbwb, urbu, grg, rbugggb, bruwg, uubgwgw, bw, uubgu, rru, rwww, gu, wrbrg, guu, wgu, ruuru, wubrrg, brugrg, uuggb, wrurg, rgb, rbu, urg, buw, grwbg, gwuw, grbbg, wuwu, gbgbbw, uugrwrww, wbguub, grrgbug, u, uug, uwr, wrwb, gbg, bru, wwg, bbwur, bbbbbbbw, bugbb, rwurrgr, wwb, ugbbw, bug, grgg, bgwgrrb, uggu, rurguru, wwr, rbw, ubwwgw, wrrw, rrbg, g, rgrbub, gruggw, bur, ubgb, bgg, uwur, ur, bbbwb, gwbu, wuww, uruuuubb, wbru, ugggg, gbuu, rgg, wwwug, gbrwgg, guwgr, urw, wbur, bu, rur, rrubr, ugb, ubrgrb, rbbgg, rbwrg, rggw, rguug, wwu, uur, wrrguggu, brbb, bwwwbr, guw, gugw, wgubwu, rrr, ub, ru, brrbbruw, bwwgrrbb, rubgu, uggwwg, wbb, rwr, r, ruuu, wbggg, wwwu, grbrb, rrrrr, ruwb, wuuw, rbbb, ugg, wbg, rguwr, wbw, wbuwg, ubbgrbb, urugu, rbubw, wrgwuuwu, grw, ubbbu, bwurb, rwuu, rgbbwur, urbuu, uww, wuw, bwurgu, wur, wuwwrbur, wwuu, wbgw, grbbbw, wuub, urb, wuuguuwg, wg, gwrgr, gbug, gbrbw, rwgg, brbbu, bwww, wrbbbu, wwgbggb, burug, gww, ubgrrb, bgw, rgbb, brb, wbuu, brw, ggrbrbwg, uwruw, wrgurrbb, guwrgu, rr, ugggrbr, bgrgg, urgbrbrb, wrw, wwubggu, ugurwg, grrg, bwrb, rrgwuuw, rrru, wurg, bgurwu, rgurbb, uuub, uuwb, rrrg, wrgrrrww, uwg, bgbguu, wrgwb, wwwru, rg, rrurwur, urrbb, bww, rrwwbbb, ubr, wgrbu, gru, ubg, gb, ggr, gbwbwru, uuw, rbb, gugwrg, gwb, bbb, rgrggw, uw, wggbbg, rwgubgb, gwbw, brrr, gugbwu, rwrr, uuuwbb, ugrrr, rgu, wubrwr, wrr, bwb, bwbgurb, rrrub, wub, rwgrug, rurb, gwrgrbr, rbrwbb, wwrgbg, urr, bwu, bwgu, rbuuw, bbub, wbbwubu, ggg, wbwwgwb, buwbg, wwwuru, rbg, gubugg, gbwb, www, rbr, ubur, grbbw, wgw, gbw, wgrw, rguuuu, rwb, gbrw, bbbb, gururbb, rbggwu, bub, bgbr, gurb, rrbgrb, rurwb, ugr, wgwrg, ruw, bgrr, gwu, gbr, uwugwru, wru, wr, ugbruw, grbubb, gwg, gwggurg, gugbr, ugubbgb, uwrw, uru, bwr, rgr, rbgrwg, buuw, ugbur, urgub, wurrrgww, rgguuwru, burr, rgw, rbruw, rwbwbbr, bwguw, uub, wgb, rgur, ubb, urwg, rwgww, wgub, rwwrgu, gg, rgug, gub, bggr, uuu, uu, rbug
|
||||
|
||||
bubrbbwggggbuuwbbrwwbbgbwrruugwbwgbwugbugrgu
|
||||
wugwgwggbgubuuwugugrugwbrrwrbwwguburbbbggw
|
||||
wbbrrwwbgwbgrrbwuuwrbbrwuwburgbwgwwuruwgbggubwug
|
||||
ubrwbrbrggrwgbwbwwuwwguurbubwrbgwwrubbrwuwururwrr
|
||||
gggrwbgwbwuwrubrguwggruubrggwgbrbguwrbrgwuurbwggrggrwwwrb
|
||||
wuurugububruuwuggwuuwgbwwbrbwgrrrubwbuuwu
|
||||
grrrwrwgwuwrburruuwwubgubwwwrrrwbwwbggrbrgr
|
||||
gugrrubugrgrwgggggrbrbrwgguurrwurgrbuggrrbbwgwwwbuu
|
||||
wubuwgwuwrrubbwuwwrburrwbrrubgurbggbbubrwrguwururgww
|
||||
ubbrgurrbgbrbwguggugwrrrurwwwugbgrwwbuwrbggrgwwrgwbrwwuugb
|
||||
bgwbwwwrrgugwwwugruwrbgrbrwbwbrwurbgruwgrggwruururb
|
||||
guwurburwrguurwbggrrwwugurguwbubbrggrggrubrbbbrwwbgw
|
||||
wgwuurwrgubguugbbgrrwbwgrwbwrwgbwrwburggrgbbuuw
|
||||
grbgrruuwrgwwuburwggbubbbgwwrgrbubggwrwbuurwwbuubuwrgwb
|
||||
bbwuubwuuwwubrwrwgbbrgwwurwbbwwburwuwwwubwrubguubggruwbbg
|
||||
rrugrwurbugrrbggburwurbbgbuugwwrgbwrbrwbgbgrbwbuuww
|
||||
gubwuubuwrrwgbuwbwguubuwwbwwrrwgbwbuwgguguwuwbwu
|
||||
rrbbubrrrwubrrwwbrrbwrbwugbrbrggwbgrwgugwuugg
|
||||
uurwrgruuwbwuubbrwubrwuuwwgubwgrwbbwgbwwwrbgugrbwururgurb
|
||||
rbwbbrguggubguurrrrburuwrrubgbgrwrbugrrrgruburwb
|
||||
grggbggwrubwwwwgrurwgbwuubguwrrrbgubruguub
|
||||
rrbgbggwbwbrbrrwwgbbggrruwgggurgbrbrwubwuurrbbbwgrbrgrurr
|
||||
gububbuuguwgbgrwgwgruburwrgwgbbrbrruururrrubrgggwwrbgb
|
||||
ruurrgggbwbrggwggrurgrwgwbgburwwuwgubggubru
|
||||
rbrrwgrgrrwrbwbrbggbwrwwuwrbwuwuuwbgbrwrgrwwgbuugbugg
|
||||
wwbwrrbrrruuwrrwgggruwbubrrwrwuwwurwurbrbrrrw
|
||||
wbguwwwwwguuuwuubrwgrgwguugrbrruwwrwgugbbb
|
||||
rrggwbububgbgbguggwwgurbgbwuwwrwrgwuuwruggu
|
||||
rbguubrrbrgwwgwbgrwrbrggwuwguuuwbwbwwbuwgr
|
||||
wgbrrguuurgggrwgwgbrbguugrururubruugrrrrgbrgugbg
|
||||
bgurwgugurwwbuugwurrgurwwrgwgubgrrgururubguuuwugbg
|
||||
rwbbuwuwbgwbbwurbubwwugbgrbugrbuurbwwbrrwruwrrrwww
|
||||
rbrburwwbwugrggwrrrruwwgbrgurbwwrrburbbggugbwbu
|
||||
burgwubggburuuguuwrwbbgbuguguwwburububwrrgw
|
||||
gggubgbgbwgrggrbrbrgguruurwbrrwubbrbruwgwbu
|
||||
wggruwwgbwgguwgbgbggrbggbbbwbwwwrgrwwggwrgguuwwgwubgru
|
||||
bbrwwruugwwbbbwububuuwruburbwbbgrwbburrgbbrub
|
||||
gwggggwgguuburrgrgugrwgwrbbggggurgugugrgrgwwbr
|
||||
gggbbugwgbwgwugrrgbwrrwurrgugburrggrruugurbrugrbbbg
|
||||
gbwrwggbuggurrgubuguubrbgwbrubgwgrbrwubbgrr
|
||||
bwuwgurrrgwwgguubggwwuurbbrbbwgwggwuwgbbwrwrburgr
|
||||
wgrwwubbbwbbrggrgugwggbubwwburubwwuwgbbubbrrrrguubguwbuuu
|
||||
rguuurgbrbrbuubgbuuggrwrwgrwugwrwgbwbbwbbgg
|
||||
uugbgwguuggwgwrrggggwrbrgbguuguwrbrgwgbwwuubgugwwug
|
||||
rbuuwwwrrrurgrgbrbbbrrbbwwwgwgwuwgbwggrbbwbruwwwwbg
|
||||
wwgwuurrurrbbgwuwwbgrbbrbruugwwgugbrbrgguuwrugwuguurbgwrru
|
||||
wrgwrrbrgugrrwguuguwburwuguuggguwwgbguwrbrbgubrg
|
||||
wbrugwbubuggrruggbruwrgrwgugwgbwugugbwguwwuubbrwwubggw
|
||||
grbgrrbrwggurbbrwugrwbbrurwrwbruuggwrggrrgrgwwbuwbgurb
|
||||
gwwurrbwrgrgurwuugwbwrgrrrwwwrwguwbrbrrurwbwbuggrwb
|
||||
wubguubgbbwuwbwgwwrrrgbuggwbwwwugrbbgrwubbrgurbuwwrgbur
|
||||
uurgwruubgrbgubbwrubbggrububgrwwrubwwbrgbbu
|
||||
uruuwrrbwbbugbbbrwguwbwuguurbwrurugwuwwguwbgb
|
||||
wurbgrggbggbwwgwwbbgbbrurrrwggrwwrbrbrwrbg
|
||||
ggwwrrbbwgubrgrgrgwuububrbrggbwwbubgbbgwubrgwrbururu
|
||||
grrgubuwgwuwuururwwrbgwrgrurrbbrwbgruggrbggbwubrb
|
||||
grbbrwbrgwgrgubuwbuwbrwuwugrbwuwwguwrbwbwwbuurgbwgw
|
||||
uuguwrwggruurrggurrbgurbwgggugbgrrguugggwurgrrgubugbugugg
|
||||
wrwugwwuwwbrubwwuruuwuwrugugbwwgugrrbuuguwggbrguuugwgwbw
|
||||
uuggwbgurgurbgruruwwrrgubbuwwruruwrurbwugguwbwbgrgg
|
||||
urwbggurwbwguurugbrbwbrbgwrgrbbrubrubburuwrburww
|
||||
wbbrbwwwwrbruubggwrurgugbgbbuwgrrrrwugbwwwr
|
||||
ubugrwubbgbrrrrgguugurgbubwgruuwrrgrbguuuw
|
||||
rrruwrgwrggwburgugwbwwwbggubuwbwuuurrggwwbwrgwgwggbguubw
|
||||
rgrgbrguruguwrggbrgruwrrbgbbbwugbrbgrbrrrggrubwuubwwbguw
|
||||
rbggwgugrbwbrbwurbrugrwbbbwuuuwrwgbbbrwbuwgbwrgggurbwug
|
||||
rgbuuwurbrwwuwbrugbggwbgbrrwguguwbubrubwguubbubgrgrwu
|
||||
gwwwgbrguruuwggwugguuwwrbwgbgwuwuuwrgruguwrbugurrwruw
|
||||
ubbgwurbrwrwggwubggugrgugwurwwbbbrbwbwgubw
|
||||
wurggrrwbwgbwuguurgwgurgugwbguuurrubuwwggwgggwg
|
||||
ugbrrwbgurbugwwwbggggggrugububwbguurruggrgrubuuwgurrwbbu
|
||||
rbrurrwuuugbwwgubugbuugruwwurwrbrrbrbgwurwuuu
|
||||
rrurrrwrwrrrbbbwguuwrruwguwuggbgguurrbbgggbwruurugurgb
|
||||
rurwwgugrrrrwbwurugwrugbgwwbuwrbwuwuguggub
|
||||
ubbgbrgggbuwggwgrgbgrgwbwggrrwbrggwgubuwgrwrbwrg
|
||||
wggruuggrwbwrwrugwgbuwggwbgrbuggrgguggubbrbruuu
|
||||
ggurbuwwbbubrguuubgwugugrgrguwrwbrubrgbwwrg
|
||||
rgrgbbbbwwruubwuwguwgububwgruwgruggbgggbuggwwgwuwwgu
|
||||
guwugugbrrbrruggwrbwbbgbburubwuuurbugubwrrug
|
||||
grurwuuwrbguuwgruubwwbuubwbuurgugrgrwbggggwugbgruuurww
|
||||
wuugguggwrrgruwgbbrrgbwbruubgrbbrburgugurgwggwgggrrur
|
||||
grgbbrwuwwrrgggwwwuubuggwrbgrgbwrwwrrwrwguwggw
|
||||
bwuuguwwrbbgrwubbbrwwwrrururbwgbrrrrwbrbgrbgbbu
|
||||
urggrwbggwubgggrwwgwgbwbggwggrwrrrbgwrruwbbrbguuwrw
|
||||
bubruuwrrbbruwbbugwuuwbwwbwbbuwubgrububwwrgwubgrggrruwggg
|
||||
rurgwubgbwrrwuwuuggrrrwwgwrgburbggwwrubuwwuwgwruwurugw
|
||||
wgbgururuggrbrugbwrguruugguubrgwrgguwgwruwbgrrr
|
||||
uubwrbrgggrugurgbrwuugrwrwwwrgbrgwwugbwubwgrr
|
||||
bggugwwurguwbgbwbwbuwwbrruubbgbbrbwbburugrr
|
||||
wrwbrbgbbrwugrwbbwgbgggbrwurgrwubuggwurrrugu
|
||||
grrwbgubrrwruubuugguurrrbrbubbrwgrbbguguub
|
||||
uburuugrwbrurguwgrgwbrrrgrbbgbrbuwrrbugrgbrbbug
|
||||
wgbuwuuwuruwuwuuwuwgggrbugburubggbgubwgbuuggbur
|
||||
wuugrbbwuguwuwwuuruwrwbgurrbbwbwwrwuugbwgbuugbgwwrwwwgw
|
||||
uruburbbbrwbuwrrbrbguuggbguruwwrruburwgwggr
|
||||
rurbbururbwuwuwrrrbbbwbuuwwwuwrrggurgrrurgruggwuubwrww
|
||||
wrbrwwggubwbugrrrgbugubgruggurwwrwuwwwrgbrrugbbbubwgwb
|
||||
gwruggbrbbrwubgbuwwwrugwbubgugwuuugggurwuuwrururugg
|
||||
bwgububwrrgruwubrrubwwubrwrbgrurwgrrrwbrwbubggw
|
||||
urwrbwwrubbuwrbbwgugrbrburrgbbuugbbubbbugb
|
||||
buggwggugwuwwwugggbrrrbbggwwuguguubugbrugu
|
||||
wbrwwbwuwbwgrubbuurbuurgwubrwwwuruwuurbrubbugwuw
|
||||
bbrbggbgwuguburwrgrbgrbrbugrgwbwubgwwuwbwbwrbwrwbgb
|
||||
wuugrubwgggbugrbwgwgurgwuubuubrbrrbbruwbwrwgguwrrrwbwgbbw
|
||||
wuugwgbwrrgugguwwgbwgbbwgbbgbgwuugbbuuwgrburuuurwbggwgrugu
|
||||
wgrrwwugbugbbrrrrburgwbgrgubbguuwbbwwrbbbwuurrwbruruugrg
|
||||
uwwgbwbuuwgwbbbggbwrrbwugwbruruwbbwrrwurwgbgw
|
||||
gruwuruuuuuurwurwgbbggrubrubbgbrwubrbuwbruwgb
|
||||
wuugrbubwrbrgwubrggugwbrgbggbbgwurrwgwrwu
|
||||
grurbbbgbbubgurrrbrrrwwgggguuubuwgbwgwrguwu
|
||||
ggwgbrwwwgrwgrgubrbugwuwwrbgwwgwwgurrbgburuwrgg
|
||||
urwbwbbbuurubwgwrwbgrgruugwuuubgbbwwrurwwrbgugwgwbwggrbgub
|
||||
wwwguggbrbrubgwggbrbbrgbuuuwubbwrbugbbbgruwbwwurggg
|
||||
wuuurrguggwugbggggwbwbrrwurrbgwgwgbuwubgwubuuwbugwbwbwwwrguw
|
||||
uwrgubwbrbbbgrwruwgrggbgbrwgubguuuuugwuwgwuubbgrgbgub
|
||||
uuggugwuwrwgbrwwgrwgwggrbuuwruuwgbrbwrbugururuww
|
||||
rwwrwurbrgwubbgwgggugbwwrubuggrgggurbrgwrwrwrrbwrwuu
|
||||
rwbubuwrrgwggrrgrbwwgrgbgurrbrbrggrbuwwbrggwwrwgubrwgub
|
||||
gurbbwuubbrrgbrurbwrggwuwwbrbuurwbubwwwrubggbwwgbwbrg
|
||||
uwbuurrwbrgrgrurggwbwgrrwgwrbuwwwuburugugbugwuwwbrrubwu
|
||||
rbbrwgwrrbbgwbgrwbrrrwwuuugrwbggrugrbburgbugburggbw
|
||||
uggbgrgruubgggwbrugrgrbbbbwbwbgrbrrgrwbwrgguuwruwrwr
|
||||
uwbbbuurggrbrurwgubrrrbuwgrgrrrrbwubrwrbbg
|
||||
wuuurrbwrgwrguuwgrrgbuwggrbbwbuwbgugrwubwugwbrbg
|
||||
gbrggbbwgurgrrbrugwrbuwgbrwbbbubgwggrurgurrw
|
||||
rruwuwuuuuugwwbwbrrbbggrruwbgwuuuwgugwurwrg
|
||||
gugrrbwrbrubuubgggbwbwwugugwrgwguurugbwbwwggrggbgrgrrbrw
|
||||
ubbubwbuwrugrguggwwrwbbwbrbwrgwwbguwuwgwwwbwwbggbrwb
|
||||
bbruguwgwbggbuubbgwugubrwbuwuwbgrgwwguwwwggruwgbb
|
||||
grbugrrgwgbrgbuwrwbbgwbrrbrubrgwurbwwrwruugg
|
||||
ruuruwbubugrgrbggrgubggbgrwrgwgrgbbubuwwwurbgguwr
|
||||
rrwbbugbrurwgwbwwbgurgurwwwguugguwrwguwuggwgwb
|
||||
wwuwgwgburubbbwggrrbbbbwbgbubguwrgbrrwubguurwwgrbgurg
|
||||
urwbbbruggrwwgbuguuwubgubrbgwubwgwwrwwgubggwwrgbww
|
||||
gbuurrwrgggwurrwuggbruwurrugrwrrbuwrggbwgugrwrwurwruwu
|
||||
buuwrwuuuwgwwggbrbgbguuuruuuubbguwgbbbwgwgbuuwrrgbr
|
||||
ggrrburrbbwrrwbwwubuugrgbugubwubrugbgwugrgu
|
||||
uuubbwrbrwgrwugugbbgbgwwrrbuguuuburgrruugbwbbrwrbrbbwbrb
|
||||
uuuuwrubrruguuwbwwugrrruwwburgbbggrgrgwbggubuuwu
|
||||
wwgrubrrubrwrbgwrwgbguwgbbrgrrubbwbubbburbwgrrrub
|
||||
bgwrgbrbbbuguugguguuubuugwbrwwurwuubrguwrruuuw
|
||||
wuugbbbwuuguuwgrrwrwgwwwwwrbwgwrbwguwbrbgugubr
|
||||
rgruurbggrbubwwbuwwuwuwwrbbgbgbguwrbbrwubgwrbr
|
||||
uuurrubugrwwuuguwrwwwggubbbrbbbuwbbrggwuggru
|
||||
wuuuurwgrwggwrruuuwubwubggrbrbwgbrwbgbwwurgbrwu
|
||||
wuurggrwwbgwuwwrburuwrwrruruubgggbrugwwrwgbuwrbwgbur
|
||||
ggrubgbbwruggbuuuwgrbwruwgurbwbubwuurubugbwg
|
||||
rwwggbubrwurgwrbrwuwugbrrwwubuwrwbgguuuuwuwgwurgbwguw
|
||||
wwbubuubgwwrrgbruubgggrrbuuwrugwbubrwgwbggbgwu
|
||||
bwwgrrbbubbwrwwwguwbuuwgbbwgbbubrguwbbbgrugubrwg
|
||||
wgubbgguwgbrbrgrggubrrwwgrrrwugruggrurrbubuugwbgwuuwwwwgr
|
||||
wwbgwuwggugubgbggwuwgwggrrurrbbrrrrbbbgurwrrbuggg
|
||||
rubguwgwuwwbuguguggurgwrwgbrbwubgugrurbwwwwbbuwu
|
||||
rrwrgrwggubrwgwrwwuugrgbbrgrubgwrwuugrgbbgugbgrburrrrrugwu
|
||||
bbgwugrgwbggrwwwrgbwburrwrwurbwgugwgwgrbuugwwuuwgburggggg
|
||||
uuwbwguuwrbbuggbwggbgrbuwbgugwuurrurrgbrbuurwbwurrr
|
||||
wurbwrgrgrrbgbwbwwuuggwuwuwbbwwuwgwgrwggubbgrwggbrrggur
|
||||
wugrrubbggwurburggurrgggwuwwuguugrggurrgburrbrbrwgwbuwbg
|
||||
wrugrbrwuwrugrbwurgwruggwrgwuwrgwuuwbwwggwubbgrwggwguwww
|
||||
grbwguwbbbrwuwggbgurgbgbbwbgwwbwrrwbubrgubbgubgwwurggwbrbg
|
||||
uubrubgurbgrgruwbwwugbuwgugburuubwuubbbrbbgbuggbbu
|
||||
bbgbrwbwrwgbwrwwbbbrrugrwgbwbbruugurgggbbrgrguwurubgwbw
|
||||
wwugrubrwrwburubwwuubbuubgburbbrrrruugbbwwgwbrrbubgbgbuwu
|
||||
bwugrruubwwrbwbrrrbrrrbbgwrruwwbrgubugrgbwgbbrbgrwgwwwggr
|
||||
wgugrrbbubgbgrrbbrwguwgbbgbwggwuuurrwgwbwrgwwuuw
|
||||
wururbruwwwwurwgurwbwbuburrgruuwrbuguggwgubrgrruwwgwbbg
|
||||
ugrwrrrwguwgrgwruwurbrrgruwubbubrwbwuwwrbbwbbggggr
|
||||
rwuuguburgwruwrgbbuwggugbwrwuubrugrrruuwgggubbuwbrugrwuu
|
||||
bgwubwuurwurbgugbuugbgrrugwrbwgrwrrwbgwwwgrguwwububuwbg
|
||||
urbgbbgrrbuwrrguwrwuwrbbwgubwurugguwugururwruuubbgurrbg
|
||||
grruugrurgwwbbrgugbburrwrrgwwrggwwrbwwbbwururwrbgguu
|
||||
uubrwgwuubgbbgwgwuggbuggwguggwgrguwbugwwuubwwb
|
||||
bbgubwurgurgguwrwrbbubbggwubwgbbwggwuuwugbg
|
||||
guwbbwguurgwurbrgugwbwwbgugbgwwugubbggwugwrwgrb
|
||||
wrruwbubwgwgbrwrbbbwuuuuurbwrbgwubrrugubwwrugb
|
||||
gbuwwbubrrbggrrbugrgruwbrruurrburrgbggwbgwgbbggwggggbgrg
|
||||
rwrbbbwbggrubuwgrugggbrbgbuwgrbrrbrrbwgwgrbuubgw
|
||||
burbgruuwbbwuburbgrbuuuuurbuwbububgwwgwbrguubrguugwbbwbw
|
||||
ubrrrgubrgrgbuuwgrrrwwbruuugbrrwbgbrwgrgww
|
||||
uuuubwwwuwwbguwwbwgbwrwuwrwgrggrbgrbugbwgbrggwgruwrw
|
||||
grwgruggbrrwuwrwbggwwgbrrwrwruuggbrurrbubur
|
||||
uggbrrggwbwbrbwgurbbbrbbgwbrgbgwrbwubrurgw
|
||||
ururbbrwrrwwbgubrbbuurguuwwgruwgruuurwbbwruurggru
|
||||
grbwbrubbrgrwgbwubgbuwwuuwwrubruugwwwugguwrgurgrgu
|
||||
wbwwugggwwurwrbugbbbrrgbgbuwggrggbbgrburbguurb
|
||||
brwbbgwbgbrbbgwbrruwugwbguurubgwwgurubgrwuwrbguwuwrrgbwubu
|
||||
rwugwrbgguwuggwgwgrbwbwwgwbwrrgrbbbwubgwggwrwurgwrwb
|
||||
urrbwwgrruwwwrbrbwrgbrggwbggwrbbwwrggrgbbg
|
||||
wurwwgwuurbwwgrrbbubbbbgugwwurrggrurbwrbuurbbbb
|
||||
wggwrgurburuurwgrrurgrbubgrrgbbbwwrgwrurwrwwrgubuugwur
|
||||
wrgubgbbwbbwruwrrgwgbrruubwgrurgwgrbugbgbggguwbrwuu
|
||||
bgrwuwbggwwgrwbbugwuuwwwbrgugbbrubgugwbgugrbuwgrrbbubbwrrr
|
||||
bwuwgwgugggrbwgruugbwruruwwbguggrbgggrggggwwuuuwugbuwuwgu
|
||||
ruuugrurrrbrrbwuwbubrugwrrbgugbrwuurruwuwrbrbrwubwbwgur
|
||||
rwugrbuwgwrwrbubggwugbrrgwwubbguuwbgbwuggrrrrggwrbrr
|
||||
wbbrrruwuwubrgbrgbggrbgbburbugbwrrrubbbbggrurrrwb
|
||||
ggruwrgubbururbrggurburuwrrwubwbuwwruruwbwuubwbrwwwrwr
|
||||
wwuurwuwrwbwguuwwrbwgbuurgbbrgrbgwgwggwrgwgwwuuwgrwbuwrgbu
|
||||
wuburbrwbgwrruurbrrrgwgbgrwgbwwwbbgrugubbrwuwububbrgbw
|
||||
gwbwwwgrubwrguugbrbrbggguguuuugggwrbgwguwbrwwuuwggw
|
||||
ubrbruwbururrrgwurrrbrrubbgbwrrggubbuburgwruwggurbrwb
|
||||
rbrbrwwgwwurburubwgugwwbwuubuwbrwrrgugguwrbrrgbrrbrbw
|
||||
grgubrrwbbwwwbrbbwbwwbgbbwrwrggbrrrbwwbwgbrgugguwuwubub
|
||||
rurbrbrggruurgwguugugrrwrbuuwbwrubbbuburrwgruubu
|
||||
ubrwguwgruuwwbbuwbrubugrgrurwrbwbwgbwrbubrgg
|
||||
uuwgubuugwrbggbrrwurbbuwrurbubbbruwgrrrbrbwwwg
|
||||
ububuuwuwwrugrrwrrbgurbrrrggwuwrubbgwwwurbb
|
||||
bwugrrrgwurwgrbrwurbbbwbrurrwwgwwugbgbwgwuu
|
||||
bbwgugurwurwbugugrgwburggurwrbbbbgwwbuubububurwuurggwubg
|
||||
wuugbgbbwuubbbrrgbgubbgrrrbrgugrbwguuwgburrwrguuwgrbg
|
||||
urbguwwwuugbgwwubwurubrrwbruwwugrgwwburrugugwbwbbu
|
||||
uguugwgrgwburrrugbwuwgwrbwurgbbbbbwurbbgubwr
|
||||
wuwrrrwwwwbwburbuburrrbgwuuubbwggrbwuwwgbrbrbwrw
|
||||
wwbwbuwggbrgbrbwrwgguggwbugggrbwgwrgrgbgrrgbuurwubbr
|
||||
rugbgwgugrgrugwwgwruurwbrwuwggbbrbrrggwwgwbubbug
|
||||
wwrgubrgbwbbbrbuubuurbwbgbuugbwgguwrwbugbwrbwuwwrgb
|
||||
bbrrwurbggbguwgwggrwbbgguubuuurbruwwrwuburbrrg
|
||||
wuurugrubwrrbbrbbwbubbgburrrbugwuwwrgrrrwwbwg
|
||||
uwgbugbuugrrwrwwuuuwwwrrgbubwugruubrwburgbbbbruwwgubrugb
|
||||
wrwwuuwguruwrgrwgurwgrurwggubugrrugwggrbgbuu
|
||||
guguugwrruwurugwgrbbwrbwwurwgggubugrugruuwrubbbgggwuubgrrr
|
||||
gwuggrwbrgwuuurrbgbwbwrbrggguuwbubbrbrurwwuwugrubrwrwubwgw
|
||||
ggrrwwrrggwuguuwgbgbgrbbbbgbwrrgguwgwggurubbugbgw
|
||||
rbggurrgrrgrrbrbrgrbuggwubwwburrrrgbbwuuuuuwrbwbbgbrbwbwwb
|
||||
bwugwbwububgbgwrbuuuwrruwgubbgruggburwburbrrwg
|
||||
urrrbrwbguugwgbwrubguwwrruuguuwrbgwgwrbugwbrggbgrbuguubb
|
||||
ururrgbbruuuwuubugubugbgwgwbruwgwwgwbrbgbubgwwgurgwb
|
||||
wbwbrbgwurbgwbuwwbbbrrbbbuwrrgbwgurwugwburrrruwrgb
|
||||
bbrrbgrrwbwuuuwwruwurwwuwgrwbgwugbgwrrwwwuubggrgrgrgrbwbrb
|
||||
guguguwguwbggubbgurbugrwruguururuuuuggbrgrwguwubbwww
|
||||
gwgurbrwguubuuuggwgwrurruwbuwrgwuuwugrrgrgrwrwurubuuuwgwg
|
||||
rbuguuubrgwwugurgugbuugrrgwbbgubuuurguurruwrurbrrgwgrurrw
|
||||
bgbbgrbgggwggbwwuggbrrbbgguurgrwuwurwrgwgugwbwwgrgubbb
|
||||
rrrurgbggwgrrugurbrubbgwwrwuugwuurgrwurwrwbuugwuurgggwbrww
|
||||
bburbwwrrwuuwuwuwubbwurwbwwrbwrubwugruruguwbu
|
||||
rwbrwugruuruuwgugbbrrgwurrrburwrbugrubbbrg
|
||||
rurugubuggrugbwrwwuwrggbrwruuggurrrgwgbgbwugrgbrurr
|
||||
rrbuuruwrgubbubbgbruubgrrgwrrwwwgubwbuuburwurgurruwwrbbrw
|
||||
gbggubwgrwwgwbgugbwrwgbwgubbbugggwwwrrbbggbwbwr
|
||||
uruuugbubwuwrubwgbbrggrwwbguurgwgugbuwrgwbbwru
|
||||
wuurrrwburwbbugubwwrgruwrrbgrwrrwwbwbbrruggbwuug
|
||||
bggrwbgbwbbbbwwrurgwbrwuuuubwwbbububrbrgwgrwbrrrbrugrrrgrw
|
||||
bguguurrgbugrrrwugrgggrbguwgruuwbuwubrurrrgb
|
||||
ggwgrgbwrrrwuugbwbgbwgbbbburbrwbrwbrrrwggurbwrrrbbbgrbwuu
|
||||
uugggwruuuururgrggbrwuggruwbgbuguuwwubrbbgwbrgubrgubrgbbww
|
||||
uubwuuwrgbbrbwrbrbbugbbrbgwwrwwgwggbubwwgwuguwububgbu
|
||||
gugbwwrwuuwrwrgrubwrwgbrgrguburwbrwwrbbgwuuggwggu
|
||||
wwwwubbgrbubbwuwgbrgbgwubwubwgrrurwgrrggbgubburwgurgwb
|
||||
grrrrwugwurbgrgwubbgrwrwbbuwguwgbbggbwuuguuwggrubwwuwggg
|
||||
rrugggwburrwgbrbwbgwgwuwbubugwwrrwugwrrrwwbub
|
||||
rbrbgwuwbggggwrbgwgwbgburwgurguguurbguguguwguuwggwgwr
|
||||
wbbgrwbrrrrrbrurgrbugbuwrubwuwrgrwgurbgruuggurrrw
|
||||
wrgrgbggrwgugbggrrgwuurrwbgrwgbubrbwrrubrggbrbgrrwuu
|
||||
wuurbbrgubwrgurrugbwubbrbubruwbugrrbrwuwbbbbbbbwuwuw
|
||||
wwrggrbbrgbuwgrrgwbugrubguuggugurgwbuuwgbguurgrr
|
||||
wbwrgugurrwuuwbrrguwbgwurwwbbbgbgrgrwgbbuuwurburrbub
|
||||
ggrbgwuubgrbgwbbbubugwruubuwwwrbgbwrggggggbubgrbwrw
|
||||
bugrwrrgbwgugrgbrwburgrgbwbbrrwbgguwrbgwug
|
||||
wwbrbbrruuwbgwrurgwrrguugwgrbbgbgguugubuwbgwubuwgbruuburw
|
||||
gbugbuggrggbuwruuwbwbbrggrbubwbbwrrrbwgrguburrbwguwugu
|
||||
ubgwggubbgguugguruubbugwuuwrbwgugbuuruwgwgwubugr
|
||||
rguwbrgwbubwggbuubrrwgggggruwuuggwbbrwbgwg
|
||||
ggbugubrbbrbwbruwwrguwbgruruuuwruugwbuwgwrgwurgwugwwbggub
|
||||
gwuwburguwwgbrgbguguwwrbwgwurbbgruuuubwuubbwubgbu
|
||||
bguwwrugrgbbuguwbwrbubbrwbbubuggwbgbbwwwrugbrgwrbwggu
|
||||
wwwrbuuwuwgwrbwruwuggubrgbgwbuwwrrgguugbruuubrwg
|
||||
wuuuugrgugugguwwrgurwurbbbrwbwwrgwuuwubgwru
|
||||
uruuwrwrugrwwwwwrgbbwgbgbrwrwgrwrbbbrggurrrw
|
||||
bggbbggbrbbrrgrgwurggrwbggrgggwbrbwwuguugb
|
||||
bbrugbgrurwugwbgbbgrwggbrgbuwubgbrrwbbubwbrb
|
||||
uruwbbugbwrrrgggbwbrrwgrrbwrgwgbgurrbbgwrrgwbuwgw
|
||||
wrrrrugwbrgrgwbguwrbbubrwubwbwwwwwwbburbuwgwwbubrugbwguug
|
||||
wuugrwrwwrwbbgwgugugurrwbbwwwwugwwbuuurbwgwrbbggugwwwwbgur
|
||||
uuubbrbrrubwgbwbugguwrwbgwrubwbgbbubgrwugbgrwurubgrgbwrr
|
||||
rbuguwurbrgwbubwwuwggrwuwgrbgburgubrggrgrbwwwbwbu
|
||||
grrbgwgrbwbrwwbbwgbgbbgrbguurbrwwwgugrgubububbwwbuwugrbbr
|
||||
wggguwwbwrrburbuwbwgbwbugbwgrurrrbrgubwbwug
|
||||
uuwugrrwwbguuugrbrrrbuwuubrguwwgrggwrgubbb
|
||||
ugrbwwgruwbrwbbbrwrruwbwgggugbrrbwwurbggwururgrgurwuw
|
||||
rwgurbrbgwgugwuuuuwbggwwbbgrwrgrbgwuruuubgu
|
||||
bgbrwuuuwrrgbbuuwuwwrgrgbrbrubbbbbrwubbwrbgbuuurbrubuwuurb
|
||||
bwgrbrugwggubgrrgbbrugwbbubwwbwwgwrbgwgrurrrbugwguruwu
|
||||
ugbggrbwrrwwbbrwuurbgwwbuggwggbugbgrrgwbrurrguwwubgwrgw
|
||||
uruuwuwwugubwgrugurbggwgrwuuugrgwrrwuwgrrbwrg
|
||||
wbgwuwbgbwuburguwbugwgggrrurgbgugggrrbwugugrrbbbwuguuuurbg
|
||||
wgurrbuwuruguurgwgwbgugbruruwwggubwrwuuubgwrwwww
|
||||
wguwuwugurbrwwuwrgurrbbrwggrrrbruuwbgrwbgwgubuwuwg
|
||||
gbgugrbgruuwgbgwbgwwbwruwgbrgbggrrgrwrbubrgrbgbr
|
||||
wuurbbwggrbbgwrgurbwwbuwggrurgrwrbwbrrbwbugubw
|
||||
wburgrurggrugrbuuggrrbgwrgwbgububgrwbrbugggwrwrgr
|
||||
ubwwgrubrrrbbwwrgrrubggubrrbgggwwrrrguggbugubrubburubw
|
||||
uwwururrbubugbwugwrbuwruwwwrwurbrbwrrgguubgguubww
|
||||
urbrrruwwrrrwgbwwuwubuuwuuwgubbguubwubgurwwgg
|
||||
gbrbgbbrrrbgbgbgwbbgwgggbwbrwbbuugrgrbuuuwubrgbggrrgwuubw
|
||||
gububrggbugrrrwrbguggwwwbwuurwggrrbgbgwwru
|
||||
bbgbbgbuwrwrrubrrurgguwurbwurrbugbwbrrugrwgwbrwrggbbrwww
|
||||
wuugrbgguuuuubruurgbrbrbubuuwwguwguwurrbbgruubburwwbbrb
|
||||
grgrgrruwbuuubrurwwwugrrggbbrugwrwgruugburu
|
||||
rrbbbbrguwrwgrwgwgrbwurgwrrwwbbgbgburbgwgggwb
|
||||
rwgwbrwwgwbguguwurgwurbwwbrbgrbgbruuwbuwwrgug
|
||||
wuugwwuubrwrubrbgbrwururuuburwggrurrgbwubwuggubbwbruuuwrwg
|
||||
ubbgwbugrwwbuwrggrgwgrrwrwwgggurrrgbrwgrwubrwrur
|
||||
bwububgwwbuugrwrggggrruguwrugwrgbguwrrbgbbbwburruwrgwrurg
|
||||
rruwguuwwgrgburwrbrbubwgbugwggrurgrwbubrguwuwbbwgrbuww
|
||||
rrbbrwwbrgwwuwrbwggbubbuwwwwwrbrwbrggrubwg
|
||||
wrwbwwrbuubwwuubwrwrrbruuwwbwubbbgbgwguwburwuubbg
|
||||
ururgrwggrgugugbwrbggwgugbrbugrwwgubugbrgburrurbrggg
|
||||
gwwuwuurwrbbwuubrururruggrgrgwurrrgbrbrbguwrr
|
||||
rgwwwrwbwrggruuburuugbruuugbgbgwgugwbugubuwwgrrrru
|
||||
wwrgrbwugurbgrgwgruwrbwuubbwgwggrrggubbwugbwwrrrgbbwuu
|
||||
gbwurggwgrrguurgwwgrggggbbbwgburwbgrgwwwwbr
|
||||
ggbbgrbbwbbgwburgggwgwububrbwbguuurggbubuuuwbwggugu
|
||||
bwbrwuwuuggbubggrwgguwugbgbubuurubwrugubwrurrugguuwrbr
|
||||
ubrrgrbbrrugubuuubbwuwrwbggrbrbwgrrubbuubwg
|
||||
uurbbubwuugwguwrbrgwrbbrrruwwgbwwubrgrwubguugrgwuwrg
|
||||
wugbrwbrgbwugubwrrgurrrgurgwguubwgrwrbggurrbgg
|
||||
wubwgrugruuuwuugwwrugwgbbgwwruuwuggurwwbrruw
|
||||
bwrgruurugbwwwwbwrbrrrbrggwbburrwwugrruurbbwwggurbbbr
|
||||
burrrgurrwrggbuwruwgrwwbwbgugwwwggwwurrbuwbuubbrrrwr
|
||||
wrrrgrwgwwwrwgrbgrrwuuuwgwrguwwurrrubguwurgbrb
|
||||
uwgwurwrwgwgbuwbgrrbubwwbrbuurubbrbbrrurubwb
|
||||
wbrggubgbwbbwgrrurwwburbwruuruwugrbguwrwbuwuwbwwbuwbu
|
||||
rgurgrwrurbwbwbrruuwgbwrwwbgwuubgwrugwbrwwbwbguwwbgrgrugw
|
||||
rbggubugwbbggguugrwwbrwgwbgburggrgrbruubwbrbrbrbugguwwrgb
|
||||
wruuggrbwgwwrgrwggugburwwgwgbrurwwgbgwuubrwbrgugubrwgbwgu
|
||||
bggwurruuwwrggwbgwuburrwbrwrbwwrrggwuggrburgwguu
|
||||
uwrrguugbwburwubwbuwbwrwgbgbwurguubbwbubbwbgrrrruub
|
||||
rugguugbgrgbwrruurrbwbrbrgururrrwguurgrbrwgwu
|
||||
bggbgrwgruwbugwrugwbwbubbwgubgubwbwwwwbgwrwrgwrwruwgwbuw
|
||||
gurururrwguwuwbggbggbbrbbwbwgububrrubbrggrwgu
|
||||
uugwubgugburrgrwurrrgwwgwwwrwubgbgurwrwuwuggbbguwrgugbgu
|
||||
urbwgbbugrbrruwwwrwgbbbwggrwbbuugurwgwguug
|
||||
rbrwwwrbrgwrbwbbugwugbguuggbbgbrgbuwwrgbugr
|
||||
rbrubgwbwbubbgbubwwwrbgrwggbbguugwuguwwgwbbbbu
|
||||
bwbgurbrbgugwrrbgbuggbrrbwwbrrgbwggrrwubbwbrgwg
|
||||
grwuggugggurrbwbuuwrrwbgggwbruwwrbwugrrwrgguwwwrbgbu
|
||||
rguwbbbrgbgrgbbuwurwuwbbgwburuwbugubrwgubrrbbruwbrr
|
||||
uruwrbruruwbubbrgwwrruwrurbgwrurwwgwrruggrbguwurggggg
|
||||
bbgbwwbwgbrggrgbgggrgrrwgwgggwgggwuuugrbwrrwbwb
|
||||
grbrbbgubgbgwuwwgwrbgguuwugbrurwbbugrrbwrru
|
||||
wgwwgbwgrurgwgruwugrbbbbrgbgbbugwgubwubgwwwur
|
||||
wgurubbgbbguuwggwgrwbrgwbruwggrbrrwwuugbgwgwbbgggwg
|
||||
uubbwggugwrwurbwwwuubgrwbbbbwbguwbgbbuwgrrburrwguguuwuuu
|
||||
urwrgbrgubwwubwurwwrrbwwwgbwwrbuguuguuugrubwbbwwwubr
|
||||
wwgwuurbburbwbwwwugrbwggugrrwgwugbugubububuurur
|
||||
rugbwwgwwuwbbwbrguguggugrruubbwrwbrurwwwgwubbrrwwb
|
||||
wuuuwrgbwruwwurrrgwwrgugwwbubgbbgbggrbrgg
|
||||
wugbuwgbugwrrrgbbbgrbuuwwuugrbgbgwrgubugggrgrbugbggggwrr
|
||||
wurwwwgwgbuwggbggwrwbwuwuwuguwwbgggwgrbgwbbbbg
|
||||
gugrrrrrbrgwubwruwrgbruwwwbbguruggbubrwugwbwwbugbuwww
|
||||
bbwgrbrggbuburgrwrbwbbbgbwurrruguggurbwbgrwwrr
|
||||
uguwbbgwugbguggrruggbbrrubuugurgugwuubwbwwr
|
||||
rwgbuwwbwuwwwbguwgugwgrbbuggubgwrurgrbwgbuugbrwr
|
||||
wurbubbrgburwguwrrwuggwbrrrugbwbuuruubrrgrguuwwuururwrbww
|
||||
rbubgwuubrrruubrbwbwuugugurrwugurwgwbwrurb
|
||||
bbgrwuwwubruuwbwwgrwrbrgruruuwubuguwugbgrbgrwugrwrgbugburu
|
||||
wuuuwwgrgurbgbwbwbgrrugbrwggrbrrubgwurwurgrbbrbu
|
||||
rwbbuugrbbwubwubwrurggwwuurbbwggbwuurubrburuguwrrrrw
|
||||
bgbgugwwubguuuwbuugrbbgwwwgbuwurbrgrgbuwug
|
||||
wuugwbwgwwubwuuuwuwgwurburggbwwbrwwrwguuruwubwbguuwgw
|
||||
grrbgrbbugwguwbrburrbrrwgbbrgrruwwurubbuwbgubbwgruwbgbb
|
||||
bwuuwwururgugbrruugrrrugrgugugbggbbgbbguurrg
|
||||
rgurgugrwurgbwwbuuwubruwgrwbububuuwruwggwrbbbbbbbwwbb
|
||||
wuugrbgwwwgburbwrwgugrrgbbbgrgbrwwrgurrbbwbwuugugrgbubbrrrrg
|
||||
ubrbgrwbuugrgwuurgrwbbbbrurubgurrgwubruubggwwgg
|
||||
rwwubuuwrrrrwwwbruruuwbuwurwbubrbgrruuuwrwrwg
|
||||
rggbgubbrgbgrrbgwwwrgwubrubwruugbwrwbbgguugubrubuwg
|
||||
gbwbwwgubuubgurruwwwuwrrbuurgggurbbbbubbrbgw
|
||||
gubggbgrbgwbbuwguggwuwgbwrrwwgbrwrrrgwwbgug
|
||||
wuuruwgubbwuugbbburrugbggwwuruuuubbgruwbrr
|
||||
gwgwruugwuurubburrrwrbgrurrwrwbbbbbwuuwbugrw
|
||||
bgbwuwururguwuwbuubwbubugbwbuurwurbwbwgrgbwwwgwbuwubru
|
||||
bruuwbugbbgrgubrggbggbgwuwbwwwrbwuwwwuuwgwgugrgwbbuwubbguu
|
||||
wurrbbwuguuugrgurwwbwbgwbbbwbbuuwbbgurwrrbubwbbbbwubb
|
||||
bwuubrguububbgrubbrgbgwwbgbbbgwbrrgwggwgggurgbwwwwuur
|
||||
wgwuwbgrrurbwgwugwruwbubwgrrrwbbgrbuwubgbgw
|
||||
rrbbrrbbwbbubbwrwgwrbrwwbbbbgwbguwgburwgbggr
|
||||
wuugbbuguruwugwrgwbbuggbwbwwbbuwwuuugwbguwugbwggrbrr
|
||||
gwgbburbguwuurrrgwbuwrurrbuwugwrgbgwrgwwwwurubbgbwr
|
||||
wubugurgrbrbbbwrrwurwuuugwuwrbbbwwbrgbbrurrg
|
||||
wrwugbwwbbbrguwuwugbwwuwgwubbbgrrbrwguuububbggbwwbwwrwbg
|
||||
bugwuwrwuwwggwwuwrwrbruggrurgwwurrguwugwrwg
|
||||
rbrgrwbwrurwbubrugwwgguwrrgwgwuwwbrrgrbrgwruwgbgbrbbru
|
||||
rwwwrwruruuubwgwbgubrbgbgrwwuugruurugbrwbwuuwgbwubggugg
|
||||
uuwugbbwrwbgrgwubgwwgrubbwrbbwwwbbwbbrbwrrugrgggw
|
||||
wggubrrbgrggrwgguwggubwwrbrbgbgrrgugbggbgg
|
||||
uwbuwrrgwguwurbwbbgbrbbrgguuggrrugrwrwbgrrurru
|
||||
grrrgurgwububbuguwrguuuwrwwurbbwrwwguwwwrggbrbr
|
||||
wubbgwbwbrbrgbggurgbrwgrubrurbrrrwrurgbbrwurgrrgugbwurrbg
|
||||
wruwwrwgwrbwubrbwubbbrbuurwwwugwugubuubwgbbbubgrrgbrgbw
|
||||
rwrrbgwurrgrbgrrrguugwwbgwwugbbgwwwuuuwgugwuwuwuubuw
|
||||
rgwwugwwurgubwgrbwbwwgbbbubbrggbgrugguuubuuuugbgbgug
|
||||
gruuruwbwbuururbwrwrgrwuububgwgruggwbwrgwbub
|
||||
gbbwrurugbbwrurwwbgrruwgbrbrbrrgrwrbbgbgwbgwgwuwrwgrgu
|
||||
wugwwgrwbgugurwurbggbrwruwuuwurwrbrwgruuubuurur
|
||||
wgbuwbrbwrgrbwuwggugggguuwgbrbwgrgwrurrurbrgugrgwrb
|
||||
ggwubgbwwwgrwwbbggwwrrggwguubuggubggguuwbwuwgwuuugrgbuubbb
|
||||
rguuugwbrbrbwbgrggbubwrwwrrrubwwuugugwgrbuu
|
||||
ggugbrggwbuwrwgrgwugurrbgruurruwwgrbwwubbuubr
|
||||
ubgwwggbwbuwbbbbbbggbwrgrbgrgugurwggrubburrubrwrrggrgg
|
||||
191
2024/gareth/day20/day20.go
Normal file
191
2024/gareth/day20/day20.go
Normal file
@@ -0,0 +1,191 @@
|
||||
package day20
|
||||
|
||||
import (
|
||||
"container/heap"
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var directions = [][]int{
|
||||
{0, 1}, // Right
|
||||
{1, 0}, // Down
|
||||
{0, -1}, // Left
|
||||
{-1, 0}, // Up
|
||||
}
|
||||
|
||||
type State struct {
|
||||
row, col, dir, score int
|
||||
path []string
|
||||
//Would rather use tuple as key but cant get to work
|
||||
costMap map[[2]int]int
|
||||
}
|
||||
|
||||
type PriorityQueue []State
|
||||
|
||||
func Part1(input string) int {
|
||||
maze := parseInput(input)
|
||||
_, path, costMap := solveMaze(maze)
|
||||
cheats := findCheats(path, costMap)
|
||||
return cheats
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
maze := parseInput(input)
|
||||
_, path, costMap := solveMaze(maze)
|
||||
cheats := findCheatsPart2(path, costMap)
|
||||
return cheats
|
||||
}
|
||||
|
||||
func parseInput(input string) []string {
|
||||
parts := strings.Split(input, "\n")
|
||||
maze := []string{}
|
||||
maze = append(maze, parts...)
|
||||
|
||||
return maze
|
||||
}
|
||||
|
||||
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||
func (pq PriorityQueue) Less(i, j int) bool {
|
||||
return pq[i].score < pq[j].score
|
||||
}
|
||||
func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
|
||||
|
||||
func (pq *PriorityQueue) Push(x interface{}) {
|
||||
*pq = append(*pq, x.(State))
|
||||
}
|
||||
|
||||
func (pq *PriorityQueue) Pop() interface{} {
|
||||
old := *pq
|
||||
n := len(old)
|
||||
item := old[n-1]
|
||||
*pq = old[0 : n-1]
|
||||
return item
|
||||
}
|
||||
|
||||
func solveMaze(maze []string) (int, []string, map[[2]int]int) {
|
||||
rows := len(maze)
|
||||
cols := len(maze[0])
|
||||
|
||||
// Locate start and end points
|
||||
var startRow, startCol, endRow, endCol int
|
||||
for i := 0; i < rows; i++ {
|
||||
for j := 0; j < cols; j++ {
|
||||
if maze[i][j] == 'S' {
|
||||
startRow, startCol = i, j
|
||||
} else if maze[i][j] == 'E' {
|
||||
endRow, endCol = i, j
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Priority queue and visited set
|
||||
pq := &PriorityQueue{}
|
||||
heap.Init(pq)
|
||||
startPath := []string{fmt.Sprintf("(%d,%d)", startRow, startCol)}
|
||||
startCostMap := map[[2]int]int{
|
||||
{startRow, startCol}: 0,
|
||||
}
|
||||
heap.Push(pq, State{startRow, startCol, 0, 0, startPath, startCostMap})
|
||||
visited := make(map[[3]int]bool)
|
||||
|
||||
for pq.Len() > 0 {
|
||||
cur := heap.Pop(pq).(State)
|
||||
|
||||
// If reached the end point, return the score and path
|
||||
if cur.row == endRow && cur.col == endCol {
|
||||
return cur.score, cur.path, cur.costMap
|
||||
}
|
||||
|
||||
// Mark as visited
|
||||
key := [3]int{cur.row, cur.col, cur.dir}
|
||||
if visited[key] {
|
||||
continue
|
||||
}
|
||||
visited[key] = true
|
||||
|
||||
// Explore moves
|
||||
for i := 0; i < 4; i++ {
|
||||
// Compute new direction
|
||||
newDir := (cur.dir + i) % 4
|
||||
|
||||
// Compute new position
|
||||
newRow := cur.row + directions[newDir][0]
|
||||
newCol := cur.col + directions[newDir][1]
|
||||
|
||||
// Check bounds and wall
|
||||
if newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && maze[newRow][newCol] != '#' {
|
||||
newCost := cur.score + 1
|
||||
if oldCost, exists := cur.costMap[[2]int{newRow, newCol}]; !exists || newCost < oldCost {
|
||||
// Update cost map
|
||||
newCostMap := make(map[[2]int]int)
|
||||
for k, v := range cur.costMap {
|
||||
newCostMap[k] = v
|
||||
}
|
||||
newCostMap[[2]int{newRow, newCol}] = newCost
|
||||
|
||||
// Update path
|
||||
newPath := append([]string{}, cur.path...)
|
||||
newPath = append(newPath, fmt.Sprintf("(%d,%d)", newRow, newCol))
|
||||
|
||||
heap.Push(pq, State{
|
||||
newRow,
|
||||
newCol,
|
||||
newDir,
|
||||
newCost,
|
||||
newPath,
|
||||
newCostMap,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1, nil, nil // No path found
|
||||
}
|
||||
|
||||
func findCheats(path []string, costLookup map[[2]int]int) int {
|
||||
|
||||
totalCheats := 0
|
||||
for index, position := range path {
|
||||
|
||||
var row, col int
|
||||
//Should be a better way to do this
|
||||
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||
|
||||
for _, dir := range directions {
|
||||
newRow := row + (dir[0] * 2)
|
||||
newCol := col + (dir[1] * 2)
|
||||
|
||||
if cost, exists := costLookup[[2]int{newRow, newCol}]; exists {
|
||||
if cost > index && (cost-index-2) >= 100 {
|
||||
totalCheats++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return totalCheats
|
||||
}
|
||||
|
||||
func findCheatsPart2(path []string, costLookup map[[2]int]int) int {
|
||||
totalCheats := 0
|
||||
|
||||
for index, position := range path {
|
||||
var row, col int
|
||||
//Should be a better way to do this
|
||||
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||
|
||||
for x1 := row - 20; x1 <= row+20; x1++ {
|
||||
for y1 := col - 20 + int(math.Abs(float64(row-x1))); y1 <= col+20-int(math.Abs(float64(row-x1))); y1++ {
|
||||
if cost, exists := costLookup[[2]int{x1, y1}]; exists && cost != -1 {
|
||||
diff := cost - index - int(math.Abs(float64(row-x1))) - int(math.Abs(float64(col-y1)))
|
||||
if cost > index && diff >= 100 {
|
||||
totalCheats++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return totalCheats
|
||||
}
|
||||
45
2024/gareth/day20/day20_test.go
Normal file
45
2024/gareth/day20/day20_test.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package day20
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`###############
|
||||
#...#...#.....#
|
||||
#.#.#.#.#.###.#
|
||||
#S#...#.#.#...#
|
||||
#######.#.#.###
|
||||
#######.#.#...#
|
||||
#######.#.###.#
|
||||
###..E#...#...#
|
||||
###.#######.###
|
||||
#...###...#...#
|
||||
#.#####.#.###.#
|
||||
#.#...#.#.#...#
|
||||
#.#.#.#.#.#.###
|
||||
#...#...#...###
|
||||
###############`)
|
||||
assert.Equal(t, 44, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`###############
|
||||
#...#...#.....#
|
||||
#.#.#.#.#.###.#
|
||||
#S#...#.#.#...#
|
||||
#######.#.#.###
|
||||
#######.#.#...#
|
||||
#######.#.###.#
|
||||
###..E#...#...#
|
||||
###.#######.###
|
||||
#...###...#...#
|
||||
#.#####.#.###.#
|
||||
#.#...#.#.#...#
|
||||
#.#.#.#.#.#.###
|
||||
#...#...#...###
|
||||
###############`)
|
||||
assert.Equal(t, 285, r)
|
||||
}
|
||||
141
2024/gareth/day20/input.txt
Normal file
141
2024/gareth/day20/input.txt
Normal file
@@ -0,0 +1,141 @@
|
||||
#############################################################################################################################################
|
||||
#...###...#.......###...........###...#...#####...#...#...###...#...#.........###...#.......#...#.....#.........#...........#...............#
|
||||
#.#.###.#.#.#####.###.#########.###.#.#.#.#####.#.#.#.#.#.###.#.#.#.#.#######.###.#.#.#####.#.#.#.###.#.#######.#.#########.#.#############.#
|
||||
#.#.#...#.#.#...#...#.#.........#...#.#.#...#...#.#.#...#.....#.#.#.#.....#...#...#.#...#...#.#.#.#...#.....#...#.#.........#.....#.........#
|
||||
#.#.#.###.#.#.#.###.#.#.#########.###.#.###.#.###.#.###########.#.#.#####.#.###.###.###.#.###.#.#.#.#######.#.###.#.#############.#.#########
|
||||
#.#.#.#...#...#...#...#.#...#.....#...#...#...#...#.#...........#.#.###...#.....#...#...#.....#...#.#...#...#.#...#.###...#...#...#.#...#...#
|
||||
#.#.#.#.#########.#####.#.#.#.#####.#####.#####.###.#.###########.#.###.#########.###.#############.#.#.#.###.#.###.###.#.#.#.#.###.#.#.#.#.#
|
||||
#.#...#...#...###.....#.#.#.#.#.....#...#.....#.#...#.#...#...#...#.#...#.........###.#.............#.#.#...#.#...#.....#...#.#.#...#.#.#.#.#
|
||||
#.#######.#.#.#######.#.#.#.#.#.#####.#.#####.#.#.###.#.#.#.#.#.###.#.###.###########.#.#############.#.###.#.###.###########.#.#.###.#.#.#.#
|
||||
#.#.....#...#.#.....#.#.#.#...#...#...#.....#.#.#.#...#.#...#.#...#...#...#...###...#.#.........#...#.#.#...#.#...#...#.......#.#.#...#...#.#
|
||||
#.#.###.#####.#.###.#.#.#.#######.#.#######.#.#.#.#.###.#####.###.#####.###.#.###.#.#.#########.#.#.#.#.#.###.#.###.#.#.#######.#.#.#######.#
|
||||
#.#.#...#.....#.#...#.#.#...#...#.#.......#.#.#.#.#.....#...#.###.....#.#...#.#...#...#.........#.#...#...#...#.#...#...###.....#.#.#.......#
|
||||
#.#.#.###.#####.#.###.#.###.#.#.#.#######.#.#.#.#.#######.#.#.#######.#.#.###.#.#######.#########.#########.###.#.#########.#####.#.#.#######
|
||||
#...#...#.....#.#.#...#.....#.#.#.#...#...#...#.#.#.....#.#...#...###.#...#...#.......#.....#...#.....#.....#...#.###.....#.....#...#.......#
|
||||
#######.#####.#.#.#.#########.#.#.#.#.#.#######.#.#.###.#.#####.#.###.#####.#########.#####.#.#.#####.#.#####.###.###.###.#####.###########.#
|
||||
###...#...#...#.#...#.......#.#...#.#.#...#...#...#...#.#.#.....#.....#.....#.....#...#.....#.#.#.....#.....#...#...#...#.###...#...........#
|
||||
###.#.###.#.###.#####.#####.#.#####.#.###.#.#.#######.#.#.#.###########.#####.###.#.###.#####.#.#.#########.###.###.###.#.###.###.###########
|
||||
#...#.....#...#.....#.#...#.#...#...#...#...#...#.....#...#...........#.###...#...#...#.#...#.#.#.#.......#.###...#...#.#.#...#...#.....#...#
|
||||
#.###########.#####.#.#.#.#.###.#.#####.#######.#.###################.#.###.###.#####.#.#.#.#.#.#.#.#####.#.#####.###.#.#.#.###.###.###.#.#.#
|
||||
#...........#.#...#...#.#.#.#...#.....#...#...#.#...#...#...#...#...#.#.#...#...#...#.#.#.#.#.#.#.#.#...#...#...#.#...#.#...#...###...#...#.#
|
||||
###########.#.#.#.#####.#.#.#.#######.###.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.#####.#######.#####.#
|
||||
#...###.....#...#.#...#.#...#.#.......#...#.#.#...#.#.#.#.#.#.#.#.#...#...#...###.#.#.#.#.#.#.#.#.#.#.#...###.#.#.#.#...#.....#.....#.#.....#
|
||||
#.#.###.#########.#.#.#.#####.#.#######.###.#.###.#.#.#.#.#.#.#.#.#########.#####.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####
|
||||
#.#.#...#.......#...#.#.#...#.#...#.....#...#.###.#.#.#.#.#.#.#.#.#.......#.#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.#.#...#.....#...#.#.#.....#
|
||||
#.#.#.###.#####.#####.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#####.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####.#
|
||||
#.#...#...#.....#...#.#...#.#.###.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.....#.#.#.#.#.#.#.#...#...#.#...#.....#.....#...#...#...#.#
|
||||
#.#####.###.#####.#.#.#####.#.###.#.#.#.###.###.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.###.###.###########.#####.#######.#.#.#
|
||||
#.#...#...#...#...#.#.......#...#.#...#.....#...#.....#.#.#.#.#.#.#...#.....#.#...#...#.#.#.#.#.#.#.#.#...###.#.........#.......#.......#...#
|
||||
#.#.#.###.###.#.###.###########.#.###########.#######.#.#.#.#.#.#.#########.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.#######.#########.###########
|
||||
#.#.#.#...#...#.###...........#.#...#.........#...#...#...#...#.#...#.....#.#.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#...###.....#...#...........#
|
||||
#.#.#.#.###.###.#############.#.###.#.#########.#.#.###########.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.###########.#
|
||||
#.#.#.#.###.....#.............#.....#.#...#.....#.#.....#.......###.#...#...#.#.#...#.#.#.#.#.#.#.#...#.#.#...#...#...#...#...#.#.....#...#.#
|
||||
#.#.#.#.#########.###################.#.#.#.#####.#####.#.#########.###.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###########.#.#.#####.#.###.#.#.#.#
|
||||
#...#...#.........#...#.....#.......#.#.#.#...#...#...#.#.#...#...#.#...#...#.#.#.#.#.#.#.#.#.#.#...#...#.#...........#.#.....#...###...#.#.#
|
||||
#########.#########.#.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###########.#####.###########.#.#
|
||||
###...###...#.......#.#...#...#.....#.#.#.#...#...#.#...#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.......#...#.#.....#.........#.#.#
|
||||
###.#.#####.#.#######.###.#####.#####.#.#.#.#####.#.#####.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.#####.#######.#.#.#
|
||||
#...#.#...#...###...#.#...#.....#...#...#...#...#.#.....#.#.....#.#.#.#.###...#.#.#...#...#.#...#.#.#.#.#.......#...#...#...###.#.......#...#
|
||||
#.###.#.#.#######.#.#.#.###.#####.#.#########.#.#.#####.#.#####.#.#.#.#.#######.#.#########.###.#.#.#.#.#.#####.###########.###.#.###########
|
||||
#...#...#.........#...#.###.......#.........#.#...#.....#.#...#.#...#.#.#.......#.......#...#...#...#.#.#.#...#.#...........#...#...........#
|
||||
###.###################.###################.#.#####.#####.#.#.#.#####.#.#.#############.#.###.#######.#.#.#.#.#.#.###########.#############.#
|
||||
###...................#.#.....#...#.........#.....#.....#...#.#.....#...#.#.....#.......#...#...#...#...#...#.#.#.....#.......#...#.........#
|
||||
#####################.#.#.###.#.#.#.#############.#####.#####.#####.#####.#.###.#.#########.###.#.#.#########.#.#####.#.#######.#.#.#########
|
||||
#...#.......#...#...#...#...#.#.#.#.........#.....#...#...#...#...#.#.....#.###.#.......###.....#.#.#...#...#.#.......#.#.......#...#...#...#
|
||||
#.#.#.#####.#.#.#.#.#######.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#####.###.#######.#########.#.#.#.#.#.#.#########.#.###########.#.#.#.#
|
||||
#.#.#.....#...#...#.........#...#...........#.#...#.#...#.#...#.#...#...#...#...#...#...#.........#.#.#.#.#.#...........#.............#.#.#.#
|
||||
#.#.#####.###################################.#.#.#.###.#.###.#.#######.#.###.###.#.#.###.#########.#.#.#.#.###########################.#.#.#
|
||||
#.#.#...#...#...#...#.....#......S###########.#.#.#...#...###.#.......#.#...#...#.#...###...#.....#...#...#.#.........#...#...#.........#.#.#
|
||||
#.#.#.#.###.#.#.#.#.#.###.#.#################.#.#.###.#######.#######.#.###.###.#.#########.#.###.#########.#.#######.#.#.#.#.#.#########.#.#
|
||||
#.#...#.#...#.#...#...###...#################.#.#...#.......#.#.......#.....#...#.........#.#.###.........#...#.....#...#.#.#.#.....#.....#.#
|
||||
#.#####.#.###.###############################.#.###.#######.#.#.#############.###########.#.#.###########.#####.###.#####.#.#.#####.#.#####.#
|
||||
#...#...#.....#.....#...#####################...#...#...#...#.#...#...........#...#.....#.#...#...........#...#.#...#...#.#.#.#...#...#...#.#
|
||||
###.#.#########.###.#.#.#########################.###.#.#.###.###.#.###########.#.#.###.#.#####.###########.#.#.#.###.#.#.#.#.#.#.#####.#.#.#
|
||||
#...#.#...#...#...#.#.#...#####################...#...#...###...#.#.........#...#.#.###.#.#...#.......#...#.#.#.#.....#.#.#.#.#.#.#.....#...#
|
||||
#.###.#.#.#.#.###.#.#.###.#####################.###.###########.#.#########.#.###.#.###.#.#.#.#######.#.#.#.#.#.#######.#.#.#.#.#.#.#########
|
||||
#...#...#...#...#.#.#...#.#...#################...#.........#...#.#.........#.#...#...#...#.#.###...#...#...#...#.......#...#...#.#...#...###
|
||||
###.###########.#.#.###.#.#.#.###################.#########.#.###.#.#########.#.#####.#####.#.###.#.#############.###############.###.#.#.###
|
||||
###...#...#...#...#.....#.#.#.#...###############.#...#.....#.....#.......#...#.....#...#...#.....#.........#...#...........#...#...#...#...#
|
||||
#####.#.#.#.#.###########.#.#.#.#.###############.#.#.#.#################.#.#######.###.#.#################.#.#.###########.#.#.###.#######.#
|
||||
#####...#.#.#...........#.#.#.#.#.........#######...#.#.....#...#...#...#.#.###.....#...#.#.....#...#.....#...#.............#.#...#.........#
|
||||
#########.#.###########.#.#.#.#.#########.###########.#####.#.#.#.#.#.#.#.#.###.#####.###.#.###.#.#.#.###.###################.###.###########
|
||||
###.......#.###.........#...#.#.........#......E#...#.......#.#...#...#...#...#.#...#.#...#...#...#...###.....#...#...#...###.#...#.....#...#
|
||||
###.#######.###.#############.#########.#########.#.#########.###############.#.#.#.#.#.#####.###############.#.#.#.#.#.#.###.#.###.###.#.#.#
|
||||
#...#.....#.#...#...#...#...#.........#...###...#.#.#...#...#.......#.....#...#.#.#...#.#.....###...#.........#.#...#...#...#.#...#...#...#.#
|
||||
#.###.###.#.#.###.#.#.#.#.#.#########.###.###.#.#.#.#.#.#.#.#######.#.###.#.###.#.#####.#.#######.#.#.#########.###########.#.###.###.#####.#
|
||||
#...#.###...#.....#.#.#.#.#.#...#...#...#.....#...#...#...#.....#...#...#.#...#.#.#.....#.#.......#.#...........#.....#.....#...#.....#...#.#
|
||||
###.#.#############.#.#.#.#.#.#.#.#.###.#######################.#.#####.#.###.#.#.#.#####.#.#######.#############.###.#.#######.#######.#.#.#
|
||||
###.#...#.........#...#...#.#.#.#.#...#.#.......#.....#.........#...#...#...#.#.#.#.......#...#...#...........#...###...#.......#.......#...#
|
||||
###.###.#.#######.#########.#.#.#.###.#.#.#####.#.###.#.###########.#.#####.#.#.#.###########.#.#.###########.#.#########.#######.###########
|
||||
#...#...#...#...#...........#.#...#...#.#.....#...#...#.......#.....#...#...#.#...###...#...#...#.........###...#.........#.....#.......#...#
|
||||
#.###.#####.#.#.#############.#####.###.#####.#####.#########.#.#######.#.###.#######.#.#.#.#############.#######.#########.###.#######.#.#.#
|
||||
#.#...#.....#.#...#.....#...#.#...#...#.....#.....#...#.......#.........#.....###...#.#...#...#.....#...#.........#...#.....###...#...#...#.#
|
||||
#.#.###.#####.###.#.###.#.#.#.#.#.###.#####.#####.###.#.#########################.#.#.#######.#.###.#.#.###########.#.#.#########.#.#.#####.#
|
||||
#.#...#.#...#.###...###...#...#.#.....#...#.......#...#...#...#.....#...#...#.....#.#.......#.#...#...#.......#.....#.#.....#...#...#...#...#
|
||||
#.###.#.#.#.#.#################.#######.#.#########.#####.#.#.#.###.#.#.#.#.#.#####.#######.#.###.###########.#.#####.#####.#.#.#######.#.###
|
||||
#...#.#.#.#...#...............#.........#.........#...#...#.#.#.#...#.#...#.#.....#.#.......#...#...#.....#...#.....#.......#.#.......#.#...#
|
||||
###.#.#.#.#####.#############.###################.###.#.###.#.#.#.###.#####.#####.#.#.#########.###.#.###.#.#######.#########.#######.#.###.#
|
||||
#...#.#...#...#.............#...#...............#.#...#...#.#...#.....#...#.#.....#.#.........#.....#.###.#.........#...#...#.#.......#.....#
|
||||
#.###.#####.#.#############.###.#.#############.#.#.#####.#.###########.#.#.#.#####.#########.#######.###.###########.#.#.#.#.#.#############
|
||||
#.....#.....#.....#...#.....#...#.......#.....#...#.......#.........#...#...#.....#...........#.....#...#.#...#...###.#...#...#.#...#.......#
|
||||
#######.#########.#.#.#.#####.#########.#.###.#####################.#.###########.#############.###.###.#.#.#.#.#.###.#########.#.#.#.#####.#
|
||||
###...#.........#.#.#.#.....#.#...#...#...#...#...###...###...#.....#.#...#...#...#.........#...###.....#...#...#.....#.......#...#...#.....#
|
||||
###.#.#########.#.#.#.#####.#.#.#.#.#.#####.###.#.###.#.###.#.#.#####.#.#.#.#.#.###.#######.#.#########################.#####.#########.#####
|
||||
#...#...........#...#.#...#.#...#...#.......###.#.#...#...#.#.#.....#...#.#.#.#.....#...###...###...#...#...............#...#.....#...#.....#
|
||||
#.###################.#.#.#.###################.#.#.#####.#.#.#####.#####.#.#.#######.#.#########.#.#.#.#.###############.#.#####.#.#.#####.#
|
||||
#...#...#...#...#...#...#...#...............#...#.#...#...#.#.###...#.....#.#.###.....#...........#...#.#.................#...###...#.#.....#
|
||||
###.#.#.#.#.#.#.#.#.#########.#############.#.###.###.#.###.#.###.###.#####.#.###.#####################.#####################.#######.#.#####
|
||||
###...#...#...#...#.....#...#.#.............#.#...#...#...#.#...#...#.###...#...#.......#.....#...#...#...........#.........#.......#.#...###
|
||||
#######################.#.#.#.#.#############.#.###.#####.#.###.###.#.###.#####.#######.#.###.#.#.#.#.###########.#.#######.#######.#.###.###
|
||||
#.................###...#.#...#...........#...#.###...#...#...#.#...#...#.....#.....###...#...#.#...#...........#...###...#...#.....#...#...#
|
||||
#.###############.###.###.###############.#.###.#####.#.#####.#.#.#####.#####.#####.#######.###.###############.#######.#.###.#.#######.###.#
|
||||
#.............#...#...#...#...............#.#...#...#.#.#...#.#.#...#...#...#.#.....#.....#.....###...#.........###.....#...#...#...###.....#
|
||||
#############.#.###.###.###.###############.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#########.#.#.###########.#######.#####.#.#########
|
||||
#.....#.......#.#...#...#...#...#...........#...#.#...#.#.#...#.....#.....#.#.#.#...#...#.....#.....#.#...........#.#.....#...#...#...#.....#
|
||||
#.###.#.#######.#.###.###.###.#.#.#############.#.#####.#.#################.#.#.#.#.###.#####.#.#####.###########.#.#.###.###.#.#####.#.###.#
|
||||
#...#.#.......#.#.....###.....#...#.............#.....#.#.............#...#...#...#.#...#...#.#.#...#...#...#.....#.#...#...#.#.#...#...#...#
|
||||
###.#.#######.#.###################.#################.#.#############.#.#.#########.#.###.#.#.#.#.#.###.#.#.#.#####.###.###.#.#.#.#.#####.###
|
||||
###.#.#...#...#...###...#...#.......#.......#...#...#.#...#...###...#...#.#.........#.#...#...#...#...#...#.#.......#...#...#...#.#.#...#...#
|
||||
###.#.#.#.#.#####.###.#.#.#.#.#######.#####.#.#.#.#.#.###.#.#.###.#.#####.#.#########.#.#############.#####.#########.###.#######.#.#.#.###.#
|
||||
#...#...#...#...#.....#...#.#.........#.....#.#.#.#.#...#.#.#.#...#...###.#.#.....###.#.###...###...#.....#.#...#.....#...#...#...#...#...#.#
|
||||
#.###########.#.###########.###########.#####.#.#.#.###.#.#.#.#.#####.###.#.#.###.###.#.###.#.###.#.#####.#.#.#.#.#####.###.#.#.#########.#.#
|
||||
#.#.......#...#...#...#...#.#...#.......#.....#.#.#.#...#.#.#.#.....#...#.#.#.#...#...#...#.#.#...#.....#.#...#...#...#.....#...#...#...#...#
|
||||
#.#.#####.#.#####.#.#.#.#.#.#.#.#.#######.#####.#.#.#.###.#.#.#####.###.#.#.#.#.###.#####.#.#.#.#######.#.#########.#.###########.#.#.#.#####
|
||||
#.#.#.....#...#...#.#...#.#.#.#.#...#...#.....#.#.#.#.#...#.#.#...#...#.#.#.#.#.###...#...#.#.#.......#.#...###.....#.............#...#.....#
|
||||
#.#.#.#######.#.###.#####.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#.#######.#.###.###.###########################.#
|
||||
#...#.#...#...#.....###...#...#.....#.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#...#...#.#...#.#...#...#...#.....#...#...#...#...#...#.......#
|
||||
#####.#.#.#.###########.#############.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.###.#.###.#.#.#.#####.#######.#.#.#.#.#.#.#.#.#.#.#######
|
||||
#.....#.#.#.#.....#...#.....#.........#.#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#...#...###.#.###...#.#...#...#.......#...#.#.#...#...#.#...#...#
|
||||
#.#####.#.#.#.###.#.#.#####.#.#########.#.#.#.#.#.#.###.#####.#.#.###.#.#.#.###.#######.#.#######.###.#.###.###########.#.#########.###.#.#.#
|
||||
#.#.....#...#...#...#.......#.###.......#.#...#.#.#...#.###...#.#.....#...#.#...#.......#.......#...#.#.#...###.......#.#.....#...#...#...#.#
|
||||
#.#.###########.#############.###.#######.#####.#.###.#.###.###.###########.#.###.#############.###.#.#.#.#####.#####.#.#####.#.#.###.#####.#
|
||||
#.#.#...........#...#...#...#...#...#...#...#...#.#...#...#...#.....#.......#.###.....#.....#...###.#.#.#.......#.....#.......#.#.###.......#
|
||||
#.#.#.###########.#.#.#.#.#.###.###.#.#.###.#.###.#.#####.###.#####.#.#######.#######.#.###.#.#####.#.#.#########.#############.#.###########
|
||||
#...#.............#...#.#.#...#...#...#.#...#.#...#.#...#.#...#.....#...#...#.#.....#.#.#...#.....#...#.#.......#.....###...###.#...........#
|
||||
#######################.#.###.###.#####.#.###.#.###.#.#.#.#.###.#######.#.#.#.#.###.#.#.#.#######.#####.#.#####.#####.###.#.###.###########.#
|
||||
#...............#.....#...#...#...###...#...#.#...#.#.#.#.#.#...#...###...#.#.#...#...#.#.....#...###...#...###.....#.....#.....#...#.......#
|
||||
#.#############.#.###.#####.###.#####.#####.#.###.#.#.#.#.#.#.###.#.#######.#.###.#####.#####.#.#####.#####.#######.#############.#.#.#######
|
||||
#.............#.#...#.....#...#.#.....#...#.#.#...#.#.#.#.#.#.....#.......#.#...#...#...#.....#.....#.#...#.....#...#...#.....#...#.#.......#
|
||||
#############.#.###.#####.###.#.#.#####.#.#.#.#.###.#.#.#.#.#############.#.###.###.#.###.#########.#.#.#.#####.#.###.#.#.###.#.###.#######.#
|
||||
#...#...###...#.....#...#.....#.#.....#.#...#.#.###.#.#.#.#...#...#.....#.#.#...###.#.###...#...#...#...#.#.....#.#...#.#...#.#...#.........#
|
||||
#.#.#.#.###.#########.#.#######.#####.#.#####.#.###.#.#.#.###.#.#.#.###.#.#.#.#####.#.#####.#.#.#.#######.#.#####.#.###.###.#.###.###########
|
||||
#.#...#...#...........#.....#...#.....#.#.....#...#...#.#.###.#.#.#.#...#.#.#.#.....#.#.....#.#.#.#.......#.....#.#.#...#...#.....#...#...###
|
||||
#.#######.#################.#.###.#####.#.#######.#####.#.###.#.#.#.#.###.#.#.#.#####.#.#####.#.#.#.###########.#.#.#.###.#########.#.#.#.###
|
||||
#.......#.#.................#.#...#...#.#...#...#.....#.#.#...#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.......#.....#...#...#...........#...#...#
|
||||
#######.#.#.#################.#.###.#.#.###.#.#.#####.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#######.#.###########.###################.#
|
||||
#.......#.#...#.....#...#...#.#.#...#...###.#.#...#...#...#.#...#.#.#.#.#...#.#...#.###...#.#.#.#.#.......#.......#...#.#.....#...#...#...#.#
|
||||
#.#######.###.#.###.#.#.#.#.#.#.#.#########.#.###.#.#######.#.###.#.#.#.#.###.#.###.#######.#.#.#.#.#############.#.#.#.#.###.#.#.#.#.#.#.#.#
|
||||
#...#...#...#...#...#.#.#.#...#.#.#...#...#.#.###.#.###.....#...#...#.#.#.....#...#.......#.#.#.#.#.#...#...#...#.#.#.#...###.#.#.#.#...#.#.#
|
||||
###.#.#.###.#####.###.#.#.#####.#.#.#.#.#.#.#.###.#.###.#######.#####.#.#########.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#####.#.#
|
||||
###...#...#.......#...#.#.#...#...#.#...#...#...#.#...#...#.....#.....#.#.........#.......#...#.#.#...#.#.#...#.#...#.......#.#.#.#...###.#.#
|
||||
#########.#########.###.#.#.#.#####.###########.#.###.###.#.#####.#####.#.#########.###########.#.#####.#.#####.###########.#.#.#.###.###.#.#
|
||||
#.........#.....#...#...#...#.....#.........#...#.#...###.#.#...#...#...#.#...#...#...#.......#...###...#.....#...#...#.....#...#...#...#.#.#
|
||||
#.#########.###.#.###.###########.#########.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.###.#.#####.#######.#######.###.#.#.#.###########.###.#.#.#
|
||||
#...#...#...###...#...#...#.......#.........#.###...#.....#...#.#...#.#...#.#.#.#...#...#...#.#.......#.......###...#.#.......#.....#...#...#
|
||||
###.#.#.#.#########.###.#.#.#######.#########.#######.#########.#.###.#.###.#.#.###.#####.#.#.#.#######.#############.#######.#.#####.#######
|
||||
#...#.#.#.#.........#...#.#.###...#...#.....#.......#.....#.....#...#.#...#.#.#...#...#...#...#.......#.#...#...#...#.#.......#.......###...#
|
||||
#.###.#.#.#.#########.###.#.###.#.###.#.###.#######.#####.#.#######.#.###.#.#.###.###.#.#############.#.#.#.#.#.#.#.#.#.#################.#.#
|
||||
#...#.#.#.#.#...#...#...#.#.#...#.....#.#...#.....#.....#.#...#.....#.#...#.#...#.#...#.....#.........#...#...#...#.#.#...................#.#
|
||||
###.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.###.###.#####.#.###.#.#####.#.###.###.#.#.#######.#.#####################.#.#####################.#
|
||||
###...#...#...#...#.....#...#...........#.....###.......#.....#.......#.....###...#.........#.......................#.......................#
|
||||
#############################################################################################################################################
|
||||
125
2024/gareth/day21/day21.go
Normal file
125
2024/gareth/day21/day21.go
Normal file
@@ -0,0 +1,125 @@
|
||||
package day21
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type coordinate struct {
|
||||
row, col int
|
||||
}
|
||||
|
||||
var numberPad = map[string]coordinate{
|
||||
"7": {0, 0}, "8": {0, 1}, "9": {0, 2},
|
||||
"4": {1, 0}, "5": {1, 1}, "6": {1, 2},
|
||||
"1": {2, 0}, "2": {2, 1}, "3": {2, 2},
|
||||
"0": {3, 1}, "A": {3, 2},
|
||||
}
|
||||
|
||||
var robotPad = map[string]coordinate{
|
||||
"^": {0, 1}, "A": {0, 2},
|
||||
"<": {1, 0}, "v": {1, 1}, ">": {1, 2},
|
||||
}
|
||||
|
||||
type cacheKey struct {
|
||||
sequence string
|
||||
iterations int
|
||||
}
|
||||
|
||||
var memo = make(map[cacheKey]int)
|
||||
|
||||
func Part1(input string) int {
|
||||
codes := parseInput(input)
|
||||
|
||||
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||
|
||||
total := 0
|
||||
for _, code := range codes {
|
||||
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||
total += codeInt * getLength(code, 3, true, numpadGraph, dirpadGraph)
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
codes := parseInput(input)
|
||||
|
||||
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||
|
||||
total := 0
|
||||
for _, code := range codes {
|
||||
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||
total += codeInt * getLength(code, 26, true, numpadGraph, dirpadGraph)
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func parseInput(input string) []string {
|
||||
parts := strings.Split(input, "\n")
|
||||
codes := []string{}
|
||||
codes = append(codes, parts...)
|
||||
return codes
|
||||
}
|
||||
|
||||
func createGraph(keypad map[string]coordinate, invalidCoords coordinate) map[string]string {
|
||||
graph := make(map[string]string)
|
||||
|
||||
for a, coordA := range keypad {
|
||||
for b, coordB := range keypad {
|
||||
x1, y1 := coordA.row, coordA.col
|
||||
x2, y2 := coordB.row, coordB.col
|
||||
|
||||
path := strings.Repeat("<", max(0, y1-y2)) +
|
||||
strings.Repeat("v", max(0, x2-x1)) +
|
||||
strings.Repeat("^", max(0, x1-x2)) +
|
||||
strings.Repeat(">", max(0, y2-y1))
|
||||
|
||||
if invalidCoords == (coordinate{x1, y2}) || invalidCoords == (coordinate{x2, y1}) {
|
||||
path = reverseString(path)
|
||||
}
|
||||
graph[a+"->"+b] = path + "A"
|
||||
}
|
||||
}
|
||||
|
||||
return graph
|
||||
}
|
||||
|
||||
func reverseString(s string) string {
|
||||
runes := []rune(s)
|
||||
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
||||
runes[i], runes[j] = runes[j], runes[i]
|
||||
}
|
||||
return string(runes)
|
||||
}
|
||||
|
||||
func getLength(sequence string, iterations int, firstIter bool, numpadGraph map[string]string, dirpadGraph map[string]string) int {
|
||||
|
||||
if iterations == 0 {
|
||||
return len(sequence)
|
||||
}
|
||||
|
||||
key := cacheKey{sequence: sequence, iterations: iterations}
|
||||
if cachedResult, exists := memo[key]; exists {
|
||||
return cachedResult
|
||||
}
|
||||
|
||||
graph := numpadGraph
|
||||
if !firstIter {
|
||||
graph = dirpadGraph
|
||||
}
|
||||
|
||||
totalLength := 0
|
||||
prev := "A"
|
||||
for _, char := range sequence {
|
||||
graphKey := prev + "->" + string(char)
|
||||
if subSequence, exists := graph[graphKey]; exists {
|
||||
totalLength += getLength(subSequence, iterations-1, false, numpadGraph, dirpadGraph)
|
||||
}
|
||||
prev = string(char)
|
||||
}
|
||||
|
||||
memo[key] = totalLength
|
||||
return totalLength
|
||||
}
|
||||
25
2024/gareth/day21/day21_test.go
Normal file
25
2024/gareth/day21/day21_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package day21
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`029A
|
||||
980A
|
||||
179A
|
||||
456A
|
||||
379A`)
|
||||
assert.Equal(t, 126384, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`029A
|
||||
980A
|
||||
179A
|
||||
456A
|
||||
379A`)
|
||||
assert.Equal(t, 126384, r)
|
||||
}
|
||||
5
2024/gareth/day21/input.txt
Normal file
5
2024/gareth/day21/input.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
985A
|
||||
540A
|
||||
463A
|
||||
671A
|
||||
382A
|
||||
112
2024/gareth/day22/day22.go
Normal file
112
2024/gareth/day22/day22.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package day22
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Queue struct {
|
||||
data []int
|
||||
size int
|
||||
}
|
||||
|
||||
func NewQueue(size int) *Queue {
|
||||
return &Queue{
|
||||
data: make([]int, 0, size),
|
||||
size: size,
|
||||
}
|
||||
}
|
||||
|
||||
func (queue *Queue) Push(value int) {
|
||||
if len(queue.data) == queue.size {
|
||||
queue.data = queue.data[1:]
|
||||
}
|
||||
queue.data = append(queue.data, value)
|
||||
}
|
||||
|
||||
func (queue *Queue) Get() []int {
|
||||
return queue.data
|
||||
}
|
||||
|
||||
func (queue *Queue) String() string {
|
||||
strs := make([]string, len(queue.data))
|
||||
for i, val := range queue.data {
|
||||
strs[i] = fmt.Sprintf("%d", val)
|
||||
}
|
||||
return strings.Join(strs, ", ")
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
secretNumbers := parseInput(input)
|
||||
|
||||
total := 0
|
||||
for _, number := range secretNumbers {
|
||||
for i := 0; i < 2000; i++ {
|
||||
number = getNextNumber(number)
|
||||
}
|
||||
total += number
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
secretNumbers := parseInput(input)
|
||||
memo := make(map[string]int)
|
||||
|
||||
for _, number := range secretNumbers {
|
||||
seen := make(map[string]bool)
|
||||
queue := NewQueue(4)
|
||||
prevNumber := secretNumbers[0] % 10
|
||||
|
||||
for i := 0; i < 2000; i++ {
|
||||
singleNumber := number % 10
|
||||
cost := singleNumber - prevNumber
|
||||
queue.Push(cost)
|
||||
if i > 3 {
|
||||
if _, ok := seen[queue.String()]; !ok {
|
||||
memo[queue.String()] += singleNumber
|
||||
seen[queue.String()] = true
|
||||
}
|
||||
}
|
||||
prevNumber = singleNumber
|
||||
number = getNextNumber(number)
|
||||
}
|
||||
}
|
||||
return maxMapValue(memo)
|
||||
}
|
||||
|
||||
func parseInput(input string) []int {
|
||||
parts := strings.Split(input, "\n")
|
||||
secretNumbers := []int{}
|
||||
for _, part := range parts {
|
||||
num, _ := strconv.Atoi(part)
|
||||
secretNumbers = append(secretNumbers, num)
|
||||
}
|
||||
|
||||
return secretNumbers
|
||||
}
|
||||
|
||||
func getNextNumber(number int) int {
|
||||
step1 := (number * 64) ^ number
|
||||
step1 = step1 % 16777216
|
||||
|
||||
step2 := (step1 / 32) ^ step1
|
||||
step2 = step2 % 16777216
|
||||
|
||||
step3 := (step2 * 2048) ^ step2
|
||||
step3 = step3 % 16777216
|
||||
|
||||
return step3
|
||||
}
|
||||
|
||||
func maxMapValue(memo map[string]int) int {
|
||||
maxValue := 0
|
||||
|
||||
for _, value := range memo {
|
||||
if value > maxValue {
|
||||
maxValue = value
|
||||
}
|
||||
}
|
||||
return maxValue
|
||||
}
|
||||
23
2024/gareth/day22/day22_test.go
Normal file
23
2024/gareth/day22/day22_test.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package day22
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`1
|
||||
10
|
||||
100
|
||||
2024`)
|
||||
assert.Equal(t, 37327623, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`1
|
||||
2
|
||||
3
|
||||
2024`)
|
||||
assert.Equal(t, 23, r)
|
||||
}
|
||||
1629
2024/gareth/day22/input.txt
Normal file
1629
2024/gareth/day22/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
11
2024/gareth/go.mod
Normal file
11
2024/gareth/go.mod
Normal file
@@ -0,0 +1,11 @@
|
||||
module aoc2024
|
||||
|
||||
go 1.23.2
|
||||
|
||||
require github.com/stretchr/testify v1.10.0
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
9
2024/gareth/go.sum
Normal file
9
2024/gareth/go.sum
Normal file
@@ -0,0 +1,9 @@
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
17
2024/gareth/main.go
Normal file
17
2024/gareth/main.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"aoc2024/day22"
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
start := time.Now()
|
||||
data, _ := os.ReadFile("day22/input.txt")
|
||||
fmt.Printf("part 1: %d\n", day22.Part1(string(data)))
|
||||
fmt.Printf("part 2: %d\n", day22.Part2(string(data)))
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Execution time: %s\n", elapsed)
|
||||
}
|
||||
@@ -35,7 +35,7 @@ func Part2(input string) int {
|
||||
list2 := make(map[int]int)
|
||||
|
||||
|
||||
num := 0
|
||||
num := 1
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
fields := strings.Fields(line)
|
||||
|
||||
105
2024/go/day02/day02.go
Normal file
105
2024/go/day02/day02.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package day02
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
_ "adventofcode2024/utils"
|
||||
_ "adventofcode2024/utils/grid2d"
|
||||
_ "adventofcode2024/utils/inputs"
|
||||
_ "errors"
|
||||
_ "fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Dir int
|
||||
|
||||
const (
|
||||
Up Dir = iota
|
||||
Down
|
||||
Safe
|
||||
Unsafe
|
||||
)
|
||||
|
||||
// Implement the Stringer interface
|
||||
func (d Dir) String() string {
|
||||
switch d {
|
||||
case Up:
|
||||
return "Up"
|
||||
case Down:
|
||||
return "Down"
|
||||
case Safe:
|
||||
return "Safe"
|
||||
case Unsafe:
|
||||
return "Unsafe"
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
count := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
fields := strings.Fields(line)
|
||||
if isSafe(fields) {count++}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
count := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
fields := strings.Fields(line)
|
||||
if isSafe(fields) {
|
||||
count++
|
||||
} else {
|
||||
for i := 0; i < len(fields); i++ {
|
||||
// Create a new slice excluding the current item
|
||||
newFields := applyDampner(fields, i)
|
||||
if isSafe(newFields) {
|
||||
count++
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func isSafe(fields []string) bool {
|
||||
Dir := getDir(utils.MustAtoi(fields[0]), utils.MustAtoi(fields[1]))
|
||||
if Dir == Unsafe {
|
||||
return false
|
||||
}
|
||||
for x := 2; x < len(fields); x++ {
|
||||
NextDir := getDir(utils.MustAtoi(fields[x-1]), utils.MustAtoi(fields[x]))
|
||||
if NextDir == Unsafe {
|
||||
return false
|
||||
}
|
||||
if NextDir != Dir {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func getDir(a int, b int) Dir {
|
||||
var dir Dir
|
||||
diff := b - a
|
||||
if diff > 0 && utils.Abs(diff) < 4 {
|
||||
dir = Up
|
||||
} else if diff < 0 && utils.Abs(diff) < 4 {
|
||||
dir = Down
|
||||
} else {
|
||||
dir = Unsafe
|
||||
}
|
||||
return dir
|
||||
}
|
||||
|
||||
func applyDampner(fields []string, pos int) []string {
|
||||
copy := append([]string{}, fields...)
|
||||
if pos < 0 || pos >= len(copy) {
|
||||
return copy // Return the fields unchanged if pos is invalid
|
||||
}
|
||||
return append(copy[:pos], copy[pos+1:]...)
|
||||
}
|
||||
29
2024/go/day02/day02_test.go
Normal file
29
2024/go/day02/day02_test.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package day02
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(
|
||||
`7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9`)
|
||||
require.Equal(t, 2, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(
|
||||
`7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9`)
|
||||
require.Equal(t, 4, r)
|
||||
}
|
||||
1000
2024/go/day02/input.txt
Normal file
1000
2024/go/day02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
64
2024/go/day03/day03.go
Normal file
64
2024/go/day03/day03.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package day03
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
"fmt"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
val := 0
|
||||
|
||||
pattern := `mul\((\d{1,3}),(\d{1,3})\)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
matches := re.FindAllStringSubmatch(input, -1)
|
||||
|
||||
fmt.Println("Matches found:")
|
||||
for _, match := range matches {
|
||||
if len(match) == 3 { // match[1] is x, match[2] is y
|
||||
x := utils.MustAtoi(match[1])
|
||||
y := utils.MustAtoi(match[2])
|
||||
val += x * y
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
val := 0
|
||||
pattern := `mul\((\d{1,3}),(\d{1,3})\)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
matches := re.FindAllStringSubmatchIndex(input, -1)
|
||||
|
||||
fmt.Println("Matches found:")
|
||||
for _, match := range matches {
|
||||
if len(match) == 6 {
|
||||
xStart, xEnd := match[2], match[3]
|
||||
yStart, yEnd := match[4], match[5]
|
||||
x := utils.MustAtoi(input[xStart:xEnd])
|
||||
y := utils.MustAtoi(input[yStart:yEnd])
|
||||
if do(input[:xStart]) {
|
||||
val += x * y
|
||||
}
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func do(input string) bool {
|
||||
pattern := `don't\(\)|do\(\)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
|
||||
matches := re.FindAllString(input, -1)
|
||||
|
||||
if len(matches) > 0 {
|
||||
// Get the last match
|
||||
lastMatch := matches[len(matches)-1]
|
||||
if lastMatch == "don't()" {
|
||||
return false
|
||||
} else if lastMatch == "do()" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
17
2024/go/day03/day03_test.go
Normal file
17
2024/go/day03/day03_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package day03
|
||||
|
||||
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("xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))")
|
||||
require.Equal(t, 48, r)
|
||||
}
|
||||
6
2024/go/day03/input.txt
Normal file
6
2024/go/day03/input.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
~-mul(858,892)?@#mul(380,985)what()[^what()%mul(340,11)~*}don't())/~-mul(849,387)%-why()when():how()>-,what()mul(605,504)what()~:]what();how()who()];mul(771,783)?^ who()}~?>mul(111,830))@ ~mul(329,797)%'why()why()mul(125,409)-*/where()()@&!why()mul(390,37)when(974,538)#/when()){/don't()/mul(20,990)}?%{(who()mul(627,567)(how()'<(#%how()mul(387,315){;%who()%#from()mul(868,680)}^$mul(862,19)mul(847,689)>((#@when()}mul(339,156)+/{}@{^%[why(231,704)mul(236,754)]'^where(978,690)mul(460,872)#'*mul(518,944)>mul(301,886))mul(477,933)^mul(685,909)who())]what(288,791)mul(170,434){ &where()~(@where()mul(191,104)mul(637,600)&select()why())~select()mul(534,617)?mul(763,508){from()when(22,266)+who() when()mul(204,352)when()mul(426,122)-<*where()'$ why()mul(192,980)[(#[!$-}mul(798,208)''[!where()what()select()mul(295,727))#)}($<?<mul(452,502)(don't()mul(737,492)>,$%where(539,126)what()when()select()'@mul(311,541),?don't()#select()!}!(}&?mul(100,142)),-}%mul(222,856)~$;>!from()where()mul(758,901)mul(757,796)mul(976,686);@'~+-{#who()mul(26,971);mul(404,362)^~who(417,106)what()#mul(186,691)from() %#+{/mul(67,433)-who()!-+!mul(184,469)*when()[&when(458,221)<$mul(163,556)^)]?,'}&+who()mul(514,239)~)(mul(143,441)'how(741,776)~who(766,575)when();>*^mul(281,143)+!>;+:mul(767,44)#<mul(490,849)> when()why()don't()how()from()[from()from(){mul(436,519)what() *who();@{,>do()%'mul(19,540)when()mul(643,539)~when(812,543)mul(527,639)-!mul(409,379)where()/(mul(168,491)#$>]mul(432,333)@%<when();{?what()^mul(819,413)'where(65,845)}-' ^@don't()?how()when()>><mul(591,832)where(600,755)]who()}do()!^-$what()from()select()'#mul(572,956)@#:what()from(),]mul(303,346) when()$$how()@%/#$mul(857,344)/what()where()mul(969,234)$!#when()>>&who()(mul(113,494)%where()why()when()mul(659,592)<why()!<}mul(429,162)[who()*>#(/'mul(72,670)when()^^mul(369,596)mul(631,168)-why()()[*}mul(330,968) $why()where()mul(230,139)don't()@)@<mul(849,413)-when(){*?]mul(821,9)mul(753,277)]{&when()%:mul(262,360)what()mul(65,276)don't()])who();where()$!,(-mul(952,221)+:/{where()where()mul(608,843)'>where())%}where()&,}mul(875,661)~don't()':why(){mul(793*:mul(399,702)!://select()@when()why()do()@mul(488,581{?{&<who(617,140)@how()mul(156,982)why()'&<where()*:{mul(452{-+$$*/mul(202,724)]#:#why()+??(#mul(607,2)@^mul(20,845)#{+#[/#~/mul(111,872)how()select()]<how())'how()mul(921,254)$:;/where() ~why()}?mul(558,122)@how()<<who()mul(992,319)what(734,450)[^mul(498,490)/mul(632,639)when()]from(){why()]$[who(664,268)mul(401,695]!>how()&select()!<'mul(912,311)why()! })@+}mul(128*mul(626,752)%mul(49,60)[,who()what()select()<what()mul(24,8)>)@@]*]why(937,788)from():mul(945,658)<]don't()where()how(515,644)@+'select()how()mul(369,665)/],<when(){( $how()mul(361,594)$select()&:{:$when()mul(52,806) #from()@when()where():>mul(263,185)where()^why()why()@what()mul(82,407)mul(464,537)[mul(871,333)^mul(560,227)-why()mul(966,203)$what()+where()#mul(101,21)}%how(),)^who()>,select()mul(667,565)('what(),%select()(@mul(500,204:''<~'why(477,559)<do()>)[where()mul(698,648);how(){&?what()^@[%mul(280,395)>~, mul-#/%:where()>where():mul(170,746)don't()}($:@mul(998,876)*~<[mul(121,366)-?#;how()>from() ::mul(804,883)^-[ (:mul(100,354who(544,766)+,]>!['/;mul(949,115)
|
||||
[^!})from()&mul(617,518)*how()(:@who()what()/mul(591,163):what()?{'do()!/when()!$mul(394,797)]how(620,741)!:!mul&%mul(523,862) ~}where()why()}from()! @do()mul(270,205)from()[&^mul(577,474)?{*/why()*what()mul(656,30)where()+#,@mul(295,616)why()/mul(8,267))-^when()who(610,661)'mul(182,139)select()}select()!when();;mul(492,992)?how()~($who(716,562)%/mul(702,654))*>mul(126,386)[mul(351,400)select()%$[!}{+mul(98,266)mul(924,5)*'(^:[}!?mul(112,163)+!?where()mul(987,791)mul(943,488)how()mul(698,312)&:@from(442,439)~%~:mul(235,520)%mul(248,221&>/;select()what()) ~@from()mul(546,261)'mul(956,953why(458,937)when()~!where();mul(442,916)%;)&(mul(410,237)where()~why()[+?[mul(169,337)what()who()&what()mul(901<where()#&who(808,156)-mul(322,634)>/mul* don't()mul(999,662)*]&/'#<+<select(621,69)do()>,^}'mul(365,260){{?,,}from(520,861)where()what()mul(325,208): when()+>{!;mul(335,726)#',:>@?mul(48,443![mul(130,626)!{</#%*select()mul(806,140)'']'~mul(697,649)&,+??[%?how()mul(515,385)mul(878,769)^when()&what()]:$)*%don't()#){/mul(119,439)-[,+!'don't()^<what()~^-[(-%mul(791,824)+>^don't()*?-*[%>mul(934,995),how()@from()'<mul(907,832)?% who()(*[do()%:where()what()>#mul(433,843)why()<}$}how()-mul(754,464)when()why()mul(992,113);]/{%mul(87,293^]how()why()~&when()*#mul(589,979)@-&select()/%mul(218,248);mul(536,581)when()mul(215,212)/%when(66,857)@what()+mul(958,271) '%#who()&{mul(239,197)}what()$>{*'select()mul(365,443)>why()how()what()%mul(885,496how()when()}{@/ mul(589,42)^:;who()where()why() !how()(mul(574,947)*;where():&where()%]<{mul(572,4)$mul(232,716)when()<?>when()mul(928,697)^(where()mul(301,501)-mul(100,436)#~?mul(708,770): @:@)!*mul(89,177)><where()]mul(699,985)(-)do()#who()mul(194,358)why():when()/why()where()mul(103,669)#mul(779,400)@when()~/;/({mul(760,763&-when()%]where()*#mul(781,829)*select()><@+ {when()+mul(926,998);>,)?,$)mul(813,382)}from(728,403)^mul(497,820)where()(?why(454,153)!select()}*!don't()what()from()}&}<?)([mul(379,305)!when(): don't() ~~why()@&%mul(953,224))![*)/mul(802,693):;mul(126,477)-when(409,550){mul(238,713)!/!why()-}+>?how()mul(432,895)$!+mul(743,149)$!why(704,998)when()mul(229,683)((when()from()#&{mul(217,869)^)?)?what() select()}mul(765,209)who():}%{mul(448,553)[:-,don't()what()<,}from()where())mul(543,719)from(415,153)why()!'?^~mul(666,540)mul(922,877)mul(416,636)+#;$select()'mul(971,485)from(964,539)where()^ *who()/mul(35,594)<:mul(207,585)~*}'<when()>[]#mul(815,776){?%&*@?mul(385,133)['!:who() )mul(439,846)&)mul(529;?>;#mul(677,906)^& ()mul(75])how())mul(481,206)who()why()$^ from();what()'why()do()(%^&)mul(277,454)>where()where()$-#select()+/don't()what()select()]mul(295,126)why();from()mul(203,301){#mul(572,420){%(-*mul(929,786)do()mul(107,813)mul(921,668)'^+++!:[;mul(587,921)mul(242,920)mul(933,463)why()mul(340,196)'--']-mul(623,675)select()what()mul(656,927)<$)from()where(473,933)]~mul(408,566)!>$mul(373,541)}%*^)mul(346,14)>&how()@^-(&;mul(993,735)select()*{mul(990,221)*from():[ mul(940,96)/how()^>#;select()/#?mul(624,249)>mul(160,974)]^mul(589,900)&$[?[<-!select()mul(512,717)^/&mul(226,478)* ';'+from()?@~mul(224,929)!when()^what()where()'@'>~mul(451,87)
|
||||
when()%how()where()how()what() mul(59,36)how()where() )><when()[(mul(776,247)when()# &why())}?mul(331,460)]how()/why(382,926)&*mul(494,482)'*;~#/select()?who(828,76)mul(205,327)~:how(),^how()why()mul(466,546)+'~&mul(481,829?who()!{+who()from()^(%>mul(270,950)--mul(864,193)$!!from()[+when()do()?&]from(){?who()mul(576,443)}>*what()mul(60,617)]where(){*}what(16,936)*:mul(613,575) @$%%'mul(930,241)!~when()<+what()&{mul(189,41)don't()how()%who()how()mul(79,681){']{({ mul(615,354)~#&{mul(863,397)<?;how()mul(264,31>@?(mul(469,991)!mul(97,649)'%{where()/{+*}when()mul(429,913)[ >where()>](when(654,639)),mul(763,148):!~do()%+*',mul(646,831)~*$!?>mul(632 @?from()[mul(165,564)#mul(464,289)from(),mul(197,442)~[&mul(739,935)how()where()!],mul(583,831){mul(4,501)mul(912,584):select()(when()>&& &what()mul(836,498)where(987,400)*${mul(983,648)+~]don't()&,how()'^[*({mul(180,898)mul(982,907): select()($what()mul(294,259)do()where();>mul(130,154)mul(566,682)how()-:from()/ )^mul(50,250)~@select()(->mul(65,434)mul(865,288)+$don't()#+-<when()mul(348,972)#{^*<who()&,mul(545,238)select()mul(736,427)$from()mul(24,605)select():mul(183,229) do()-$where()$where()how()#[why(){mul(440,221)?when(171,776)$mul(930,461)?mul(118,801)how(162,609)where()'why()@ ;:$mul(538,213)>mul(875,123)@@>?mul(606,377);do();!where(){mul(267,543):]','# #*why()mul(31,575)#;who() *<$mul(797,419)'what()}when():what()/mul(627,73)'how(218,429)who()]*$,$from()mul(221,471)$ ;what()mul(38,106)?-&!~&from()mul(117,669):how()mul(422,348)(:/]mul(568,980)when(){~where(490,375)<(& mul'*)'where();##:}mul(34,144)mul(352,352) select()-when()/where(365,161)mul(571,634)mul(373,66)}how()don't()where()@>$$(!&mul(532,260))!mul(304,873)select(676,286)?#<,why(),<!do()/what()]?~^where(558,20)mul(744,233)^''mul(119[/%where()why()%who()mul(797,726)~*why()mul(743,436)?/-why()mul(399,351)mul(398,28))what()(when()/$what(169,128)>^~do()%@~where()mul(56&+select()>select()what()mul(670,288)< $:+<mul(706,866),)when()when()from()mul(391,781)~mul(142,120)>[$~what(){@!%mul(422,126)(who()?from()}*}mul(459,923)mul(38,243)^)!who()::#from()/mul(845,589)^/when()'#when()~,'select()mul(454,166)who()~>when()^when()?'@where()mul(237,855)~from()from()why()mul(233,606)]@mul(947,750)!@*}who()(@%mul(252,951)[from(995,363))}),when()who()+where()mul(368,442)>from()where()select()from()what()^?mul(190,689)mul(337#who()*when()/*mul(652,631);,*why()+select()>}where()%mul(839,296)>&%,@}$mul(723,530)who(685,511) %~where(782,449)mul(36,917);]]{mul@where()!&*%why()mul(191,759):why()what()$mul(900,773):$who() *{mul(426,740) why(396,306)/from()why()*%}'+do()@!'how()%^/mul(970,462)when()who()!-mul(535,35)}from(377,342)when()/(how()who()-}:mul-what()/how()?*^how()mul(217,447)/]?%!mul(495,690)}#<{?,do()+-why()<mul(613,900)<@when()@)from()mul(590,34)-why()mul(524,292)>mul(3,559)who()+what()mul(942,139)})when()who()<-]'what()what()mul(218,316)how()mul(669,389),<+mul(861,165)why(){^}[mul(594,386what()who(){mul(801,662)mul(852,2)-mul(458,479)//mul{don't()mul(826,480)>mul(954,968)$;mul(871,184)from()select()**<]!mul(503,290)#select()where()?do()mul(154%[&how()?mul(279,673)-[don't()$]why()-what(754,13)mul(841,495)where()}{mul<-'##!/usr/bin/perl@~mul?what()<^-@/>from()!mul(573,383)where()-{#mul(420,579)when(977,697)when() &@##from()+}mul(314,487)
|
||||
who()+from()where()mul(878,982)]~mul(812,80)?select()don't()how()];mul(986,548)/how(311,658)/select()(don't()(select()select(533,328)<^+from()what()why()@mul(786,152)*<[ }},)mul(30,285)mul(721,12)#(-{what()mul(70,496)^when()-/how(420,87)select()what()]$mul(645,406);-~where()>do()~&^(,}$#$mul(993,357)?/select()}do()+from()~@mul(661,590))what()*!?]*!'mul(19,345)-why())select(){%(% don't():*#when()~select()mul(910,416)}mul(550,400)<from();/)$who()mul(107,198)*^;what()*mul(585,659)]}<*[mul(408,612)(how()+'[don't()select()mul(910,993)({[who(895,379)>when()]~mul(515,93)&where()mul(412,99);(;+mul(611,500%what()%,from()when()mul(822,769),-*(([$(mul(153,856)why(){mul(476,25)do()-mul?from()<<[why()&mul(859,60)what()]+ :how()what(434,726):^from()do()}*?}?mul(432,641)>%<why();where()mul(722,325)who()why()do()'$,>?!mul(93,484)++}?mulwho()#>who()select(): why()mul(889,212)>]?where()&mul(808,71)<*/'-+select()mul(523,619)+#where()mul(324,306)why()';why()}mul(337,315)~:what():^?-$from()mul(924,137)mul(444,59)why()[from()how()who()mul/how()>mul(304,707)'select() select()mul(224,915)mul(991,306)[>$! &how()>/mul(719,679)how()select()mul(65,620)from()#'~:]<mul(906,303)}what():how()&%^select():{mul(644,751),^,&,!*'@mul(323,720)why()>+-from()]mul(971,857)how()#[~~]?%mul(230,961)from()from())# } where()mul(330,14)>mul(411,981)}}<)mul(304,453)how()from()$who()mul(573,848)% ;:<mul(23,887)>from()(~select()!mul(542,790)}'#mul(530,502)%$(-#$mul(358,540)mul(10,361)when()where()<}&where()mul(429+!*$~)mul(446,812)%when()don't()>~>^what()select()why()from()where()mul(330,214) -[mul(731,164)/mul(776,235)mul(240,20)who()^what()']@!-who()%don't()(( )'!how()why();>mul(941,911)'?where()from()how()/mul(489,746(select(725,995)-from()?;when()%]%<mul(293,629){;what();(~!<mul(176,456)<~who(252,77)who()~{why()?]&mul(587,279){%?]from()<?mul(313,626)@[/how()+&don't()mul(298,798@!'&when()~(#[mul(827,523)from()$ where()who()%mul(54,803))*mulselect()%mul(500,731)mul(946,993&;{/;where()^where()mul(795,350)where(),~ @^how()-]mul(995,399)%who()do()where()mul(911,909$(?!$]]~what()mul(151,846)[select(636,807)mul(111,19)where(){^mul(730,317)who()^do()'~#]$/$@<>mul(555,315),how()#%!><from();mul(845,939)>?mul(664,596how()+'-who()from(51,408)mul(605,672)?!%from()) #}don't():}mul(579where()mul(243,699)mul(321,902)*!/mul(465,704)*when()[*how()mul-!mul(15,80)}#}mul(413,156)(;mul(71,288)/$;'don't(),how()+[;$who()%$when()mul(516,863)mul(268,600)(</from()~how()'<how()where()mul(715,920)&,mul(989,598)[~where()where()mul(635,110);from()*mul(843,35)&*}@[how(232,546)'-+ mul(979,532)[do()&mul(649,85)]how(832,401)-;mul(876,724)-[mul(432,417)!from()select()]mul(967,886'mul(561,191)#mul(660,865)-}~#mul(736$mul(623,276)from(93,634)^<&-+!@(how()mul(543,427)]#what()from()mul(247,751))from()where()+/^@!;?mul(919,365)where()]&!{-:~why()mul(220,330):]&mul(919,207)-&who()?*how()#%mul(759,323)!how()how()mul(695,755)[{mul(426,127)-{% /~mul '*&how()who()^(mul(797,201)'mul(509from()when()(@(<()don't() :&mul(852,261)<#^]from()mul(981,414)(</who()*do()(+where()*'why()what(229,53)+mul(954,398)mul(148,957)what()^&*mul(92,295)select(){mul(146,508) who()}[>mul(602,939)who())>)<&'!mul(323,967)?mul(673,398)):&#}>>{!mul(501,484)<;who(969,453)-who(624,921)-)<-mul(72{-//!mul(576,751)mul(318,331)mul(707,186)+how()mul(660#how()!+#?where()mul(547,453)
|
||||
[what()?->+[mul(266,969)what()from()%^!how()?mul(236,335) )'<>,&!-where()mul(563-select()(mul(405,969)when()[%;why():$]mul(266,763)what()~#-<how()?mul(574,316))^;//}:when()}}mul(798,955)%?(%}*>{+don't()~+-mul(68,150)#{{?%:mul(422,966)select()mul(143,33);mul(917,142))]'>mul(23,457);'what()why()-where()}/>mul(66,911)&&':(>why()>mul(413,27)mul(772,64)mul(266,512)%$<what()who()*-)mul(169,905))where()do()~where(),how()^:what()mul(584,453{#&&:how():,how():%mul(937,5)mul(974+:when()where()~}+-<mul(356,901)~?]when()select()mul(933,555)&'-mul(728,399){&>*[why()<mul(862,418)?>:where(),@%^',mul(750,295)*]:<mul(491,8)#^&mul(801,442)where()where()@/how()+where(17,463)(select()mul(460,732)*what()}/-})>mul(17,60)!!}*from(975,930)mul(763,134)mul(463,381)when()(select()where()+{?what()mul(755,843)!why()+>mul(24,584){mul(105,734)$why()@where()!+what()%what()mul(5,111)#^;?{^/?^~mul(24@>when()what()where()#from(284,9)when(437,59)mul(978,337))+:(select()mul(996,373)(what(188,513)@ ]from()}mul(370,765)~$mul(490,904))]/%who()why()/mul(123,978how()why()[who()~%how(180,982)<mul(251,677)!%(>@:mul(343,157)![/*^mul(157,976)who()from() select()]+?+do();)&)<from()!/select()mul(143,894)]<*,?mul(900,759)]:%@:mul(496,2)*don't())-$# ?!>mul(734,420)$%(select()>'mul(143]mul(4,351)mul(279,828)'}^mul(108,132) #how()why()}mul(573,602)}@mul(747,126)where()'@mul(247>why())when()+::^&from()mul(843,212)^mul(612,743)[mul(204,899)$mul(174,265)%]mul(864,804)-from()how()%%mul(674,431)^^#[(@:&*mul(619,935)select()//~^mul(70,941)why()select(405,825)why()who()@mul(112,658)'+(@!$who(){select()do()from()from()@how(846,925)mul(417,888)~{: who()&-;mul(285,186)-+what(){/+-mul(24,944''mul(935,370)why()?~ +mul(468,38)'why()(/mul(704,512)%mul(946,591,<);from()select(290,495)*{:<do(),)/mul(522,493)(^mul(182,31)/mul(330,74);'%:mul(793,487)-;where()who(){where(590,54)(mulwhen()@ :]!mul(812,795)(:mul(468,59-(how())where()',;mul(263,506);^why()mul(159,826)(,: /$mul(179,478)[,(who()>['%mul(554,965)<why(920,323)mul(3,344)do()]why()mul(353,389)' )+)%from()do()select()#>(~mul(308,534)mul(6,373)^how()@%&how()~mul(669,386)when() 'mul(33,652)mul(950,268)::mul(98,181)]^how()'!mul(982,613)how()&where()]what()how()do()[from()#[? mul(929,452)<$$<who();^]don't()&what()-]}<&from(),~mul(721,96)$}^[what(272,30)&who()mul(107,629)why()why()where()-how()/}from()+mul(718,337) *mul(49,736)why()&/'where(888,569)#&where()]+mul(728,703)!'> mul(506,408)-mul(670,674)how()mul(645,104)do()(>[%from()@'who()&%mul(45,884)mul(895,714)mul(871,6)},?&;!select()#where(779,295)^mul(113,370)why())%[select()[,^' mul(976,960)][%mul(828,993){}}mul(135,443)>what()mul(344,20)>where()/) :@mul(564,715){([,]'mul(675,478)#*@who()>]$*+mul(94,992}<mul(565,578)/mul(85,827)mul(565%do()/+{[mul(956,611)what()mul(807,414)]what()how(521,834)]where()}>from()mul(288,445)mul(72,57)*/})how()[how()!mul(543**%who():what()mul(345,778){mul(462,244)from()[@*who(),+mul(591,870)#select()%mul(779,654)$+%%@ mul(920,934)?-select()-}mul(247,709)@$why()mul(179,824)(when(989,252)?mul(422,816)$[from()#who()<mul(672,845)mul(118,135)
|
||||
*what()}[*how()?why()mul(386,104)[from()];mul(208,918))){(+<how(),:how()mul(694,384)@!-*{mul(69,248)?',what(), ^<;mul(902,984)*mul(369,924)^?^mul(594,537)>@,when(),mul(922,47)@mulwhy()-mul(890,397)-^/+'select()[&!who()mul(547,6)-]>:^;mul(870,938),~?[%mul(8,689!>*@!]mul(311,244)->how()$when()'}mul(213,766)$:!+ mul(620,644)%where()mul(430,127)%{[mul(682,585)mul(245,26)don't()mul(510,688)where()]-mul(844,443)/@+who()?who()when()mul(453,182)mul(928,131)<select()who()(]mul(422,986)[&&who()[how()$mul(54,860)!]{;mul(549,103)<%;mul(807,173)/mul(513,515)@mul(852,657)'#when(293,457)$&+why()mul(694,888)*why()mul(912,542)$$!:$mul(776,404^$$}&(mul(965,836)-what()*:]mul(97,471)/*~]what(){[what()mul(241,843)where()[^mul(639,208'}(- who()how()mul(869,533)how()who()what()select()%don't() where()(why(811,325)!<where()^~;mul(955,806)][)])+,% mul(207,798):&who(),<where() how()mul(857,424::,]mul(250,416)select()'{mul(815,806)[)/@mul(285,41)$mul(901,755)from()!)?why()){!mul(78>?&'{[+@?,mul(55,18)mul(795,739):}what())@$]'mul(377,34)&,~*why()<do()<mul(795,39)where()$%+?>/@who()mul(467,127))&how(28,925)mul(955,519)}where(830,382)$when()[-why()/+mul(310,139)mul(217,931)!mul(574,122)!mul(227,82)where()mul(940,851) {mul(545,758)<select()?[mul(720,337)mul(52,940)~how()from(855,795)*mul(664,962)>:from()%~/mul(937,897)mul(665,919)^&/ &what()mul(23,37),select()%*mul(98,952);mul(171,967)who()$+]when()%$mul(426,870)<<;;why()[do()@mul(28,286)-what()([+select()why()do()<^+what()^?~-mul(246,992)/mul(938,936)'$>when()mul(18,736)%?how()-what()from() <do()mul(994,498);<,how(800,873)[%/&mul(260,162)why()]when())(what()}#don't() mul(99,24)(*!@]]mul(490,150)~mul(47,794)$#}where()(who(){what():mul(369,830)mul(24,75)where():(,@)]$~mul(509,783)mul(914,160)+mul(619,799)&@~how()from()mul(445,64)*>when()select()mul(37,387)}<[}?+how()#&?mul(779,369)select()mul(750,510)%[,'from()>who()mul(13,97)what(547,477)why(859,962)?,where()mul(806,879)mul(577,179)#from()+>where(705,292)what(712,121))when(227,970)*mul(942,336)& who())!<mul(345,567)/-select(838,572)-~'*)why()[mul(12,866)@^where()?<mul(985,870)where(503,821);^mul(803,551)'[%#where()-who())mul(38,22)^}$who()?,how()%what(528,476)who()mul(486,865)<(/mul(714,503)%%,$select()]mul(299,58)-when()~why()-}mul(684,388) /^<:[;:don't()why()who()<who()-{mul(413,975),>*mul(992,750):from()<:+-mul(938,672)mul(55,872)mul(354,183)>+(+mul(520,932)#from():}{who()$mul(675,973)@^@%mul(58,468)/select()what()->]mul(343,375)^ ,%mul(480,300)where()(/*$mul(695,676)how()where(),-!:from()mul(363,212)~(!where()-[what()don't()mul(614,594))mul(569,802)'mul(995,471)~&$:^:how()how()-^mul(853,428)-;-%what()(from()+do()'where()() !{^?#mul(376,780)select())where()select()&{-,{,mul(894,646)select()*< @}*[}}mul(332,665)[
|
||||
59
2024/go/day04/day04.go
Normal file
59
2024/go/day04/day04.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package day04
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
val := 0
|
||||
grid := inputs.ToGrid2D(input, "\n", "", '.', func(c string) rune { return rune(c[0])})
|
||||
directions := [][]int{{0,1},{0,-1},{1,0},{-1,0},{-1,1},{1,1},{-1,-1},{1,-1}}
|
||||
for j := 0; j < grid.SizeY(); j++ {
|
||||
for i := 0; i < grid.SizeX(); i++ {
|
||||
if !checkChar(i, j, grid, 'X') { continue }
|
||||
for _, dir := range directions {
|
||||
x := i + dir[0]
|
||||
y := j + dir[1]
|
||||
if !checkChar(x, y, grid, 'M') { continue }
|
||||
x = x + dir[0]
|
||||
y = y + dir[1]
|
||||
if !checkChar(x, y, grid, 'A') { continue }
|
||||
x = x + dir[0]
|
||||
y = y + dir[1]
|
||||
if !checkChar(x, y, grid, 'S') { continue }
|
||||
val++
|
||||
}
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
val := 0
|
||||
grid := inputs.ToGrid2D(input, "\n", "", '.', func(c string) rune { return rune(c[0])})
|
||||
dir1 := [][]int{{-1,1},{1,-1},}
|
||||
dir2 := [][]int{{1,1},{-1,-1}}
|
||||
for j := 0; j < grid.SizeY(); j++ {
|
||||
for i := 0; i < grid.SizeX(); i++ {
|
||||
if !checkChar(i, j, grid, 'A') { continue }
|
||||
if
|
||||
(checkChar(i + dir1[0][0], j + dir1[0][1], grid, 'M') && checkChar(i + dir1[1][0], j + dir1[1][1], grid, 'S') ||
|
||||
checkChar(i + dir1[0][0], j + dir1[0][1], grid, 'S') && checkChar(i + dir1[1][0], j + dir1[1][1], grid, 'M')) &&
|
||||
(checkChar(i + dir2[0][0], j + dir2[0][1], grid, 'M') && checkChar(i + dir2[1][0], j + dir2[1][1], grid, 'S') ||
|
||||
checkChar(i + dir2[0][0], j + dir2[0][1], grid, 'S') && checkChar(i + dir2[1][0], j + dir2[1][1], grid, 'M') ) {
|
||||
val++
|
||||
}
|
||||
}
|
||||
}
|
||||
return val}
|
||||
|
||||
func checkChar(x int, y int, grid *grid2d.Grid[rune], c rune) bool {
|
||||
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
|
||||
return false
|
||||
}
|
||||
if grid.Get(x, y) == c {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
35
2024/go/day04/day04_test.go
Normal file
35
2024/go/day04/day04_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package day04
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX`)
|
||||
require.Equal(t, 18, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX`)
|
||||
require.Equal(t, 9, r)
|
||||
}
|
||||
140
2024/go/day04/input.txt
Normal file
140
2024/go/day04/input.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
MSAMXXMASXSXMMSASXMASMXMASXSXSSMSSSMMMSSSSMSAMXASAMXXAXMSMMMAXMAMSAMXAMXMXXMXMASMXSAXMXMAMXSXSXXMSSXMSSMMSSMMMMXSXAXMXMAMMASMSXSXSSXMSSMSSMM
|
||||
MSASASAAXSMAMMSAMXSXXMAMXSASAAAASMSASAASAAAMMMSXXMMMSMMXAAASMMMMSAMXSAXASMMSSMMXAXXMSSXXMSMMASMXMASXAAXAAAAAAMAASXSAMAXSMSMMASAXAXAAAAAMAAAS
|
||||
ASAMASMMMASXMAMAMXXAXSMSAMAMMMMMMAMMMMXXMMMMSASXXMAXAASXSSMSASAMXMSAMXSASAMAASAMXMAAAMXMASAMAMXMMASMMMSMMSSMMMMMSAAASMSMAAMSAMAMXMXMMXSMXXMM
|
||||
MMAMAMAAAMAMMASMMXMMMXAAMMXMMXXXMXSXASXSMSXXMASAMSSSMSMAAMASXMASAAMASXSAMXMSSMMXSMMMXSAXAXAMSSMAMASXMASXMAMMSMMASAMXMMAMMMMMXSXMSMXMASMXSASA
|
||||
XSAMAXSMSXAMSASASXMAAXSSMXXXAXMXSAAXXSAAASASMAMAXAXAMXMSMMMMMSAMMMSXMMMAMXAXAAAAMXMSAXMSSMSMASASMAMXMASXMAXAAAMMSAXXSSXMXSXMXXAMXMMMSMAASMMS
|
||||
MSXMMXMXXMMMMASAMMSMXXAAXXSASMMAMAMMXMMMMMAMMASAMMSAMSXMASXXXSAXSXSMSAMASXMSSMMSXAXMASMXMAXMMXSAMSSSMXSASAMXSSMXSASAMXMAXMASMSSMASAXAMMMSMAM
|
||||
XMAMSAMMSAMXMMMMMAASMMSAMXXMMAMASMXSAMASXMXMXASASXAAASASAMMMASXMSXMASXSASAMAMXAMMSMMXMXAMAMAMSMMSAMAAMSAMXSAAXMASAMXMXMASMXMASASASXSMAXAXMAS
|
||||
SMAMXASAMAMXMMXAMSSSXAMASXXXXXSASAAXASASXMAXMXXXMMXMXSAMXSXAXSMMMAMAMAMMSXMMSMASAAAMXSSMMXSXMAAXMASMMMMAMAMMMMMXSXXAAASAMXAXXSAMXSAMXSMMXSAS
|
||||
XSXSSMMXSAMXMMMMMMAMMXSAMMMMSXMAMMMSAMASASMSSSXAXMAMXMMMMMXSAMAAXAMASXSAMXXSAMXMMSMMAXASAAMASXSMSMMMAAXAMSMSAMSASXSMSMSAMSMMMMMMSMMMAMASXMAS
|
||||
MAMXAAAAXMMAMAAMAMSMSXMASAAAAAMXMAASXMMMMMAAAXSXASAXMXMAXSAMXSSMSSSXSXMXSAXXMSAMXXXMXSAMMMSAMAAAAMASXMXMMMAMAMSAMAXAMASMMAMASAMXAAAMAMAMAMAM
|
||||
SAAMSMMSSXXAXSMSAXXASXMXSXMMSAMXMMMSXSXSAMMMSMMSMMAXSASASMAMAXAAAAAAMMSXMXSXASMSAMAMAMAMXAMAXXXMAMASAMASAMAMMAMAMSMMMAMASXSASASAMSMSMSSSSMAM
|
||||
SXMAAXXAAMSXXAASMMMMMAXMSAMXXAMXXMXMXXAXAXXMAAMXXMSMSASXXMSMMSAMMSMAMAMAMAMMXMXMAXAMASAMMMXSMXMASMMSASASASXSMMMMAAAXMASMSAMXXAMMXAXAMXMAMSAS
|
||||
SAASAXSMXMAMMMMMMAXASXMASMMMSAMMSMAMSMSMSMAMSXXASMMAMMMMSMMAMSXXAXXXMMSAMASASXSXMMXMAMASAMAAMMMAAAASXMASMMXXXXAASXXMXAAXMMMSMMSAMXSMSSMAMSXS
|
||||
SAMAAMSXSMMSMAAXMMSMMMAMSXAAXSMSASASXAAAMSSMMMSXSAMXMAMASASAMXMMMSAMXAMASXXASMSAMSSMSSXMAMSSSXMXSMMSXXXSAMXAXMMMMASXSMMXXSAMXAAAMAAXAXMAXXAM
|
||||
MAXXSXSAMMXAXMSSMMMXMMSMMMSSXXXSAXXXMXMXMAXXAXMASMMSSSMASMMAMAAMAXAMMSSMMXMMMAMAMAAAAXAMMMXAMMMMXXAMXMMSAMMMMAMSMAMAAAMMMMAMMXSMMMXMASMMSMAM
|
||||
XMMMXMMAMSSMSXAXMAASMAXAXAAXMMMMSMASXXSAMAMSMSMAMXSXAAMAMMXMSSMSMSAMAAXAAXMASMSAMSMMMXMMAXMAMAAMMMXXAAAXXMAMMAXXMASMMMMAMMAMSMMAAXSAMXXAAMXM
|
||||
AMAXAMSMMMAASMMSXMXMMAMMMSXMAAAAMMMMAASASAAAAAMXXXMMMMMSMSAMXMAAXSAMMSSMMSSMMAXXMAMASAXMMMSAXMSSMAAXSXMSASXSMMXSAMXMXSXSMMAMXASXMSXXMAMXXSXM
|
||||
XXAMXMAAASMMMAMAMSMSMSSXAXMASXMSMMXMXMXASASMSMSSXSMSXSAXXXASAMXMMMAMAMXAXAMXMASXSMSASXSAAXSMSMXAMMSXMAXXMAMAAAMAMXASXSAXAMMSMXMAXXMSMSSSSMAX
|
||||
MXSXMMSSMSAMXSMMMAASAXMMXSAMAAMAXSAMXXMAMAXAXAAXAXAAAMXSMSMMASAMXSXMASXSMSMXMMSAAAMASASMMMMAAXMXMMMAMXMASMSSMSSSMSXSAMAMMXMAMXXMMSMSAAAMXSMM
|
||||
SAMAAAAAXSXMAXAXSMSMXMASMSXSXXMAXSASMSXMMSMAMMMMMMMMSMMXMAMXAMASAAXSSSMMAMAAMXMMMMMAMXMAAASXMMXMMXMXMSMXAAAAAXAMXXAMAMAMXXSASMMXAMAMAMSAAAMA
|
||||
MASXMMXSMMMMMSXMASXMMAAXASAMXSXSASAMMXXAAAASXMMXMXMAXAAASASMASXMXSXXAXAMAMSSSSSXMAMAMAXSMXXAASMASAXMXAXAXXMXSMSMXMSMASXSAXMASAAASMXMXXXMSSMS
|
||||
MAMMXSAMASXAMXASMMMASMSMMMXMMMAMMMAMAMSMSSXXAXSAMMSMMSSMSASXXSMSAMMMMMSSXXAMMAXMMMXAXXXXMMSMMAASMXXAXMSMSXSAMMXSXXXSMSAMMSMAMMMSMAMXXMSXMAXA
|
||||
MMSMAMXMXMMMMMAMAXMAXMAMXSXSAMMMXSAMAMXAMXASAMSASAMXAXAMXXMASMAMMMMAXXXMMMASMSMMXMASMSXSAAXASMSMSMMXAXAXMXMASXAAMXMMMMXMSXMXMMXXXXSXASMASMMM
|
||||
MSAMMSMSSSXSAAAXXMMAMSAMASASAMMSXMXSAMMAMMMMMXSAMXAMXSAMXMXXXMSMXXMMSMSMXSSMAXAXAMAMAXAXMMSXMXAMAMASASMXSAXMMMMSMASAMXAXXAMASMMSMMSXMXSXMXAX
|
||||
MXASAAAXAAASXXMXSAMXAMASXMMMXSSMMSASAXSSMSXASMMXMMXMMSAMMXSMMMXMAXSAAAAAAMAMMMMSASXMSMSMMAXXXMXSAXMAMXMASMMMXAMAXXSXSXMASAMASAAAAAMAMMMMMSSM
|
||||
SSMMXXSMMMMMAMSASXSMMSASXMAMMMXAASMMSMAAXASAXASXSMSXASASAMXAMSAXAMMSMSMSXXAAMXXMAXAAMMMAMXSSSSMSMXMAMAMMMXAXSXSASMSAMXXAMAXASMMMSMXAMAAAXAAS
|
||||
XAMXMMMAXXXMXMMASAXAAMXMASMSASMMMSXAXMSMMMAXSAMXSAXMXSAMMMSXMXMXASAXXAAAXSSSMXXXMMMMMASAMXAAMSASASXSSSSMSMMXAAMASXSAXAMMSSMMSMSXMMSSSSSSMMSM
|
||||
SAMXSASXSXSMMXMAMAMMMSASXMASMSAAAMMSSMXAMXAAMAMAMXMMMXXMAMXSAAMSXMASXMSMMMMAMXMMMASXSMSASXMXMMXMAMAAXAAAAASMXMMXMASXMMSMAMAXMAMAXMAMXMAMXXAM
|
||||
MMSMMMSASAMXAXMASXSXSAMXAMMMXSXMMXAXAAXMAXMXMAMASAMMASASXXAAXMMASMAMAXXXAASAMASASASAXXXXMAXSMSMMMMMMMSMMMAMAAXMSAMXMXAAMMSSMMAXMMMASMMSMSMMS
|
||||
MAAXAXMAMXMASXMXMMXMAXXSAMXSMSMMMMXXMMMSSSMXXASAXXXAMXAXAMSSMSXASMXSXMXASMXASMSASAMXMMSMSXMMAAXAXXXMAXXXMASMMSAMMMAXMASMMMASXAASASASMAMASAMX
|
||||
MSSMMSXXAAMXXXMAAMMSSXMMXXMSAXMAASMSMXXAAAASMMMMSMSSSMXMMMMAAXMASXMAMXMMMXMAMXMMMMXMSXAASXSMSMSMSSMMSMMXMAXMASASXSMSXAXAASAMXXSAAMASMXMASAMM
|
||||
XAMAXMMXSXSASMMSSMAAMXMAASAMMMMSXMAAXAMMSMMMAXMXAAXAAXMAMASMMMMXMASXSXXSAXXAMXSXASAAMMMMMASAMASAAAMMAAMSSMMAMSXMAMSSXMMSMMASMMMMAMXMXAMAMASX
|
||||
MAXSASXAMAMMSSMXAMMSSXMAMMAMXXAXAMSMSXXAMAXSXMASMSMSMMMXSASASAXASXMAMAMMASAAMAXSAMMSMMAAXAMAMAMMSSMSMSMAAAXSXSAMMMASASAXXSAMXSASMSAMSMSMSAMX
|
||||
MMMMAXMMMAMASAXSAMAMMMMXSSSMMMMSMMAAMAMASMMMMMXXAMAMAMSAMMSASMSASAMAMAMXAMMSMAMSMSMXASMSMASXMAMMAMAXAAXSSMMMASMMXMASXMASAMSSMSASASAMSXAMMASX
|
||||
SASMSMAAMXMXSAMSAMXXAAAMMAMMMAMAASMMMAAXMAMAAXMMXMASAMMASAMMMAXAMAMXSMSMSSXMMXXMAAASAMAAMAXXSXXMAMSMSMXMMMAMXMXMXMASAMAMAMMXMMXMMSAMMMSXSMMM
|
||||
MASAXSSMXSMAMMMMXAXSSXXAMAMXSSSSMMAMSMSSSXSSSSMSASXSASMXMMSAMSMMSASASXAXAMAXMMMMSMXMSMSMSMSASAXSXMMMMMMSXSASXXAMSMMSAMXMXMMMSXSAXMAMAAXMMSAS
|
||||
MSMMMMMSAAMXXAAMAMXXMAXSSMSMMMAMXMAMAMAAXAMXAXAMMSXSXMASXXMAAMAMSAMASXMMMMMMMAXAXXSAMXXAMAMAMXMMAMXAASAAASASAMASXAXMXXSXSMSAMAMXMSSMMMSAMMXM
|
||||
SAAXXAAMSSMMSSSSSMXMMMMMAMXAMMSMASXSSSSMMSMMSMSMXMAXASAMMASAMMAMMAMAMAMAXAAMXXMASAMXMXMAMSMAMMMSAMXSSSMMMMXMMSMXXMMASMSAMAAXMSMAMAXAMAMAMAAM
|
||||
ASMMSMXMAMXAAAAAMXAMAXASXMMSXAAMXSAAAAMXAXASXAAXMASXXMASMMMSMSMXSAMXXAMXMSMSASMMSAMXSXSXMXSAXAMSXMXMAMAMSMSSXAMMMSMMMAMSMAMSMAXAMMSMMAMXMSAS
|
||||
MMMXXXXAASMSMMMMMMXSMSASAAAMMSMSAMMMMMMMSXMMMSMSMAMXMXXMAAAMMAAXMMXXXASAMMASMXAASXMXSAMAMAMMMSMMMSMMAMAAAAXASASAASAMMMAAXAMAMMSMMXAXMSSMXMAA
|
||||
XMMXMASMXSAXMXMXSAMAAMXSXMXSAXAMMXXASXSAXAMXAAMAMXMAMMSMSMMXSMMMAMAXMMMMXSASXMMMMAMAMAMAMSSMAAAAAXXMASMSMMMMSXMAMSAMAMSSSXSXXXAXASMSMMAMAMXM
|
||||
AMXMSAAXAMXMSXSASAXXXXXXMSMMMMAMSSMXSAMASAMSSMSXSASASAXAASMMSAXSSMSMXAAXAMXMAXSXSAMMSMSMSXAMSSSMSSXAMAMXAMSXMASXMSAMXMXAXASAMSAMXSXAMSAMAMMX
|
||||
SAAMMSSMMSASXSMASMMSSMMSAMXAMSSMMAMAMXMASAMAXXAMSASASMMSMXSAMXMMAAAASXMMMSAMXMAASXSXAAAMMMAMXMMAXMAXSAMXSAXMAMXMASXMXXMMMMMAMMMMMMMAXMXMAMXM
|
||||
MXMMAMXAXSXSXAMAMAXAAAAASMMAXAXXXAMXSXSASXMASXSMMAMAMXAAAXMMMAAXMMMMMAAMASXSMAMXMMMXMSMSAMMSMSMMMSAXSASAMMMSAMAAMMMMXMMMSMMMMMAAASXMMSMMAMAA
|
||||
SAMMSMXAMXMMXAMASMMSXMXSMMMSMASMSMSASMMASMSAMXMAMSMMMMASAMXSMXSXSMXXXSMMASXMAXMXMAAAXMAMXSAAMMASAMXMSAMXSXAXAMSSXAASAAAASAAAAXMXMMAAAAMMSSXS
|
||||
SAMMAASXMSAXSXXXAMAXXMMXASAAMAMMAXMASAMAMMXXMASAMAAAXMAMAXAXSAXMASXMAXAMXMAXXASXSMSSSMAMAMXXSSMMXSXMMMMMSMMSSXMXMSSXMMMXSAMSASXSSSSMMXXMXAMX
|
||||
SAMMMMMAASMMXASMXMASAMXXAMSMMSXSXSMMMXMXSSSMSASMXSSMAMASMMSSMXXAMXMAMXAXSSSMMMAAXMAXXMAMMXSXAAXAXSMMAAAMXAAAMXAMMMAMMASAMXMMXXAAAMXXSMSXMASX
|
||||
SMMXSASMMMAMMMMXAMAXAMXMSMMXAXAXAMXSAXXSMAMAMXMAAXAMXSXSXAMAXSMSXXXASMSMAAMXASMAMMMSSSXMSASMSMMMSMASXSSSSMMSSMMMAXMASASASMXXMMMMMMMAAAAXSAMM
|
||||
SAMXSAXAASAMAMASXMASXSSXAASMMMXMASAMXSMMMAMSMAMMMXAMASASMSSMMSAMASMAMAAMMMMSASAAMAMMAMAAMAMAAAMMMMMMAAAMAASXMAXSMSXAMASAMAAXXAAAAAXXMXMMMASA
|
||||
SAMXMAMSMSSXXMMAMXXMAAASMSMASAMSMMASMMXMAMMXMXSASXMMMMMXAXMAAMAMAMMSMSMMMAASXSXMMAXSAMXMMMMSSMMMAMXMXXSXSMMASMMMASXMMAMAMSMSMMMXXSSXMXSASAMX
|
||||
SSMXMAMAAXAXSMSMSMMMMMMXMXMAMMMAAXXMAXMAASMSXMXXMASMSMXMSMXMMSAMXSAAAAXMXMXMAMXSSSXSASMSASAAAAMMAXXXMXMAMXMXMAMMAMAXMAXXMAMSASMSMAMXMAXMXMAS
|
||||
SAXMMMSXSMMMXAAAAAASXSASMAMMMASXSMSSSMASMSAMASXMSMMAAMAMAMXXMXASMMMSSMXSAMXMSMAXAMASAMAAAMMSSMMSSSMASAMXMSSMSMMMASMMSASAMXXSAMAAMAMMMASMXSSM
|
||||
SMMSAMXMMAXAMSMSMSMSASAMMXSASMSAXAXXXAXXAMMSAMMAAMMSMSXXAXXMSSMMAMMMAXAMAXMMMAMMMMMMAMMMMMAMXXMAMAAMMASMAAAAAAASXMXMXMAXMMASMMXMSMXSMASMAMAM
|
||||
SXASMSAMSSMSAMAMAXAMXMAMAXSXSAMMMXMXMSMMMMAMASXMASAXXAASMSMAAXMASAASXMMSAMSASAMAAAXSAMASXMASMMAMMMMXMAMMMMMSMSMSAMXMAMAAXSASMSMXMMAXMXMMAXMM
|
||||
XMAMXMAMAXAXMMAMXSAXXAMMMXMASASMSAAXAAXAXMXSMMAMMMXSXMAMAAMMMMXAASAMXAMMMMSASMMXMXXSASAMASXSAMMMASXMSSXXAXXXMMASAMAMAMXMMMAXAASAAMMSSMMSSSXS
|
||||
SSMMSSSMMSXMASXMASAMSSMAXASASAMAMXXXSSSMXAMXXMMSAAAXAXMMSAMXSMMMMMSSMSAXAAMMMAASXMMSMMXSXMASMMASMSAMAMASMSMAMMMMSSMSMSAXMMSMSMSMSAAMAAXAASMS
|
||||
AAAXAAXMAXAAXXAMXMAMAAXXMAMXMMMAMMMMAAAMMSASAMAMMSMMMMXAMASAMXAMXAAXXAMMMMXAMXAAAAMXMAXXAMAMASAMXSAMAMXMAAMAMAMMASMAASAMXAMXMAXAMMXSSMMMSMXX
|
||||
SXMMMMMMMSSSXSXXXMAMMSMXAAMAAAXAXSAAXMAMAAMSAMASXMXAMXMAMAMASMSSMMSSSMXAAMSMSMSMSXMAMMMSMMASXMMSMMXMAMAXXMSSSMSMAXSMXMMMMAMAMMMMMAXMASASAMMS
|
||||
MASAMXAXXAAXXAMXSMMMAAAXMASMXMSMSAMMMXMMSSMSAMXXAAMMSAXXMSSMMAMXMAMXMXAXMXAAXXXAXMMXSAAAASASMSMAASMSSSSMMXMXAAAMSMXXMASXXAMSMSAMMSMMASXSASAX
|
||||
SAMASXMMMMSMSXMASAAMSSSMSMXMXXAMAMSXSAXAAAAXXAMSMMMXMASXXAAAMSSSSSSSSXSSSSMSXMMSMMSAMMMSMMASAAXMXMAAXSAASMXSMMMAMASXMXAAMMMXASXSAAMMXSMSMMXS
|
||||
MXSAMMSAAXMAMXMAXAMXXAXAXXAMXMASAXAAMAMMSMMMSXMAMASXMASXMMSXMMAAXAAAXAXAAXMMAMMAASXSMAXXAMXMMMXSAMMMMSSMMMASXMXASMMAMXMMAAAMXMMMMSSMXSAMAMAS
|
||||
MMMMSASXSMMAMMMMSSXSSMMMMMSMSSMMMMXMMAXMAXSAXAMMSASAMSMMAXAAMMMMMMMMMXMMSMASAMSMSMAMMXMXAMMMMSAMMXXMXMAXAMASASMMSXXAMAXXSMMSMMXSAMXMAMSMAMAS
|
||||
AAAMMASXXASAMMAMXMAXAXAXSAAAAMSAXMMMSXSMXMMMSSMMMMXAMAAXSMMSMMASAMAXAMXXXMASXMAXAMXMSSSSSMAAAMAXSAMSMMMSMMASMMAMSMMMMXMMXMXXAMASAMXMMMAXSXMS
|
||||
SMSSMSXMMAMAXSXSAMSMXMMMAXMXMMSMMSAMAMXMAMXMAMAXAMSSSMSMAMAAMMASASXMXAXSXMASASAXMAMXSAXAAXXMXXXMMASAAAAAAMAXMSSMMAASMMXSAMXSSMASMSMMMMMSMAAX
|
||||
XAMXMMAMSSXMAAASMXAAASXSSSSXXXXAASXSSSMSSSMMASMMSAAAMAMXAMSSSMASAMXXASAMAMAMMMMSXAASMMMSMMSMSMAMSMMXSMSSSMSSXAXMMMMMAAAMASMAXMASAAAAAASAMAMS
|
||||
MAMAMSMMAXAMXMXMASMSMSAXMAMMMSMMMSAXXAMXAAAMAMAAMMSMSMSSXXXAMMAMASAXMMASAMMMSAASMSMMAXAXMXAAASXMAXMAMMMAMAMAMMSMMSMSMMMSAMMMMMAMMMSMSXSAXSSM
|
||||
AXSAMAMMMMXMMMMSMMXAAMMMMAMAAXAASMMMSMMMSMMMASMXMAMASAAMXMMMMMMSAMMMXSAMASXAXMXSAXAMXMMSSSMMMSXMMMMMMXMAMSMXMXAMXAAAAMXMMMAMXMSXXMAXXMMMMXAX
|
||||
SASMSXSAAMSMMAASXSSMSMSXSXSMSSSMSAAMMAMMMMXSXSXXMMSAMMMMAMMXSAMMASXMAMMSXMMXSXMMMMMASMMAAAASXMAMAASXMASXMAMMXMAMSMSMMSAMSSSXMAMAAASAMXASXSSM
|
||||
XXSXMMSMSMSAXMMXAAAAAAMXXMSAMAAAMXMMSAMMAMASAMAXSMMASXMXMSAASAMSAMAMASAAXSMXAXMAXSMAAAMMSMMMAAXMAMSAXXSASXSAAMXMSXMAAMXXAXMAMAMSMMMXSSSSXAXX
|
||||
MMSAMASMMAMAMSMMSMMSMSMAXAMAMSMMMAMMSXMMAXAMAMMMSASAMXSAMMMXSAMMSSXMXSMMMAMMMXXAAXMAXXXAXMASMMMAMSMXMAMASAMMXSAMXAMMMSMSMSSXMAXAAASAMMMMMMMM
|
||||
AAMXMASAMMMSMMAAXAXXAMAMXSMMMMXAMAXAXSSSSMSXMMMXSAMASAMMSXMMMXMAMMMSAMXXSAMAAMASXMSSMMMSSSMMMASXMAAAMXMSMAMAMSASMSMSXAAAXAAXSSSSSMSAMXAMAAAX
|
||||
SSMAMAMMXSAXAMMMSMMMSMMXAXAXXXMMMSMMMMMAXAMXSAMMMMSXMASAMXSSXMMMSAAMAXXASMSMMSAMAMAAAAXAAXAXSASXSMSMSXMAMXMAXSAMAAAMAMXMMMMMAMXXMASAMXMXSSSX
|
||||
AAXSMXMXXMASXMSXSXMAXAMMMSSMMAASAXASXAAAMXMAXASMAAAAMAMMSAAMSMAAMMMSAMSXMXAXMMASXMMSMMMMSMMMMASXMXXAMMXAMMSXMXMMSMSMXMAAAAXXXXAMXASXMASAMAMX
|
||||
SSMMAMSMSMAMAMSAMXSASAMSMAMXASMSASAMXMMXMAMMSMXMMXSAMASXMMMMASMSSMAMAXMASXMSXSAMXSXXXAXXAAXXXMSAMAMASMSXMAXSXAMXXAXMASXSMSSSMMSSMXMASASAMAMM
|
||||
MMAMXMAASMSXSMMAMAMXSXMXMASMXXAXAMAMXSAXSAMXAMSMMMXMXMXAXSXSAMSAXMXMXAXXMAAAXMASAASMSSSMMSMSAMXAMMSAMMAXASMMSXMAMMMMXAMXMXAAXAAAXSMMSMMMMMSS
|
||||
MMMMSSMSMAXSMASXMXSASAASMXSAMMMMMMXXXAAXMMSSMXAAAAMAAMXMMMAMASAMXASXMMSSSMMMSXAXXAMXAASAAMASMASAMXMASMSMMXAMSMSXSASXSMSASASMMMSSMSAMMAXMSAAA
|
||||
MAAAAXXMMAMAXXMXAAMASXMAXMXXMAXMSAMXSMMMMAAMMSSSMSSSMXAAAXSMMMMXXMASAAAAMMMXXMMSMXAMMSSSMMAMMMAAXAXXMAXXXSAMXASXSASXAASMSAAXMAMAASMXMSMAXMAS
|
||||
SSSMMSSMMSSMMSMXMXMAMASXSSSMSSSXMASAXXSXMSSMAAMXAAAAAXSXMSMMSAXSASASMMMMMASASXAAASMSMAMAMMXMASMMMSMAMMMMMSXMASMAMMMMMMMAMMMMMMSMMMXMSMAMAXSM
|
||||
XAAXXAMAAXAXAAXAMSMMSAMMAAAAAAMXSAMXSAMXAAAMMSXXMMXMMMMASAMAMASXXMASXSXXMAXMXMMXMAAAMAMAXXMMXMAMAXMASAAAMXMAMAMXMASAMMMMMMXAAMXXXMAMAASXMSAS
|
||||
MSMMMASMMSMMSSSXSAAXMASAMSMMMXMAMXMAMXAMMMSMMAXXASXAMSSMMAMXMMSAMXXMASMMMSSMAMSSMXMMSSSXSAXXASAMXXSASMSSSMXMMSMXSASMSAAMAXSXMSASMSSSSSMAMAMX
|
||||
AAXMAMMXMAXAXXMXAXXMMXMXMXMXMAMAMAMSSSXSAAXMMSSMAMXSXAAXSAMXSMMMSSMMXMSXAAAXASAAXSXXMAAASMMMXSXSAAMXSAMAAAASXXAAMMSXSXSSMXSASMAMAXMAMXMXMMXX
|
||||
XSAMXMXSMMSMMMXXMAMMMXXAMAMASASASAMAAXAMMMMAAAAMAMMMMSSMSASXSAAAXMAMXXAMMSXMMMXSMMASMMMMMXSXMMMSXXXAMXMSMSMSASMMSXMASXMAMAMMMAMMSMMSAMXMXXXX
|
||||
MXXMASASAMMMAMMMXSAASMSASASMSXSMSASMSMMMSMSMMSMSASXAAXAMXXMASMMMSSSMSSMSAMMSXAAMAMAMAXXXXAXAAAAXAXMXSAAXAXXMXMASXASAMASXMASAMXMAXXXMMMAMXMMM
|
||||
MMSMXMASXMSMXSASAMSMAASASASASAMASAMAXXXXAAAXXMASASXMSSMSAAMXMASXMAAAMMXMAMASMMXSAMASXMSXMASXMMSMMXMASMSMSMXXASMMSXMAMXMAMXMXXSMXXSXMASAMXASX
|
||||
AAAAAMXMMXSAASMMXMASMAMAMXMXMMMAMMMSMMMAMSMMAMXMAMAMXMASXXSASAMAMSMMMXMMAMMMAAAXASASAMXAMASASMXAXASAMAAAAXMXXMSAMXMSSMMSMMMSMMMMMSASASAXSAMX
|
||||
MMSSXSMMSAMMMMMSMXMSXAMSMSMSMXMXSXAAAAXXXMMSSSMMXSAMXMXMMMSXMASAMAMSMAXSAMXSMMSSMMASMMASMASMMAMMXMMAXSMSMMMSMMMMSAMAAXAAMAAAAAAAXSAMAMXXMASX
|
||||
SXMMASAXMMSMXAXXASMMXSSXAXAAMASMMMSSSMSXAXAAAAXSASASXMMAAAXMAMXMXMXAMAMSASXSXAMAXMMMASAXXXMMMSMSSMMSMXAMXSASAAAASAMXSMSSXMSSXSSSMMMMMMSXMMSA
|
||||
XAASAMSXXXMXSMSMXMXAAXMMMMSMSASAXXAAXAMMMMMMMSMSASAMASMXMXSAMXXMASXMXSASAMAMMMSMMMXSAMMSMMSMXMAMAAAMAXXMXMAXSMMMSAMXXAXAAXAMAMAMAMXMSAMASAMM
|
||||
SXMMAMMMMSXAMSAXASMXMMXAAXXAMMSXMMMXMXMAXAXMMXASXMAMAMMMSAMXMXMMAXAXXMAMAMAMSAAMASAMSSMAMMAMMMAMXMMSSMXAXMSMXMSAXMSSMMMSMMASXMAMASAXMASXMASX
|
||||
AMSXSMAAAAMXSAMSXSAAMMMSMSMAMASASXXXAASASXSXAMAMAMXMAXAMXXMASAAMXSSMSMAMXSSXMSAXAMASAXXASXASXSMMXSAMAMMXSAMXAXMMMMSXASAMXMMMMSMSAMXSXAXASAMA
|
||||
SASAXXSMSXAXAXMAAXXSAAAAXMMMMMSAMAMMSMMMAMMMXMAMAMXXMSMSMMSASMSMMXMAMSASAMXAMMXMASMMMMMMMMAMXAMXAMXSAMMMSAMMMSASXMXXAMXAAXAAXAAMMSMMMMSMMMSS
|
||||
MAMAMAXAMXSASXMSSMMXAMSSSMSMMMMMMXMAAXMMMXAMAXSMSMSMAAMAAAMASAXXAAMAMMXSAMSMMAAXMMXAAAASXSASXSAMXSAMASAAXAMXAXAXMASMSSMSMSMSSSSMAAAXAMAMAXAA
|
||||
MXMSMSMSAAXSMAXAAAXSSXAMMAAAAAMMSXMSSXMASMSSSXMAXASMSMSMMMSASASASMXMXSXMXMAMMMXAAASXMSAXXMAMAMMXMXMSMSMSSSMXMMSSMXMAMAMXXXXAXAMMXXXXMMMMXSSM
|
||||
MXMXAXAMMMSASMMSSMMMMMXSMSMXMXXASAMXAMSSMAAAMAMXMXMAXAXXXXSAXAAMXMASAAAAMSXMAAMMMMSAMMMMMMSMMMMSMMXAMXAAAAAXXAAAAXMMSSMXXSMSSMXMSSSSMXSAMXAX
|
||||
MXMMMMXMMXMMAMXAXAMXXMMMAMAMSSMMSAMMMMXAMXMAMMMXAXMXMXMMSMMMMMMXMSXMASXMAMMSMXSXAAMMXAAMMAAAASAAAXSMSMMMSMXSMMSSMMSAAXMXMMAAXXXMAAAXAAMAMXMX
|
||||
SXMAMSMXXMMMSAMXSXMXAMXSMMAMAAAMMAMMXMSXMASMXAMXSAMASAXMAXAMXAXAXXAMAMXAXXAAXAXXMMMXXMMMMSMSMSXSMMXXAAAAXAAAMAMAAASMSMSAMMMMSSSMMSMMMMMAAAMM
|
||||
AMMAMMXXASMAMXSXMASMMAAXMSXMSSMMSSMSAMXAMASAMXAMXMSASMSSMXXSSSSMASAMSSMSMMSSMMMAMXXSXXAXMMMMASAXMSSSXSMSSMMXMASMMMXAAMMAMXMASMAAAAXXXAXSSMSA
|
||||
MSSMSAAMSMMMSMMASAMASAMXMMMMAAAXAMASXSXSMMSMAMAXAXMXSAXAMSMXMMAMMAMMMAAMXXAMXXAMXSMSASMMMAAMAMAXMAAMMMXMXMSXSASXSMMMMSSSMMMSSSSMMMXAMMXMAMAX
|
||||
XMAMXMASXAAAAAXXMASXMMMAAXSSSMXSAMXMASAMAMXXMASMMXSAMXMAMAAAMSXMMMXAXAMXXMSMASXMMXAMAMAASMMSAMXMMMSMASAXMXMAMAMAAXMAXXAAAMSMMXXAXXMXXMAMAMMS
|
||||
SMMMSXMAXXMMXMXSSMMASASXSMAAAXASAMXAASASMMSXMAMAMXMMSXSAMMSSXMASXXSXXSAMXSAMXXAAMXMMAMXMMAASAMXSMMMXAMAXXSMMMXMSMSXMXMXMMMMAMXSXMXMASMMSMSAS
|
||||
MAAAXMAMAMSXSMXMAASMMAAAMMMMMMASAMXMAMAMAXXAMASAMMSXXAXAXXMAXSAMMXMASMAAXSMSXSSMMMASXSASMXMSAMAAAAAMMXSASAAXXMAMAAXAMSAMXMXAMMMSAXMXXAAXAMAM
|
||||
SAMSSXXXMAMAAXAMMMMXMSMAMAAMXSASXXXXXXSSMMMXMASAMASAMXMMMSAMXXSXXAMXMSMSMMXAAXMASXMMASASAMASXMASMMSSMAMXAXMMMSAMXMXXAXMXASMXSAXXSXSMSMMMMMSM
|
||||
MXAAMMMXMAMXMSXSXMASAMXXMXMSASAMXSMMMMMAMMSAMXSAMSXMXAXMAXXXMMMMSSSSXMXAAMMMMMSXMAXMAMASAMXMXMAXAAAXMXMSXXSXMASAXSMSSXMMMXAASXMXMXMAAXMXSAMX
|
||||
MMMASXSSSSSSXAASXSAMASXSSMAMAXAMAMMAAAXXMASASASXMAMXSMSMSSXXMASASAAMMSMSXMAAAAXMMXMMXSASXMSSMXAXMMSMMSXMAXXAMXMMSXAAXAMASMMMMXMASAMXMSAXMASA
|
||||
XASAMAMAAXAAMMSMAMXSAMAAAMAMMXMMXXASMMSAMXXMMMMXSSMXAAXXMXMXMSSSMMMMAXMMMMSSMSSSMSAXAMAMAAAAAMSSXAMAAXAMXMSSMMAXMMMMSXSAMAAMXSMMSASAAMMMMXMX
|
||||
SXMMMAMMMMMMXSAMXMMMXMMSMMMSMXSASAAXAXMASAXSASXMAMASXAMXAAAXMAMMMMMMSSXSAXAXXAAAASXMMSSSMMMMMMMAMSSMMSSMXMAMASXXAAAXXMMMSSMSAAMAXAMMXMXASAMX
|
||||
MMSASXSAMXMMXMXXXSXMXSAMXSAXAAMAMMXMMMSAMXMMASMMAXAAXAAMSMSMMASAAMAMXMASXMMSAMMMMMXSXAAAAMXMAXXAXXAAXAMXXMXXMSMSSSSSMXAMAXXMASMSSMMMMMSXXASX
|
||||
AAXAMASMSMSMMMSSMMAMASAMXMMMMMSASXXMXAMXSSSMAMXSMMSSSMSMMMAASMSMSMSSMMAMAMAXMXSXXXSAMSSXMMXXAMSXMSXMMSSMMMSXXMAXAAXAXSSSMSMSXXAMXXAXAAMXSAMA
|
||||
MMSAMXMXAAAXXAAAASXMASAMXXAAAASXSASAMXSXMAAMMMXAXAMAMXAAXSSXMMSXMAXXAMXSAMXXXASXMMXMAXMASMSMXXMAMAASAMAAAAXXAMXMMMMSMMXAXSAMXMAMXSSSXSAAMAMX
|
||||
XXAXXXMSMSMSMMSSMMAMXXXAMXSMMMSMMAMSAMXAMXMMMSSMMMMMAXXMMXXXMASAMMMSMMXSMSMSMMMAXAAXMXMASAAXMASXMSSMASMMMSSXSMMXXXAAAXSXMMSMXSAMXMXSAMXXSAMM
|
||||
XMASMAMMXMXXXAXXMSXSMSXMXAAMMAMAMXMXXMXAMAXAXAAASASXSSSSXMAXSXMMMAAAAAAMXMAAMXSMMSMMSASAMXMMSAMXXXAMXMXMSAMAXASXSMSSSMXASAMXMSXSMSAMXMSASASM
|
||||
MXAXMAMMMSXMMMMMXXAAXMASMSSXMASXMMSXXMASXMSMSSSMMASAAAAXMXSXMAXAMXMMSMXXAMSMSMMSAAMAXXXASXMAMMSSXXMMSMAMMAMMXAMMAAMMXMSSMMSSMMXMAMAXSAMXSAMX
|
||||
SXMSSMXSAAAAASASMMMMAMXMAAAASXMXMASXMASXAXAAMMMAMSMMMMMMAAXASMSMSXSAXXXXMXAMXMAASXMASMSMMAMXSXAXASAMXMASMXMXMSMMMXMMAMXMASAMAXSMASMMXXSAMXMX
|
||||
SASAMXAMMXXMAMASMAAXSSSMSMSMMASXMASMAXMSMMMMMASAMAMSMMMSMMSAMAAXAAMMMXSAMSAMAMXMXXMAMXAMXXSSMMXSMAAMXSMSAASXMAAXXMASASMSMMMSMMAXAXXAMMMXSMSS
|
||||
SXMASMMXXXSXSMAMMSSMMAMAAXMASAMAAXSMMMMXXAAASXXMMAXMAAAAAXMXMMMMMSMSAMXAMAASMSMSSXMXSSMMSMMAAMAMXAAXMSAMMMSASMXMSSMMAMMAXAAAXAMMSXSAAASXMMAS
|
||||
SMSAMAXMSMMAMMXMAXXASAMMMMSAMMSMMMMXAAMSMXSMSAMXMMSMMMXXSMMASXSAXAAMSSMSMMXMAAAXMXSAAAXAAAMSXMXSMSSXAXXXXXSMMSAAAMXMSMSSMMSXSSXAMMSXSMSASMAM
|
||||
SAMXSSMMSAMXMASMMSSXMAMXAMMASASMSMAXMSMAMMMAMMMAASAMXXSAMXSXSAASXMXMMXAXMAXMSMMMMAMMSMMSSMMMSMMXMAMMSMSMSMXSAXMMMSAMXASAAAAXSXMXSAMMXASAMMSS
|
||||
MAMXAXMASMMMAMMAAXMMSAMSSMMAMXMAXMMSMAXXSAMAMAMSSMASAAMMMXMMMMMMMMMXMMSMAXXMXXMXMASAMXXMAASAMXAAMASMAXAAAXMMSSMSXSASXMMSMMSSMAMAMMMAMMMXMAMX
|
||||
SAMMMXMAMAMMAMSMMSAAMAXMAAMSSSMSMMAAXMASMMSSMMXMAMAMMSMAMSASXSXAAAXMMAXXASMMAXAASXMASMSMSMMASMSXSAXXMMMSMMSAAMXMASMMAMXXXXXXMAMASXMXSXMSMSMM
|
||||
XAXASXMASAMSAXAAMMMMSMMMMXMAAXAMAMSMSMMAMXAAXXASXMXSXAXAXSAMAMXMSMSASAMSXSASAMSASAMXXAXXMASAMXMAMMSMSAAAAAMMMSAMMMAMAMAMMASMXXSAXAMAMAAMAAMA
|
||||
SMSMSASASAMSXSMSMXAAXAAXXSAMXMAMSMMAAXXMMMMSMSXSAMXMXMMMXMSMSMAMAMSXMAMAAMMMXXXAMMSSMMMMXMAMXAMAMSAASMSMMMSAXSXSMSSMASASXASASXMMSMMASAMMMMSS
|
||||
AXAAXAMXSXMSAXMMMMMSSSMSAMAXMMXMAAMSMMXXAAMXAMXMAMASAXASAMXMAXMMAMMXSXMMMMASXSMSMAAXAAASAMMMMMXAMMMMMAAXXXMMXMXSXAXXXMAAMAMXAXSAAASASXXSAAXX
|
||||
MSMSMXMXSMMMXMAMSASAMXAAASAMXSASMSMMXMSMSMSMSMSSMSASASASASXSMSXSXMXAMMMSXSAMAMAMMMMSSMXXASXMASMMSXMAMMMXSMMSXMASMMMMMMSMMASAMXMMSXMASXAXMXMX
|
||||
XAXAAXMASAXAMMXAAMMSSMMSMMMMXSASAMXMAMAMMAMAXXMAMSXSXMASMMAAAAXAXSMSXSAAXMASAMAMASMMMSMSMMMMXSAAAASXSMXAAAAXAMASXXAAMAXXMASAXAXMMMMXMMMXMAAX
|
||||
SSSMSXSAXXMMMSAMMXMAXAXMASXSMMAXXAAMSSSXSAMAMXSXMMAMXMXMXMSMMMSMSMAMAMMSSMXAMSASASASAMXAXAMSASMMMMMMAAMSSMMSAMXSMMMSMASXSMSMSMSMAAAAXAXAXXSA
|
||||
MAMAMMMAXSAMASXXAAMXXSASMXAAXMAMMSXAAAMASASMMASMMMAMMMMSAMXMAMAXAMAMXMAXAXMAXAXXXSAMXSSMXMSMASASXXAMMMMXAXAAASAMASAAMXMASAMAMXAMMMXMMMMAASMX
|
||||
MAMAMAMAMXAMASXMSXSMMMASXMSMMXXMMAAMMSMASMMAMAXAASASAASMMMXSAXSSSMSSSMSSSMSAMXMXMMMMXMXXAMAMXMASMSSSXXSXMMXXXMAMAMSSSSMMMAMAMMSSMSAMSSSMMXAX
|
||||
SXMAXMMASXMMMXMAAAXAAMAMAXXAAAMSXMMSAXMASMSASMSSMSASMSMMXSAXMSMAAAXAMAMAMAXMAAMAAAAMSMSAMMAMXSAXMAXMAMSXSASMSSSMAMAMAAASMXMXSXAAAMASAAAXXMXM
|
||||
SMSMSASAMAMAMSXXMSMMSSMSSMMSXXAAAAAMXXMXSASXMAXMASXXMMXXSMAXSAMMMMMAMXMAMMMMMSSMSSXSAAXASXSMMMASMMXSMMMXMASAAAMAXMASMXMMAAXAMMMMMSSMMSMASMMM
|
||||
MAAAAAMMMASASAAMXMAXAAXAMXAXMASXSMMSMSMXMAMAMXMMMMMSXMASMMMMMASMMSMSMMSAMMASAMAXAAMMMXMAMAAMSMMMMMASAXSAMAMMMMSSMSMMXSMXXMMASAXXAXAAMAMAXXAX
|
||||
MXMSMMMSSXMXXMXAAXXMSSMSSMMSSMXAMMMAAAAMMXMMSMAMMAAXAAXAMASXSMMAMSAAAASAMSAMASXMMSSMASAMMSMMXAXSAMMSAMMAMXSAMXAAAXXSAMSAAMSAXMSMMXMXSASMSSSS
|
||||
XSXXXXAXMMSSSXSSSSMMXMAMAXMAASMMMMXMSMSAMXMAAXMMSMSSSMSMSASAAXMAMMMMMMSAMMASAMAAXAMXMMMSAMAXSMMSASAMAMSXMAXAMXSMMXXMAMXSSMMMSXAASAXMSXSAAXAA
|
||||
MAAMAMXXAXAAAAAXMAMMAMMMAXMSMMXMASAMXMAXXAMXMMSAAXXAMAAXMASMMMSSSMSSSMXAMSMMMXSXMMSMSMXMASMMMAASXMMSMMAMMSSMMMXAMAMSSMAMXMASAMXMMASAMXMMMMMM
|
||||
AMXSMMXSMMMSMMMMMAMXAMAMASXMAAMMASASAMXMSMSSXAMXSSMMMMMMSASASAXAAMAAMASAMXMAMMMASXMAAAASMMXAXSMSMMAMAXMXAAXAAASAMXAAXXXMASXMXSSSSXMXXMMAXASX
|
||||
SXAAXMAAAAMAAAXAMSSSXSXSSMMSMMSMASAMXMAMXAAXMMMXXMAXAXSXMASXMAMMMMSSMMMXMASASMSAMMMMMSMMSASMMXAXAMAXMMXMMSXXMXSMASMSXMMMMMSMXAAXAXAXMMSAMXSS
|
||||
MMXMAMSSSMSSSMXSXXAMAAXSAMAXAAXMAMXMASXMMMMXSAAMSSMMMXMAMXMASXMSXAAXAXMASMSASAMXMASXMMAAMMMMSMSMSSMSAMXAAMMSMMMXAXXMASASAAMXMMXMMMXSXAMXMMXX
|
||||
MSMSMAAXAXMXMMSMMMAMXMXSAMSMMMMMAMXXAMAXXMAASAAXXAXMMASAMASAMAASMMSSMAXASAMXMAMXSAMXSSMMMSAAAAAAAAXSAMXMXSAXAAAMMSMXMMASMXMAXXASXSMAMXMSAMXM
|
||||
SAAAAMMSMMSAMXAAASAMAXAXXMAMASASMSSMSSMMSMMXSMSXSAMXSASASMSAMMMMAMMAMAMSMMMXSXMMMXSMXASAAMMSSSMSMSMMAMAMMMASMMMMSAAAMSASASMSMMASAMAMSMAMXMSM
|
||||
SMSMSMAAXAMASXSSMSASXMMSMSMSASXSAAMAMAXAAASAXAAXXMAMMASAMXSAMXAASMXAMASAAAMAMAAASAMXSAMMMSAAAAAXMAXSASASAMXMMAAXSMSMXAAXASAMXMAMAMSXXMASAXAX
|
||||
XMAXXMMSMMSXMXMAXSXMXXXAXSXMXSXMMMMASXMASAMXMXMMAXSAMXMXMASAMSSSXASXSXSMSMMXSMMSMXSAMXMSAAMMSMMMXAASXSXSXSMMSMMMMXAXAMXMXMAMXMASAMAXXMASXSAS
|
||||
291
2024/go/day06/day06.go
Normal file
291
2024/go/day06/day06.go
Normal file
@@ -0,0 +1,291 @@
|
||||
package day06
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
"fmt"
|
||||
_ "strings"
|
||||
)
|
||||
|
||||
type Direction int
|
||||
|
||||
const (
|
||||
_ Direction = iota
|
||||
Up
|
||||
Down
|
||||
Left
|
||||
Right
|
||||
)
|
||||
|
||||
type Pos struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
type Loc struct {
|
||||
dir Direction
|
||||
pos Pos
|
||||
count int
|
||||
}
|
||||
|
||||
type Point struct {
|
||||
dirs []Direction
|
||||
display string
|
||||
}
|
||||
|
||||
func (d Direction) String() string {
|
||||
return [...]string{"-", "Up", "Down", "Left", "Right"}[d]
|
||||
}
|
||||
|
||||
func (l Loc) String() string {
|
||||
return fmt.Sprintf("Direction: %s, Position: %d %d", l.dir, l.pos.x, l.pos.y)
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
var loc Loc
|
||||
grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c })
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
if grid.Get(x, y) == "^" {
|
||||
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y) == "v" {
|
||||
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y) == ">" {
|
||||
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y) == "<" {
|
||||
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(grid.Matrix())
|
||||
fmt.Printf("%v\n", loc)
|
||||
grid.Set(loc.pos.x, loc.pos.y, "X")
|
||||
loc.count = 1
|
||||
move1(&loc, grid)
|
||||
return loc.count
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
var loc Loc
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
if grid.Get(x, y).display == "^" {
|
||||
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == "v" {
|
||||
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == ">" {
|
||||
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == "<" {
|
||||
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(grid.Matrix())
|
||||
fmt.Printf("%v\n", loc)
|
||||
point := grid.Get(loc.pos.x, loc.pos.y)
|
||||
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
grid = inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
|
||||
p := grid.Get(x, y)
|
||||
if p.display == "." {
|
||||
grid.Set(x, y, Point{dirs: p.dirs, display: "#"})
|
||||
l := loc
|
||||
if isLoop(&l, grid) {
|
||||
loc.count++
|
||||
}
|
||||
grid.Set(x, y, Point{dirs: p.dirs, display: "."})
|
||||
}
|
||||
}
|
||||
}
|
||||
return loc.count
|
||||
}
|
||||
|
||||
func isLoop(loc *Loc, grid *grid2d.Grid[Point]) bool {
|
||||
for {
|
||||
_, _, err := move2(loc, grid)
|
||||
if err != nil { return false }
|
||||
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
|
||||
return true
|
||||
} else {
|
||||
p := grid.Get(loc.pos.x, loc.pos.y)
|
||||
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(p.dirs, loc.dir), display: "X"})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Part2b(input string) int {
|
||||
var loc Loc
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
if grid.Get(x, y).display == "^" {
|
||||
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == "v" {
|
||||
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == ">" {
|
||||
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
if grid.Get(x, y).display == "<" {
|
||||
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println(grid.Matrix())
|
||||
fmt.Printf("%v\n", loc)
|
||||
point := grid.Get(loc.pos.x, loc.pos.y)
|
||||
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
|
||||
loc.count = 0
|
||||
for {
|
||||
_, _, err := move2(&loc, grid)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
|
||||
loc.count++
|
||||
break
|
||||
}
|
||||
}
|
||||
return loc.count
|
||||
}
|
||||
|
||||
func move1(loc *Loc, grid *grid2d.Grid[string]) int {
|
||||
return -1
|
||||
}
|
||||
|
||||
func move2(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
|
||||
x, y, err := doMove(loc, grid)
|
||||
if err != nil {
|
||||
return x, y, err
|
||||
}
|
||||
if x == loc.pos.x && y == loc.pos.y {
|
||||
move2(loc, grid)
|
||||
}
|
||||
return x, y, nil
|
||||
}
|
||||
|
||||
func canBlock(loc *Loc, point Point) bool {
|
||||
val := false
|
||||
switch loc.dir {
|
||||
case Up:
|
||||
if contains(Right, point) {
|
||||
val = true
|
||||
}
|
||||
case Down:
|
||||
if contains(Left, point) {
|
||||
val = true
|
||||
}
|
||||
case Left:
|
||||
if contains(Up, point) {
|
||||
val = true
|
||||
}
|
||||
case Right:
|
||||
if contains(Down, point) {
|
||||
val = true
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func contains(v Direction, point Point) bool {
|
||||
for _, d := range point.dirs {
|
||||
if d == v {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func checkMove(loc *Loc, grid *grid2d.Grid[string]) bool {
|
||||
switch loc.dir {
|
||||
case Down:
|
||||
if loc.pos.y+1 >= grid.SizeY() {
|
||||
return false
|
||||
}
|
||||
if grid.Get(loc.pos.x, loc.pos.y+1) == "#" {
|
||||
loc.dir = Left
|
||||
} else {
|
||||
loc.pos.y++
|
||||
}
|
||||
case Up:
|
||||
if loc.pos.y-1 < 0 {
|
||||
return false
|
||||
}
|
||||
if grid.Get(loc.pos.x, loc.pos.y-1) == "#" {
|
||||
loc.dir = Right
|
||||
} else {
|
||||
loc.pos.y--
|
||||
}
|
||||
case Left:
|
||||
if loc.pos.x-1 < 0 {
|
||||
return false
|
||||
}
|
||||
if grid.Get(loc.pos.x-1, loc.pos.y) == "#" {
|
||||
loc.dir = Up
|
||||
} else {
|
||||
loc.pos.x--
|
||||
}
|
||||
case Right:
|
||||
if loc.pos.x+1 >= grid.SizeX() {
|
||||
return false
|
||||
}
|
||||
if grid.Get(loc.pos.x+1, loc.pos.y) == "#" {
|
||||
loc.dir = Down
|
||||
} else {
|
||||
loc.pos.x++
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func doMove(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
|
||||
x := loc.pos.x
|
||||
y := loc.pos.y
|
||||
switch loc.dir {
|
||||
case Down:
|
||||
if loc.pos.y+1 >= grid.SizeY() {
|
||||
return x, y, fmt.Errorf("outside")
|
||||
}
|
||||
if grid.Get(loc.pos.x, loc.pos.y+1).display == "#" {
|
||||
loc.dir = Left
|
||||
} else {
|
||||
loc.pos.y++
|
||||
}
|
||||
case Up:
|
||||
if loc.pos.y-1 < 0 {
|
||||
return x, y, fmt.Errorf("outside")
|
||||
}
|
||||
if grid.Get(loc.pos.x, loc.pos.y-1).display == "#" {
|
||||
loc.dir = Right
|
||||
} else {
|
||||
loc.pos.y--
|
||||
}
|
||||
case Left:
|
||||
if loc.pos.x-1 < 0 {
|
||||
return x, y, fmt.Errorf("outside")
|
||||
}
|
||||
if grid.Get(loc.pos.x-1, loc.pos.y).display == "#" {
|
||||
loc.dir = Up
|
||||
} else {
|
||||
loc.pos.x--
|
||||
}
|
||||
case Right:
|
||||
if loc.pos.x+1 >= grid.SizeX() {
|
||||
return x, y, fmt.Errorf("outside")
|
||||
}
|
||||
if grid.Get(loc.pos.x+1, loc.pos.y).display == "#" {
|
||||
loc.dir = Down
|
||||
} else {
|
||||
loc.pos.x++
|
||||
}
|
||||
}
|
||||
return x, y, nil
|
||||
}
|
||||
35
2024/go/day06/day06_test.go
Normal file
35
2024/go/day06/day06_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package day06
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...`)
|
||||
require.Equal(t, 41, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...`)
|
||||
require.Equal(t, 6, r)
|
||||
}
|
||||
130
2024/go/day06/input.txt
Normal file
130
2024/go/day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
...#..................#...................#......................#..............................#.............................#...
|
||||
....#.......................#........#.#..............##...........#.....#..........#..........................#..................
|
||||
.............#........................................................................#.........#.#..#..#..........#..............
|
||||
..........#.......#..........#..................#........##...................#..............#....................................
|
||||
....................#..........................................................#..#.....................................#.........
|
||||
....#............................#..............................................#.....................#..........##....#..........
|
||||
.......#.............#......................................................................#.............#.........#.............
|
||||
....###......................#....#...........#.....#................................#..........................#.................
|
||||
..........#..#...........#..#........................................................#.....#...........#................#.........
|
||||
..#....#......#....#....#...................................................................#.....................................
|
||||
....................#............#............................................#......#....#...............................#.......
|
||||
..........#.......#.........#.......#.............................................................................................
|
||||
.......#...#.......................................#...................#..........................................................
|
||||
.......#........#............................#.....#.......#..............................................#..................#...#
|
||||
.....................#.................................#................#...#...............#.....#.#..........................#..
|
||||
.....#..........................................#......................#.............##..............................#........#...
|
||||
.....#......#.........................#..........................#..........................................................#..#..
|
||||
.#......#.............#......#.................................................#.....#...................##......#................
|
||||
.............................................................................##...................................................
|
||||
........................................#.......................................#........#.............................#.#.......#
|
||||
...........#.....................................#.............................#......#......#..#....................#..#.........
|
||||
.............................................#.......................#..................##....#.....#.............................
|
||||
........................#..............................................................#..........................................
|
||||
#..............#.........................#........#...#...............#..............#..................#....................##...
|
||||
...#...#.............................#.......#................................................#........................#....#.....
|
||||
.....#.........................#..#.......................#..........#.....................#..................#.#.....#...........
|
||||
..................#........#..#.......#...................................................................................#....#..
|
||||
..#...#...............................................#.#..#........................................................#....#......#.
|
||||
...............#...............#..........................#............................#..........#.............#.................
|
||||
............#.....#........#.........................................................#........#........#.....#........#......#....
|
||||
............................#.........#....#........#.....#...#.............#.................................#...................
|
||||
........#..................#....#..........................................................#.#.#..................................
|
||||
....................................................................................................................#.............
|
||||
#............#.............#..................#......................................................................#............
|
||||
...............................#....#..........#...........##........................................................#.........#.#
|
||||
................#.........................................#.................................................#........#............
|
||||
..............................................#............#................#........#........................#...................
|
||||
..................#.........#..........................#.............#...............#............#....................#..........
|
||||
........................#...#...............................................#..............#.....#.....................#..........
|
||||
...........#.......................................#..............................#..................#....#...##..................
|
||||
#...............#..................#...............................#...............................#.....................#........
|
||||
.............#...............................................................##...................................................
|
||||
.................#.............#.......................#...#............#.#....#................................#...........#.....
|
||||
#......#......#..................................##.................#.#...............................#...........................
|
||||
.#...............#..........#...............................................#...#..........#..........#...........................
|
||||
.....................................#............................#....#.............................................#...#........
|
||||
......#...#.............#.#....................#.........#..........##.................................#..........#..........#....
|
||||
.............................#..................#....#..............##.......................#.#.....#........#...................
|
||||
.................................................#.#......................................................#................#......
|
||||
......................................#..........................................#......#.........................................
|
||||
#....................#...........................................................#..................#.............................
|
||||
.....#.........#...................................................#....#.#....#.#.........#......................................
|
||||
........#..........#......#.............#................................#.....#................#.................................
|
||||
...........#................................#...........#..........#......#.............#........................#................
|
||||
.......#...............#....................#..#................................................#.................................
|
||||
.....................#.........#..#............#..........#...........#...........#...............................#...............
|
||||
................#...#........#...........#..........................................................#..#...................#......
|
||||
.........................................................#.....................#...#......................#.#....................#
|
||||
................#......#....#.#..............#............#.......................................................................
|
||||
..........#.....................................#......................................................................#..........
|
||||
#......................................#.......#.....##..#.....................#.........#.......#................................
|
||||
........#...#..............#....................#................................#..............................................#.
|
||||
.##............................................................................#......#................................#..........
|
||||
.#........................#..............#..............................................#........#.....#.......#..................
|
||||
#......................................#.....................#...................................................................#
|
||||
............................#.....#.....#............#...............#...#.......#.........#......................................
|
||||
.#.........................#.......................#.........#.......#.................#............................#..#..........
|
||||
.............................................................................................................#........##..........
|
||||
...........#...#...#.#................#.....................................#........#............................................
|
||||
......#.......................#..........#.......#................................................................#...............
|
||||
........#....#........#..................#....##.....#............#..............................#...........#...........#..#.....
|
||||
..................................#...............................................................................#...............
|
||||
.....................#.#.......................#....................................#.............................................
|
||||
........................................................................................#.........#.................#.........#...
|
||||
..........................#..........#....#..........................................#.......................#............#.#.....
|
||||
...............................................#.#....#...............................#...................#......................#
|
||||
.....#...........#........#.#.......#.............................#..................#............................................
|
||||
...............#.........................................................#....................#.................#.............#...
|
||||
#....................................##..........#................................................................#...............
|
||||
...............#.................#...#..............#......................................................#..............#.......
|
||||
...................#......#.............................................#......................................................#.#
|
||||
..#.............#.......#......#....#..#..#.......................................................................................
|
||||
.........#....................................................#.....................................#..............#..............
|
||||
..............#..............#................................................................#.......................#...........
|
||||
..........................#.................#.......................................................##...................#.#......
|
||||
...............#..#...................................................................................................#.......###.
|
||||
...#.....................#..#........#..........#..................................................................##.............
|
||||
.................#.......................................###..............#.........................#.............................
|
||||
...#.....................................................#.......#..........................#................#..#.................
|
||||
...................................................#..................#.........................................................#.
|
||||
.....#.............#...................#...................#.....................................#................................
|
||||
.....................#.........................#......#...........................................................................
|
||||
...........#...............#......#.....##...#...#.............................................#........#.#...............#...#...
|
||||
..............#..............##...........#.......................#..#.^..........................................................
|
||||
...................#..............................................................................................................
|
||||
..................#.......#..........#.......#..................#..........#...................................#..................
|
||||
..............................................................................................#..................................#
|
||||
......................................................#................#......................#...................................
|
||||
..............#.........#..............................#.....................#......................#.............................
|
||||
#................#.........#................#.............................#......................#..#...#..............#..........
|
||||
.#..#........#................#...............#..................#........#.....................#............#........#...........
|
||||
.....................................................#.#.........#......................#.............................#........#..
|
||||
......................#.....................#..#......#..........................#............................#......#............
|
||||
......................#.........................#..#..................................#.......................#..............#....
|
||||
..........................#..................#.............#......................................................#...............
|
||||
..........................#....#........................................#..#...#....#.................#...........................
|
||||
.......#...........#.......................#............##........#....................................................#..........
|
||||
#..........................................................................#...........#..........................................
|
||||
............................................................#.................#..#........................................##......
|
||||
..#...............................................#....#.................................................##.....#...##.....#......
|
||||
...#.....##..............................#.........................................................#............#.................
|
||||
.....#....##............................#....##..........#...#....................................................................
|
||||
..................................................#..........................#.........##.......#.......................#.........
|
||||
.........#.....#..........#........#........................#.##..#............#.......................................#..........
|
||||
.....#...............#.......#..........#.#..........#.....................#.....................................#.....#..........
|
||||
....#......#............................................................................................##...#.#.#.........#......
|
||||
...........#........................#.....#....................#..................#.#........#....................................
|
||||
....................................................#................#.#................................................#.........
|
||||
..........#..............#.......................#.................#...................................#.............#.#......##..
|
||||
................##......................................................#.................#.......#.#....................#........
|
||||
................#......................................................#.............##...............#.....#......#.......#......
|
||||
..............................#............................#..........#...........#...............................................
|
||||
.......#.............#....................................................................#..............................#.#......
|
||||
...#.....................#.#...............................................................#...#..#....#..........................
|
||||
....#.........##......#..............................................................................#..................#.........
|
||||
....#..........................................#......#...................#........##............#................................
|
||||
..#.......#......#............#........#...#.#...........................#.......#................................................
|
||||
..........................#...#....................#...............#...#......#.#...#...#...............#.#.#.....................
|
||||
....##.#....................................................................#...#.....##........................#.##..............
|
||||
.............................................#....................................................................................
|
||||
140
2024/go/day07/day07.go
Normal file
140
2024/go/day07/day07.go
Normal file
@@ -0,0 +1,140 @@
|
||||
package day07
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Op int
|
||||
|
||||
const (
|
||||
Add Op = iota
|
||||
Mul
|
||||
Conc
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
val := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
parts := strings.Split(line, ":")
|
||||
result := utils.MustAtoi(parts[0])
|
||||
numStrings := strings.Fields(parts[1])
|
||||
var numbers []int
|
||||
for _, numStr := range numStrings {
|
||||
num := utils.MustAtoi(numStr)
|
||||
numbers = append(numbers, num)
|
||||
}
|
||||
bitmask := 1 << (len(numbers) - 1)
|
||||
for i := 0; i < bitmask; i++ {
|
||||
calc := 0
|
||||
switch isNthBitSet(i, 0) {
|
||||
case true:
|
||||
calc = numbers[0] + numbers[1]
|
||||
case false:
|
||||
calc = numbers[0] * numbers[1]
|
||||
}
|
||||
|
||||
for n := 1; n < len(numbers)-1; n++ {
|
||||
switch isNthBitSet(i, n) {
|
||||
case true:
|
||||
calc = calc + numbers[n+1]
|
||||
case false:
|
||||
calc = calc * numbers[n+1]
|
||||
}
|
||||
}
|
||||
if calc == result {
|
||||
fmt.Printf("result: %v numbers:%v count: %d\n", result, numbers, bitmask)
|
||||
val += result
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
val := 0
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
parts := strings.Split(line, ":")
|
||||
result := utils.MustAtoi(parts[0])
|
||||
numStrings := strings.Fields(parts[1])
|
||||
var numbers []int
|
||||
for _, numStr := range numStrings {
|
||||
num := utils.MustAtoi(numStr)
|
||||
numbers = append(numbers, num)
|
||||
}
|
||||
operations := []Op{Add, Mul, Conc}
|
||||
results := [][]Op{}
|
||||
generatePermutations(operations, len(numbers)-1, []Op{}, &results)
|
||||
for _, op := range results {
|
||||
calc := 0
|
||||
switch op[0] {
|
||||
case Add:
|
||||
calc = numbers[0] + numbers[1]
|
||||
case Mul:
|
||||
calc = numbers[0] * numbers[1]
|
||||
case Conc:
|
||||
calc = concat(numbers[0], numbers[1])
|
||||
}
|
||||
|
||||
for n := 1; n < len(numbers)-1; n++ {
|
||||
switch op[n] {
|
||||
case Add:
|
||||
calc = calc + numbers[n+1]
|
||||
case Mul:
|
||||
calc = calc * numbers[n+1]
|
||||
case Conc:
|
||||
calc = concat(calc, numbers[n+1])
|
||||
}
|
||||
}
|
||||
if calc == result {
|
||||
fmt.Printf("result: %v numbers:%v\n", result, numbers)
|
||||
val += result
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func isNthBitSet(num, n int) bool {
|
||||
return num&(1<<n) != 0
|
||||
}
|
||||
|
||||
func getOp(row, col int) Op {
|
||||
vals := []Op{Add, Mul, Conc}
|
||||
// Column 0 cycles as row / 3
|
||||
if col == 0 {
|
||||
return vals[row/3]
|
||||
}
|
||||
// Column 1 cycles as row % 3
|
||||
return vals[row%3]
|
||||
}
|
||||
|
||||
// Recursive function to generate permutations
|
||||
func generatePermutations(ops []Op, n int, prefix []Op, results *[][]Op) {
|
||||
if n == 0 {
|
||||
// Append a copy of the current prefix to the results
|
||||
*results = append(*results, append([]Op{}, prefix...))
|
||||
return
|
||||
}
|
||||
|
||||
// Iterate over all operations and build the combinations
|
||||
for _, op := range ops {
|
||||
generatePermutations(ops, n-1, append(prefix, op), results)
|
||||
}
|
||||
}
|
||||
|
||||
func concat(a, b int) int {
|
||||
aStr := strconv.Itoa(a)
|
||||
bStr := strconv.Itoa(b)
|
||||
|
||||
concatStr := aStr + bStr
|
||||
|
||||
result, _ := strconv.Atoi(concatStr)
|
||||
return result
|
||||
}
|
||||
47
2024/go/day07/day07_test.go
Normal file
47
2024/go/day07/day07_test.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package day07
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"github.com/stretchr/testify/require"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`190: 10 19
|
||||
3267: 81 40 27
|
||||
83: 17 5
|
||||
156: 15 6
|
||||
7290: 6 8 6 15
|
||||
161011: 16 10 13
|
||||
192: 17 8 14
|
||||
21037: 9 7 18 13
|
||||
292: 11 6 16 20`)
|
||||
require.Equal(t, 3749, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`190: 10 19
|
||||
3267: 81 40 27
|
||||
83: 17 5
|
||||
156: 15 6
|
||||
7290: 6 8 6 15
|
||||
161011: 16 10 13
|
||||
192: 17 8 14
|
||||
21037: 9 7 18 13
|
||||
292: 11 6 16 20`)
|
||||
require.Equal(t, 11387, r)
|
||||
}
|
||||
|
||||
func TestGetOp(t *testing.T) {
|
||||
operations := []Op{Add, Mul, Conc} // Define the operations
|
||||
X := 3 // Define the number of positions (columns)
|
||||
|
||||
// Start the recursive generation with an empty prefix
|
||||
results := [][]Op{}
|
||||
generatePermutations(operations, X, []Op{}, &results)
|
||||
for _, op := range results {
|
||||
fmt.Printf("%v\n", op)
|
||||
}
|
||||
r := Add
|
||||
require.Equal(t, Add, r)
|
||||
}
|
||||
850
2024/go/day07/input.txt
Normal file
850
2024/go/day07/input.txt
Normal file
@@ -0,0 +1,850 @@
|
||||
16183610: 62 7 96 8 6 8 52 3 3 47
|
||||
408936528: 5 1 5 1 9 2 2 8 7 1 725 63
|
||||
20378697464: 101 893 487 2 6 4
|
||||
376576: 4 9 235 57 1 3 6 722 8
|
||||
431880008: 18 66 276 5 295 4 5 7 1
|
||||
379520346363: 858 95 723 8 92 7 9 2
|
||||
18243750: 76 24 3 750
|
||||
7302: 806 446 391 791 3
|
||||
18879037: 7 75 1 94 217 37
|
||||
3887037856: 805 64 71 7 9 856
|
||||
120267: 3 48 937 659 3 69
|
||||
757199: 86 2 69 7 7 8 80 5 8 743
|
||||
5835692: 349 65 110 8 1 8 35 4
|
||||
9693533: 560 33 54 523 251
|
||||
1691420808: 33 720 4 76 84 66
|
||||
27537: 5 2 2 4 296 73 89
|
||||
3099946535: 7 330 5 245 9 4 5 3 7 3 5
|
||||
2430252: 58 1 3 9 47 71 5 19 418
|
||||
379232792: 789 98 6 71 6 8 535 8 2
|
||||
11690268: 2 92 3 2 83 72 1 3 1 6 8 4
|
||||
65091: 225 4 895 1 9 6 5 6 81
|
||||
230263117372: 405 38 568 727 7 372
|
||||
1071440: 6 4 614 67 30 4 7 1 229
|
||||
60445800: 3 7 9 9 9 683 27 8 4 4
|
||||
6834722563: 95 43 29 182 9 317
|
||||
449482: 98 1 458 99 85
|
||||
381868494: 74 992 18 289 78
|
||||
42075: 86 3 28 14 38 18 225
|
||||
105275: 13 751 755 4 91
|
||||
1258023882: 4 79 534 502 61 3 3 9
|
||||
766505: 7 87 21 4 4 7 83 5
|
||||
4569436040: 355 7 6 3 4 7 8 753 4 29
|
||||
182512: 4 1 7 1 6 66 38 8 6 112
|
||||
238680: 9 42 36 65 2
|
||||
81450600: 235 52 86 6 275 2
|
||||
20684471: 2 989 98 2 4 237 3 7 59
|
||||
79521192: 48 98 9 91 5 15 29 18
|
||||
604195918: 756 74 12 2 9 52 7 8
|
||||
43646875223: 62 28 8 5 6 8 730 3 2 3
|
||||
24683153283: 5 12 2 2 462 2 72 24 3
|
||||
13641: 21 664 2 3 655 5 61
|
||||
23364264: 35 5 9 43 39 2 520 8 33
|
||||
1352375279: 9 21 54 9 84 61 527
|
||||
122558095823: 51 58 4 676 99 6 3 7 2 9
|
||||
9153847: 912 3 1 38 47
|
||||
623510: 25 63 6 30 892 86 2 5
|
||||
100277100: 352 773 45 20 90 22
|
||||
19779196416: 7 239 64 716 2 129
|
||||
5982828: 86 3 644 9 2 271 66 4
|
||||
1287462: 3 25 68 2 93 15 6 22
|
||||
11178753676: 9 9 69 3 7 2 4 8 2 6 8 8
|
||||
38798: 3 314 4 4 71 38
|
||||
15055: 1 43 7 52 3
|
||||
58769: 813 2 4 4 3 1 1 8 3 47 7 5
|
||||
716958509: 2 343 612 33 69 5
|
||||
1675: 1 28 41 19 467
|
||||
39178: 3 873 40 3 1 9
|
||||
708235: 340 13 9 2 50 385
|
||||
61112: 7 52 2 107 5
|
||||
9420: 2 9 5 70 4 13 2 468 8
|
||||
23543454: 8 478 2 87 242
|
||||
35262945144: 26 81 91 441 184
|
||||
357858: 68 4 6 9 92 7 9 92 54
|
||||
2718246046: 1 85 4 95 53 7 7 5 6 2 2 6
|
||||
575: 519 2 49 3 2
|
||||
1180: 172 18 58 44 888
|
||||
1206891306: 2 9 1 67 80 9 1 2 9 8 5 3
|
||||
1968096: 6 5 545 39 7 5 2 21 6 6 4
|
||||
74504: 744 97 7
|
||||
452256: 8 355 5 796 81 168
|
||||
418262248: 541 1 482 802 2
|
||||
152402250369: 4 87 8 8 6 319 65 369
|
||||
123797905: 9 7 550 577 1 7 2 5 3 5 7
|
||||
3129360: 73 1 7 5 62 59 20
|
||||
13030160: 58 9 4 748 65
|
||||
3758143: 7 80 6 44 6 7 1 4 17 9 4
|
||||
1058: 521 534 3
|
||||
6027582: 8 55 704 838 2
|
||||
55923132: 971 9 7 137 1 6
|
||||
42362711: 423 614 8 71 440
|
||||
74875: 89 83 85 4 57 94
|
||||
6528: 6 8 8 17
|
||||
376636: 7 9 301 12 636
|
||||
33983238: 77 8 38 925 422 51
|
||||
9773991: 76 738 2 998 6
|
||||
13324553022657: 7 4 20 5 9 5 30 22 646 9
|
||||
99691578: 5 71 1 9 4 7 325 7 1 54 7
|
||||
15561636: 4 3 74 7 10 9 7 6 6 3 3 1
|
||||
133680: 1 59 7 1 24 5
|
||||
768797: 956 3 8 375 7
|
||||
2192068: 4 4 7 2 7 22 7 2 9 97 76
|
||||
141515823: 4 8 51 515 449 3
|
||||
102779637: 902 41 6 251 3 920
|
||||
255504: 7 843 1 68 3
|
||||
6334426: 8 4 42 47 132 3 439 6
|
||||
1679200: 6 2 1 28 7 954 4 1 2 4 5
|
||||
743869: 686 85 6 56 893
|
||||
1740659638: 723 68 4 5 38 4 37 65 3
|
||||
38740803516: 696 4 198 64 36 439
|
||||
1445311524: 851 1 51 9 4 197 4 4 4
|
||||
82489: 6 13 27 26 153 22
|
||||
288151123: 5 8 95 3 4 121 6 7 5 7 7 8
|
||||
33615: 41 9 2 83 249
|
||||
235334584: 616 5 9 2 473 7 8
|
||||
18983872: 3 58 389 84 8
|
||||
966410: 117 12 622 477 3 5
|
||||
31850527: 318 32 17 741 787
|
||||
7766: 8 97 6
|
||||
3767400: 6 4 3 9 203 2 17 7 4 30
|
||||
8170454: 494 93 449 31 1
|
||||
56113624133: 5 4 7 6 502 7 9 71 7 35 3
|
||||
1070749: 2 60 64 3 986 4 6 4 9 1
|
||||
152169288123: 3 440 2 47 3 834 878 3
|
||||
23710639960: 7 7 6 2 3 4 2 395 81 2 4 4
|
||||
41133: 1 1 736 6 119 3 85 2 3 3
|
||||
2438060548: 872 65 66 8 16 5 308
|
||||
2150: 60 975 6 34 2
|
||||
42667317: 8 9 2 848 6 2 7 693
|
||||
99291: 8 52 97 811 115 69
|
||||
700480533: 152 24 4 995 533
|
||||
2043415727134: 437 668 53 7 6 6 5 13 4
|
||||
47685378032: 2 7 4 4 2 87 82 5 962 32
|
||||
1623679122582: 842 679 71 4 2 58 2
|
||||
13176069: 5 5 527 988 81
|
||||
402209662: 4 891 26 8 4 9 38 389
|
||||
62080: 86 718 329
|
||||
1056230: 475 2 5 2 553
|
||||
95017: 8 6 9 5 8 13 323 7 6 1 5 7
|
||||
130085288174: 9 9 2 9 674 36 4 2 17 4
|
||||
179095515: 2 38 6 7 6 26 9 36 8 27
|
||||
520128: 9 66 438 504
|
||||
110760: 3 8 4 7 4 60 71
|
||||
76246863: 2 80 3 3 5 75 7 761 791
|
||||
2167131616: 590 79 3 197 236 19 1
|
||||
243936484: 25 10 5 8 8 857 4
|
||||
88760: 305 4 30 6 2 9 1 70
|
||||
6539567445: 2 673 89 206 49 53 5
|
||||
802: 89 4 8 2 1 56
|
||||
198163: 55 9 8 5 5 514 273
|
||||
184378: 38 691 7 11 561
|
||||
342819000: 82 387 8 5 2 3 5 9 8 8 27
|
||||
10656324: 5 26 8 1 7 186 3 1 6 7 6
|
||||
552920982: 87 69 7 92 91 9 61 2
|
||||
20206: 1 63 1 86 79 535
|
||||
1555253: 731 36 853 960 53
|
||||
3143202608: 91 2 4 378 4 72 49 7
|
||||
108617320: 7 64 27 657 8 367 1 49
|
||||
1002415: 2 5 5 4 235 21 53 3 61 2
|
||||
554954: 96 720 227 9 8 7 1 99
|
||||
14766160525: 748 1 337 25 13 6 6 5 5
|
||||
26599060: 51 610 855 1 9
|
||||
313216: 70 93 6 92 8
|
||||
495206630906: 624 496 4 577 25 4 6
|
||||
852106300: 461 6 1 83 3 95 5 629
|
||||
338693777: 3 386 93 739 38
|
||||
84441: 50 93 2 18 647 45 13
|
||||
19591896: 3 47 87 143 888 8
|
||||
1215760: 88 32 8 7 760
|
||||
303: 8 64 9 215 7
|
||||
4493757702: 587 7 4 9 2 5 4 7 3 3 994
|
||||
45810: 6 54 4 7 4
|
||||
455911: 475 1 3 9 9 2 10 91 5 1
|
||||
21250549332: 9 7 6 6 51 18 183 43 8 9
|
||||
1651093: 716 6 3 3 1 4 1 8 8 52 4 5
|
||||
1425: 50 4 36 6 9
|
||||
240413184: 8 5 6 5 7 6 8 7 34 9 96 8
|
||||
9353: 10 13 9 8 1 1 4 4 3 7 5 8
|
||||
2098356329412: 6 57 264 714 1 5 7 651
|
||||
1366070: 18 3 2 99 220 237
|
||||
166196809: 68 59 291 20 7 284 9
|
||||
40834936: 405 659 51 3 1
|
||||
37929239: 5 739 66 518 39
|
||||
332660900: 25 96 954 572 541
|
||||
17248552687: 71 8 6 71 3 56 8 6 88
|
||||
736: 2 97 58 4 6 9 5 62 6 8 7 5
|
||||
1113308: 7 4 9 3 1 515 9 6 7 840 1
|
||||
1047862: 99 5 552 863 1
|
||||
8679: 9 6 32 5 39
|
||||
17123332: 150 3 542 72 38
|
||||
14301196: 810 535 6 33 446
|
||||
13953852: 82 2 21 94 18 844 1
|
||||
30194: 5 4 5 3 487
|
||||
299623: 40 908 79 4 55
|
||||
45472: 3 56 56 29 7
|
||||
4534682: 9 17 6 96 6 52 92 159 2
|
||||
182860020: 664 873 836 35 9
|
||||
2594594: 2 7 5 20 6 8 6 594 7 1 1
|
||||
5956711: 1 3 88 2 900 8 68 3 61
|
||||
513431: 641 64 8 98 21
|
||||
1690136: 197 191 66 66 8
|
||||
50985: 32 9 59 3 3
|
||||
1540800567: 15 30 4 16 535 567
|
||||
393181: 3 3 3 2 6 9 295 43 4 69
|
||||
152631244: 89 18 287 808 44
|
||||
49366847: 9 60 5 831 99 551 2
|
||||
47525635: 433 4 2 212 359 256 3
|
||||
313329721: 139 788 41 18 458 4 9
|
||||
48862422: 1 6 40 331 4 254 500 9
|
||||
39443910: 87 42 1 849 170 237
|
||||
130906800: 207 85 93 16 5
|
||||
220175705: 42 3 2 654 89 35 79 95
|
||||
14111: 1 6 5 8 6 8 143 510 4 9 5
|
||||
409336410: 846 720 10 8 7 5 2 1 7 6
|
||||
113011515265: 9 3 39 7 61 5 2 663 605
|
||||
2387490: 6 9 7 5 221 80 60 70 8 5
|
||||
7712: 2 7 1 155 606 2
|
||||
8043: 210 91 58 790 7
|
||||
146645: 4 407 30 3 122
|
||||
8480556: 1 8 5 922 657
|
||||
689065610: 7 141 2 698 10
|
||||
2753326: 1 141 6 5 4 1 9 39 643
|
||||
345873: 7 265 3 8 26 1 47
|
||||
74885173: 372 7 670 8 2 85 9 8 3
|
||||
136583527: 6 6 8 8 3 9 8 5 51 822 7
|
||||
3089340323: 8 64 8 1 90 477 2 4 53 3
|
||||
1096918: 195 6 886 9 920
|
||||
5367398: 535 68 80 25 98
|
||||
3976108135: 7 9 2 5 1 1 1 6 31 33 7 56
|
||||
2496005: 8 19 199 55 71
|
||||
2893997: 2 3 6 9 5 19 88 9 502 7
|
||||
557376309: 295 7 7 1 2 623 27 699
|
||||
42567659: 42 480 1 875 5 9
|
||||
15723798791671: 4 926 456 7 6 791 671
|
||||
91: 3 1 87
|
||||
75030526368: 250 695 9 692 78 8 96
|
||||
17385: 560 19 3 2 3
|
||||
616920: 3 60 879 1 582
|
||||
584294213: 8 346 7 7 4 213
|
||||
4724: 9 416 7 467
|
||||
155165: 4 11 95 2 648 4 19 125
|
||||
981426041: 4 83 7 71 3 50 9 4 5
|
||||
19972184: 2 5 31 7 2 231 2 4 4 62
|
||||
549451: 7 6 741 734 53
|
||||
5081833: 4 950 6 996 2 1 6 6 7 3 1
|
||||
1988310268: 9 3 5 707 744 14 6 8 2
|
||||
96053133326: 5 804 8 8 192 972 8 7 2
|
||||
3528: 3 11 28 3 3
|
||||
24189396: 8 3 2 171 4 4 33 28
|
||||
864165: 9 4 78 73 795
|
||||
26433000: 667 5 1 6 660
|
||||
8858: 38 1 4 206
|
||||
3200393280: 50 1 3 912 7 940 79
|
||||
2445982082: 49 1 7 94 4 86 7 64 2
|
||||
3488032730490: 73 5 6 8 57 7 8 938 490
|
||||
10071162: 8 381 15 137 3 8 8 9 1
|
||||
444: 69 6 30
|
||||
28452288677408: 480 45 5 2 6 7 90 658 8
|
||||
2593: 860 1 1 3 7
|
||||
198443470: 7 506 8 78 72 97 94
|
||||
75507: 754 2 2 85
|
||||
564275: 3 3 767 4 3 6 3 515 9 5 6
|
||||
1226: 58 4 1 276 887
|
||||
1416: 6 3 4 25 55 36
|
||||
4946042400: 9 751 929 60 65
|
||||
10626120960: 5 1 280 6 7 4 8 672 235
|
||||
222300: 10 494 15 1 3
|
||||
15905: 39 6 13 3 27 29
|
||||
89152410253: 1 27 8 2 2 6 8 8 1 518 5 3
|
||||
347293: 7 6 5 61 1 64 336 1 659
|
||||
397401: 7 7 5 20 9 9 43 1 3 7 1 3
|
||||
38394: 6 466 2 1 81
|
||||
120391: 4 9 145 4 3 7 9 8 2 6 927
|
||||
110645540: 5 180 267 1 2 9 2 143 4
|
||||
87614568: 2 4 63 32 73 213 591 4
|
||||
4709992455381: 3 6 7 2 2 955 791 9 159
|
||||
6834689: 27 6 194 8 3 689
|
||||
768: 1 16 4 5 694
|
||||
320720507: 39 660 890 7 2 7 9
|
||||
349171872: 11 36 32 82 1 89 9 6 56
|
||||
2144800: 47 79 3 5 32 25 7
|
||||
4415: 1 1 2 8 3 6 1 7 799 8 4 3
|
||||
77208: 2 322 34 7 96
|
||||
70838: 5 209 55 6 76 52 2 88
|
||||
711169603810: 9 1 9 2 20 80 74 761 1 5
|
||||
6894733854: 684 60 84 6 90 3 4 21 2
|
||||
5086572: 316 31 296 9 3 7 1 8 28
|
||||
2928408191557: 394 991 42 5 5 4 75 7
|
||||
509332682: 5 1 4 37 834 58 7 5 68 2
|
||||
13102440337: 1 6 3 780 5 8 3 37
|
||||
10878341: 9 90 612 170 45 41
|
||||
498132911: 4 911 685 999 89
|
||||
958999: 683 23 61 6 5 17 722
|
||||
143343: 88 59 9 92 751 210 3
|
||||
2743510584: 6 706 6 385 584
|
||||
251973: 424 66 5 8 9
|
||||
10183308: 169 709 9 5 3 9 67 2 46
|
||||
749315: 464 4 4 68 10 2 2 203
|
||||
92707239: 6 522 50 4 2 74 1 6 25 8
|
||||
82155646350715: 4 87 2 84 9 463 507 15
|
||||
87924480: 281 975 789 320
|
||||
60415: 5 804 3 23 5
|
||||
971347: 83 13 9 2 47
|
||||
17037310: 7 811 3 6 310
|
||||
15333: 535 78 95 99 19
|
||||
23713: 3 2 39 519 877
|
||||
29532875: 29 5 32 563 118 194
|
||||
6455904009: 221 6 9 4 2 4 26 112 9
|
||||
57785406: 96 140 7 55 186 26 6 7
|
||||
48: 1 3 12
|
||||
215140: 8 317 5 3 8 4 4 40 9 3 2 2
|
||||
9406542: 9 5 39 9 5 653 511 219
|
||||
8396187: 7 904 477 3 148 87 2
|
||||
734384430: 56 485 9 1 507 4 9 130
|
||||
484993118067: 81 402 993 345 6
|
||||
287773: 1 783 2 814 267 7 4 7 3
|
||||
36777312: 47 6 66 8 247
|
||||
4740447723: 2 36 3 10 3 355 8 73 1 3
|
||||
866755680: 460 3 3 991 1 5 6 6 19
|
||||
290326138: 5 285 317 8 83 38
|
||||
13602050748: 801 13 5 1 49 7 314 99
|
||||
61360: 9 543 8 53 60
|
||||
1787: 321 5 82 6 3 80 9
|
||||
233760: 7 429 313 5 4 77 4 296
|
||||
7665: 87 5 11 17 83
|
||||
26991479: 26 1 8 6 6 6 12 7 7 3 5 76
|
||||
18712: 6 74 13 974 56 1 7 9 7 3
|
||||
217: 7 87 2 3 26
|
||||
64867314: 2 90 9 5 8 492 1 4 1 257
|
||||
318200694: 2 3 739 7 1 861 63
|
||||
3282485321: 82 4 248 521 3 106
|
||||
156568734: 7 2 8 6 4 36 769 7 5 1 6 9
|
||||
832433113: 36 909 158 161 1
|
||||
33661685163: 7 2 7 42 49 1 9 80 342 3
|
||||
1924152: 5 83 51 9 677 998 8
|
||||
5297870114599: 141 899 89 5 839 99
|
||||
429345221: 9 471 63 7 45 2 21
|
||||
656: 7 27 9 15 7 2
|
||||
75577: 34 855 85 6 6
|
||||
1215357: 2 922 57 28 210 29 3
|
||||
1595334418735: 6 676 272 86 184 3 35
|
||||
5453: 7 683 5 31 542 94
|
||||
154076: 3 414 4 74 1 1 88 1 604
|
||||
355: 44 8 3
|
||||
33370224183: 71 470 224 122 64
|
||||
39385509782: 3 2 712 454 6 442 86
|
||||
69169117: 1 2 492 14 91 17
|
||||
1312: 44 51 55 890 272
|
||||
168008743: 8 50 42 87 34 9
|
||||
487800: 48 7 19 72 48 75
|
||||
13370112: 8 5 49 9 81 6 724 9 4 1 7
|
||||
42823680: 5 1 6 9 9 5 96 34 32
|
||||
8791740: 1 62 807 3 54
|
||||
56457986: 60 9 6 32 9 49 568 221
|
||||
113219: 78 200 8 409 43
|
||||
54394: 8 99 89 90 5
|
||||
378625170008: 77 496 8 83 125 61 1 8
|
||||
278244129: 5 6 176 93 630 770 2 9
|
||||
558711270: 10 9 7 7 8 2 550 97 9 9
|
||||
119: 1 8 9 43 58
|
||||
4219093863: 1 4 3 5 609 98 31 63 1
|
||||
13341355: 42 910 954 14
|
||||
10052058: 904 699 63 9 34 3 6
|
||||
48462: 4 5 5 66 301
|
||||
75699471: 4 34 942 942 82 4 347
|
||||
4544506132: 5 3 7 5 247 1 5 9 9 1 1 32
|
||||
52896: 68 279 1 76 76 1 2
|
||||
258536924: 8 5 8 2 7 3 86 690 9 1 12
|
||||
288662: 5 26 2 75 5 3 172 41 2 3
|
||||
26390: 48 59 931 7 7
|
||||
102081: 324 693 2 36 1
|
||||
128487268: 38 7 83 6 39 81 97 1 4
|
||||
19224: 3 9 1 8 89
|
||||
81432540: 501 20 7 387 3
|
||||
738: 20 9 4 2 7 435
|
||||
29516544: 87 2 7 557 8 69
|
||||
1296424278: 6 666 6 31 857 54
|
||||
479149020: 5 6 987 261 62
|
||||
1883704: 9 638 8 8 41
|
||||
7480260: 4 8 7 534 9 102 2 7 8 18
|
||||
1475107: 29 37 30 745 7
|
||||
1693: 17 97 1 9 35
|
||||
896075: 792 1 862 5 2 53 9 8 6 5
|
||||
2470: 151 1 1 2 2 2 608 2 7 3 4
|
||||
45069234: 82 177 29 539 6
|
||||
241893540: 824 820 358 79 10 11
|
||||
191130028: 685 7 8 4 25 92 5 4 3 16
|
||||
8853318: 693 285 5 39 31 2 9
|
||||
18827664945: 4 9 1 45 8 6 4 9 82 757 5
|
||||
4116: 1 564 14 7 70
|
||||
176837684: 7 5 22 10 4 73 5 4 7 83 2
|
||||
1896818086: 12 931 5 409 5 2 4 1 6
|
||||
105489753097: 6 17 9 841 5 4 1 7 8 29
|
||||
40161623048: 352 63 98 3 55 4 7 2 4
|
||||
1588: 8 21 3 27 8 4
|
||||
557431350: 25 486 9 26 589 25 70
|
||||
344082613: 47 8 5 8 4 9 2 2 4 802 13
|
||||
54844287: 548 44 27 1 4
|
||||
2009988: 293 98 7 4 4
|
||||
1460: 9 5 3 9 7 9 4
|
||||
531060398227: 4 37 897 9 4 398 227
|
||||
370163550: 9 48 1 8 67 12 70 3 747
|
||||
607921609: 5 476 7 37 30 790 9
|
||||
142843: 2 27 80 33 12 271
|
||||
1491: 729 646 86 24 6
|
||||
710723510: 17 469 9 3 53 8 86 3 70
|
||||
101165: 37 495 19 6 79
|
||||
4068792: 3 7 432 8 3 13
|
||||
22305981: 9 3 348 4 1 5 3 2 65 2 89
|
||||
1969800068778: 500 201 196 687 78
|
||||
1968: 105 7 1 51 12
|
||||
60750717: 45 2 9 75 717
|
||||
57464640: 1 85 651 2 8 2 81 3 2 5 2
|
||||
200314094445: 4 8 7 5 7 66 8 1 880 8 9 5
|
||||
8486: 2 963 1 6 7 7 1 6 2 337 2
|
||||
313862603: 71 5 92 961 3
|
||||
13295: 3 257 9 50 5
|
||||
567600: 7 4 572 946
|
||||
68737952352: 318 23 1 2 6 9 2 8 3 144
|
||||
3564807348: 35 47 202 9 298 57 4
|
||||
689871030: 19 95 980 3 26 6 5
|
||||
94380: 1 9 71 5 66 2
|
||||
2781516: 6 5 603 20 61 492 386
|
||||
13274353131: 3 4 466 1 1 87 8 963 1 8
|
||||
1114: 838 95 19 90 72
|
||||
265690: 9 119 8 31 82
|
||||
4914768: 505 5 968 48 17
|
||||
20054848: 9 2 3 97 3 6 3 34 58 11 4
|
||||
25408: 773 8 4 2 670
|
||||
12692025489: 6 504 54 226 9 1 8 11
|
||||
290762983266: 7 1 8 7 38 1 6 998 14 9 6
|
||||
11062: 173 7 56 250 4 9 4 715
|
||||
2047569858: 12 5 91 17 21 81 2 9
|
||||
36882: 237 4 751 961 2 827 6
|
||||
604145841: 3 5 9 8 4 5 823 4 634 41
|
||||
3706712: 3 706 710
|
||||
1958107: 1 325 6 8 6 4 4 1 1 60 6 1
|
||||
310883145: 4 816 618 4 8 31 45
|
||||
86120982: 4 41 221 6 66 866 7 6
|
||||
2773830: 231 76 3 9 9 30
|
||||
75367563264: 6 83 2 6 8 6 76 9 8 7 1
|
||||
22134: 3 90 238
|
||||
7551233910: 839 9 163 70 910
|
||||
153182070: 50 2 1 7 6 84 30 7 5 9 31
|
||||
6210421: 7 763 8 2 1
|
||||
14047776281: 5 67 852 229 281
|
||||
2203652320: 807 8 63 602 1 9 7
|
||||
233435: 9 715 1 9 41 399 1 4 8 7
|
||||
1257131: 5 94 1 16 1 95 502 629
|
||||
26088: 10 8 6 466 953 9 48 9 2
|
||||
35581368: 5 9 75 912 6 62 438
|
||||
606056: 6 11 5 194 44
|
||||
1552572: 85 761 3 2 9 6 18 4
|
||||
253947: 3 2 627 81 12
|
||||
5051760736: 3 786 571 469 50 8
|
||||
358540: 9 64 306 28 394
|
||||
561644260: 5 61 1 4 3 6 5 4 247 11 2
|
||||
1778294250: 9 15 242 9 42 144 810
|
||||
7710: 8 2 753 10 4 16
|
||||
193140: 20 498 3 4 7 55 15 6
|
||||
502578: 9 84 900 63 6
|
||||
43946: 26 42 643 24 39 159
|
||||
6279695: 1 6 5 4 60 57 1 9 95 6 2 3
|
||||
2372052: 8 8 8 80 44 2 3 7 9 516
|
||||
55286: 610 308 47 4 57 8 45
|
||||
11313: 85 435 604 6 1 3
|
||||
1172701075: 8 842 21 461 9 25 7
|
||||
1797522636: 590 8 52 3 578 44 392
|
||||
971889: 5 235 71 26 30 9
|
||||
4481: 648 4 8 166 1 291 4 9
|
||||
33050: 4 46 661
|
||||
28350171951: 4 146 945 859 75 2 1
|
||||
20126581497: 17 9 491 229 494 3
|
||||
219611747: 9 421 966 60 549 758
|
||||
1240: 53 6 3 7 1
|
||||
1063335085: 7 505 96 3 6 7 975 1 8 5
|
||||
1055: 6 52 29 2 6 11
|
||||
7469925625: 5 38 2 1 7 59 6 86 20 5
|
||||
35653113: 3 5 653 11 3
|
||||
149744: 53 897 49 1 40 9 8 2 8
|
||||
93519: 1 894 233 7 16 9 39 2 9
|
||||
11332409040413: 7 8 418 7 502 4 90 413
|
||||
143916476: 2 497 3 57 961
|
||||
7467000: 8 14 900 388 300 19
|
||||
198360845: 6 121 119 56 3 41 98
|
||||
353309832209: 6 1 36 8 2 9 9 44 3 211
|
||||
128: 6 6 2 50 6
|
||||
50422922685: 340 92 73 61 362 605
|
||||
1044844: 3 7 4 4 844
|
||||
9193: 5 79 3 76 3
|
||||
30090: 14 16 3 131 8 259 77 9
|
||||
337279: 37 4 9 13 658 8
|
||||
168780: 28 9 6 17 64 4 3 4 87 5
|
||||
642: 77 6 8 7 2
|
||||
7672557939275: 25 643 5 76 88 34 7 5
|
||||
19552214: 702 29 2 8 9 480 374
|
||||
354663185: 7 9 3 325 6 3 574 6 3 2 5
|
||||
525: 4 7 460 54
|
||||
599351195625: 2 38 4 45 625 573 689
|
||||
1965880: 220 960 34 49
|
||||
714: 13 3 3 2 6
|
||||
3955502937502: 3 6 75 586 2 93 1 6 502
|
||||
2814600: 2 2 6 14 4 83 23 20 74 1
|
||||
5382626: 5 887 8 9 771 26
|
||||
2985: 42 70 45
|
||||
114040: 86 805 270 99 90 640
|
||||
9758700: 3 11 8 35 2 47 5 7 150
|
||||
100502: 56 9 7 82 8 4 1 9 9 305
|
||||
414969404544: 4 317 8 6 41 9 7 9 64 96
|
||||
1842483: 1 59 3 3 2 9 2 7 1 60 9 3
|
||||
21282606: 4 21 883 518 942
|
||||
127405: 1 447 285 9 1
|
||||
142043: 2 84 8 804 139 400
|
||||
28834136: 47 5 607 1 5 1 10 148 6
|
||||
2624860: 28 4 2 9 9 2 217 85 45 7
|
||||
17295642442: 994 174 406 15 3 42
|
||||
446792: 76 1 5 5 58 19 2
|
||||
35078400: 29 14 25 8 9 6 8
|
||||
35933488: 8 927 948 537 218 1 8
|
||||
2054: 2 54 1 35 59
|
||||
5752100560: 729 935 27 394 20
|
||||
1460: 8 78 3 36 2 1 794
|
||||
2092: 92 2 6 482 2
|
||||
132844416: 3 73 8 16 8 5 53 5 6 914
|
||||
1040: 2 1 8 13 65 5
|
||||
3776340861: 5 6 43 4 807 9 30 3 327
|
||||
211646: 737 7 1 2 41 45
|
||||
2478488900: 912 677 9 320 6 8 446
|
||||
6346890: 79 13 64 549 21 9 3
|
||||
10743769823: 2 9 9 366 2 9 213 5 7 4 3
|
||||
384744: 1 7 45 9 1 53 8 9 1 2 3 92
|
||||
11120158342: 94 2 3 863 118 2
|
||||
489775464841: 754 909 829 862 9 4
|
||||
51328938: 7 8 9 4 3 172 73 8 9 1
|
||||
3792391: 50 8 89 5 11 141 193 3
|
||||
1677592: 79 87 20 6 9 16 5 2 56
|
||||
471: 9 14 8 7 433
|
||||
1107101: 3 367 7 198 5 7 1 98 4 9
|
||||
47200: 2 9 3 17 944
|
||||
3348321304: 5 813 9 1 520 64 7 4 4 9
|
||||
1739519: 66 19 428 57 519
|
||||
22440: 8 4 9 54 4 9 165 846 17
|
||||
821576: 9 31 6 5 79 1 2 8 9 7 5 56
|
||||
2668212268: 193 9 6 929 17 9 2 9 70
|
||||
107258248: 5 39 55 824 8
|
||||
16886076: 86 798 850 2 10 9 27 6
|
||||
15150915: 23 77 8 9 89 97 15
|
||||
5495112: 4 9 3 27 652 3 329 8 8
|
||||
3731250172: 18 923 206 765 957
|
||||
712: 7 82 7 70 61
|
||||
1690608385: 950 8 59 36 754 933 5
|
||||
211704: 4 73 5 5 29 4
|
||||
13350938: 9 13 690 26 878 70
|
||||
1078: 4 75 3 58 938
|
||||
63265042924: 8 6 92 1 1 530 8 2 924
|
||||
133796: 88 12 6 1 31 2 1 991 2
|
||||
1568: 47 9 365 578 202
|
||||
8272201: 32 68 5 887 703
|
||||
1577492: 46 517 38 1 28
|
||||
196963074: 84 5 1 63 47 6 29 5 198
|
||||
886296: 87 7 35 894 6
|
||||
31327600: 175 117 765 2 847 3
|
||||
253681: 8 1 40 23 775 45 3 7 7 2
|
||||
17514480: 43 377 18 79 31 60
|
||||
910107: 912 319 400 558 1 9
|
||||
161: 3 3 4 2 83 9 21
|
||||
40413945600: 405 172 56 280 37
|
||||
3789: 87 2 35 650 24
|
||||
27022: 4 4 32 5 600 22
|
||||
197568: 257 9 3 1 36 84
|
||||
328307113: 377 3 6 45 87
|
||||
151439: 95 56 423 16
|
||||
259661768400: 920 49 2 33 57 6 33 48
|
||||
423: 1 2 5 8 4 6 1 4 62 7 35 3
|
||||
46979865: 446 9 8 7 209 4 5
|
||||
645844904: 913 3 32 7 921 349 9 8
|
||||
2626745581: 7 4 4 96 770 9 5 581
|
||||
563611272336: 84 52 5 5 4 6 98 126 6 3
|
||||
2816515701: 4 305 5 13 93 8 5 7 6
|
||||
7008: 3 24 43 7 6 1
|
||||
3843804: 114 9 6 880 67 3 4 680
|
||||
11489089: 29 882 67 32 5 14 59
|
||||
532035739: 604 586 2 440 59
|
||||
400471397473: 6 674 52 1 3 2 911 6 4 1
|
||||
125805007: 8 4 5 2 3 2 9 7 51 5 60 7
|
||||
3731005: 37 30 952 4 49
|
||||
26168970: 873 7 4 1 704 26 7 33 6
|
||||
18249174: 249 25 74 86 9
|
||||
14153474251: 6 471 6 3 9 6 9 6 9 450 1
|
||||
1685466: 4 921 82 678 466
|
||||
50708: 8 546 191 67 793
|
||||
1789646: 7 4 2 52 1 6 2 910 787 8
|
||||
113086575: 136 85 1 323 95 75 21
|
||||
763: 60 3 3 157
|
||||
756109819: 1 2 7 90 258 9 1 4 621 9
|
||||
99331: 610 597 94 38 9 2 437
|
||||
5591282: 31 5 662 9 2 4 84
|
||||
68420: 76 7 2 1 4 3 5 5 517 8 8 4
|
||||
120380: 4 9 6 553 924 8
|
||||
663053160: 4 2 6 14 5 4 9 5 2 6 365 2
|
||||
26825461: 609 28 7 1 9 109 6 52 9
|
||||
41360: 2 19 3 2 3 899 6
|
||||
20393: 1 49 4 3 93
|
||||
2084013: 781 26 3 9 257
|
||||
1667257110288: 3 69 8 28 41 204 77 7
|
||||
430950: 14 1 8 8 18 7 4 6 7 2 6 5
|
||||
52577: 6 28 9 295 356 6
|
||||
10006634: 7 1 25 5 6 634
|
||||
262290534: 82 9 8 3 6 95 3 18 4 92 6
|
||||
67866: 31 650 73 9 6
|
||||
1575: 9 58 1 3 6
|
||||
59124: 8 2 9 2 32 3 845 1 23 4 4
|
||||
1013226: 3 588 5 3 94
|
||||
223242318: 7 8 55 5 16 22 2 423 18
|
||||
1156716300: 1 201 5 191 828 299 1
|
||||
304170059558: 452 46 8 950 6 59 558
|
||||
16721: 4 68 9 4 7 1 60 2 2 7 3 2
|
||||
3270361: 8 1 110 8 638 2 7 4 85
|
||||
810506452: 66 458 4 349 554 4 6 2
|
||||
67695107: 955 7 8 7 2 268 87 30 7
|
||||
1799821: 2 9 52 4 4 1 20 11
|
||||
4416: 43 2 6 3 6
|
||||
10554182: 9 2 4 84 5 8 80 58 6 38
|
||||
139: 8 6 53
|
||||
175460066367: 18 8 66 6 738 930 27
|
||||
2080368820: 3 32 1 3 9 3 1 90 99 8 28
|
||||
217175: 214 2 605 570
|
||||
370333248: 9 80 559 33 928 586
|
||||
47: 6 6 35
|
||||
2499: 52 6 2 2 81 2 1 9
|
||||
398476: 4 108 97
|
||||
277326: 13 795 462 3 5 31 7
|
||||
444588700: 444 17 41 86 41 59
|
||||
140: 9 52 1 72 7
|
||||
151004081: 4 47 3 99 341 9 65
|
||||
117335040: 55 6 1 68 9 863 1 384 8
|
||||
5381424859: 2 989 1 4 2 8 18 7 6 9 8
|
||||
972371: 11 81 60 176 851
|
||||
75170: 6 3 683 71 28 471
|
||||
939123289: 51 8 43 158 93 36 289
|
||||
1129468656: 975 25 47 492 94
|
||||
59856: 1 7 539 2 19 57 222 43
|
||||
48186761: 7 894 77 99 62
|
||||
507835: 50 5 9 9 9 9 1 5 39 1
|
||||
95273700: 8 574 52 16 705 29
|
||||
20660493280: 7 529 32 49 70 560
|
||||
6624696: 8 6 507 5 1 8 9 85 7 7 34
|
||||
15010074378: 8 7 56 4 8 4 3 5 3 354 6 3
|
||||
678375368: 700 20 4 597 968
|
||||
29457249523: 2 9 12 6 4 3 2 72 495 23
|
||||
124197303: 114 675 807 2 3
|
||||
952: 5 3 7 91 31 6 749 7 1 5 7
|
||||
105460: 8 15 88 950 10
|
||||
2474: 87 9 99 995 597
|
||||
82448: 12 4 9 58 1 34 1 1 3 2 3 4
|
||||
200852169: 83 216 5 1 22 4 3 4 3 7
|
||||
15804: 644 95 836 7 47
|
||||
51172: 6 80 9 1 9 487 9 8 4 9 4 3
|
||||
18716470110: 7 7 92 4 9 9 5 3 299 30
|
||||
1104115320: 7 51 5 55 2 11 396 70
|
||||
23730820: 4 6 7 468 96 2 23 450 3
|
||||
1001067516: 2 6 1 1 22 218 2 1 892 9
|
||||
43248548: 4 324 1 7 2 9 69 373 6 1
|
||||
15903155187792: 90 16 503 18 73 2 92 6
|
||||
8504979: 4 83 2 5 8 7 7 64 73 74
|
||||
363303: 404 580 41 23 9
|
||||
227343: 7 77 268 9 481 1 90 3 3
|
||||
326565: 815 40 9 468 3 85
|
||||
7695: 2 2 85 6 81
|
||||
39343: 80 49 2 72 69
|
||||
61878: 86 58 9 295 138 54
|
||||
1863313: 4 41 68 8 7 314
|
||||
81640800: 1 69 3 493 800
|
||||
159012: 37 80 6 2 21
|
||||
9700215: 8 5 1 446 8 2 2 61 105 1
|
||||
58789: 202 628 35 6 3 2 1 671
|
||||
3072485: 6 45 337 94 487 9 2
|
||||
256800: 2 8 8 6 535
|
||||
283078917: 5 7 733 38 30 39 3 309
|
||||
34675: 47 8 3 4 5 995 4 5 4 175
|
||||
15603: 4 14 832 364 263
|
||||
3938405130: 1 8 715 46 1 3 2 8 5 6 51
|
||||
1769660661: 7 2 5 2 2 3 103 35 7 426
|
||||
1609545534: 32 2 83 7 55 37 7 5 89 6
|
||||
77820294491: 6 63 2 917 1 64 17 74
|
||||
11220481: 3 33 3 3 83 1 3 6 640 1
|
||||
2658459: 771 1 9 71 8 2 5 59 1 8 3
|
||||
1599441406: 416 6 89 8 5 900 7 8 91
|
||||
156508013: 9 3 92 6 57 2 440 8 1 1
|
||||
8346: 5 8 182 686 380
|
||||
231984743: 9 72 888 7 38 9 7 607 3
|
||||
21601: 37 6 2 132 7 96 1
|
||||
724: 27 317 27 274 79
|
||||
55994878860: 38 9 34 799 5 9 2 4 9 4
|
||||
4631: 1 40 16 7 39
|
||||
712350654: 857 68 17 18 453
|
||||
229674: 1 723 402 36 58 3
|
||||
2100: 843 740 55 76 386
|
||||
921150275: 51 64 890 9 275
|
||||
734929386: 632 380 4 9 90 34 6
|
||||
2669199: 97 5 7 95 922 7 9 6 8 6 1
|
||||
1500039: 2 7 331 3 6 2 3 8 1 9 27 9
|
||||
72048: 240 650 9 49 76
|
||||
1660302: 113 25 5 850 22 76 4 2
|
||||
511746807: 47 9 809 9 465 807
|
||||
38019125: 369 68 87 11 9 6
|
||||
4527: 6 6 9 45 293 5 2 4 2 691
|
||||
242568: 8 24 6 341 64 8
|
||||
427: 3 81 4 91 1
|
||||
23195120: 22 198 655 342 120
|
||||
360: 9 6 4 2 3
|
||||
6853: 79 6 78 216 7
|
||||
35758: 336 21 1 43 8 6 1
|
||||
2179618: 7 70 70 4 680 1 98
|
||||
9606: 86 4 2 3 943
|
||||
26749464: 1 5 433 5 717 98 84
|
||||
776037573: 8 8 894 9 577 6 621 9
|
||||
799293: 99 8 76 2 4 4 6 1 3 5 31 3
|
||||
2691671: 1 7 6 2 1 4 1 12 65 668 3
|
||||
1544: 898 24 1 496 99 27
|
||||
68191364: 42 990 2 2 82
|
||||
524438312: 524 4 382 42 70
|
||||
8831455: 5 2 7 29 5 435 2 76 879
|
||||
434271927: 649 708 8 725 73 4 7
|
||||
88569642727: 885 69 642 7 27
|
||||
663: 204 17 3
|
||||
38449: 2 65 6 1 1 8 1 2 56 8 369
|
||||
392709: 28 177 117 2 50 5 7 3 9
|
||||
58033879: 8 725 4 9 7 8 16 570 1 9
|
||||
94154: 150 22 5 86 358
|
||||
43361102577534: 7 5 59 634 69 749 966
|
||||
2026946: 8 257 6 983
|
||||
5551744: 3 9 9 9 79 661 51 7 8 4
|
||||
467134789: 819 596 957 92 29
|
||||
1434: 1 5 1 6 8 520
|
||||
1660075: 217 34 83 710 8 7 38 1
|
||||
104704026560: 2 8 7 4 6 5 9 429 5 20 7 4
|
||||
3362348024: 7 4 601 27 3 897 5 7
|
||||
967272990: 17 30 354 9 559 9 64
|
||||
695308: 69 436 8 86 854
|
||||
617664: 4 19 879 684 696
|
||||
280208148: 365 766 618 143 4
|
||||
11358272: 74 3 5 44 43 11 29 63 2
|
||||
102: 25 2 8 67 1
|
||||
148752720571: 5 693 265 6 10 9 19 3 1
|
||||
9326675237: 4 658 325 28 56 774 5
|
||||
63112912358: 63 11 29 123 6 1
|
||||
689052595: 202 96 7 7 485
|
||||
6261: 8 4 31 16 93 8 13
|
||||
1143244033: 857 230 95 9 29 2 1
|
||||
4077224042: 5 343 675 763 17
|
||||
148967182: 91 464 855 38 91
|
||||
13013: 261 7 9 23 7
|
||||
151402: 2 7 65 119 8 8 484 2 2
|
||||
1162841: 4 653 7 444 5
|
||||
122954: 931 42 59 1 119 25
|
||||
8802293760: 8 6 5 2 7 248 208 5 72 6
|
||||
882283627: 2 60 762 28 29 68 659
|
||||
119320851948: 4 6 9 3 2 736 8 3 5 65 8 6
|
||||
363560: 599 2 9 551 61
|
||||
79156980000: 12 75 3 35 8 5 487 43
|
||||
2016471: 8 80 2 5 9 9 1 5 7 66 90
|
||||
541898: 7 906 63 68 6
|
||||
8691: 44 4 41 2 4
|
||||
57859465: 582 9 60 978 6 5 974
|
||||
969507840: 8 5 3 520 71 4 254 7 3 1
|
||||
111331: 14 9 2 8 4 3 1 40 188 3
|
||||
79296: 9 72 2 52 62 4 2 48 7
|
||||
99752561604: 25 783 42 2 4 32 2 482
|
||||
260196: 85 8 466 6 2 104 53 9
|
||||
54308747928: 84 978 7 115 1 6 958
|
||||
177610113: 5 12 4 679 5 23 457 9
|
||||
291015504: 409 342 4 702 138
|
||||
111029044: 7 658 506 16 57 7 844
|
||||
4431074491353: 263 96 287 7 27 650
|
||||
61459200: 3 3 3 37 4 805 2 30 80 9
|
||||
4938: 2 6 7 7 7 586 74 4 130 6
|
||||
724927: 1 687 9 1 13 80 47
|
||||
176219199: 8 533 928 1 351
|
||||
7061236841: 52 30 20 299 859
|
||||
1680930: 56 9 2 120 1 799 8 2 95
|
||||
22230091458: 5 780 57 91 4 61
|
||||
618962: 618 8 7 9 1
|
||||
979087974: 896 52 407 2 5 53 393
|
||||
1076124: 3 42 7 761 124
|
||||
39804061: 3 6 7 9 3 2 3 685 535 6 1
|
||||
617371560: 9 2 6 77 1 83 4 26 9 10 1
|
||||
59292627728: 244 243 62 77 28
|
||||
60679755965: 81 7 1 3 19 57 687 65
|
||||
385718461: 2 6 873 908 8 3 3 3 2 24
|
||||
70068614: 5 2 19 383 178 887 7 7
|
||||
81627: 812 1 8 236 87 45 41
|
||||
61252920: 7 396 200 229 90
|
||||
122349515906: 536 4 1 3 95 66 704 49
|
||||
236503863: 546 954 305 373 131
|
||||
3351192: 2 65 1 640 75 9 78
|
||||
5108625: 3 2 2 5 2 165 313 1 7 8 6
|
||||
178031530140: 14 4 9 269 7 1 710 822
|
||||
6883328: 6 94 1 3 113 7 9 4 1 4 4
|
||||
4007370310: 15 90 8 9 7 357 89 830
|
||||
588964251601: 7 5 347 2 47 20 963 5 1
|
||||
270755048: 6 42 1 631 212 57 8 8
|
||||
1332121: 8 9 8 4 2 3 6 800 8 3 3 88
|
||||
5591335: 371 3 5 2 6 7 5
|
||||
14219565360: 5 993 213 3 8 754 91 5
|
||||
5861562162: 1 8 9 4 8 6 6 4 451 53 6 2
|
||||
1433385: 874 74 21 72 9
|
||||
15707744640: 568 36 6 5 59 434
|
||||
1690128: 66 2 4 97 33
|
||||
398948632: 65 4 61 85 5 3 7 72
|
||||
10387019376: 63 1 245 7 6 77 42 328
|
||||
4179604: 5 6 422 1 20 40 45 4
|
||||
207295515460: 7 423 3 645 7 3 9 6 1 1 9
|
||||
1496054: 80 69 48 12 54
|
||||
117174039: 60 5 5 4 331 59 2 37
|
||||
120561: 443 34 8 3 62
|
||||
1093662: 1 413 9 1 86
|
||||
72832203: 49 3 4 4 791 3 5 22 3 9 9
|
||||
9172450: 520 94 7 264 49 175
|
||||
5092: 9 52 9 6 5 869
|
||||
205017: 859 5 67 47 3
|
||||
502964: 5 465 2 92
|
||||
982872: 55 31 30 94 721 1 6
|
||||
18842130: 997 20 24 362 50 30
|
||||
933: 11 824 8 3 87
|
||||
100362657: 9 3 2 6 375 988 3 3 8 4 1
|
||||
125631197: 7 8 1 2 92 6 9 72 1 563 2
|
||||
16965: 936 759 2 5 8
|
||||
63221509696: 76 214 5 4 340 89 8 8
|
||||
175095120: 66 4 1 5 6 10 184 6 3 8 5
|
||||
5948579768: 69 5 3 2 6 5 44 93 3 8 4 3
|
||||
612455: 6 4 1 638 251 2 8 3 1 9 6
|
||||
35828415: 6 4 1 7 9 779 2 22 5 4 5 7
|
||||
1423570: 77 835 65 4 6 1 849
|
||||
139702935: 55 8 4 5 5 6 4 90 2 935
|
||||
521072: 148 8 55 9 5 8
|
||||
42845205: 9 110 6 54 47 5
|
||||
155790: 8 558 97 18 1
|
||||
347911604818: 91 6 354 22 44 2 9 9 8 8
|
||||
196579: 1 9 15 15 129 2 19 499
|
||||
178336116: 5 53 16 4 522 6 6
|
||||
211784: 352 6 6 22 4
|
||||
357611951: 9 19 8 1 613 463 7 3 3 5
|
||||
2856: 6 31 29 54 4
|
||||
3115653: 8 404 964 5
|
||||
139573401: 1 34 1 142 33 851 891
|
||||
2731: 3 107 8 1 8 8 80 3
|
||||
1635930605522: 8 5 9 6 8 137 7 94 604 2
|
||||
2517747584: 8 1 3 715 424 5 755 1 9
|
||||
13551: 8 9 6 589 4
|
||||
8640: 9 60 9
|
||||
246434062: 6 18 632 93 960 87 62
|
||||
844073: 298 57 899 67 7 47
|
||||
14942463139: 169 883 197 631 39
|
||||
70584888: 8 8 23 8 888
|
||||
66176064187: 882 7 833 5 9 17 2 7 5 3
|
||||
54955: 54 95 5
|
||||
1683752: 417 2 9 562 7
|
||||
31395181: 94 497 1 1 672 9 4
|
||||
418453: 9 7 19 1 1 349 2
|
||||
737204: 8 1 4 189 9 3 86 4 5 5 1 3
|
||||
168
2024/go/day08/day08.go
Normal file
168
2024/go/day08/day08.go
Normal file
@@ -0,0 +1,168 @@
|
||||
package day08
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type loc struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
type pt struct {
|
||||
display rune
|
||||
antinodes int
|
||||
paired map[loc]pt
|
||||
visited map[rune]bool
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)} })
|
||||
for x1 := 0; x1 < grid.SizeX(); x1++ {
|
||||
for y1 := 0; y1 < grid.SizeY(); y1++ {
|
||||
pt1 := grid.Get(x1, y1)
|
||||
if pt1.display != '.' {
|
||||
for x2 := 0; x2 < grid.SizeX(); x2++ {
|
||||
for y2 := 0; y2 < grid.SizeY(); y2++ {
|
||||
pt2 := grid.Get(x2, y2)
|
||||
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
|
||||
pt1.paired[loc{x: x2, y: y2}] = pt2
|
||||
pt2.paired[loc{x: x1, y: y1}] = pt1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
pt1 := grid.Get(x, y)
|
||||
if pt1.display != '.' {
|
||||
for ploc := range pt1.paired {
|
||||
addAntiNodes(x, y, ploc.x, ploc.y, grid)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
antinodes := 0
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
pt := grid.Get(x, y)
|
||||
if pt.antinodes > 0 {
|
||||
antinodes++
|
||||
}
|
||||
}
|
||||
}
|
||||
return antinodes
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)}})
|
||||
for x1 := 0; x1 < grid.SizeX(); x1++ {
|
||||
for y1 := 0; y1 < grid.SizeY(); y1++ {
|
||||
pt1 := grid.Get(x1, y1)
|
||||
if pt1.display != '.' {
|
||||
for x2 := 0; x2 < grid.SizeX(); x2++ {
|
||||
for y2 := 0; y2 < grid.SizeY(); y2++ {
|
||||
pt2 := grid.Get(x2, y2)
|
||||
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
|
||||
pt1.paired[loc{x: x2, y: y2}] = pt2
|
||||
pt2.paired[loc{x: x1, y: y1}] = pt1
|
||||
pt1.antinodes++
|
||||
pt2.antinodes++
|
||||
grid.Set(x1, y1, pt1)
|
||||
grid.Set(x2, y2, pt2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
pt1 := grid.Get(x, y)
|
||||
if pt1.display != '.' {
|
||||
for ploc := range pt1.paired {
|
||||
addAntiNodes_p2(pt1.display, x, y, ploc.x, ploc.y, grid)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
antinodes := 0
|
||||
fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
pt := grid.Get(x, y)
|
||||
if pt.antinodes > 0 {
|
||||
antinodes++
|
||||
} else {
|
||||
if pt.display != '.' { antinodes++ }
|
||||
}
|
||||
}
|
||||
}
|
||||
return antinodes
|
||||
}
|
||||
|
||||
func formatter(p pt, x int, y int) string {
|
||||
if p.antinodes > 0 {
|
||||
return "#"
|
||||
}
|
||||
return "."
|
||||
}
|
||||
|
||||
func isPaired(x int, y int, p1 pt, pt2 pt) bool {
|
||||
return p1.paired[loc{x: x, y: y}].display == pt2.display
|
||||
}
|
||||
|
||||
func addAntiNodes(x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
|
||||
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
|
||||
|
||||
if px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY() {
|
||||
return
|
||||
}
|
||||
pt1 := grid.Get(px1, py1)
|
||||
pt1.antinodes++
|
||||
grid.Set(px1, py1, pt1)
|
||||
if px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY() {
|
||||
return
|
||||
}
|
||||
pt2 := grid.Get(px2, py2)
|
||||
pt2.antinodes++
|
||||
grid.Set(px2, py2, pt2)
|
||||
}
|
||||
|
||||
func addAntiNodes_p2(frequency rune, x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
|
||||
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
|
||||
if !(px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY()) {
|
||||
pt1 := grid.Get(px1, py1)
|
||||
if !pt1.visited[frequency] {
|
||||
pt1.antinodes++
|
||||
pt1.visited[frequency] = true
|
||||
grid.Set(px1, py1, pt1)
|
||||
addAntiNodes_p2(frequency, x1, y1, px1, py1, grid)
|
||||
}
|
||||
}
|
||||
if !(px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY()) {
|
||||
pt2 := grid.Get(px2, py2)
|
||||
if !pt2.visited[frequency] {
|
||||
pt2.antinodes++
|
||||
pt2.visited[frequency] = true
|
||||
grid.Set(px2, py2, pt2)
|
||||
addAntiNodes_p2(frequency, x2, y2, px2, py2, grid)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function to calculate two points symmetrically placed above and below the line
|
||||
func offsetPoints(x1, y1, x2, y2 int) (int, int, int, int) {
|
||||
dx := x1 - x2
|
||||
dy := y1 - y2
|
||||
|
||||
p1x := x1 + dx
|
||||
p1y := y1 + dy
|
||||
p2x := x2 - dx
|
||||
p2y := y2 - dy
|
||||
return p1x, p1y, p2x, p2y
|
||||
}
|
||||
39
2024/go/day08/day08_test.go
Normal file
39
2024/go/day08/day08_test.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package day08
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............`)
|
||||
require.Equal(t, 14, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............`)
|
||||
require.Equal(t, 34, r)
|
||||
}
|
||||
50
2024/go/day08/input.txt
Normal file
50
2024/go/day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
||||
.....y..........................p................r
|
||||
........I.........................................
|
||||
......................4.s.........................
|
||||
..........4.......................................
|
||||
....y.............................................
|
||||
......................................p.........r.
|
||||
..........0..s......N..................1.....p....
|
||||
..y........4.......................p..............
|
||||
...............0..................................
|
||||
..............0....t....N....h....................
|
||||
.............N....................................
|
||||
......j...................s............H...l..O...
|
||||
..........q.................H................O....
|
||||
..f...e.qj.....y...0..............................
|
||||
...........t..........................k..Q..r.....
|
||||
.........6................Q..s...x......W.........
|
||||
....2..b...e....t..4.........c.....xW.j...........
|
||||
...e....................w................1.....O..
|
||||
..e..j..5...........................c.............
|
||||
.........B..2...............MK................H...
|
||||
...2......b...g..X...q..........h...............O.
|
||||
...q...2..........m....k...i...............QV.x...
|
||||
...................i.........W.k.............HQ...
|
||||
........b...X...............D..........c...N......
|
||||
................................l..........h.....I
|
||||
.m...........g......l.......c.............3......V
|
||||
....X.......m........g...V.K...7......F.d.........
|
||||
.........b.X...U..........................C.......
|
||||
.....................l..............o.1....C......
|
||||
............u.............K..............3...d....
|
||||
......................i.T....f................V...
|
||||
..............................1.k.................
|
||||
.B.....E......9..m....K..5.M......................
|
||||
...P...............M...95....o..i........I........
|
||||
...............................S......3......wI...
|
||||
.....EP...........9........5..T.R.................
|
||||
.P..........v..9......f.............R.Co..w3......
|
||||
..........h...SG..v.E...7..f.T....................
|
||||
..........6..........L.................Y.......d..
|
||||
..........B...............U........D..............
|
||||
....B................U.....8..M....n...J..........
|
||||
.........................L................Fw......
|
||||
....L6E.P.................7.UG....J.....Y.D.......
|
||||
........t........v...SJ........n..d...............
|
||||
......................8v.....uG...................
|
||||
..................L.....n.........................
|
||||
...............T..............n......D............
|
||||
..............o.........8................J.Y.R....
|
||||
..................S...............u....F.......R..
|
||||
........6..............u.....7.8..........Y..F....
|
||||
117
2024/go/day09/day09.go
Normal file
117
2024/go/day09/day09.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package day09
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
disk := []int{}
|
||||
file_id := 0
|
||||
for i := 0; i <= len(input); i++ {
|
||||
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
|
||||
disk = append(disk, file_id)
|
||||
}
|
||||
i++
|
||||
if i < len(input) {
|
||||
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
|
||||
disk = append(disk, -1)
|
||||
}
|
||||
}
|
||||
file_id++
|
||||
}
|
||||
|
||||
printDisk(disk)
|
||||
|
||||
for i:=len(disk)-1;i>0;i--{
|
||||
if disk[i] != -1 {
|
||||
id := disk[i]
|
||||
disk[i] = -1
|
||||
for j:=0;j<=len(disk);j++ {
|
||||
if disk[j] == -1 {
|
||||
disk[j] = id
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printDisk(disk)
|
||||
|
||||
checksum := 0
|
||||
for i:=0;i<len(disk);i++ {
|
||||
if disk[i] != -1 {
|
||||
checksum += i * disk[i]
|
||||
}
|
||||
}
|
||||
return checksum
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
disk := []int{}
|
||||
file_id := 0
|
||||
for i := 0; i <= len(input); i++ {
|
||||
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
|
||||
disk = append(disk, file_id)
|
||||
}
|
||||
i++
|
||||
if i < len(input) {
|
||||
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
|
||||
disk = append(disk, -1)
|
||||
}
|
||||
}
|
||||
file_id++
|
||||
}
|
||||
|
||||
printDisk(disk)
|
||||
|
||||
for i:=len(disk)-1;i>0;i--{
|
||||
size := 0
|
||||
if disk[i] != -1 {
|
||||
id := disk[i]
|
||||
for {
|
||||
if i-size > 0 && disk[i-size] == id {
|
||||
size++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
free := 0
|
||||
j := 0
|
||||
found := false
|
||||
for ;j<i && free < size;j++{
|
||||
if disk[j] != -1 {
|
||||
free = 0
|
||||
continue
|
||||
}
|
||||
free++
|
||||
if free == size { found = true }
|
||||
}
|
||||
if found {
|
||||
for k:=0;k<size;k++ {
|
||||
disk[i-k] = -1
|
||||
disk[j-size+k] = id
|
||||
}
|
||||
// printDisk(disk)
|
||||
}
|
||||
i -= (size -1)
|
||||
|
||||
}
|
||||
}
|
||||
printDisk(disk)
|
||||
|
||||
checksum := 0
|
||||
for i:=0;i<len(disk);i++ {
|
||||
if disk[i] != -1 {
|
||||
checksum += i * disk[i]
|
||||
}
|
||||
}
|
||||
return checksum}
|
||||
|
||||
func printDisk(disk []int) {
|
||||
for _, x := range disk {
|
||||
if x == -1 {fmt.Print(".")} else {
|
||||
fmt.Printf("%d", x)
|
||||
}
|
||||
}
|
||||
fmt.Print("\n")
|
||||
}
|
||||
17
2024/go/day09/day09_test.go
Normal file
17
2024/go/day09/day09_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package day09
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1("2333133121414131402")
|
||||
require.Equal(t,1928, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2("2333133121414131402")
|
||||
require.Equal(t, 2858, r)
|
||||
}
|
||||
1
2024/go/day09/input.txt
Normal file
1
2024/go/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
103
2024/go/day10/day10.go
Normal file
103
2024/go/day10/day10.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package day10
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
"adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Position struct {
|
||||
height int
|
||||
summit bool
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
score := 0
|
||||
i := 0
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} })
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
position := grid.Get(x, y)
|
||||
if position.height != 0 {
|
||||
continue
|
||||
}
|
||||
wipe_summit(grid)
|
||||
score += getScore(x, y, 0, 0, grid)
|
||||
fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score)
|
||||
i++
|
||||
}
|
||||
}
|
||||
return score
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
score := 0
|
||||
i := 0
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} })
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
position := grid.Get(x, y)
|
||||
if position.height != 0 {
|
||||
continue
|
||||
}
|
||||
wipe_summit(grid)
|
||||
score += getScore2(x, y, 0, 0, grid)
|
||||
fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score)
|
||||
i++
|
||||
}
|
||||
}
|
||||
return score
|
||||
}
|
||||
|
||||
func formatter(p Position, x int, y int) string {
|
||||
return fmt.Sprintf("%v", p.height)
|
||||
}
|
||||
|
||||
func wipe_summit(grid *grid2d.Grid[Position]) {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
pos := grid.Get(x, y)
|
||||
if pos.height == 9 && pos.summit {
|
||||
pos.summit = false
|
||||
grid.Set(x, y, pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getScore(x, y, level, score int, grid *grid2d.Grid[Position]) int {
|
||||
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||
for _, dir := range directions {
|
||||
x1 := x + dir[0]
|
||||
y1 := y + dir[1]
|
||||
nposition := grid.Get(x1, y1)
|
||||
if level == 8 && nposition.height == 9 {
|
||||
score++
|
||||
}
|
||||
if nposition.height != level+1 {
|
||||
continue
|
||||
}
|
||||
score = getScore(x1, y1, nposition.height, score, grid)
|
||||
}
|
||||
return score
|
||||
}
|
||||
|
||||
func getScore2(x, y, level, score int, grid *grid2d.Grid[Position]) int {
|
||||
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||
for _, dir := range directions {
|
||||
x1 := x + dir[0]
|
||||
y1 := y + dir[1]
|
||||
nposition := grid.Get(x1, y1)
|
||||
if level == 8 && nposition.height == 9 {
|
||||
score++
|
||||
}
|
||||
if nposition.height != level+1 {
|
||||
continue
|
||||
}
|
||||
score = getScore2(x1, y1, nposition.height, score, grid)
|
||||
}
|
||||
return score
|
||||
}
|
||||
31
2024/go/day10/day10_test.go
Normal file
31
2024/go/day10/day10_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package day10
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732`)
|
||||
require.Equal(t, 36, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732`)
|
||||
require.Equal(t, 81, r)
|
||||
}
|
||||
56
2024/go/day10/input.txt
Normal file
56
2024/go/day10/input.txt
Normal file
@@ -0,0 +1,56 @@
|
||||
43217654309879876104563234589896761012345656543098901001
|
||||
34108903212368123233472105676787851299856567832187812652
|
||||
45677814301457014312986345589876940387765678943046543743
|
||||
56789325100876525800345276430105432456566589858956769821
|
||||
65438456912963436901236187621234501223455410767349874430
|
||||
74321067803451107898547093412012982016764323101210143561
|
||||
89412210987430210789698892102123673107895214589723652678
|
||||
78601521856521345678721743089034543212345605679854781789
|
||||
66789430545678934505430654898745672212236765434765690878
|
||||
55676545038943213216765989601654981300129870121012345969
|
||||
46543216127657804389834808762347690456789983498141456452
|
||||
65454307233456934870126712354878765565210012507230987321
|
||||
54567898332110125961015645403969234674323215616546576010
|
||||
65658983021001876854324106912452128789321308723455678901
|
||||
76543212137892965348933217832141089873410419678964987652
|
||||
89862901236543501267018363101033210565566566569873788543
|
||||
89871876544345652106529854892123521454479877654012699830
|
||||
78100703454278743212434763763014672343287778943210581021
|
||||
65210212565189858906763212654985785650198961212101432010
|
||||
54321056876012567875898708783476698763267890303215678321
|
||||
87012567988703489874345679692676543294986725456574329478
|
||||
96543498589876530365210189501987650187675216987687610569
|
||||
01234567651010921234501076401236501010564307678596789876
|
||||
10389830532329854376542345321545692323403018789455430965
|
||||
21456721013456765289031234980098783410912129670320121054
|
||||
92505432565421010109120345671107654567823451061210120123
|
||||
87615443478302341018750134543234541050765962552121234984
|
||||
34322342189219650129665234789432132021894873443010965673
|
||||
45451056077828743234574343276543032134703210523457876532
|
||||
51069987456943104545987650167898749865612309610765454101
|
||||
32678678345652210698092156756547056764303458779890363232
|
||||
43010589232781306787183045876532178965210569888211274321
|
||||
56923432101090458989254234923421369878934678898302989430
|
||||
87889211078764567876360143010030450767125986567401276589
|
||||
96676305669653478985478652102141341458076803456564345676
|
||||
45435434734522780340349760123456232349883712678178737894
|
||||
80127821821011091211299854354987101016792103549069016323
|
||||
92346940910329654304587121267807652345013401232108925412
|
||||
81055432101458765643671010871018947654324589543987432101
|
||||
76567789023467010782532346965425638945695678654986540012
|
||||
05498654110567821891047897212334721032786014345678901098
|
||||
12387013223489932346156598101549889821012823216765212387
|
||||
03456323016576542345692367210678710701296954907854323456
|
||||
12345465437895431016781450123467623654387867878985401501
|
||||
21089870124326528701670101874345634565676541045621032012
|
||||
32189210065017019632543210965236730120545632456734548743
|
||||
43498349876298903545450143050159821321234012349895699654
|
||||
34567658389101232123469052101567634489234510106786789985
|
||||
99876501276788943016578769872498105672105621215021058876
|
||||
87035432365897654107689898763343234321678789334134567655
|
||||
70129641034781089898791099854232145690569245493254321567
|
||||
63238701123654178718982387763156056781410126787655010498
|
||||
54345652321073265001073456012047189872328901098546710327
|
||||
34568543434589874132569895145438976987437812361239891210
|
||||
21879654898678013203456701236327805456546521450967890123
|
||||
30968745467654320112345210987610112345545430567856543234
|
||||
76
2024/go/day11/day11.go
Normal file
76
2024/go/day11/day11.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package day11
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
stones := strings.Fields(input)
|
||||
for i := 0; i < 25; i++ {
|
||||
n_stones := []string{}
|
||||
for _, stone := range stones {
|
||||
switch {
|
||||
case stone == "0":
|
||||
n_stones = append(n_stones, "1")
|
||||
case len(stone)%2 == 0:
|
||||
d1 := strconv.Itoa(utils.MustAtoi(stone[0 : len(stone)/2]))
|
||||
d2 := strconv.Itoa(utils.MustAtoi(stone[len(stone)/2:]))
|
||||
n_stones = append(n_stones, d1)
|
||||
n_stones = append(n_stones, d2)
|
||||
|
||||
default:
|
||||
n_stones = append(n_stones, fmt.Sprintf("%d", utils.MustAtoi(stone)*2024))
|
||||
}
|
||||
}
|
||||
stones = n_stones
|
||||
}
|
||||
return len(stones)
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
stones := strings.Fields(input)
|
||||
smap := make(map[string]int)
|
||||
smap2 := make(map[string]int)
|
||||
|
||||
for _, stone := range stones {
|
||||
smap[stone] = 1
|
||||
}
|
||||
for i:=0;i<75;i++ {
|
||||
for k, v := range smap {
|
||||
switch {
|
||||
case k == "0":
|
||||
smap2["1"] = smap2["1"] + v
|
||||
case len(k)%2 == 0:
|
||||
d1 := strconv.Itoa(utils.MustAtoi(k[0 : len(k)/2]))
|
||||
d2 := strconv.Itoa(utils.MustAtoi(k[len(k)/2:]))
|
||||
smap2[d1] += v
|
||||
smap2[d2] += v
|
||||
default:
|
||||
k2 := fmt.Sprintf("%d", utils.MustAtoi(k)*2024)
|
||||
smap2[k2] += v
|
||||
}
|
||||
}
|
||||
smap = CopyMap(smap2)
|
||||
smap2 = make(map[string]int)
|
||||
}
|
||||
count := 0
|
||||
for _, v := range smap {
|
||||
count += v
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func CopyMap(original map[string]int) map[string]int {
|
||||
// Create a new map to hold the copy
|
||||
copied := make(map[string]int)
|
||||
|
||||
// Copy each key-value pair from the original map to the new map
|
||||
for key, value := range original {
|
||||
copied[key] = value
|
||||
}
|
||||
|
||||
return copied
|
||||
}
|
||||
17
2024/go/day11/day11_test.go
Normal file
17
2024/go/day11/day11_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package day11
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1("125 17")
|
||||
require.Equal(t, 55312, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2("125 17")
|
||||
require.Equal(t, 55312, r)
|
||||
}
|
||||
1
2024/go/day11/input.txt
Normal file
1
2024/go/day11/input.txt
Normal file
@@ -0,0 +1 @@
|
||||
3 386358 86195 85 1267 3752457 0 741
|
||||
146
2024/go/day12/day12.go
Normal file
146
2024/go/day12/day12.go
Normal file
@@ -0,0 +1,146 @@
|
||||
package day12
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
"fmt"
|
||||
|
||||
)
|
||||
|
||||
type Plot struct {
|
||||
crop string
|
||||
visited bool
|
||||
region int
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
type Region struct {
|
||||
plots []Plot
|
||||
crop string
|
||||
id int
|
||||
area int
|
||||
perimteter int
|
||||
sides int
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
var val int
|
||||
region_id := 0
|
||||
regions := make(map[int]Region)
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} })
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
var region Region
|
||||
plot := grid.Get(x, y)
|
||||
if plot.visited {
|
||||
continue
|
||||
}
|
||||
|
||||
region_id++
|
||||
region = Region{id: region_id, area: 1, crop: plot.crop, sides: 4}
|
||||
plot.region = region_id
|
||||
plot.visited = true
|
||||
plot.x = x
|
||||
plot.y = y
|
||||
grid.Set(x, y, plot)
|
||||
region.plots = append(region.plots, plot)
|
||||
regions[region_id] = region
|
||||
|
||||
try_neighours(grid, ®ion, x, y)
|
||||
regions[region.id] = region
|
||||
}
|
||||
}
|
||||
for _, region := range regions {
|
||||
val += region.area * region.perimteter
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
var val int
|
||||
region_id := 0
|
||||
regions := make(map[int]Region)
|
||||
grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} })
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
var region Region
|
||||
plot := grid.Get(x, y)
|
||||
if plot.visited {
|
||||
continue
|
||||
}
|
||||
|
||||
region_id++
|
||||
region = Region{id: region_id, area: 1, crop: plot.crop}
|
||||
plot.region = region_id
|
||||
plot.visited = true
|
||||
plot.x = x
|
||||
plot.y = y
|
||||
grid.Set(x, y, plot)
|
||||
region.plots = append(region.plots, plot)
|
||||
regions[region_id] = region
|
||||
|
||||
try_neighours(grid, ®ion, x, y)
|
||||
regions[region.id] = region
|
||||
}
|
||||
}
|
||||
for _, region := range regions {
|
||||
val += region.area * get_sides(grid, region)
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func formatter(p Plot, x int, y int) string {
|
||||
return fmt.Sprintf("%v", p.crop)
|
||||
}
|
||||
|
||||
func try_neighours(grid *grid2d.Grid[Plot], region *Region, x int, y int) {
|
||||
|
||||
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||
plot := grid.Get(x, y)
|
||||
perimeters := 0
|
||||
|
||||
for _, dir := range directions {
|
||||
x1 := x + dir[0]
|
||||
y1 := y + dir[1]
|
||||
nplot := grid.Get(x1, y1)
|
||||
|
||||
if nplot.crop == plot.crop {
|
||||
if !nplot.visited {
|
||||
region.area++
|
||||
nplot.visited = true
|
||||
nplot.region = plot.region
|
||||
nplot.x = x1
|
||||
nplot.y = y1
|
||||
grid.Set(x1, y1, nplot)
|
||||
region.plots = append(region.plots, nplot)
|
||||
try_neighours(grid, region, x1, y1)
|
||||
}
|
||||
} else {
|
||||
perimeters++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func get_sides(grid *grid2d.Grid[Plot], region Region) int {
|
||||
sides := 0
|
||||
corners := [][][]int{{{-1, 0}, {0, -1}, {-1, -1}},
|
||||
{{+1, 0}, {0, -1}, {+1, -1}},
|
||||
{{-1, 0}, {0, +1}, {-1, +1}},
|
||||
{{+1, 0}, {0, +1}, {+1, +1}}}
|
||||
for _, plot := range region.plots {
|
||||
for _, o_corners := range corners {
|
||||
c1 := grid.Get(plot.x + o_corners[0][0], plot.y + o_corners[0][1])
|
||||
c2 := grid.Get(plot.x + o_corners[1][0], plot.y + o_corners[1][1])
|
||||
c3 := grid.Get(plot.x + o_corners[2][0], plot.y + o_corners[2][1])
|
||||
if c1.crop != region.crop && c2.crop != region.crop {
|
||||
sides++
|
||||
} else if c1.crop == region.crop && c2.crop == region.crop && c3.crop != region.crop {
|
||||
sides++
|
||||
}
|
||||
}
|
||||
}
|
||||
return sides
|
||||
}
|
||||
29
2024/go/day12/day12_test.go
Normal file
29
2024/go/day12/day12_test.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package day12
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`RRRRIICCFF
|
||||
RRRRIICCCF
|
||||
VVRRRCCFFF
|
||||
VVRCCCJFFF
|
||||
VVVVCJJCFE
|
||||
VVIVCCJJEE
|
||||
VVIIICJJEE
|
||||
MIIIIIJJEE
|
||||
MIIISIJEEE
|
||||
MMMISSJEEE`)
|
||||
require.Equal(t, 1930, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`AAAA
|
||||
BBCD
|
||||
BBCC
|
||||
EEEC`)
|
||||
require.Equal(t, 80, r)
|
||||
}
|
||||
140
2024/go/day12/input.txt
Normal file
140
2024/go/day12/input.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
UUUUUUUUUUUUUUUUUUUDQQQQQQQOOOOOHHSSSSSYYYYYYYYGGGGNNNNNNNNTTTTTTTTTTTTTTDDDDDDDDDDDDDDDDDDNNNCCNJJJJOOHHHDDDDDDDDDDDDDDDDDDXXMBBBBMMCCCCCCC
|
||||
UUUKUUUUUUUUUUUUUDDDDDDDQQQOOOOOOOOOSSSSSYYYYYYYYGGGGGNNNNTTTTTTTTTTTTTTTTTTTTDDDDDDIIDDDNNNNNCCNJJJOOOHDDDDDDDDDDXDDDDDDDMMMXMMMMMMMMCCCCCC
|
||||
UUUKKUUUUUUWUUUUUUDDDDDDDDDROOOOOOOWWSSSSYYYYYYYGGGGGGGQNTTTTTTTTTTTTTTTTTTTTTDDDDDDDIDIINNNNLNNNNOOOOODDDDDDDDDDXXDDDDDDDMMMMMMMMMMMMCCCCCC
|
||||
UUKKUUKKXUUUUUUUUDDDDDDDDDDDDOOOOOOOOYSSSSSYYYYYGGGGGGQQNNTTTTTTTTTTTTTTTTTTTTDDDDDIDIIIINNNNNNNNNNOOOODDDDDDDXDDXXDDDDDDDMMMMMMMMMMMMMMCCCC
|
||||
UUKKUKKKXXUQQQQUUDDDDDDDDDDDDOOOOOOOOYYYYYYYYYYYGGGGGQQIINTTTTITTTTTTTTTTTTTTTTDDDIIIIIIIINNNNNNNNNOOODDDDDDDDXXXXXXDDDDDMMMMMMMMMMMMFFFFCCC
|
||||
UKKKKKKKXKAWWWWWDDDDDDDDDDDDDOOOOUUOYYYYYYYYYYYYGGGGQQQQIIDITIIIITTTTTTTTTTTTTDDDDIIIIIIINNNNNNNNLLLLODDDDDDXXXXXXXXDXDDDMMMMMMMMMMMMFFFFCCC
|
||||
KKKKKKKKKKKWWWWKDPPDDDDDDDWWWOOOOOUUYYYYYYYYYYYYYGRQQQQQIIIIIIIIITTTTTTTTTTTDDDDDDIIIIIIIIINNNNNNNLLLLLDDDDDXXXXXXXXXXDDDDDMMMMMMMMMMFFFCCCC
|
||||
KKKKKKKKKKWWWWWWDDDDDDDDDSWWWOWOOOOUYYAYYYYYYYYYYYQQQQQIIIIIIIIOIITTTTTTTTTTDDDDIIIIIIIIIIINNNNNLNNNLLLDDDDDDXXXXIXYDDDDDDDMMMMMMMMMMFFFCFCC
|
||||
KKKKKKKKWWWWWWWWSSDSDDDDDSSWWWWOOOOUYYAYYYYYYYYYYQQQQQQIIIIIIIIIITTTTTTTTTTDDDIIIIIIIIIIIINNNNNNLLLLLLLDDDDDDXXXXIXYDDDQDDDMMMMMMMUMFFFFFFFC
|
||||
KKKKKKKWWWWWWWWWSSSSDSDSSSSWWWWWOOOUYYYYYYYYYYYYYYQQQQIIIIIIIIIIIIIXXXXXTTTTDIIIIIIIIIIIKINNLNNNLLLLZLLLLDDVDXXXXXYYDDQQDDTMMYYYMMUUUFFFFFCC
|
||||
KKKKKKKKWWWWWWWWWWSSSSSSSSSSWWWWWWOUYPPPPPYYYYYYQQPQQQQAIIIIIIIIISSXXXXXXXTTDIIIIIIIIIIIIIIILLLLLLLLZZLLLDDDXXXXXXXYYDXXXYMMMYYYYMPUUFFFFFFC
|
||||
KKKKKKKKWWWWWWWWWWBBBBSSSSSWWWWWWWSSPPPPWWWWWWAYPPPPQAAAAITTIIIIIXXXXXXXUTTXXXIIIIIIIIIIIIIOLLLLLLLLZZLLLLLLLLXXXXYYXXXXXXXXRPPPPPPPPPFFCCFC
|
||||
KKKKKKDWWWWWWWWWWWDDBBBSSSSWWWWWWWWSSPPPPWWWWWWWPPPPPAAAAIIIIIIIIXXXXXXXXXDXXIIIIIIIIIIIIIIOLLLLLLLZZZZZZLLLLNXNNXNYYYXXXXXXPPPPPPPPPPFFCCCC
|
||||
KKKKKKWWWWWWWWWWWWBBBBBBBSSSWWWWWWWSSSSPPWWWWWWWPPPPPAAAAAAIIIIIIIXXUUUUUUXXXXIIIIIIIIIIIIIILLLLLLLZZZZZZZLLLNNNNNNYYYXXXXXXPPPPPPPPPPCFCCCC
|
||||
KTKQQKWWWWWWWWWWBWBBBBBBBSBSWWWWWSSSSSPPPWWWWWWWWPPPPPPAAFAIIYYYUUUUUUUUUUUXXXQQQIIIXXXXXXXXXXLLLLLZZZZZZZZZLNNNNNNYYXXXXXXXPPPPPPPPPPCCCCCC
|
||||
QQKAQQWWWWWWWWWWBWBBBBBBBBBSWWWSSSSSSSSPPWWWWWWWPPPPPPPPPPYYYYYYUUUUUUUUUUUQXQQQQQQIXXXXXXXXXXLZLLEZZZZZZZZZLNNPNNNYYXXXXXPXPPPPPPPPPPPCCCCC
|
||||
QQQQQQQWWWWWWWWWBBBBBBBBBBVWWWDDSSSSSSSSSPWWWPPPPPPPPPPPPPYYYYYYUUUUUUUUUUUUUUUUQQIIXXXXXXXXXXLZZZZZZZZZZZZLLUUUUUUUUXXXXXPPPPPPPPPPPPCCCCCC
|
||||
QQQQQQQQWWWWWWWWBBBBMMMBBBMWWWDSSSSSSSSSSPPPPPPPPPPPPPPPYYYYYYYBYYXXXXXUUUUUUUUUOIIIIZZZZZLLLZZZZZZZZZZZZZZZZIIIIUUUUUXPPXPPPPPPPPPPYYCCCCCC
|
||||
QQQQQQQQQWWZZZWMMMMMMMMMBMMWWDDSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYXXXXXXUUUUUUUUUOOIIIZZZZLLLLLZZZZZFFFFFFFFFHHHIUUUUUPPPPPPPYPPYPPPYYYCCCCCC
|
||||
QQQQQQLQQQWWZZZMMMMMMMMMMMHHWSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYYXXXXXXXUUUUUUUUUOIIIIIZLLLLLLZZZZZZFFFFFFFFFHHHIUMUUUPPPPPPPYYYYYYYYYYYCCCYC
|
||||
QQQQQLLQLLZZZZMMMMMMMMMMMMMMWSSSSSSSSSSSPPPPPPPPPBYPPPYYYYYYYYYYYYXXXXXUUUUUUUUUIIIIIIIILLZZZZZZZZZFFFFFFFFFHHFFFFQUULLPPPPPQYYYYYRYYYYYYYYY
|
||||
QQQLLLLLLLLZZZMMMMMMMMMMMMMMNMSSSSSSSSSSVVPPPPPPBBYYYYYYYYYYYYYYYYYXXXXUUUUUUUUUOIIIIILLLLZZZZZZZZZFFFFFFFFFFFFFFFFUUMMPPPPPYYYYYYYYYYYYYYAA
|
||||
QQQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSSSVVPPPBBBBBBYYYGGGGGGGGGYYYYYYYYUUUUUUUUUIIIIILLLLZZZZZZZZZZFFFFFFFFFFFFFFFFMMMOPPPPGYYYYYYYYYYYYYYYA
|
||||
QQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSRRSVVVVVVBBBBBYYYGGGGGGGGGYYYYYYYXUUUUUUUUUIIIIILLLLLZZZZZZZZZZZHHZZHHFFFFFFFFMMMMMPPPYYYYYYYYYYYYYYYYY
|
||||
QQLLLLLLLLLZZZMMMMMMMMMMMMMMMSSSSSSRRRRSVVVVVBBBBBBBYYGGGGGGGGGYYYYYYEEUUUUUUUUUIIIIILLLLLBZZZZZZZZZZHHHHHHFFFFFFFFMMMMMMPIIYYYYYYYYYYYYYYYY
|
||||
QQQLLLLLLZZZZZZMMMMMMMMMMMMMFSSSSSSRRRRRRVVVVVVVVBBYGGGGGGGGGGGYYXYYYEEEEEEEEEEEIEIILLLLLLZZZZZZZZZZZZHHHHHFFFFFFFFMMMMMMPPIIYYYYYYYYYUUYYYU
|
||||
QQQQQQGLLLLPPPMMMMMMMMMMMMMMMSRSSSRRRRRRVVVVVVVVBBBQGGGGGGGGGGGGGGYXXXEEEEEEEEEEEEELLLLLHZZZZZZZZZZZXZHHHHHFFFFFFFFMMMMIIIIIYYYYYYYYYYUUUUYU
|
||||
QQQQQQQQQLKPPPPIIMMMMMMMMMUUUURRSRRRURRRVVVVVVVVVBQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJEELLLHHHHHHHHHZZDDZZZHHHHHFFFFFFFFQMMMQQIIIIYUUUUYYYYUUUUUU
|
||||
JJQQQTQQQKKKPPPPPQQMUUMUUUUUURRRSRUUURRRUUUVVVUVVVQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJJJLLHHTTHHHHHHYYYDDDZHHHHHFFFFFFFFQMMMQQQQQUUUUUUUUUUUUUUUU
|
||||
JJJJQTTQKKKPPPPPPQQQUUUUUUUCURRRRRRUUURRUUUVUUUUVVQQGGGGGGGGGGGGGGXXXXZEEEEEEEEEJJJJJHTTTTHHHHHHYDDDDHHHHHHMMQQQHQQQQMQQQQQUUUUUUUUUUUUUUUUU
|
||||
JJJJJTTTPKKPPPPPPPQUUUUUUUUUUURRRRRRUUUUUUUVUUUUUVVQGGGGGGGGGGGGGGXXXXZEZZZZEEEJJJJJTTTTTTTTHHHHYYYMMHHHMHHMMMQQQQQQQQQQQQQUUUUUUUUUUUVUUUUU
|
||||
JJJJJTTPPPPPPPPPPPPUUUUUUUUUURRRRRRUUUUUUUUUUUUUUVVUGGGGGGGGGGGGGGXXRRZZZZZZEEDDDJJTTTTTTTTHHHHHYMMMMHMHMMMMMMMQLLLQLQQQQQQUUUUUUUUUVUVVUUUU
|
||||
JJJJJJJPPPPPPPPPPPUUUUUUUUUUURRRRPRRRUUUUUUUUUUUUVVUGGGGGGGGGGGGGGZRRRRRRRDDDDDDDJJJZTTTTTTTHHYYYYMMMMMHHMMMMMLLLLLLLLQQSQQSSUUUUBBBVVVVVUUU
|
||||
JJJJJBBPPPPPPPPPPPUUUUUUUUUUUURRRPPCCUUUUUUUUUUUUUUUGGGGGGGGGGGGZZRRRRRRRBDDDDDDDJJJTTTTTTTTYHYYYYYYUMMMHMMMMLLLLLLLLLLLSSSSUUUUBVVVVVVZVUUU
|
||||
JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURRPPPCCGUUUUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRYDDDDDDJJTTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLSSSSSSUUUBVVVVVVVVVUU
|
||||
JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURUPPPCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDJTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLLSSSSSSSSSEEEEVVVVVVVU
|
||||
JJJJBBBBQQQPPPPPPPUUUUUUUUUUUUUUPPCCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDTTTTTTTTTTYYYYYYYOYMMMMMMMMMMMMMLLLLLLSSSSSSEEUEEEVEEVQQVQ
|
||||
JJJJJBBBBQQQPPPPUUUUUUUUUUUUUUPPPPCCCCCCCCCFFUUUUUUUQGGGGGGEEKKKKZZRRRRRRRRRDDDDHDTTTTTTTTTTTTYYYYYYYMMMMMMMMMMMMMMMSSSSSSSSSSEEEEEEEEQQQQQQ
|
||||
JJJJBBBBBQQQQQPPUHHWUUUUUUUUUUPPPPCCCCCCCCCFFUUEUUMUQGGGGGGEEEKKKZRRRRRRRRRRRHDDHDDDTTBTTTTTTTYYYYYYYYMMMMMMMMMMMMSSSSSSSSSSSEEEEEEEEEEQQQQQ
|
||||
JJHBBBBBQQQQQPPPPHHWWUUUUUUUUPPPPPCCCCCCCCCCAUUEUUUUQGGGGGGEKKKKPRRRRRRRRRRRRHHHHHDTTTTTNTTTTTTTXYYAAYYMMMMMMMMMMMGGSGGGOOOSOOOEEEEEEEEEQQQQ
|
||||
JHHHBBBBQQQQQPPPPHHWWUUUWWWUPPPPPPPPCCCCCCAAAAAEEEUUUGGGGGGCKKKKKKKRRRRRRRRRRHHHHHDTWWTTNNNTTTXXXYAAAAMMMMMMMMMMMGGGGGGJOOOOOOEEEEEEEEEEQQQE
|
||||
HHHHBBBUQQQQQPPPPWHWWWUWWWWUPPPPPPPPPPCCCCAAAAAEEEEEEGGGGGGCKKKKKKKRRRRRRRRRGGHHHHHHWWNNNNNNTXXXXXXAAAAAMMMMMMMMGGGGGGJJOOOOOOEEEEEEEEEEEQEE
|
||||
HHHHHBBBBQQQPPPPWWWWWWWWWWWWWPPPPPPPPPCCCAAAAAEEEEEECCCCCCCCKKKUKKRRRRRRRRRRRGHHHHHWWDDDNNNNTTXNNNNVAAAAAMWMMMMMGGGGGGJJOOOODEEEEEEEEEEEEEEE
|
||||
HHHHHHHHUQQUPPPPWWBWWWWWWWWWWPPPPPPPPPCCAAAAAAAEEEEECCCCCCCCCKKKKRRRRRRRREKKKKKDHHHWDDDDNNNNNNNNNNNNNAAAAAMMMMPMMEGGGEOOOOOOEEEEEEEEEEEEEEEE
|
||||
HHHHUHHHUQQUUPPPSUUWWWWWWWWWWPPPPPPPPPPCJPBAATTTTTEEEERRCCCCRRKKKKRRRRRRRRKKKKKKNHHWDDDDDNNNNNNNNFFNNAAAAAAAAMPMEEGGGEOOOOOOVVVEEEEEEEEEEEEE
|
||||
HHHHUUUUUUUUUUVVUUWWWWWWWWWWWPPPPPPPPPPPPPAATTTTTTEEEERRUCCCCRKKKKKKRRRKKKKKKDDJDDDWDDDDDNNNNNNNNNNNAAAAAAAAAMMAEEEGGEEOOOOOOVVSESSSSEEEEEEE
|
||||
HHHHHUUUUUUUUUUUUUWWWWWWWWWWWPPPPPLTTPPPPPPTTTTTTTTTEERRRCCCCRRKKKKKRRKKKKKKKDDDDDDDDDDDDDDNNNNNNNNNAAAAAAAAMMAAEEEEGEEEEEOOVVSSSSSSSEEEEEEE
|
||||
HHHHHHHHHUUUUUUUUUWWWWWWWWWWLLLLLLLTTPPPPPPTTTTTTTTTEERRPCERRRRRKKKKKKKKKKKMKLDDDEDDDBBBBBBBNNNNNNNNNAAAAAAAAAAAAAEEEEEEEEOOVVSSSSSSSSSSEGGE
|
||||
HHHHHHHUUUUUUUUUXUWWWWWWWWWWLLLLLLLTTTPPPTTTTTTTTTTTERRRRRRRRRRRRKKKKKKKKMKMLLLDDDDDDBBBBBBBNNNNNNANAAAAAAAAAAAAAAEEEEEEEEEESSFSSSSSSSSSESGG
|
||||
HHHHHHHUUUUUUUUXXXXWWWWWWLLLLLLLLLTTTTTTTTQTTTTTTTTTTRRRRRRRRRRRKKMMKKKKKMMMMMLLDDDDDBBBBBBBNNNNNNNAAAAAAAAAAAAAAAKKEEEEEEEESSSSSSSSSSSSSSGG
|
||||
HHHHHUUUUUUUUUUXXXXXWWWXLLLLLLLLLLTTTTTQQQQTTTTTTTTTTTRRRRRRRRRRRKMMMKKKKMMMMMMDDDDDDBBBBBBBNNNNNNNNNAAAAAAAAAKKKKKKEEEEEEEEESSSSSSSSSQSNQGG
|
||||
HHHKKUUUUKUUUWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQTQQQTTTTTTRRRRRRRRRRRRMMMMKKKKMMMMMMDDDDDDBBBBBBBDNNNNNNNBBBBBBBAAAAKKKKKKKEEEEEEEESSSSSSSSQQQQGG
|
||||
HHHHKKLKAKKUWWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQQQQTTTTTTTRRRRRRRRRRRRMMMMMKMMMMMMMMQQDDDDBBBBBBBNNNNNNNNBBBBBBBAAAAKKKKKKEEEEEEEESSSSSSSSSQGQQGG
|
||||
HHHHHKKKKKKUWWWWWXXXXXXXXLLLLLLLLLQVQQQQQQQQQQQTTTTTRRRRRRRRRRRNNMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBNABBBBBBBAAAAKKKKKKEEEEEENEESSSSSSQSQQQQGQ
|
||||
HHHHKKKKKKKRWWWWWWXXXXXXXLLLLLLIILIQQQQQQQQQQQQQTTTTRRRRRRRRRRRNMMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAKKKKKKEEEENNNNSSSSSSSQQQQQQQQ
|
||||
HMHHKKKKKKKRWWWWWXXXXXXXXLLLLLLIIIIQQQQQQQQQQQQQTTTRRRGRRRRRRRRNMMMMMMMMMMMMMMZQZZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAAAKKKKEEENNNNNSSSNSSSQQQQQQQQ
|
||||
MMKKKKKKKKKWWWWWWXXXXXXXXLLLLLLLLIIIQQQQQQQQQQQQQQTRRRRKKRRRRRNNMMMMMMMMMMMMBBZZZZZZDBBBBBBBBBBBBBBBBBBBBBBAAIIAKKKKKKKENNNNNNNSNSSUUQQQQQQQ
|
||||
NMMMMKKKKKKWWWWWWWXXXXXLLLLLLLLLLLLIIQQQQQQQQQQQQEEERRIIKRRRRNNNMMMMMMMMMMMMMBZZZZZZZBBBBBBBBBBBBBBBBBBBBBBNIIIKKKKKKKKKKNNNNNNNNSUUQVQQQQQQ
|
||||
MMMKKKKKKKKWWWWWWXXXXXXXXRRRRJXXXLIIQQAQQQQQQQQQQEEEEEIIIIINNNNNNMMMMMMMMMMMBBZZZZZZZDSSBBBBBBBBBBBBBBBNNNEEIIIKKKKKIKKNNNNNNNNNNNQQQQQQQQQQ
|
||||
MFMIFFKKKKKKWWWWWWXXXXXXRRRRJJJXXQQQQQQQQQQQQQQQQEEEEEEEIINNNNNNNNNNMMMMMMMBBBBBZZZZZDZZBBBBBBBBBBBBBBBNNNIIIIIKKKIKIINNNNNNNNNNNQQQQQQQQQQQ
|
||||
FFBIFFFKKKKKWWWWWWXXXXXXWWRRRJJXXXXQQQQQQQQQQQQQQEEEEEIIIINNNNNNNNNNNMMMMMMMBBBCBZZZZZZZBBBBBBBBBBBNNNNNNIIIIIIIIIIIIINNNNNNNNNNNNNQQQQQQQQQ
|
||||
FFBBBFFFFKKKYWWWXXXXXXVWWWRRRJXXXXXXXQQQQIQQQUQQUUEUEEIIIIIIINNINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBIINNNNIIIIIIIIIIIIIIINNNNNNNNNNNNNHQQQQQQ
|
||||
FBBBBFFFFFFFFWWWXXXXXXXWWWRWWXXXXXXDDPPPQQUUUUUQUUUUIIIIIIIIIIIINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBINNNNNIIIEIIIIIIIIIIIINNNNNWNNNNNNHQZQQQQ
|
||||
BBBBBFFFFFFFEEEQXXXXXXXXWWWWWXWXXXXDDPPZZUUUUUUUUUUUIIIIIIIIIIIINNNNNNMBBBBBBBBBBBBZZZZZZZBBBBBBBBBIIIIEEEEEEIIIIIIIIIIIWWWWWUWWNWNNNNQZZDDD
|
||||
BBBBBFFFFFEEEEEQXNNXXXWWWWWWWWWWXDDDDQQUUUUUUUUUUUHBIIIIIIIIIIIBNNNNNNBBBBBBBBBBBBZZZZZZZZBBBBBBBBBIIIIIEEEEEIIIIIIIIIIIWWWWUWWWWWNNNNNZDDDD
|
||||
BBBBBBFFFFFEEEEEENNNNWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBIIIIIIIIIIIBNNNNNBBBBBBBBBBBBDBBZZZZZZBBBBBBBBBIIIIEEEEEEEEEIIIIIIIWWWWWWWWWWWNNNZZZDDDD
|
||||
BBBBBBBEFFFEEEEEENENNNWWWWXXXXXXXXXXDDDDDDDDUUUUBBBBBIIIIIIIILBBBNBNNNNBBBBBBBBBBBBZZZZZZZBBBBBIIIIIIEEEEEEEEEEEIIIIIIIWWWWWWWWWWWZZZZZZDDDD
|
||||
BBBBBBEEEYEEEEEELEEENNWWWWXXXXXXXXXXDDDDDDUUUUUUUBBBBIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBZZZZZZHHHUUUIIIIIENEEEEEEEEEIIIIMMMWWWWWWWWWWWZZZZZZZZDD
|
||||
BBBBBBBEEEEEEEEEEEEENWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBBIIIIIEIIBBBBBBBTTBBBBBBBBBBBBBZZZZZZZHUUUUUUUIIEEEEEEEEEEEEEMMMMMMMWWWWXXXXXWZZIJZZZZDZ
|
||||
BBBBBBBBBEEEEEEEEEEEELXXXXXXXXXXXXXXDDDDDDUUUUUUUBTUBIIIIIIIBBBBBBBBTBBBBBBBBBBBBBZZZZZZZZUUUUUUUUIIIELEEEEEEEEEEMMMLWWMWXXXXXXXXXZIIIIIZZDZ
|
||||
BBBBBBBBBEEEEEEEEEEEEEXXXXXXXXXXXXXXDRRDZAUUUUUUUUUUUNNNNIMBBBBBBBBBBBBBBBBBBBBOOBZZZZZZZZZUUUUUUUUUEEEEEEEEEEEEEMMMLLWWWXXXXXXXXXZIIPIZZZZZ
|
||||
BBBBBBBBBBEEEEEEEEEEEWXXXXXXXXXXXXXXDRRDAAAUUUUUUUUMMMNMNNMBBBBBBBBBBBRNBBBBBVNOZZZZZZZZUUUUUUUUUUUUUEEEEEEEELELLMMLLLWWWXXXXXXXXXZIIIIIIZZZ
|
||||
BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAARAUUUUUUUMMMMMMMMBBBBBBBBBBBRNNBBNNNNOOZZZNNZUUUUUUUUUUUUUUUUEEEEEELLLLMLLLLWWWXXXXXXXXXZIIIIIIZZZ
|
||||
BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAAAAAUUUUUUMMMMMMMMBBBBBBBBBBRRNNNNNNNNOONZZNNZUUUUUUUUUUUUUZEEEEEEEELLLLLLLLVWWWXXXXXXXXXIIIIIIIIIZ
|
||||
BBBBBBLLLLLLLLXXEEEVEKXXXXXXXXXXXXXXWVVVVVVAAAAUUUUMMMMMMMMBBMBBBBBBBBRNNNNNNNNNNNNNNUUUUUUUUUUUUUUUEEEEEEEEELLLLLLLLLLLWXXXXXXXXXIIIJZZZZZZ
|
||||
BBBBBBLLLLLLLGLLEEEEEKXXXXXZZZZZZZWWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBNNNNNNNNNNINNNNUUUUUUUUUUUUUUJEEEEEEEELLLLLLLLLLLWWXXXXXXXXXJJJJJJJZZZ
|
||||
BBBBBBLLLLLLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBBNNNNNNNNNNNNNNUUUUUUUUUUUUVVICCELEEEELLLLLLLLLLDDWXXXXXXXXXWWJJJJZZZZ
|
||||
BLLLLLLLOOOLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVVURRUFRMMMMMMMMMBBBBBBBBNNNNNNVKKNNNNNNNNNNNUUUUIVVVVVICCCEEEEELLLLLLLLLDDDDXXXXXXXXXJJJJJJJZZZ
|
||||
BLLLLLLLOOOLLLLLLLLLLLCZZZXXXXXXXXXZVVVVVVVVVVRRRRRRRRMMMMMMMIIIBBBBBBBBVVVVVKYNNNNNNNNNNNUIIIIVVVIIIIEEEEELLLLLLLLLLDDDDDDXXXJJJJJJJJJJJZZZ
|
||||
BLLLLLLLOOOLLLLLLLLLLLLLZZXXXXXXXXXZVVVVVVVVVRRRRRRRRRRRTTTIIIIIIIBBBYYVFVVVVVYYNNNNNNNINNNIIIIVVIIIIEEEEEEEELVLLLLGLLDDDDDXXXJJJJJJJJJJJJJZ
|
||||
LLLLLLLLOOOLLLLLLLLLLLLNZZXXXXXXXXXZVVVVVVVVRRRRRRRRRRRRRRRNIIIIIBBBBYYVVVVVYYYYYYNNNNNIIIBIIIIVIIIIIBEEEDDKELVVDLLLLDDDDDDDDDJJJJJJJJJJJJJZ
|
||||
LLLLLLLLOOOLLLLLLLLLLALNZZXXXXXXXXXZVVVVVVVVKRRRRRRRRRRRRRRRRIIIIBBBBBYYYYVVYYYYYYNNNIIDIIIIIIIIIIIIIIDREDVDEVVVDLLDLDDDDDDDDJJJJJJJJJJJJJJJ
|
||||
LLLLLLLLOOOLLLLBBBLLAAZZZZZZZZZZZZZMVVVVVVVRRRRRRRRRRRRRRXRRIIIIIIIIBYYYYYVVYYYYYYNNNIIIIIIIIIIIIIIIIIDDDDDDDVVDDDDDDDDDDDQDDDJJJJJJJJJJTJJC
|
||||
LLLLLLLLOOOLLLBBBBLLLAAAAAMZZZZMZZMMMVVVVVVRCCCRRRRRRRRRRRRRIIIIIKKYYYYYYYYYYYYYYYYYNNIIIIIIIIIIIIIIIIDDDDDDDVDDDDDDDDDDDQQDDDJJJJJJJJJTTTJC
|
||||
LLLLLLLLOOOLLLLBBBLQLAAAAAMMMZZMZMMMVVVVVVVRCCCCCRRRRRRIIIRRRIIIIKKYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIISIDDDDDDDVVDDDDDDDDDQQQDQQGJJJJJJJJGGGCC
|
||||
LLLLLLLLOOOLLLBBBBBBAAAAAAMMMMMMMMMMMVVVVVVCCCCCCRRRRRRIIIIIIIIIIIKYYYYYYYYYYYYYYYOOOIIIIIIIIIIIIIIIGIDDDDDDDDDDDDWWQQQQQQQQQQGJTJJWWWWGGGCC
|
||||
LLLLLLLLOOOLLLBBBBBBAAAAAAAMMMMMMMMMXXVVVVVCCCCCCCEEERJJJIIIIIIIIKKKKYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIGGGDDDDDDDDDDIWWGQQQQQQQQTTJJTTGGGGWGGGGC
|
||||
TLLLLLLLLLLLLLBBBBBBBAAAAAAMMMMMMMMXXXVVXVVCCCCCCCEEEEAAAAAIIIIIIKKKKYYYYYYYYYYIIIIIIIGIIIIIIIIIIFGGGGDDDDDDDSDWWWGGQQQQQQQQTTTTTGGGGGGGGCCC
|
||||
TLLLLLLLLLLLLLCBBBBBBBACAAAMMMMMMMMXXXXXXXCCCCCCCCEEECAUUUUUUIIIIKKKYYYYYYYYYIIIIIIIIIGIIIIIIFFFFFGGGGDDDDDDSSSSWWWGGQQQQQQQTTTTGGGGGGGGGCCC
|
||||
ZLLLLLLEELLLLLBBBBBBBUCCCMMMMMMMMMMMXXXXXCCCCIIIIIIIIIIUUUUUUHIIKKKKYYYYYYYYYYGXIIIIIIGIIIIIIGGFFFGGGGGDDDDDSSSSSGGGGGQQQQQTTTTGGGGGGGGCCCCC
|
||||
ZZLLLZZLLLLLLLBBBSBBBBBCMMMMMMMMMMXXXXXXXXCCCIIIIIIIIIIUUUUUUHIIIIKKJYYYYYYYYGGGIIIIIGGGGIIIQGGFGGGGGGGSSSSSSSSSSSSGGQQQQQTTQTTTTGGGGGGCCCCC
|
||||
ZZZEZZZZZLLRLLCCKCBBCCCCMMMMMMMMMMMXXXXXXXCCCIIIIIIIIIIUUUUUUHHHIIKKJYYYGGAGGGGGGFGIWGGGGIIGGGGGSSSSSSSSSSSSSSSSSSGGGQQQQQQQQQTTGGGGGGGCCCCC
|
||||
ZZZZZZZZZZLLLLSCCCCCCCCCCMNNMMMMMEEXXXXXXXXCCIIIIIIIIIIUUUUUUHQHHHJJJJJYGGGGGGGGGFGGGGGGGGGGGGGGSSSSSSSSSSSSSSSSSWWWGWQQQQQQQQQTGGGGGGCCCCCC
|
||||
ZZZZZZZZSSLLLSSSCCCCCCCCMMNMMMMMMMMXXXXXXCCCTIIIIIIIIIIUUUUUUHQHHJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSSSSSSWWWWWWWWWQWQQQQWQTTGGGGGGGGCCCC
|
||||
ZZZZZZZZSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXCXXCIIIIIIIIIIQQQQQQQQQAJJJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSWWWWWWWWWWQWWWQQGGGGGGGGGCCCC
|
||||
ZZZZZZZSSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXXXXXIIIIIIIIIIIIQQQQQQAAEAJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGDDDSSSSSSSSWWWWWWWWWWWWQQQQQGOGGGGGGCCQC
|
||||
ZZZZZZZZSTTTSSSSSCCCCCCCMMMMMMMMMMXXXXXXXXXXXXXWWIIIWAIIIQQAPQQAAAAAJJJJGGGGGGMGGGGGGGGGGGGGGGGGGGGGDDDDSSSSSSSAWHWHWWWWWWWQQQQQGGGQQGGGGCQQ
|
||||
ZZZZZZZZZTTTSSSTSSCCHCCMMMMMMEMMMAXXXXXXXXXXXXWWWIIIIIIIIIAAPPPAAAAAJJJMGGGGGGMMMGGGGGGGGGBBGGGEGGGGDDBDSSSSSSSHHHHHWWWWYWWQQQQQQQQQQQQGQQQQ
|
||||
ZZZZZZZOZTTTTTTTTSCCHCHMMMEEEEEMAAXXXXXXXXXXXXWIIIIIIIIIIIAUAPAAAAAAJJJMGGGMMGMMMGGGGGGGGGGGGGEEGGGGSSSSSSSSSSSHHHHHWWWYYQQQQQQQQQQQQQQQQQQX
|
||||
ZZZZZZZOZZTTTTTTTTTHHHHHMEEEEEEEEAAXXGXJXXXXXXWIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHWHHHHQQQQQQQQQQQQQQQQQ
|
||||
ZZZZZOOOTTTTTTTTTTTTTTEHEEEEEEEEAAXXXXXJXCXXXIIIIIIIIIIIIIAAAAAAAAAAMMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHHHHHHQQQQQQQQQQQQQQQQQ
|
||||
ZZZZZOOOTTTTTTTTTTTTTTEEEEEEEEEEEAXXAAAJACCCCIIIIIIIIIIIIIAAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGGGGEEEEEEESSSSSSSSSSSHHHHHHHHHHHHQKKQQQQQQQQQQQQQQ
|
||||
OOOOOOOOOOTTTTTTTTTTTUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIFAAAAAAAAAAAMMMMMMMMMMMGGGGGGUGGGEGEEEEEEESSSSSSSSHHHHHHHHHHHHHHHHKKKKQQQQQQQQQQQQ
|
||||
OOOOOOOOOOTTTTTTTTTTUUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGEEEEEEEEEEESSSSSSSSXXHHHHHHHHHHHHHHKKKQQQQQQQQHQQQQ
|
||||
OOOOOOOOOOOTTTTTTTTTCCCESSSSSSSZEAAAAAAAEEECCSIIIIIIIIIISSAAAAAAAAAAMMMMMMMMMMMMMMGGGGOOEEEEEEEEEEEESSSSSSSSXXXHHHHHHHHHQHHHHKNPPIQQQQQHQHHH
|
||||
OOOOOOOOOOTTTTTTTTTTCCCCSSSSSSSEEEAAAACEEEESSSIIIIIIIIIISSAAAMMAAAAAMMMMMMMMMMMMMMXXGGJEEEEEEEEEEEXBSSSSSSSSXXXXHHHHHHHQQHHKKKNNPIIIQIIHHHHH
|
||||
OOOYYYYYOOTTTTTTTTTTBCCCSSSSSSSEHHHAAAEEEEESSSIIIIIIIIIITGGAMMMAAAMMMMMMMMMMMMVVVMXXXJJJJEEEEEEEEEXXSSSSSSSSXXXXXHHHHHHHHHKKKKKNNIIIIIIHHHHH
|
||||
OOYYYYYYOTTTTTTTTTUTCCCCSSSSSSSEHHHAAAEEEEEESSIIIIIIIIIITGGAMMMAAAAAMDMMMMMMMMVVXXXXXJJJJEEEEERRREXXSSSSSSSSXXXXXHHTHTKKHHKKKKKNNTIIIIIHHHHH
|
||||
OOYYYYYYOYTTTTTTTCUCCCCCSSSSSSSYYHIIIIIEEEEESSIIIIIIIIIITTTTMMMMAAADDDDMMMMMMMVVVVXXXJJJJJEEEERRRXXXBBBXXXXXXXXXHHHTTTTKKKKKKKNNNTIIIIIIHHHH
|
||||
YYYYYYYYYYTTTTTTTCCCCCCCSSSSSSSYYHIIIIIIEEEEESSSSSSSSSTTTTTJTYYYAADDDDDDVVMVVVVVVVJJJJJJJJEEEEERRXXXBBXXXXXXXXXXGGGTTTTTKKKNNNNNIIIIIIIIIHHH
|
||||
YYYYYYYYYYYYTTTYYYCCCCCCSSSSSSSSSPIIIIIEEEEEESSSSSSSTSTTTTTTTTYYYADDDDDDVVVVVVVVVVJJJJJJJJEEEERRRXXXXXXXXXXXVXVVVVGTTTUTKNNNNNNNIIIIIIIIIHHH
|
||||
YYYYYYYYIIYYYYYYYCCCCCCCCCSSSSSSSIIIIIIIEEEEEEESSSSSTTTTTTTTTTTYYYDDDDDDVVVVVVVVVVVVVJJJJJEEERRRRRRXXXXXXXXXVVVVVGGTTTTMNNNNNNNNIIIIIIIIIHHH
|
||||
YYYYYYYYHHHHHHYYYYCCCCCCCCSSSSSSSIIIIIIEEEEESESSSSSSTJTTTTTTTTYYYYYDDDDDDVVVVVVVVVVJJJJJJJEEERRRRRRRRXXXXXXXVVVVVVVVATTNNNNNNNNNIIIIIIIIHHHH
|
||||
YYYYYYYYYHHHHHHYYYCCCCCCCCSSSSSSSIIIIIGEEEEESSSSSSSSSYTTYTYYYYYYYYYDDDDDDDDVVVVVVVVJVVVVJEEERRRRRRRRRXRRXXXXVVVVVVVVAAAANNNNNNNNNIIIIIIIIHHH
|
||||
YYYYYYYDYHHHHHYYYYCCCCCCCCSSSSSSSIIIGGGEEEEEESSSSSSSSYYYYYYYYYDDDYYYDDDDSDDDVVVVVVVVVVVVVEEERRRRRRRRRRRRXXXXVVVVVVVVAAAANNNNNNNNNNIIIIUUIIHH
|
||||
YYYYYYYYHHHHHYYYYYCCCCCCCCSSSSSSSIIIIIIIPEEEEESSSSSYYYYYYYYYYYDDDDSSDSSSSVVVVVVVVVVVVVVVEEEERRRRRRRRRREEXXXVVNVVVVVVAAAANNNNNNNNNNIIIUUUUUHH
|
||||
SYSSSSYYHHHHHHYYYYCCCYCHCCSSSSSSSSSSSIHPPEEEEEEESSSYYYYYYYYDDYDDDDSSSSSSSSSVVVVVVVVVVVMMMMMMKMRRRRRRRRTEXXXXTVVVVVVAAAAAANNNNNNNNNNUIUUUUUUH
|
||||
SYSSSSYYHHHHHHYYYYYYCYIHHCSSSSSSSSSSSHHHHEEEEEESSSSAYYYYYYYDDDDDDDFSSSSSSSSSVVVVSVVMMMMMMMMMKMMRRRRRRTTEETTTTTTVVVAAAAAAANNNNNNNNNNUUUUUUUUU
|
||||
SSSSSSSSSHHHHHYYYYYYYYYHHHHSSSSSSSSSSHHHHEEEEEEAASSSHYYYYYYDDDDDFFFSSSSSSSSSSVVVSVVMMMMMMMMMMMMRTRRRRTTTTTTTTTTVAAAAAAAAANNNNNNNNNNUUUUUUUMU
|
||||
SSSSSSSHHHHHHHHHYYYYYYYYHHHSSSSHHIIIHHHHEEEEEAAAAASHHHHSYYYDDDFFFFSSSSSSSSSSSSSSSVVMMMMMMMMMMMAATRRRTTTTTTTTTTUVAAAAAAAANNNNNNNNNNNUUUUUUUUF
|
||||
SSASSSSSSHHHNHHHZZJJYTYHHHHHHHHHHHIIHHHHHHEEEAAAAAAATHXXXYYADDFFFFSSRSSSSSSSSSSSVVVMMMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUNNNNNUNUUUUUUUBBBF
|
||||
SSASSSSSSHHHHJHZZJJJYYYHHHHHHHHHHHHHHHHHHHGEEAAAAAAAAXXXXYYAAAAAAAASASSSSSSSSSSSSSVVMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUUNNUNUUUUUUUUUBBBBB
|
||||
SAAAASSSSBHHVJHHJJJJYYHHHHHHHYYHHHHHHHHHHHGAAAAAAAAAAXXXXXYYAAAAAAAAAAASSSSSSSSSVVVMMMMMMMMMMAATTTTDTTTTTTTTTTTAAAAAAAAAUUUUUNUUUUUUUUBBBBBB
|
||||
SAAAAASBBBBJJJJHJJJJYYHHHHHHYYYYYHHHHHHHHAAAAAAAAAAAAXKXXXIRAAAAAAAAASSSSSGASSSSVVVTMMMMMMMMAAAATTMDTTTTTTTXZTTAAAAAAVAAVVUUUUUXUXUUUUUHHBBH
|
||||
AAAAAASSSBJJJJJJJJJHHHHHHHHYYYYYYYYYHHHHHAAAAAAAAAAAAXXXNIIRRAAAAAAAAAAAASSAASSSSVTTMSMMMMMMMAAATTMMMMTTTXTXXTXAAAAAAVVVVEUUUUUXXXUUUUUUHHHH
|
||||
AAAAAJRJJJJJJJJJJJJHHHHHHHYYYYYYYYYYHHHHHAAAAAAAAAAAAJIIIIIRAAAAAAAAAAAAAASAAATSRVTTMMMMMMMXXXAAATPMMMKXXXXXXXXXAAAAAVVVVUUUUUXXXXXXXUUUHHHH
|
||||
AAAAARRTTJAAJJJJJJJJHHHHHHHYYYYYYYYYHHHAAAAAAAAAAAAAAJIIIIIIIIIAAAAAAAAAAAAAATTTVVTTMMMGMZZXXXXAAMMMMXXXXXXXXXXXAAAVVVVVVUUUUXXXXXXXXXHHHHHH
|
||||
AAAAARRRJJAJJJJJJJJJHHHUUUUUYYYYYYYYYYEAAAAAAAAAAAAAAAYYIIIIIIIIAAAAAAAAAAAAAATTTTTTWMMMMZZXXXAAAAMMMXXXXXXXXXXXAAAVVVVVVUVVUXXXXXXXXXXHHHHH
|
||||
AAAAAAARJAAJJJJJJJJJMPPUUUUUYYYYYYYYYYAAAAAAAAAAAAAAAAAAIIIIIIIAAAAAAAAAAAAAAATTTTTWWDDDMXXXXXXXAAAXXXXXXXXXXXXXAAVVVVVVVVVVUXXXXXXXXHHHHHHH
|
||||
AAAAAARRRAAAJJJJJJJJPPPUUUUUYYYYYYYYYYAANNAAAAAAAAAAAIAIIIIIIIIAAISAIIIAAAATAATWWTWWWWDDXXXXXXXXXXXXXXXXXXXXXKKKAAVVVVVVVVVVUXXXXXXXXHHHHHHH
|
||||
AAAAAGGRRAAAAAJJPPPJJPPUUUUUYYYYYYYYYYYOOOOROSSAAAIAAIIIIIIIIFIIAIIIIIIAAOOOAATTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKAAKVVVVVVVVVVVTXXXXXIIXXHHHHH
|
||||
AAAAAGGGRRRAAAAAAPPPPPPPPPYYYYYYYYYYYYOOOOOOOSSSSAGGGGGIIIIIFFIIIIIIIIAAOOOOOOTTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKKKKKKVVVVVVVVVVXXXXXXXEXXHHHH
|
||||
AAAAAGGARAAAAAAPPPPPPPPPPPPPYYYYYYOYYYOOOOOOOSSSSGGGGGIIIIIIIFIIIIIIIIAAOOOOOOOOWWWWWWIIXHXXXXXXXXXXXXXXXXXXXXKVVVVVVVVVVVVVVVXXXXXXXEXXHHHH
|
||||
AAAAAGGAAAAAAAAPPPPPPPPPPPPPPPYYOOOOOYOOOOOOOOOSSGGGGGGIIIIIIIIIIIIIIIOOOOOOHHHHWWWWWWIIXHXXXXXXXXXLXXXXXXXXXXXZZVVVVVVVVVVVVVVXXXXXXXXXHHHH
|
||||
AAAGGGAAAAAAAAPPPPPPNNNPPPPPPPPPPOOOOOOOOOOOOOCGGGGGGGGGIIIIIIIIIIIIIIIQIOOOHHHHHWWWWWWIJHHXXXXXXXXXXXXXXXXXXHXZZVVVVVVVVVVVVVVXXXXXYYXXHHHH
|
||||
GAAGGGGAAAAAAAAAPJJNNNNPNPPPPPPPNOOOOOOOOOOOOOCGGGGGGGGGGGIIIIIIIIIIIIIIIOHHHHHHHWIWIIIIJHHXXXXXXXXXXXXXXXZZXXZZZVVVVVVVVVVVVVVYXYYYYYYYEEHH
|
||||
GGGGGGGGAAAAAAAAAJJNNNNNNPPPPPPPPOOOOOOOOOOUOOOGGGGGGGGGGINIIIIIIIIIIIIIIIIHHHHHHHIIIIJJJHHXXXXXXJXXXXXXXXXZZZZZVVVVVSSSZVVZVVVYYYYYYEEEEHHH
|
||||
GGGGGGGGGAAAAAAAAJJNNNNNNPPPPPPPPPPOOOOOOOOUUUGGGGGGGGGGGIIIIIIIIIIIIIIIIHHHHHHHHIIIIIIJJJHXXXXXXXWXXFXXXXZZZZZZVZZVVVVVZZZZZVYYYYEYYEEAEHHH
|
||||
GGGGGGGGAAAAAAAAAAJNNNNNNNPNPPPPXXXOOOOOOOOOUUGGGGGGGGGGGGIIIIIIIIIIIIHHIIHHHHHHHHHIIIIJJJHXXXXXXXWXFFFXXXXZZZZZZZZZZZVZZZZZZZYYYYEEEEEEHHHH
|
||||
GGGGGGGGGGGAAAJJJJJNNNNNNNNNPPPXXXXOOXXOOOOOGGGGGGGGGGGGGGGGIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHXXXXXXXXXFFFFXXZZZZZZZZZZZZZZZZZZZZZYYEEEEEHHHHH
|
||||
58
2024/go/day13/day13.go
Normal file
58
2024/go/day13/day13.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package day13
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
_ "adventofcode2024/utils/grid2d"
|
||||
_ "adventofcode2024/utils/inputs"
|
||||
"regexp"
|
||||
_ "fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Part1(input string) int {
|
||||
val := 0
|
||||
machines := strings.Split(input, "\n\n")
|
||||
pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
for _, machine := range machines {
|
||||
matches := re.FindStringSubmatch(machine)
|
||||
a := utils.MustAtoi(matches[1])
|
||||
b := utils.MustAtoi(matches[2])
|
||||
c := utils.MustAtoi(matches[3])
|
||||
d := utils.MustAtoi(matches[4])
|
||||
X := utils.MustAtoi(matches[5])
|
||||
Y := utils.MustAtoi(matches[6])
|
||||
// fmt.Println(matches)
|
||||
B := (Y*a - X*b)/(a*d - c*b)
|
||||
A := (X - c*B)/a
|
||||
// fmt.Printf("A: %d B: %d\n", A, B)
|
||||
if (A*a + B*c == X && A*b + B*d == Y) {
|
||||
val += A*3 + B
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
val := 0
|
||||
machines := strings.Split(input, "\n\n")
|
||||
pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
for _, machine := range machines {
|
||||
matches := re.FindStringSubmatch(machine)
|
||||
a := utils.MustAtoi(matches[1])
|
||||
b := utils.MustAtoi(matches[2])
|
||||
c := utils.MustAtoi(matches[3])
|
||||
d := utils.MustAtoi(matches[4])
|
||||
X := utils.MustAtoi(matches[5]) + 10000000000000
|
||||
Y := utils.MustAtoi(matches[6]) + 10000000000000
|
||||
// fmt.Println(matches)
|
||||
B := (Y*a - X*b)/(a*d - c*b)
|
||||
A := (X - c*B)/a
|
||||
// fmt.Printf("A: %d B: %d\n", A, B)
|
||||
if (A*a + B*c == X && A*b + B*d == Y) {
|
||||
val += A*3 + B
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
45
2024/go/day13/day13_test.go
Normal file
45
2024/go/day13/day13_test.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package day13
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279`)
|
||||
require.Equal(t, 480, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`Button A: X+94, Y+34
|
||||
Button B: X+22, Y+67
|
||||
Prize: X=8400, Y=5400
|
||||
|
||||
Button A: X+26, Y+66
|
||||
Button B: X+67, Y+21
|
||||
Prize: X=12748, Y=12176
|
||||
|
||||
Button A: X+17, Y+86
|
||||
Button B: X+84, Y+37
|
||||
Prize: X=7870, Y=6450
|
||||
|
||||
Button A: X+69, Y+23
|
||||
Button B: X+27, Y+71
|
||||
Prize: X=18641, Y=10279`)
|
||||
require.Equal(t, 480, r)
|
||||
}
|
||||
1279
2024/go/day13/input.txt
Normal file
1279
2024/go/day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
149
2024/go/day14/day14.go
Normal file
149
2024/go/day14/day14.go
Normal file
@@ -0,0 +1,149 @@
|
||||
package day14
|
||||
|
||||
import (
|
||||
"adventofcode2024/utils"
|
||||
grid "adventofcode2024/utils/grid2d"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Robot struct {
|
||||
velocity [2]int
|
||||
}
|
||||
|
||||
const SIZE_X = 101
|
||||
const SIZE_Y = 103
|
||||
|
||||
func Part1(input string) int {
|
||||
grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
|
||||
pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
matches := re.FindStringSubmatch(line)
|
||||
fmt.Println(matches)
|
||||
x := utils.MustAtoi(matches[1])
|
||||
y := utils.MustAtoi(matches[2])
|
||||
x1 := utils.MustAtoi(matches[3])
|
||||
y1 := utils.MustAtoi(matches[4])
|
||||
robots := grid.Get(x, y)
|
||||
grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}}))
|
||||
}
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
ng := ticks(grid, 100)
|
||||
fmt.Println(ng.StringWithFormatter(formatter))
|
||||
|
||||
return get_saftey(ng)
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
min_safe := 240096000
|
||||
min_i := 0
|
||||
max_safe := 0
|
||||
max_i := 0
|
||||
grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
|
||||
pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)`
|
||||
re := regexp.MustCompile(pattern)
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
matches := re.FindStringSubmatch(line)
|
||||
fmt.Println(matches)
|
||||
x := utils.MustAtoi(matches[1])
|
||||
y := utils.MustAtoi(matches[2])
|
||||
x1 := utils.MustAtoi(matches[3])
|
||||
y1 := utils.MustAtoi(matches[4])
|
||||
robots := grid.Get(x, y)
|
||||
grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}}))
|
||||
}
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
max_safe = get_saftey(grid)
|
||||
for i:=0;i<7380;i++ {
|
||||
ng := ticks(grid, 1)
|
||||
safe := get_saftey(ng)
|
||||
if safe > max_safe {
|
||||
max_safe = safe
|
||||
max_i = i
|
||||
}
|
||||
if safe < min_safe {
|
||||
min_safe = safe
|
||||
min_i = i
|
||||
}
|
||||
grid = ng
|
||||
}
|
||||
for i:=7380;i<7390;i++{
|
||||
ng := ticks(grid, 1)
|
||||
fmt.Println(ng.StringWithFormatter(formatter))
|
||||
grid = ng
|
||||
}
|
||||
fmt.Println(grid.StringWithFormatter(formatter))
|
||||
fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i)
|
||||
return get_saftey(grid)
|
||||
}
|
||||
|
||||
func formatter(robots []Robot, x int, y int) string {
|
||||
if len(robots) == 0 {
|
||||
return " "
|
||||
}
|
||||
return "*"
|
||||
}
|
||||
|
||||
func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] {
|
||||
ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
|
||||
for y := 0; y < g.SizeY(); y++ {
|
||||
for x := 0; x < g.SizeX(); x++ {
|
||||
for _, robot := range g.Get(x, y) {
|
||||
nx := x + ((robot.velocity[0] * seconds) % SIZE_X)
|
||||
if nx < 0 {
|
||||
nx = g.SizeX() + nx
|
||||
}
|
||||
if nx >= g.SizeX() {
|
||||
nx = nx - g.SizeX()
|
||||
}
|
||||
ny := y + ((robot.velocity[1] * seconds) % SIZE_Y)
|
||||
if ny < 0 {
|
||||
ny = g.SizeY() + ny
|
||||
}
|
||||
if ny >= g.SizeY() {
|
||||
ny = ny - g.SizeY()
|
||||
}
|
||||
robots := ng.Get(nx, ny)
|
||||
ng.Set(nx, ny, append(robots, robot))
|
||||
}
|
||||
}
|
||||
}
|
||||
return ng
|
||||
}
|
||||
|
||||
func get_saftey(grid *grid.Grid[[]Robot]) int {
|
||||
robots := 0
|
||||
val := 1
|
||||
for y := 0; y < grid.SizeY()/2; y++ {
|
||||
for x := 0; x < grid.SizeX()/2; x++ {
|
||||
robots += len(grid.Get(x, y))
|
||||
}
|
||||
}
|
||||
val *= robots
|
||||
robots = 0
|
||||
for y := 0; y < grid.SizeY()/2; y++ {
|
||||
for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ {
|
||||
robots += len(grid.Get(x, y))
|
||||
}
|
||||
}
|
||||
val *= robots
|
||||
robots = 0
|
||||
for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ {
|
||||
for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ {
|
||||
robots += len(grid.Get(x, y))
|
||||
}
|
||||
}
|
||||
val *= robots
|
||||
robots = 0
|
||||
for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ {
|
||||
for x := 0; x < grid.SizeX()/2; x++ {
|
||||
robots += len(grid.Get(x, y))
|
||||
}
|
||||
}
|
||||
val *= robots
|
||||
return val
|
||||
}
|
||||
527
2024/go/day14/day14_test.go
Normal file
527
2024/go/day14/day14_test.go
Normal file
@@ -0,0 +1,527 @@
|
||||
package day14
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`p=0,4 v=3,-3
|
||||
p=6,3 v=-1,-3
|
||||
p=10,3 v=-1,2
|
||||
p=2,0 v=2,-1
|
||||
p=0,0 v=1,3
|
||||
p=3,0 v=-2,-2
|
||||
p=7,6 v=-1,-3
|
||||
p=3,0 v=-1,-2
|
||||
p=9,3 v=2,3
|
||||
p=7,3 v=-1,2
|
||||
p=2,4 v=2,-3
|
||||
p=9,5 v=-3,-3`)
|
||||
require.Equal(t, 12, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`p=80,75 v=69,72
|
||||
p=88,10 v=-28,-23
|
||||
p=79,61 v=79,59
|
||||
p=37,102 v=92,-43
|
||||
p=12,22 v=-5,-95
|
||||
p=60,13 v=-30,-42
|
||||
p=3,59 v=-96,-88
|
||||
p=85,33 v=-43,-41
|
||||
p=44,14 v=63,45
|
||||
p=6,6 v=-34,-86
|
||||
p=47,102 v=12,42
|
||||
p=36,88 v=-88,-93
|
||||
p=78,27 v=-18,52
|
||||
p=96,64 v=-62,-34
|
||||
p=49,99 v=-78,-15
|
||||
p=57,31 v=-80,21
|
||||
p=25,57 v=8,-84
|
||||
p=69,20 v=81,61
|
||||
p=80,5 v=-11,-30
|
||||
p=2,35 v=-85,77
|
||||
p=9,12 v=-4,36
|
||||
p=37,68 v=12,-69
|
||||
p=47,88 v=-8,-90
|
||||
p=72,68 v=59,-86
|
||||
p=55,38 v=-68,-94
|
||||
p=60,58 v=41,37
|
||||
p=76,87 v=-1,-18
|
||||
p=89,9 v=38,92
|
||||
p=100,67 v=17,-53
|
||||
p=83,73 v=80,32
|
||||
p=77,19 v=-54,-20
|
||||
p=10,86 v=-65,36
|
||||
p=13,88 v=-64,-84
|
||||
p=50,29 v=-17,-29
|
||||
p=79,38 v=89,-57
|
||||
p=55,57 v=-68,22
|
||||
p=71,82 v=-80,52
|
||||
p=37,83 v=-68,-43
|
||||
p=25,5 v=81,-22
|
||||
p=83,54 v=-32,-75
|
||||
p=27,95 v=-77,-55
|
||||
p=70,97 v=-72,-4
|
||||
p=3,84 v=-60,-60
|
||||
p=16,29 v=-35,99
|
||||
p=39,39 v=37,-38
|
||||
p=76,94 v=90,60
|
||||
p=18,21 v=-86,-26
|
||||
p=22,84 v=-16,66
|
||||
p=45,83 v=-40,-43
|
||||
p=35,52 v=54,3
|
||||
p=30,21 v=14,36
|
||||
p=69,61 v=69,-66
|
||||
p=52,22 v=-28,33
|
||||
p=9,21 v=-85,-73
|
||||
p=87,32 v=79,52
|
||||
p=28,85 v=-35,85
|
||||
p=32,58 v=-49,89
|
||||
p=22,75 v=85,44
|
||||
p=45,19 v=-88,61
|
||||
p=97,59 v=98,-75
|
||||
p=70,81 v=82,7
|
||||
p=97,102 v=-23,-8
|
||||
p=92,68 v=89,72
|
||||
p=24,42 v=-63,-97
|
||||
p=21,64 v=-45,-47
|
||||
p=58,3 v=-69,51
|
||||
p=33,68 v=19,-20
|
||||
p=27,6 v=-89,-21
|
||||
p=28,81 v=-67,-8
|
||||
p=59,83 v=-66,-82
|
||||
p=3,14 v=-3,-1
|
||||
p=19,65 v=15,-25
|
||||
p=57,37 v=53,-29
|
||||
p=36,84 v=-4,-84
|
||||
p=55,96 v=82,-21
|
||||
p=68,101 v=51,51
|
||||
p=68,8 v=-90,-30
|
||||
p=78,51 v=-51,-63
|
||||
p=4,55 v=-63,97
|
||||
p=100,60 v=76,-13
|
||||
p=7,91 v=-96,-73
|
||||
p=97,17 v=-54,33
|
||||
p=85,60 v=69,-3
|
||||
p=20,39 v=96,-85
|
||||
p=24,12 v=86,-84
|
||||
p=34,7 v=-7,-36
|
||||
p=30,69 v=-67,97
|
||||
p=65,17 v=20,33
|
||||
p=39,101 v=-7,-83
|
||||
p=38,51 v=-90,-4
|
||||
p=99,61 v=-13,59
|
||||
p=30,1 v=-67,-96
|
||||
p=1,89 v=-85,-83
|
||||
p=8,1 v=68,4
|
||||
p=89,89 v=-52,85
|
||||
p=81,5 v=-55,71
|
||||
p=99,60 v=-94,-72
|
||||
p=68,70 v=-10,78
|
||||
p=81,18 v=89,-95
|
||||
p=47,61 v=-39,56
|
||||
p=91,71 v=85,59
|
||||
p=28,66 v=44,-28
|
||||
p=10,64 v=-59,-4
|
||||
p=84,10 v=-32,-11
|
||||
p=29,52 v=-37,34
|
||||
p=78,43 v=-92,12
|
||||
p=85,3 v=-71,4
|
||||
p=37,85 v=-46,-84
|
||||
p=56,21 v=21,-32
|
||||
p=17,17 v=15,17
|
||||
p=26,87 v=45,-93
|
||||
p=57,21 v=-6,40
|
||||
p=95,48 v=-33,59
|
||||
p=38,59 v=65,-72
|
||||
p=59,85 v=-50,-99
|
||||
p=17,21 v=86,-45
|
||||
p=53,3 v=-28,-46
|
||||
p=1,40 v=-54,-91
|
||||
p=61,13 v=-40,83
|
||||
p=33,35 v=-72,-96
|
||||
p=40,14 v=33,-8
|
||||
p=29,89 v=53,-59
|
||||
p=74,0 v=-22,-42
|
||||
p=12,32 v=-65,-4
|
||||
p=82,89 v=-12,20
|
||||
p=35,71 v=-40,20
|
||||
p=14,5 v=95,83
|
||||
p=46,44 v=39,92
|
||||
p=25,54 v=-66,-47
|
||||
p=91,78 v=64,53
|
||||
p=14,9 v=25,67
|
||||
p=39,29 v=-29,8
|
||||
p=20,100 v=95,51
|
||||
p=59,41 v=92,-82
|
||||
p=15,92 v=93,-73
|
||||
p=42,93 v=3,-86
|
||||
p=82,93 v=-21,-96
|
||||
p=50,9 v=12,-39
|
||||
p=81,22 v=-13,99
|
||||
p=72,81 v=-51,-93
|
||||
p=88,19 v=-72,-14
|
||||
p=8,93 v=-85,-15
|
||||
p=54,2 v=61,8
|
||||
p=44,81 v=66,41
|
||||
p=78,10 v=90,8
|
||||
p=19,53 v=68,4
|
||||
p=80,43 v=9,46
|
||||
p=11,38 v=-66,88
|
||||
p=31,3 v=4,-2
|
||||
p=49,28 v=-74,21
|
||||
p=27,15 v=54,-88
|
||||
p=96,87 v=-50,-67
|
||||
p=94,94 v=-5,-97
|
||||
p=16,89 v=73,23
|
||||
p=93,32 v=-53,93
|
||||
p=47,17 v=-29,92
|
||||
p=10,78 v=16,35
|
||||
p=55,33 v=-60,-17
|
||||
p=55,73 v=-68,-22
|
||||
p=100,62 v=17,-69
|
||||
p=67,91 v=-49,45
|
||||
p=68,53 v=-42,-41
|
||||
p=35,73 v=54,47
|
||||
p=20,63 v=-85,-12
|
||||
p=23,16 v=-87,33
|
||||
p=70,55 v=50,-16
|
||||
p=92,6 v=41,-59
|
||||
p=9,97 v=-37,47
|
||||
p=48,48 v=42,40
|
||||
p=96,37 v=-90,32
|
||||
p=66,13 v=-60,91
|
||||
p=62,46 v=-50,18
|
||||
p=11,15 v=98,77
|
||||
p=42,78 v=1,47
|
||||
p=10,40 v=15,-48
|
||||
p=88,44 v=7,-75
|
||||
p=27,53 v=-70,-9
|
||||
p=21,7 v=-56,96
|
||||
p=92,81 v=-22,69
|
||||
p=57,65 v=92,-34
|
||||
p=85,63 v=77,11
|
||||
p=92,2 v=-30,21
|
||||
p=59,16 v=73,-70
|
||||
p=16,11 v=86,-89
|
||||
p=82,16 v=80,-36
|
||||
p=41,30 v=-49,19
|
||||
p=13,6 v=14,73
|
||||
p=67,99 v=-91,51
|
||||
p=37,20 v=-65,-37
|
||||
p=85,16 v=99,-14
|
||||
p=1,39 v=-44,56
|
||||
p=37,29 v=74,5
|
||||
p=44,51 v=-18,93
|
||||
p=43,9 v=-55,-84
|
||||
p=5,10 v=-65,26
|
||||
p=51,90 v=-59,-96
|
||||
p=55,98 v=-9,23
|
||||
p=0,94 v=88,-49
|
||||
p=91,43 v=-14,-72
|
||||
p=93,43 v=-69,-94
|
||||
p=84,100 v=-12,54
|
||||
p=23,46 v=85,78
|
||||
p=79,37 v=39,-10
|
||||
p=1,23 v=99,-79
|
||||
p=73,50 v=-51,84
|
||||
p=78,58 v=-31,-16
|
||||
p=75,44 v=69,71
|
||||
p=27,5 v=-87,14
|
||||
p=95,91 v=-33,63
|
||||
p=22,94 v=-5,-37
|
||||
p=36,11 v=-5,-60
|
||||
p=18,3 v=-64,-27
|
||||
p=44,14 v=24,-92
|
||||
p=96,40 v=65,-92
|
||||
p=47,1 v=84,25
|
||||
p=93,22 v=68,-48
|
||||
p=14,32 v=-24,37
|
||||
p=99,17 v=78,-89
|
||||
p=53,36 v=10,58
|
||||
p=44,44 v=-78,-60
|
||||
p=15,28 v=-96,-20
|
||||
p=96,61 v=-81,-45
|
||||
p=58,87 v=-9,7
|
||||
p=20,43 v=84,-22
|
||||
p=50,42 v=-18,68
|
||||
p=74,23 v=-12,42
|
||||
p=12,57 v=-94,-94
|
||||
p=49,49 v=-89,40
|
||||
p=47,98 v=-67,-8
|
||||
p=84,17 v=-62,11
|
||||
p=31,6 v=-57,-42
|
||||
p=28,67 v=66,-81
|
||||
p=0,3 v=-88,-13
|
||||
p=51,76 v=82,76
|
||||
p=67,81 v=87,-14
|
||||
p=84,78 v=39,41
|
||||
p=39,74 v=72,35
|
||||
p=30,10 v=64,-77
|
||||
p=10,31 v=11,-4
|
||||
p=6,90 v=-4,76
|
||||
p=90,24 v=-2,-23
|
||||
p=8,39 v=-57,-27
|
||||
p=31,69 v=93,-25
|
||||
p=79,38 v=39,-35
|
||||
p=69,31 v=70,30
|
||||
p=1,16 v=7,73
|
||||
p=46,9 v=-99,-70
|
||||
p=53,16 v=-94,-84
|
||||
p=32,60 v=33,-69
|
||||
p=62,22 v=-99,-4
|
||||
p=66,3 v=98,20
|
||||
p=4,76 v=46,-75
|
||||
p=50,71 v=-90,22
|
||||
p=57,12 v=31,-15
|
||||
p=59,84 v=-50,-65
|
||||
p=33,0 v=76,-48
|
||||
p=58,76 v=-30,44
|
||||
p=6,69 v=6,35
|
||||
p=74,91 v=-61,-43
|
||||
p=36,92 v=-58,60
|
||||
p=2,78 v=-48,-98
|
||||
p=43,91 v=53,76
|
||||
p=34,101 v=-77,79
|
||||
p=40,44 v=-68,28
|
||||
p=71,64 v=47,-48
|
||||
p=54,7 v=84,15
|
||||
p=54,75 v=-60,-31
|
||||
p=14,40 v=86,12
|
||||
p=80,29 v=-92,-26
|
||||
p=8,47 v=-33,-69
|
||||
p=2,41 v=12,-9
|
||||
p=39,60 v=-38,59
|
||||
p=13,22 v=86,-20
|
||||
p=25,12 v=-57,11
|
||||
p=60,47 v=96,96
|
||||
p=50,51 v=-48,-82
|
||||
p=85,40 v=89,74
|
||||
p=99,4 v=-94,-21
|
||||
p=75,7 v=29,-73
|
||||
p=28,58 v=-80,24
|
||||
p=46,94 v=-9,56
|
||||
p=24,65 v=-76,62
|
||||
p=50,2 v=-20,70
|
||||
p=85,55 v=-5,66
|
||||
p=38,11 v=43,36
|
||||
p=53,54 v=53,24
|
||||
p=18,45 v=65,96
|
||||
p=94,22 v=16,80
|
||||
p=79,28 v=75,-69
|
||||
p=30,38 v=-15,-29
|
||||
p=5,23 v=-4,49
|
||||
p=8,98 v=96,-99
|
||||
p=7,60 v=-14,47
|
||||
p=96,17 v=88,-73
|
||||
p=48,23 v=-41,35
|
||||
p=17,31 v=-26,-23
|
||||
p=13,52 v=66,37
|
||||
p=58,19 v=41,55
|
||||
p=25,9 v=-77,-89
|
||||
p=3,92 v=55,-80
|
||||
p=74,95 v=20,-77
|
||||
p=26,70 v=43,72
|
||||
p=54,4 v=96,-18
|
||||
p=63,8 v=-97,49
|
||||
p=23,51 v=87,-75
|
||||
p=24,18 v=85,36
|
||||
p=8,52 v=6,-13
|
||||
p=97,50 v=17,-72
|
||||
p=47,66 v=-25,6
|
||||
p=38,78 v=3,-93
|
||||
p=62,6 v=5,77
|
||||
p=56,74 v=-70,-6
|
||||
p=94,99 v=9,34
|
||||
p=19,92 v=-18,26
|
||||
p=35,54 v=-47,-69
|
||||
p=92,8 v=-13,42
|
||||
p=47,86 v=12,-90
|
||||
p=12,83 v=-68,2
|
||||
p=0,18 v=-75,-89
|
||||
p=11,99 v=-99,14
|
||||
p=88,20 v=62,21
|
||||
p=27,53 v=53,-47
|
||||
p=17,44 v=-5,-91
|
||||
p=57,10 v=66,-65
|
||||
p=66,95 v=-71,-12
|
||||
p=38,21 v=23,95
|
||||
p=68,69 v=-31,35
|
||||
p=87,71 v=50,72
|
||||
p=98,12 v=47,33
|
||||
p=94,21 v=66,51
|
||||
p=53,97 v=-16,-93
|
||||
p=59,35 v=6,39
|
||||
p=12,88 v=-86,88
|
||||
p=85,16 v=39,8
|
||||
p=38,85 v=35,80
|
||||
p=44,9 v=-48,11
|
||||
p=71,18 v=-82,39
|
||||
p=85,14 v=-74,-73
|
||||
p=88,22 v=-42,36
|
||||
p=8,6 v=-58,38
|
||||
p=21,58 v=-66,9
|
||||
p=25,17 v=-68,95
|
||||
p=89,16 v=-34,-86
|
||||
p=33,54 v=64,-88
|
||||
p=57,8 v=54,51
|
||||
p=40,18 v=-98,58
|
||||
p=91,22 v=-34,-53
|
||||
p=75,81 v=-70,26
|
||||
p=89,70 v=-2,69
|
||||
p=62,6 v=-1,-92
|
||||
p=78,24 v=-82,-42
|
||||
p=47,7 v=-75,83
|
||||
p=86,8 v=-63,95
|
||||
p=80,64 v=-36,-79
|
||||
p=69,95 v=-30,29
|
||||
p=46,86 v=85,20
|
||||
p=76,35 v=-82,-51
|
||||
p=33,15 v=-17,55
|
||||
p=40,58 v=-2,-11
|
||||
p=76,31 v=39,2
|
||||
p=46,82 v=-15,-45
|
||||
p=14,53 v=36,-16
|
||||
p=98,66 v=68,-3
|
||||
p=83,38 v=35,-87
|
||||
p=41,9 v=53,70
|
||||
p=35,33 v=-68,-68
|
||||
p=53,66 v=62,97
|
||||
p=75,80 v=49,-62
|
||||
p=66,70 v=-50,47
|
||||
p=78,80 v=7,64
|
||||
p=82,16 v=85,-81
|
||||
p=58,25 v=11,-70
|
||||
p=36,72 v=33,72
|
||||
p=66,92 v=-91,10
|
||||
p=24,52 v=-98,22
|
||||
p=74,7 v=-36,-79
|
||||
p=46,26 v=-61,-90
|
||||
p=52,24 v=53,-88
|
||||
p=92,26 v=31,78
|
||||
p=60,52 v=80,-81
|
||||
p=82,78 v=-81,-49
|
||||
p=10,3 v=-15,-55
|
||||
p=91,31 v=99,77
|
||||
p=75,50 v=-91,40
|
||||
p=49,71 v=93,91
|
||||
p=1,94 v=-54,54
|
||||
p=96,50 v=39,18
|
||||
p=0,3 v=-53,33
|
||||
p=34,9 v=-17,-8
|
||||
p=96,28 v=68,-63
|
||||
p=25,4 v=66,21
|
||||
p=94,74 v=82,-89
|
||||
p=47,66 v=-17,87
|
||||
p=58,23 v=63,83
|
||||
p=13,82 v=-74,75
|
||||
p=29,85 v=40,79
|
||||
p=57,7 v=50,83
|
||||
p=7,88 v=-37,-16
|
||||
p=81,61 v=-10,34
|
||||
p=6,32 v=33,-60
|
||||
p=63,7 v=1,98
|
||||
p=59,29 v=-31,-85
|
||||
p=85,91 v=19,-18
|
||||
p=22,39 v=21,90
|
||||
p=25,13 v=75,89
|
||||
p=14,100 v=-27,30
|
||||
p=33,6 v=97,-53
|
||||
p=84,83 v=-22,38
|
||||
p=100,69 v=77,-38
|
||||
p=2,67 v=-14,-25
|
||||
p=71,71 v=-53,73
|
||||
p=9,43 v=-52,98
|
||||
p=55,76 v=-60,94
|
||||
p=49,91 v=-35,-95
|
||||
p=77,68 v=26,12
|
||||
p=41,91 v=-17,-15
|
||||
p=1,69 v=-44,72
|
||||
p=32,61 v=4,59
|
||||
p=94,12 v=-33,30
|
||||
p=1,35 v=96,49
|
||||
p=72,64 v=-61,-53
|
||||
p=76,93 v=38,-37
|
||||
p=97,9 v=33,61
|
||||
p=60,32 v=80,18
|
||||
p=16,68 v=15,-29
|
||||
p=99,72 v=66,44
|
||||
p=99,18 v=56,99
|
||||
p=42,11 v=-88,11
|
||||
p=57,69 v=-2,-2
|
||||
p=39,57 v=26,-51
|
||||
p=34,15 v=73,42
|
||||
p=56,55 v=-61,-75
|
||||
p=89,1 v=67,-27
|
||||
p=21,100 v=5,70
|
||||
p=85,11 v=-35,63
|
||||
p=16,35 v=47,-63
|
||||
p=98,0 v=93,-2
|
||||
p=51,89 v=-9,85
|
||||
p=50,32 v=84,-42
|
||||
p=29,63 v=78,-76
|
||||
p=92,86 v=89,10
|
||||
p=27,11 v=-77,51
|
||||
p=65,21 v=-59,68
|
||||
p=84,68 v=20,-50
|
||||
p=19,2 v=-24,-36
|
||||
p=25,78 v=25,-85
|
||||
p=90,92 v=59,-87
|
||||
p=70,100 v=10,-52
|
||||
p=48,78 v=3,54
|
||||
p=85,81 v=30,44
|
||||
p=53,65 v=41,-67
|
||||
p=13,95 v=82,-29
|
||||
p=5,19 v=95,75
|
||||
p=37,96 v=-68,26
|
||||
p=83,16 v=-5,-9
|
||||
p=31,17 v=4,-20
|
||||
p=83,34 v=-83,-76
|
||||
p=50,88 v=93,-5
|
||||
p=66,36 v=-30,58
|
||||
p=11,29 v=-44,83
|
||||
p=31,31 v=-77,-51
|
||||
p=26,85 v=14,-18
|
||||
p=8,76 v=65,69
|
||||
p=60,70 v=-40,47
|
||||
p=69,70 v=22,64
|
||||
p=85,53 v=18,12
|
||||
p=97,93 v=-58,-57
|
||||
p=52,83 v=92,-9
|
||||
p=20,92 v=30,50
|
||||
p=88,73 v=32,3
|
||||
p=83,16 v=-42,-14
|
||||
p=57,89 v=-29,20
|
||||
p=50,19 v=73,8
|
||||
p=8,101 v=-94,-68
|
||||
p=12,77 v=-4,-84
|
||||
p=63,28 v=-84,91
|
||||
p=46,25 v=13,-95
|
||||
p=93,21 v=88,-26
|
||||
p=10,54 v=-24,72
|
||||
p=69,16 v=-92,-30
|
||||
p=26,68 v=21,97
|
||||
p=56,30 v=-90,-51
|
||||
p=62,69 v=-1,-50
|
||||
p=7,6 v=55,-39
|
||||
p=63,78 v=76,92
|
||||
p=57,55 v=-51,-19
|
||||
p=70,62 v=18,37
|
||||
p=88,26 v=-61,82
|
||||
p=80,50 v=-73,99
|
||||
p=40,1 v=-78,86
|
||||
p=35,85 v=81,-12
|
||||
p=17,74 v=56,47
|
||||
p=36,99 v=64,-15
|
||||
p=56,18 v=-29,-14
|
||||
p=42,44 v=-18,46
|
||||
p=84,4 v=-63,-2
|
||||
p=97,75 v=27,-62
|
||||
p=47,71 v=54,-50
|
||||
p=26,101 v=-67,-83
|
||||
p=30,74 v=-57,66`)
|
||||
require.Equal(t, 0, r)
|
||||
}
|
||||
500
2024/go/day14/input.txt
Normal file
500
2024/go/day14/input.txt
Normal file
@@ -0,0 +1,500 @@
|
||||
p=80,75 v=69,72
|
||||
p=88,10 v=-28,-23
|
||||
p=79,61 v=79,59
|
||||
p=37,102 v=92,-43
|
||||
p=12,22 v=-5,-95
|
||||
p=60,13 v=-30,-42
|
||||
p=3,59 v=-96,-88
|
||||
p=85,33 v=-43,-41
|
||||
p=44,14 v=63,45
|
||||
p=6,6 v=-34,-86
|
||||
p=47,102 v=12,42
|
||||
p=36,88 v=-88,-93
|
||||
p=78,27 v=-18,52
|
||||
p=96,64 v=-62,-34
|
||||
p=49,99 v=-78,-15
|
||||
p=57,31 v=-80,21
|
||||
p=25,57 v=8,-84
|
||||
p=69,20 v=81,61
|
||||
p=80,5 v=-11,-30
|
||||
p=2,35 v=-85,77
|
||||
p=9,12 v=-4,36
|
||||
p=37,68 v=12,-69
|
||||
p=47,88 v=-8,-90
|
||||
p=72,68 v=59,-86
|
||||
p=55,38 v=-68,-94
|
||||
p=60,58 v=41,37
|
||||
p=76,87 v=-1,-18
|
||||
p=89,9 v=38,92
|
||||
p=100,67 v=17,-53
|
||||
p=83,73 v=80,32
|
||||
p=77,19 v=-54,-20
|
||||
p=10,86 v=-65,36
|
||||
p=13,88 v=-64,-84
|
||||
p=50,29 v=-17,-29
|
||||
p=79,38 v=89,-57
|
||||
p=55,57 v=-68,22
|
||||
p=71,82 v=-80,52
|
||||
p=37,83 v=-68,-43
|
||||
p=25,5 v=81,-22
|
||||
p=83,54 v=-32,-75
|
||||
p=27,95 v=-77,-55
|
||||
p=70,97 v=-72,-4
|
||||
p=3,84 v=-60,-60
|
||||
p=16,29 v=-35,99
|
||||
p=39,39 v=37,-38
|
||||
p=76,94 v=90,60
|
||||
p=18,21 v=-86,-26
|
||||
p=22,84 v=-16,66
|
||||
p=45,83 v=-40,-43
|
||||
p=35,52 v=54,3
|
||||
p=30,21 v=14,36
|
||||
p=69,61 v=69,-66
|
||||
p=52,22 v=-28,33
|
||||
p=9,21 v=-85,-73
|
||||
p=87,32 v=79,52
|
||||
p=28,85 v=-35,85
|
||||
p=32,58 v=-49,89
|
||||
p=22,75 v=85,44
|
||||
p=45,19 v=-88,61
|
||||
p=97,59 v=98,-75
|
||||
p=70,81 v=82,7
|
||||
p=97,102 v=-23,-8
|
||||
p=92,68 v=89,72
|
||||
p=24,42 v=-63,-97
|
||||
p=21,64 v=-45,-47
|
||||
p=58,3 v=-69,51
|
||||
p=33,68 v=19,-20
|
||||
p=27,6 v=-89,-21
|
||||
p=28,81 v=-67,-8
|
||||
p=59,83 v=-66,-82
|
||||
p=3,14 v=-3,-1
|
||||
p=19,65 v=15,-25
|
||||
p=57,37 v=53,-29
|
||||
p=36,84 v=-4,-84
|
||||
p=55,96 v=82,-21
|
||||
p=68,101 v=51,51
|
||||
p=68,8 v=-90,-30
|
||||
p=78,51 v=-51,-63
|
||||
p=4,55 v=-63,97
|
||||
p=100,60 v=76,-13
|
||||
p=7,91 v=-96,-73
|
||||
p=97,17 v=-54,33
|
||||
p=85,60 v=69,-3
|
||||
p=20,39 v=96,-85
|
||||
p=24,12 v=86,-84
|
||||
p=34,7 v=-7,-36
|
||||
p=30,69 v=-67,97
|
||||
p=65,17 v=20,33
|
||||
p=39,101 v=-7,-83
|
||||
p=38,51 v=-90,-4
|
||||
p=99,61 v=-13,59
|
||||
p=30,1 v=-67,-96
|
||||
p=1,89 v=-85,-83
|
||||
p=8,1 v=68,4
|
||||
p=89,89 v=-52,85
|
||||
p=81,5 v=-55,71
|
||||
p=99,60 v=-94,-72
|
||||
p=68,70 v=-10,78
|
||||
p=81,18 v=89,-95
|
||||
p=47,61 v=-39,56
|
||||
p=91,71 v=85,59
|
||||
p=28,66 v=44,-28
|
||||
p=10,64 v=-59,-4
|
||||
p=84,10 v=-32,-11
|
||||
p=29,52 v=-37,34
|
||||
p=78,43 v=-92,12
|
||||
p=85,3 v=-71,4
|
||||
p=37,85 v=-46,-84
|
||||
p=56,21 v=21,-32
|
||||
p=17,17 v=15,17
|
||||
p=26,87 v=45,-93
|
||||
p=57,21 v=-6,40
|
||||
p=95,48 v=-33,59
|
||||
p=38,59 v=65,-72
|
||||
p=59,85 v=-50,-99
|
||||
p=17,21 v=86,-45
|
||||
p=53,3 v=-28,-46
|
||||
p=1,40 v=-54,-91
|
||||
p=61,13 v=-40,83
|
||||
p=33,35 v=-72,-96
|
||||
p=40,14 v=33,-8
|
||||
p=29,89 v=53,-59
|
||||
p=74,0 v=-22,-42
|
||||
p=12,32 v=-65,-4
|
||||
p=82,89 v=-12,20
|
||||
p=35,71 v=-40,20
|
||||
p=14,5 v=95,83
|
||||
p=46,44 v=39,92
|
||||
p=25,54 v=-66,-47
|
||||
p=91,78 v=64,53
|
||||
p=14,9 v=25,67
|
||||
p=39,29 v=-29,8
|
||||
p=20,100 v=95,51
|
||||
p=59,41 v=92,-82
|
||||
p=15,92 v=93,-73
|
||||
p=42,93 v=3,-86
|
||||
p=82,93 v=-21,-96
|
||||
p=50,9 v=12,-39
|
||||
p=81,22 v=-13,99
|
||||
p=72,81 v=-51,-93
|
||||
p=88,19 v=-72,-14
|
||||
p=8,93 v=-85,-15
|
||||
p=54,2 v=61,8
|
||||
p=44,81 v=66,41
|
||||
p=78,10 v=90,8
|
||||
p=19,53 v=68,4
|
||||
p=80,43 v=9,46
|
||||
p=11,38 v=-66,88
|
||||
p=31,3 v=4,-2
|
||||
p=49,28 v=-74,21
|
||||
p=27,15 v=54,-88
|
||||
p=96,87 v=-50,-67
|
||||
p=94,94 v=-5,-97
|
||||
p=16,89 v=73,23
|
||||
p=93,32 v=-53,93
|
||||
p=47,17 v=-29,92
|
||||
p=10,78 v=16,35
|
||||
p=55,33 v=-60,-17
|
||||
p=55,73 v=-68,-22
|
||||
p=100,62 v=17,-69
|
||||
p=67,91 v=-49,45
|
||||
p=68,53 v=-42,-41
|
||||
p=35,73 v=54,47
|
||||
p=20,63 v=-85,-12
|
||||
p=23,16 v=-87,33
|
||||
p=70,55 v=50,-16
|
||||
p=92,6 v=41,-59
|
||||
p=9,97 v=-37,47
|
||||
p=48,48 v=42,40
|
||||
p=96,37 v=-90,32
|
||||
p=66,13 v=-60,91
|
||||
p=62,46 v=-50,18
|
||||
p=11,15 v=98,77
|
||||
p=42,78 v=1,47
|
||||
p=10,40 v=15,-48
|
||||
p=88,44 v=7,-75
|
||||
p=27,53 v=-70,-9
|
||||
p=21,7 v=-56,96
|
||||
p=92,81 v=-22,69
|
||||
p=57,65 v=92,-34
|
||||
p=85,63 v=77,11
|
||||
p=92,2 v=-30,21
|
||||
p=59,16 v=73,-70
|
||||
p=16,11 v=86,-89
|
||||
p=82,16 v=80,-36
|
||||
p=41,30 v=-49,19
|
||||
p=13,6 v=14,73
|
||||
p=67,99 v=-91,51
|
||||
p=37,20 v=-65,-37
|
||||
p=85,16 v=99,-14
|
||||
p=1,39 v=-44,56
|
||||
p=37,29 v=74,5
|
||||
p=44,51 v=-18,93
|
||||
p=43,9 v=-55,-84
|
||||
p=5,10 v=-65,26
|
||||
p=51,90 v=-59,-96
|
||||
p=55,98 v=-9,23
|
||||
p=0,94 v=88,-49
|
||||
p=91,43 v=-14,-72
|
||||
p=93,43 v=-69,-94
|
||||
p=84,100 v=-12,54
|
||||
p=23,46 v=85,78
|
||||
p=79,37 v=39,-10
|
||||
p=1,23 v=99,-79
|
||||
p=73,50 v=-51,84
|
||||
p=78,58 v=-31,-16
|
||||
p=75,44 v=69,71
|
||||
p=27,5 v=-87,14
|
||||
p=95,91 v=-33,63
|
||||
p=22,94 v=-5,-37
|
||||
p=36,11 v=-5,-60
|
||||
p=18,3 v=-64,-27
|
||||
p=44,14 v=24,-92
|
||||
p=96,40 v=65,-92
|
||||
p=47,1 v=84,25
|
||||
p=93,22 v=68,-48
|
||||
p=14,32 v=-24,37
|
||||
p=99,17 v=78,-89
|
||||
p=53,36 v=10,58
|
||||
p=44,44 v=-78,-60
|
||||
p=15,28 v=-96,-20
|
||||
p=96,61 v=-81,-45
|
||||
p=58,87 v=-9,7
|
||||
p=20,43 v=84,-22
|
||||
p=50,42 v=-18,68
|
||||
p=74,23 v=-12,42
|
||||
p=12,57 v=-94,-94
|
||||
p=49,49 v=-89,40
|
||||
p=47,98 v=-67,-8
|
||||
p=84,17 v=-62,11
|
||||
p=31,6 v=-57,-42
|
||||
p=28,67 v=66,-81
|
||||
p=0,3 v=-88,-13
|
||||
p=51,76 v=82,76
|
||||
p=67,81 v=87,-14
|
||||
p=84,78 v=39,41
|
||||
p=39,74 v=72,35
|
||||
p=30,10 v=64,-77
|
||||
p=10,31 v=11,-4
|
||||
p=6,90 v=-4,76
|
||||
p=90,24 v=-2,-23
|
||||
p=8,39 v=-57,-27
|
||||
p=31,69 v=93,-25
|
||||
p=79,38 v=39,-35
|
||||
p=69,31 v=70,30
|
||||
p=1,16 v=7,73
|
||||
p=46,9 v=-99,-70
|
||||
p=53,16 v=-94,-84
|
||||
p=32,60 v=33,-69
|
||||
p=62,22 v=-99,-4
|
||||
p=66,3 v=98,20
|
||||
p=4,76 v=46,-75
|
||||
p=50,71 v=-90,22
|
||||
p=57,12 v=31,-15
|
||||
p=59,84 v=-50,-65
|
||||
p=33,0 v=76,-48
|
||||
p=58,76 v=-30,44
|
||||
p=6,69 v=6,35
|
||||
p=74,91 v=-61,-43
|
||||
p=36,92 v=-58,60
|
||||
p=2,78 v=-48,-98
|
||||
p=43,91 v=53,76
|
||||
p=34,101 v=-77,79
|
||||
p=40,44 v=-68,28
|
||||
p=71,64 v=47,-48
|
||||
p=54,7 v=84,15
|
||||
p=54,75 v=-60,-31
|
||||
p=14,40 v=86,12
|
||||
p=80,29 v=-92,-26
|
||||
p=8,47 v=-33,-69
|
||||
p=2,41 v=12,-9
|
||||
p=39,60 v=-38,59
|
||||
p=13,22 v=86,-20
|
||||
p=25,12 v=-57,11
|
||||
p=60,47 v=96,96
|
||||
p=50,51 v=-48,-82
|
||||
p=85,40 v=89,74
|
||||
p=99,4 v=-94,-21
|
||||
p=75,7 v=29,-73
|
||||
p=28,58 v=-80,24
|
||||
p=46,94 v=-9,56
|
||||
p=24,65 v=-76,62
|
||||
p=50,2 v=-20,70
|
||||
p=85,55 v=-5,66
|
||||
p=38,11 v=43,36
|
||||
p=53,54 v=53,24
|
||||
p=18,45 v=65,96
|
||||
p=94,22 v=16,80
|
||||
p=79,28 v=75,-69
|
||||
p=30,38 v=-15,-29
|
||||
p=5,23 v=-4,49
|
||||
p=8,98 v=96,-99
|
||||
p=7,60 v=-14,47
|
||||
p=96,17 v=88,-73
|
||||
p=48,23 v=-41,35
|
||||
p=17,31 v=-26,-23
|
||||
p=13,52 v=66,37
|
||||
p=58,19 v=41,55
|
||||
p=25,9 v=-77,-89
|
||||
p=3,92 v=55,-80
|
||||
p=74,95 v=20,-77
|
||||
p=26,70 v=43,72
|
||||
p=54,4 v=96,-18
|
||||
p=63,8 v=-97,49
|
||||
p=23,51 v=87,-75
|
||||
p=24,18 v=85,36
|
||||
p=8,52 v=6,-13
|
||||
p=97,50 v=17,-72
|
||||
p=47,66 v=-25,6
|
||||
p=38,78 v=3,-93
|
||||
p=62,6 v=5,77
|
||||
p=56,74 v=-70,-6
|
||||
p=94,99 v=9,34
|
||||
p=19,92 v=-18,26
|
||||
p=35,54 v=-47,-69
|
||||
p=92,8 v=-13,42
|
||||
p=47,86 v=12,-90
|
||||
p=12,83 v=-68,2
|
||||
p=0,18 v=-75,-89
|
||||
p=11,99 v=-99,14
|
||||
p=88,20 v=62,21
|
||||
p=27,53 v=53,-47
|
||||
p=17,44 v=-5,-91
|
||||
p=57,10 v=66,-65
|
||||
p=66,95 v=-71,-12
|
||||
p=38,21 v=23,95
|
||||
p=68,69 v=-31,35
|
||||
p=87,71 v=50,72
|
||||
p=98,12 v=47,33
|
||||
p=94,21 v=66,51
|
||||
p=53,97 v=-16,-93
|
||||
p=59,35 v=6,39
|
||||
p=12,88 v=-86,88
|
||||
p=85,16 v=39,8
|
||||
p=38,85 v=35,80
|
||||
p=44,9 v=-48,11
|
||||
p=71,18 v=-82,39
|
||||
p=85,14 v=-74,-73
|
||||
p=88,22 v=-42,36
|
||||
p=8,6 v=-58,38
|
||||
p=21,58 v=-66,9
|
||||
p=25,17 v=-68,95
|
||||
p=89,16 v=-34,-86
|
||||
p=33,54 v=64,-88
|
||||
p=57,8 v=54,51
|
||||
p=40,18 v=-98,58
|
||||
p=91,22 v=-34,-53
|
||||
p=75,81 v=-70,26
|
||||
p=89,70 v=-2,69
|
||||
p=62,6 v=-1,-92
|
||||
p=78,24 v=-82,-42
|
||||
p=47,7 v=-75,83
|
||||
p=86,8 v=-63,95
|
||||
p=80,64 v=-36,-79
|
||||
p=69,95 v=-30,29
|
||||
p=46,86 v=85,20
|
||||
p=76,35 v=-82,-51
|
||||
p=33,15 v=-17,55
|
||||
p=40,58 v=-2,-11
|
||||
p=76,31 v=39,2
|
||||
p=46,82 v=-15,-45
|
||||
p=14,53 v=36,-16
|
||||
p=98,66 v=68,-3
|
||||
p=83,38 v=35,-87
|
||||
p=41,9 v=53,70
|
||||
p=35,33 v=-68,-68
|
||||
p=53,66 v=62,97
|
||||
p=75,80 v=49,-62
|
||||
p=66,70 v=-50,47
|
||||
p=78,80 v=7,64
|
||||
p=82,16 v=85,-81
|
||||
p=58,25 v=11,-70
|
||||
p=36,72 v=33,72
|
||||
p=66,92 v=-91,10
|
||||
p=24,52 v=-98,22
|
||||
p=74,7 v=-36,-79
|
||||
p=46,26 v=-61,-90
|
||||
p=52,24 v=53,-88
|
||||
p=92,26 v=31,78
|
||||
p=60,52 v=80,-81
|
||||
p=82,78 v=-81,-49
|
||||
p=10,3 v=-15,-55
|
||||
p=91,31 v=99,77
|
||||
p=75,50 v=-91,40
|
||||
p=49,71 v=93,91
|
||||
p=1,94 v=-54,54
|
||||
p=96,50 v=39,18
|
||||
p=0,3 v=-53,33
|
||||
p=34,9 v=-17,-8
|
||||
p=96,28 v=68,-63
|
||||
p=25,4 v=66,21
|
||||
p=94,74 v=82,-89
|
||||
p=47,66 v=-17,87
|
||||
p=58,23 v=63,83
|
||||
p=13,82 v=-74,75
|
||||
p=29,85 v=40,79
|
||||
p=57,7 v=50,83
|
||||
p=7,88 v=-37,-16
|
||||
p=81,61 v=-10,34
|
||||
p=6,32 v=33,-60
|
||||
p=63,7 v=1,98
|
||||
p=59,29 v=-31,-85
|
||||
p=85,91 v=19,-18
|
||||
p=22,39 v=21,90
|
||||
p=25,13 v=75,89
|
||||
p=14,100 v=-27,30
|
||||
p=33,6 v=97,-53
|
||||
p=84,83 v=-22,38
|
||||
p=100,69 v=77,-38
|
||||
p=2,67 v=-14,-25
|
||||
p=71,71 v=-53,73
|
||||
p=9,43 v=-52,98
|
||||
p=55,76 v=-60,94
|
||||
p=49,91 v=-35,-95
|
||||
p=77,68 v=26,12
|
||||
p=41,91 v=-17,-15
|
||||
p=1,69 v=-44,72
|
||||
p=32,61 v=4,59
|
||||
p=94,12 v=-33,30
|
||||
p=1,35 v=96,49
|
||||
p=72,64 v=-61,-53
|
||||
p=76,93 v=38,-37
|
||||
p=97,9 v=33,61
|
||||
p=60,32 v=80,18
|
||||
p=16,68 v=15,-29
|
||||
p=99,72 v=66,44
|
||||
p=99,18 v=56,99
|
||||
p=42,11 v=-88,11
|
||||
p=57,69 v=-2,-2
|
||||
p=39,57 v=26,-51
|
||||
p=34,15 v=73,42
|
||||
p=56,55 v=-61,-75
|
||||
p=89,1 v=67,-27
|
||||
p=21,100 v=5,70
|
||||
p=85,11 v=-35,63
|
||||
p=16,35 v=47,-63
|
||||
p=98,0 v=93,-2
|
||||
p=51,89 v=-9,85
|
||||
p=50,32 v=84,-42
|
||||
p=29,63 v=78,-76
|
||||
p=92,86 v=89,10
|
||||
p=27,11 v=-77,51
|
||||
p=65,21 v=-59,68
|
||||
p=84,68 v=20,-50
|
||||
p=19,2 v=-24,-36
|
||||
p=25,78 v=25,-85
|
||||
p=90,92 v=59,-87
|
||||
p=70,100 v=10,-52
|
||||
p=48,78 v=3,54
|
||||
p=85,81 v=30,44
|
||||
p=53,65 v=41,-67
|
||||
p=13,95 v=82,-29
|
||||
p=5,19 v=95,75
|
||||
p=37,96 v=-68,26
|
||||
p=83,16 v=-5,-9
|
||||
p=31,17 v=4,-20
|
||||
p=83,34 v=-83,-76
|
||||
p=50,88 v=93,-5
|
||||
p=66,36 v=-30,58
|
||||
p=11,29 v=-44,83
|
||||
p=31,31 v=-77,-51
|
||||
p=26,85 v=14,-18
|
||||
p=8,76 v=65,69
|
||||
p=60,70 v=-40,47
|
||||
p=69,70 v=22,64
|
||||
p=85,53 v=18,12
|
||||
p=97,93 v=-58,-57
|
||||
p=52,83 v=92,-9
|
||||
p=20,92 v=30,50
|
||||
p=88,73 v=32,3
|
||||
p=83,16 v=-42,-14
|
||||
p=57,89 v=-29,20
|
||||
p=50,19 v=73,8
|
||||
p=8,101 v=-94,-68
|
||||
p=12,77 v=-4,-84
|
||||
p=63,28 v=-84,91
|
||||
p=46,25 v=13,-95
|
||||
p=93,21 v=88,-26
|
||||
p=10,54 v=-24,72
|
||||
p=69,16 v=-92,-30
|
||||
p=26,68 v=21,97
|
||||
p=56,30 v=-90,-51
|
||||
p=62,69 v=-1,-50
|
||||
p=7,6 v=55,-39
|
||||
p=63,78 v=76,92
|
||||
p=57,55 v=-51,-19
|
||||
p=70,62 v=18,37
|
||||
p=88,26 v=-61,82
|
||||
p=80,50 v=-73,99
|
||||
p=40,1 v=-78,86
|
||||
p=35,85 v=81,-12
|
||||
p=17,74 v=56,47
|
||||
p=36,99 v=64,-15
|
||||
p=56,18 v=-29,-14
|
||||
p=42,44 v=-18,46
|
||||
p=84,4 v=-63,-2
|
||||
p=97,75 v=27,-62
|
||||
p=47,71 v=54,-50
|
||||
p=26,101 v=-67,-83
|
||||
p=30,74 v=-57,66
|
||||
119
2024/go/day15/day15.go
Normal file
119
2024/go/day15/day15.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package day15
|
||||
|
||||
import (
|
||||
_ "adventofcode2024/utils"
|
||||
_ "adventofcode2024/utils/grid2d"
|
||||
_ "adventofcode2024/utils/grid2d"
|
||||
"adventofcode2024/utils/inputs"
|
||||
"fmt"
|
||||
_ "regexp"
|
||||
"strings"
|
||||
|
||||
_ "github.com/deckarep/golang-set/v2"
|
||||
)
|
||||
|
||||
type Loc struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
type Queue struct {
|
||||
elements []Loc
|
||||
}
|
||||
|
||||
// Push adds an element to the end of the queue
|
||||
func (q *Queue) Push(value Loc) {
|
||||
q.elements = append(q.elements, value)
|
||||
}
|
||||
|
||||
// Pop removes an element from the front of the queue
|
||||
func (q *Queue) Pop() (Loc, bool) {
|
||||
if len(q.elements) == 0 {
|
||||
return Loc{}, false // Return zero and false if the queue is empty
|
||||
}
|
||||
value := q.elements[0]
|
||||
q.elements = q.elements[1:] // Remove the first element
|
||||
return value, true
|
||||
}
|
||||
|
||||
// IsEmpty checks if the queue is empty
|
||||
func (q *Queue) IsEmpty() bool {
|
||||
return len(q.elements) == 0
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
var val int
|
||||
var rloc Loc
|
||||
in := strings.Split(input, "\n\n")
|
||||
dirs := map[rune][2]int{
|
||||
'<': {-1, 0},
|
||||
'>': {1, 0},
|
||||
'^': {0, -1},
|
||||
'v': {0, 1},
|
||||
}
|
||||
grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) })
|
||||
directions := strings.ReplaceAll(in[1], "\n", "")
|
||||
fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
|
||||
fmt.Printf("%v\n", directions)
|
||||
found := false
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
if found {
|
||||
break
|
||||
}
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
if grid.Get(x, y) == '@' {
|
||||
rloc = Loc{x: x, y: y}
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Printf("Robot: %v\n", rloc)
|
||||
for _, dir := range directions {
|
||||
q := &Queue{}
|
||||
x := rloc.x
|
||||
y := rloc.y
|
||||
Loop:
|
||||
for {
|
||||
x += dirs[dir][0]
|
||||
y += dirs[dir][1]
|
||||
switch grid.Get(x, y) {
|
||||
case 'O':
|
||||
q.Push(Loc{x: x, y: y})
|
||||
case '.':
|
||||
for !q.IsEmpty() {
|
||||
grid.Set(x, y, 'O')
|
||||
loc, _ := q.Pop()
|
||||
fmt.Printf("%d,%d\n", loc.x, loc.y)
|
||||
// grid.Set(loc.x, loc.y, 'O')
|
||||
x -= dirs[dir][0]
|
||||
y -= dirs[dir][1]
|
||||
}
|
||||
grid.Set(rloc.x, rloc.y, '.')
|
||||
rloc.x = x
|
||||
rloc.y = y
|
||||
grid.Set(rloc.x, rloc.y, '@')
|
||||
break Loop
|
||||
case '#':
|
||||
break Loop
|
||||
}
|
||||
}
|
||||
// fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
|
||||
}
|
||||
for x := 0; x < grid.SizeX(); x++ {
|
||||
for y := 0; y < grid.SizeY(); y++ {
|
||||
if grid.Get(x, y) == 'O' {
|
||||
val += (100 * y) + x
|
||||
}
|
||||
}
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func formatter(p rune, x int, y int) string {
|
||||
return string(p)
|
||||
}
|
||||
57
2024/go/day15/day15_test.go
Normal file
57
2024/go/day15/day15_test.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package day15
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
r := Part1(`##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
||||
|
||||
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
|
||||
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
|
||||
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
|
||||
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
|
||||
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
|
||||
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
|
||||
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
|
||||
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
|
||||
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
|
||||
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^`)
|
||||
require.Equal(t, 10092, r)
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
r := Part2(`##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
||||
|
||||
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
|
||||
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
|
||||
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
|
||||
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
|
||||
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
|
||||
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
|
||||
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
|
||||
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
|
||||
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
|
||||
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^`)
|
||||
require.Equal(t, 0, r)
|
||||
}
|
||||
71
2024/go/day15/input.txt
Normal file
71
2024/go/day15/input.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
##################################################
|
||||
#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..#
|
||||
#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.#
|
||||
#........O....#...O......O.OO...#..O.O.#O#....O..#
|
||||
#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..#
|
||||
#..OO.....O.OO.O#.......O.........O.....O.O.O....#
|
||||
#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.#
|
||||
#........#.....#.##O....O.O..OOO.......OOO.#O....#
|
||||
#.O#.#...OO.....#.......O...O...#O.O.......OO..OO#
|
||||
#.O...O..#O...#O..O.........O.O..OO..O.......O.OO#
|
||||
#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O#
|
||||
#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.#
|
||||
#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......#
|
||||
##..O...O..OO.O.O.O..OO........#.##.........O.O..#
|
||||
#..O...O.OO..OOO.O...#..#.........#.O....OO......#
|
||||
#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O#
|
||||
#O.O..OO.O..OO............O....O....O..OO...OO..##
|
||||
#.O...O.O.O.....O..O.O...O.#.......OOO...........#
|
||||
#O.O...O.....#..O..#O...O.O.O....O#...#.###.....O#
|
||||
#.O...O.O..#O.#.OO.......O.OO.O...O...........O..#
|
||||
##O.#O....O.#............O..O..O.....O..O..OO....#
|
||||
##..#.OO.O.OO.#.O....O...#........#........O.O...#
|
||||
#..O.OO...O....#..OO.O...........OOOO#..OO#O.....#
|
||||
#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO#
|
||||
#...OOO............#O.#.@...O.....O#.#.O...O..O..#
|
||||
#...O...OO.#..O......O..............#OOO......OOO#
|
||||
#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.#
|
||||
#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...#
|
||||
#.#....#...O..O#O..OOO.....#....#......O...O...#.#
|
||||
#....O....O......O.O.O..........O.O..O.O......O..#
|
||||
#.#OO#O.OO............O##.##O.O#.O...O#.........O#
|
||||
##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.#
|
||||
#O.....#OO.....O..............#...O.O..O.....OO#.#
|
||||
#O.O.O..O#OO.O.O....O..O......O..O........OO.....#
|
||||
##O....O...............................#.O.....O##
|
||||
##..O...#...O.........O#...#O...O.OO......OO.O..O#
|
||||
#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.#
|
||||
#..O.....O.O........O.....O.....O#....OO##OOO..#O#
|
||||
#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O#
|
||||
#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..#
|
||||
#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O#
|
||||
#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O#
|
||||
#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.#
|
||||
#...O....#..#......O....O..O#O...O....OO.......O.#
|
||||
#.#.....O#.......O..O..#O.OOOO..........O.O......#
|
||||
#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....##
|
||||
#O..#.OOO##....O.O..OOOO.O...O..O#..........O....#
|
||||
##.O##...O.O.....O.O#...O.........#...........OOO#
|
||||
#O#O.....#..O.OOO...O..OO.....OOO............#O..#
|
||||
##################################################
|
||||
|
||||
^^<^>^^<<^v>^><^^^<v<v^>^^<><^v>v<^vv>^v<^>>v>^vv<<vv>>>>>>v^>v>^>^v<^v^<v^<^v>>^^>v<<>>^v^<v<v>v<v<v^<>>^>v^>^^^<^<v<v<<<v<^vv>^v>>v<v^>><vvv>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><v^><>>^^>v^<v>>^<><<^><<>v>>vvv<^^v^v^><vv>>v^^><v^<<^v>^vv<^<^<^<><>>>^><vv>>^<v^<><><^v<^<^v<^^>^<><<^<<^vv^^v<vv^^>^<^<v^v^^<v^>^v<vvv^vv<^^<^^>v>>^v>^v><v^^^v>^<^<v<^>>^><>^v<>v>^^^<^vv^^<^v<vv>><^^^v<<>>>^<^^>^<v>v>><v^v<<<v>^<vv<^<v^>^<^<v^<>^><v<>^>><<^><vv>>vv<>v^<vvv^<v><v^vv>^<<><vvv>^<><>^^v<^v<<>vv><^>><^<<v<^>^>>^^>v<^>v^>^<vv><v><<^^^^v^<>^>^v^^v<v^<v>v<><<<v>vv^v><vv^>>>v>>>>><v<vvvv<<^v>^v>^<><<<><>v<vv<v><>^vv>v<>^v^<>>v<v>>>v^>^<vv^^<v<^<^>vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^><vvvvvv<^^>^^v<>^^^<^^<>^>^v><v><<>>^<>>v>>^><^>v<v><>v^v<v><>^<<>>v>^v<vv><>^v<^>^^v>v>>^<^^^<<vvv><<v><<>vvv^v><<v^vv><^^^v^^^>v><<^^v>vv^v><v>^>^v<>>vv<<^v<v><>v><^><>>^vv><>><<vv^v<^^>><<>>v>><><vv>v^^<^<v<<^vv^<^^<v^<vv<<v<>v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<><vvv>v>v<vv<^v<^>vv^<vv>v^>^<^<>v>^^>v<^>v>v>><>
|
||||
^vv>>>^vv><^v^<>v>^><<v>^^<v^v<v^>^>^v>><>>^>^<<^^v^^vv>^v^<<v>^v^>v<v>v<<>^>vvv>v>^vvv>>vv^>v^^v^^v<v^v>v^^<><<<^^><<^<vv<>>>>^<>v><v>>^v<v<<vv>>v>><>v><<^v^><>v><v^^<>v>^>>^^><>v<v<^vv<^v>>^><v>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv<v^>>^>^>^<>v<>vv>^><vv>>v<v<>^^v<>><>>v<>>^^<>v^<v^v^v>vvv<><^^v^>vv<<v>^^>>>v>^>^^><<^v><v^>^^>>^^>v<<<v^><><<><>vv^>v>v^>vv><^<v^><>><<>^>vv<<<v>>v><^^<v^><v>^>v^^<^v>v^<<v^>><v^>^<<>^^vvv>vvv><<><^><>>><<>>^><v<<v><^<v<>>^><><^^vv<^>^vvv<^>>><<^>><^v<v^<vv<v><<v^^v^<><^>v>^v>v<v<<>>><v>^vv^>>><v^><^>v^<>>v>v^v^><^<vv>v^v^<^v<>^><^>>v^^>v<^^^<v^^v>v>v>^^^<^^><v<vv<^vv^<vv<<<><><^>>v<>v<^v>^^<>v^>^v<v^<vv^v>v<<<v>^<^v^^^>v^vv<>vv>^^<<><^><vv>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^<v^v<^<<^^<>^><^v^<<v<>^v><^>vvv><^v<>><<^^>^<^<<v^^^<^v><<<v<<>v>^v^>^>vv^<><v^^<><><>^^<^v^^>^^^^^vv<<<v^<vv<<<v^^<v<^<<v><vv^<<<<<<^^^vv><^vv<<<>><>v>vv>^^^<^><><<><<v<><>><^vv^^<<v^<^^^>v<>^^^^<><^^^<vv><>^^<><<>><vv>>^<>v<v^v<<vv^>^^>^^>>^v>v^
|
||||
^>>v<><<<vvv^^^<vv><<<vvv>v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><vv<v<v^^v<vv^<<^v<<^v<v<v><>>>vv<>vv<>^^>vv^vvvv<v>vv<vv^^>^<v<vvvv^>v>^^<<^<<<>v>^<^<v>v>vv<<v<^vv>>^^<v<v<v<>>^>><^<v<<>^^v<>^<^v>^><><<vv<^><<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<v><^^<>^<<<^v^<>^>vv<vvv>v><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<v^><>>^<vv>v>v^^v<^v><>>v<v^v<v<v>><^^<<^v<>v<<^<v>^>><<<^>>v<v<<^^v<v>v>^<^>^<^v^<^v>>>>>><^vv<v<v^<^v^<<><^>v>>v<vv>^<vv<<v^v>>>vvv<v<vv<<<^v<v<>^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><<v>>>v^>^<^<^<v^vv>><<^<>vv^^v^<>v<<<^>>v<v>vv^>><<^<^^><^^>>>v>^^^>^v<v>v<v^<v^>^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv<v>><>^v>vv^v>><vvvvv^>^><>^>v<<^>><^^v><^<v^^>>^^>^>vv><<<^vvvvv<^<^<<vv>^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^<vvv<<^<>^<^<^^v><^<^^v^<vv>v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^><v^v>v<>vvv^^^>^^^^^v<^^^<v^<^>^v<<v<^^v<^v^<<^>><<>>>v^v<>v^^^>^vv>v>v>>><><v^<v><vv<>v>vvvv>v>>vvv><v<v^<^<v<^vvv>^<v<>v<>^^v^<^vv^^>^^>>vv<><^vv><v<
|
||||
<^^>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>><vv<v<v^<>>v^>v<><v^><^v>v^>^^v^^>v<<v<<v^^^<>v<^v^^<<<^v^^vv^v<v>v>vv^>^^v<vv^<<^>v^<^^<vvv><^>>>>^><<>^><vvv>^v^<^v>v^v><<>v^<>>v^^^<v>><<^>^>^<^vvv>><v<<>^<^><<v>^v>^^<><^^^>^><vvvv><^^><v>>v^vvv><vvv<^^v^v<v<><^<<v^>v>>^<<<<>^v<v>v^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^<v^v^^^>^v^>^>vv<vvv^<<^<>vvv<vv^<vv<<<v^^>v<<^^<^<>^^^v<v<^>><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<<v<^>^v<v^^v>^<<<<^^<<>v<<<<<>v<^<v>vv<>^<><v^^v^^<v^^<<vv<v^vv^>><><^<^^<^<>v<>^<<<<v^<<^<<vv<v<>>vv<<vv>^vv<>^^<>v><<v>><vv^^^^><<<^<^>v^vv>vvvv^>v<<v<>^^^v<<<><v<v^^><v^v>>^>>^>><v<<>vv>>>v>v^<<<v<^<<>>^^<v^vv<^^<v<v^^<>v>v^<vv<v<<>>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<<vv>v^>v^<v^><v^<^>vvv><<^>>v^^>>>^<v^v^>vvv<v<>v^>^^v^^>vvv>^v^^<v^<<v^<<<>^v^<^<vvv<<<<<v<<vv^<v>>v>>><v>^^<><>v<vv^>v>^vvv<<>>v<v<>^<>^<^<<v<<vv^<v^^<<^<^v<^<^>vv^<<vv^<^vv>v>v><^^>^><vv>vv<^<v<>^<^^v<><vvv<<>^vvv^^v<v<v<^<>^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<>
|
||||
^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<<v>>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<v<v><<>v>>^<><v<v<>>>>v>^v^<<<>^vv<<v><^>vv>vv>><v^v^^v<<<^<<<^vv><^><><<>v><vv<><^<<v<<vv^vv<^>>v>>>><><>^<v^^>vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv<vv>>v><>><<<>>^^^<^^^^<<v^<<v><v<v<v>>^>>vv>^v<^>>vv>^^v>^vv^<v<^^v>^<v<v>^v><v>v>>><<<>>>v>vv<^>^v>v<vv^^v<^<v^^v<^v><v^>v^^^<><>v<^>><^vv>^<<^<>><<<<^<vv^<v<<v^>^>^^<v^<^vvvv<<v^><><>v><<^v<<<<<^v<v><v<<^<<v<>>v<^^v<<^<>^><<v^v^><<>>v<<^v>v>>>v<>>v><><^vv<vv><^^<<v^vv<^>v>v<v^<<<<v>v^<>^^>>>><<<>^^^^v>v>>>>^v><<^^<vv>>v^<<v^^<^v^v>v<>>^^v>^><^v>^>^^vvvvv<v>>^>v<v<^<>>v><vvv>v>v^^<v>^>^<><<^^^^<<v^<v>>^<^<vv<<^^^v>v>^>><v>>><v<>vv>>>v^>^><^^v>>^>>vv<^^<>><v>vv^^v<v<>^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><<vv^<<>^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><<v><v>>vv><^<vv^<v^v^vv>^>v>^^^^v><v>^v>^v<^v^>v>^<v<^v<v><v<<v^>>^^^>v>v^^v^<v>v>^v<^<v^^^v^>^^>^>vv^^vv>vv>v^v<^<^vv^><v^vv<<^>^^<v>v>^vvvv<>^^v<><vv>><<<vv>v<^>><><^><>>^<v^<><
|
||||
^><^v>v^><v^<>vvv^^v^v<v^>v<>>>v>>vv^^>v^><^^<>v^><<v<<v^<<v>>^v^<v^v^^^^^<^v<v^<^^<^>><v^^^>v>^^>><<<v>^><>v><^v><vv^>>>><<<><v>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v<v>^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv<v^^>>>><v><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^<v<v<v><v^^vv<v>>^<^^><<<>vvv^^^v>^v<>v^>v<<v^v>>v>v<>^v>vvvv<^>^^^v^^<v><>^<vv<><^^<vv<^<v<>v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>v<v<^<<>v>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<v^vv^><^>><v^>v^v^v<<^^v>vv<v^^v<v^^<<<^v<^>^>v><>v>^vv>^v>><v^^>^<<^><>v>^>v>^<v><<^<>>^<v^^<<>^v<>^>v^<>^v><v<><v<vv>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<<v<><v<<>^^<>>><<^<v<v<>v<<^>v<v^^v<><<v>><v<^v>vv>^>>>>>vv<<><^^vv^>v^<>v<<vvvv><<>^>^<v^<>v>vv^^<^v>v<^<<v^>>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<vv<<<v^v^<<><<^v>v>^vv^>><v>>^^<vv^v<^^vv><>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v<v<^v>>v<^<v^v<>>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^<v<>^>>v<>>>^v>^v^<<<vv^>^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^
|
||||
^>v<>>^vvv>>v<v<^>^vvv>>v^><>><^v<><vv>vv^<v<^>>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<<v>^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><v<><>^<v^^<^>>>v^<v>^<v>>>>^v<^^<<vv^v<v<^^<<>v><>><^<<<vv^>^v>>^vv^v<><v<vv<>^>><<v<<>>>>^<v<v^v<^v><>>v><>>^^v>>^><^^^>^^>^>^>^<vv>vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<<v<<^vv>v<<>^v^><<v^^v>>v<><<v<v>^v>^>^><^^^>v<<v<^<v<^<>>vvv<<^^<vv^v<^^v>v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^<v^^><v<vv^^>v><>><v<>^<^><^^v^^vv<^>^^>^>>vv<^<vv>><v>vv<<<v<^vvv<<<><>><><<^^v><vv^v><^<^<>v^v>^v^<<<v^>v^<<<<<vv>v^<>v<^^<<^>^v<<><>><v><><<<^^>v>^^<^^<v^v<vv>><v<<>v>v<^v>^>>v>>v>v<vv<>><^v^v<^v>^vv^><^v>><v<><<^<^^^^^^>>v>v^<>v>>v<vvv><>v^>v><<<^v^<^<^<>^>>v>>>v><v>^vv>^^<>v^<v>v>v><^v<v>^>v>>^<vvv><^v>>>v>v>vv>^^^>vvv<v^<v>v^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^<v<v^>^v<^^<<><v>>>^v>^^^^^^^^<>v><v><^<^v><v^v^vv><^>^v^^v>v^^<>vv^<^^v<><v^>v^><v>^v>v<<<<v^<^v><>><><v<>^<v<><^<^<<><>>^<><<<v>^^<>v^>>^vvv<v^<<v>^<^^v^^v<<><^>vv>>^v<^^<v^^<>>^<v>^>^<v<<<^<^v^^vv<>>>
|
||||
^>vv>^^>v^>>^<vv^>><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^<vvvv<>v<v><<>v<vv^^>>>^<>^v<<v>^<v^vv<^vvv>^^<><^<<>^<>>v^vv<v>v^<v<^^v<<><vv<^^<^<<v<^>v<v>^<v<^^v><^<v<<v<^^<v^<^>>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<<v<>v>v>><>^<vv<<^^>v>^<v><vv^v>^<^>>v^<v<><<>v<<v^v>v^>v<v^^<^^>v>vv^><vv>v^vvv^<>^v<v<<^<>><<vv<><<>v^vv>vv<><v^v>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><<vv^^v^>>v<<v<v<<^><<vv>^^^^^<<><>^vv^<><<>v>>>^><<<v>^<><>^^v^vv>>v^vvv<>><><><v<<v>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<vv^vv><>^<<>v><^<^^<v<^<v^^v<>^^>^<>^^^^<^^>v<<<<v^>v>v>>^vv>vv<v^vv>v^>v^vv>v^>vv<v^>^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<vv^<<vv^^<><^<v^>^<>^vv<<v^^v>^vv>vv<v><><v<>>^<<><v<v>^<<v><>v<v<^<^vv^^<^<><<>v<>v^^<>vv>^^>^vv^v<v^v^^>>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><<v^>^^<^^<^v^v>vv<v>v<^vv<v^<<v><^<<v^v^^^vv>><>^<<v^<>v^>vv^^<vv^^^^>^>^>^>><<^>>^<v>v^>v^^^v<^^^<^>>v^v<>^<><<v<v<vvv^^<^<>v><^^v^<^>>^^v^>>^<<v<<^<<v><<>v<^^^^<<^<v<>^v^^^^^>vv^>>v<^><<<v<<^<v><><v^v<vv>v^<>v>^
|
||||
^<v>^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<v^v><^>^v><v<^^^>>>><><<<^^v^<><<<><<v><^v<<^v>vvv>><^>^>^><^>^>>>v^<v><<<<<vvvv^v>^>>v^><^<vv<^>^vv>vv<^>><^^v^^vv<>^^v<>^<v>>>^^vv^^>>v^>>><<vv>v<^v^vvv>vvv>^v>^^^<><>v>v<v<>><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><<v^vv^>^vvvv^>^><><v^<^^^v^vv<<v>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^><v>vvv<v>><^>^v>>^>v>^v<>>>>^^>^>v>^<vvv^^<vv<>^>^^>>><^<^^v<v<^v<^^v^>^^^^>^v>v<<v>v^vvv>><v>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^<v<>vv>^v<v>><v><>^^<v><<<>v<>v>v><<<<^vv>^>>v><<v<vv<<>v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^<v<>>v><v<><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v><vv<^>^^><><v>^><<v>v>^><vv^v<>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<<v^^^<<<^<v^>^^<>vv^v^<><v>^>^<>v<^^<vv<^>>>>^>^><v<vv^^>><v><<<><^>>^v<v<^v^^vv<<v^<^<>><<>vv>><<>v^^>v>vv<^<v<^<<vv>v<^>v^v<v^<<v<v<v<^>>>^v<><<<>^v<v>^<><^v<<<v<v<<^<^^<^^>vv>>^>^>^>>v>^<^v<<<>^v^v>^<vv^v<^^^v>v<>v>v>><^<<<v>><>v^^^v^<<vv<<><^v>>><^^^v>vv>v<>v<>^^>
|
||||
>^^<^v>v<<^<v><>^^>^<>v<v^v>v>v^>^<^v^<v^<v>^>^>vv^<>><<>^v>^><vv^<<^>v^v<^^^>v<>v>><v><vv>><vv>vvv<>^^^vv<^v<^v^<^<>>v<>^<vv<>><vv<^<><<<vvvv>^<^><^<<v<v^vv>vv^>><vv^<><<<vv^<>>>^vv>v<v^v<v^<<>v^^>v^^vv<>><>^vv^<vv>>v>>^^<^^v<v<<>^>^^v<>^<vv^vvv^<<^^v^><<<<^v^^v><v<>>v^^v>^^<^<^>>v^v>^<<v<<>^v<>>^vvv<<v^^^v^v>^vv>^<<<>^^^<^^<v<<<>^vv^^^<>^^v>>><v>><<v^v>^>v<v<<^v<v^v>vv<^><>^<><>^^<v>>>^<<^>^^<>vv^vv<>v<<v>^>vvv><^<^v><v^>vv<^^^>v>>vv<>><^^<v>v^^vv>^<<^<<^>v^>v^<>^<>v^v<v^vv<><>v><^><v^<<>>^<v>^<><>>v^vv^<v<>^<^>v<>>>^>>><<><>>^<vvv^>v>^^>>v><<^^v<v><>^<<><>>>><vv^^^<<v^<<v>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<><v<v<^>^vv<>^v>><>><>v^v>^^>vv<^<<<v<^<^>^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<<v^v<>>v^^vv^>^<<<vv>^^v<<v<<^>^>v<^^<<^vv><>>^v>^^vvvv>^<^<v^<^>v^<vv<^v<<<v>^v<v^<^>v><^^^v<>>v^v^^>v^^^^^<v<^v<>^^>^v<<><<<^vv<<^v<v<<v^v>v^<vv^><<^<<>>><<><v><<><><vv<<vvv^>vv>>^^>>>>^<v>^v^^v<vv<><<>>^<<vvv>>>>^^<>>>vv><<>>><v<v>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v
|
||||
^^^<^vv>^<<^<<><^<<>v^<^^vv><^<vv<^^<^v^^><>^v>v<>^v^^vvv<v><^<>vvv<v^<>^>><^vvv<v<^><>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<v<^v<<^<vv><<>v>^v>>>><v<>^>v>>^v<>><>^>^>v<^<^<^<^<<<v^<<^<^vvv<^^<v<v><>^^>><v<>^<>vvv<<><vv<^<v>><>^>vv^>^^v^^><vv>v<^^>>>v^v<><^^<v^<vv>vv<v<^v>v>v<<^<^>^^<v><<^v>>><^^<^^v<>v^><<vv^>>^v^<<>v>>v>^^>><<v>^<<<^><^^vvv^>^>v<^v<v<>^>^><<^v<>>^><>^<v<><>>vv<><>v^<>v^<^>>vv><^v^v<<<>v><v^vvv<>^<vv^v<><^v^v<<<^<>>vv^<^^>>^v^<<v>v<^vvv<>v^v>><^v>>^v^^^><<^<<v><v<v^>^<^>^vvvv<^v>^>>><vv<^vv^v>^v<<><v<^v><<^>><^^<v^>v^^^v^>vv<vv^>v^^>^v<<v>^>vv^^^v>><<>vv>>^<v^<>^<>^v>v^v<v^v><<^^^>>^vv<>>v>vvv<v<^vv^<^v^^<v^v<v^^v<^><^v<<>^^v<^>v>^>v>^<>v^<v>v<><vvv<<v^v^v>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^<v<v<^<v>>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^<vvv^v<<vv>^^>>v>v<><^<^^>>^>>^v><v<v^^^v<v<vvv<vv>vv^vv<v<>^v<vv^vv<^<vvv<<><>>v<<<><<v<v^>vv^<^<v^<vv^^^<v<>v>v><>^v>v<^<>>^>>v<<<>^<v^v^^v>vvv<v<^>>v^<<^^>^<>vv><>^^<vv>^v>v^>vv<^^<>^<>v<v^<vvv^<>>vvv<^><<<>^>>^^>v^v<<>^v>>
|
||||
v^^v<<v>v>><v>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^<v<>>^<^^^<>>>>v<<>>>vvv<vvv>v^<v<>v^<><v<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vv<v>v>v^v^vv>v<vv><>>vv^<>v^<>><v<<<<v<<<<^<<>v<<>vv<<>^>vv<><vv^<>v>^<vvvv<^^><><^v^>>^<^<<>v^<<^<v<^vv>><><>^^><v><><<>>v<<v^v^^^<v>^vv<>^>>v<><^>^<<>^>v^><><>^<v>v>^<v><>v<<v^^v^vv>^>^v>^>>^>^<<><<^>^><><^v^><^vvv<v<>v><>^v>^>vv<^v<v<>><^<vvvv>^^^>><<v<>^v<<><>v^^^^^^<v<v<<v^^vv<>^vvv>^<<<<>v^<<^><<^>vv<^><^v<v<^<<>v<v<v<^vv^^<v^^v<v>^>^v<vv^<v>vv^<v^>>>>><<<^^vv><^<v<<<>><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<v<<vv><><v<v<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^<v>^vv^^vv^>v<v<<>v>vvvv<>v^>^<^^v>^>^v<v^v<<>v>v^v<v><<><^v>>>vvv^^<<>><^<vv>^>^<v^v^v><v^vvv>vvv^>v<^><vv^>v>>^<>^<vv^^<^v<><>v><^<>><<<>><<<^<vv<>>>>v>vvv^>><<v^^vv>><v>>>>^>v>>v>^>^>>><><v<<<^>^><<^<^>v^^v^>^^>^>^<>^v^>^v<v^^><>v^<<>v^v>v><vv<><^>>v>><v><<>v<v>><<>vvv>><^^v<>>v>v^>>vv>^<^>^<><v<v<><v<vv>v<v^v^<><<v<<^vv<v^><^<v>vv<^>v^v<^<<^<^v<^v><^vv<v^>v><v<<<v<>^<>^vv^>>><^^<^v<^^<^<v>v^vv<<<>^v>v<<>v>><
|
||||
<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><<v^v>><<^^<^^><<><vv>>v^v^v><v<^<^v<<>><^^><v>>v>v<^<><^^><<>^<<vv<v>^v^^v>^^<^<v>v^^v^<^v>^<><<v^^^^<><vvvv<v<<<^^v^<><v<<><v<^>>^<v<v>>^^^<v<<>^<><^^<<>v>^<v^^^><><^<><^v<v<>^^<v><^^<^><vv><^<<^^^>v<<>^><vv^>>>>>>v>^>^>><<vv^<<<>^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v<v>>^<<^vvvv>v>^^>><<<<<vv>>^v^v^><vvvvv^<^vvv<><><><<<>><^<^^^^vv<>><v>>>><vv>^v>>>>>v^<^<>vv^<^^v^^>>^<v^^<>^<^<^<><>>^><^>^<<v^v>^^>v<^^>><^<^vv^v^<<^>>>v<<vvvvv><^>><<^v<^<^<>v<^vv^^^v<^v<^^vv<v^^v>>^vv<vvvv>>>>v^^^>><>v^>><<>v>^^<v<<>^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^<v>^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vv<v>v^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<<v>v>^<v<vv<>v<<<vvv<<v^v><<vv^vv<^^><>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><<vvvv<<>><v^vv><^^^v<^>>vv>>>^^<v^<v<^^<^<>^vv>>v<v>><^^>v><><v>>^>v>v^<>vv<<^vv>>^>^vv><v^^>vvv<v>^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><v<><>^v<>>><<>^v><>v^vvv>vvvv>^<<
|
||||
^^><<<^^v>^v<<^<^v<^v^v><^v<vv^><^>^v<<vv<>><^^<<^>><>vv^vvv^v<vv<<^v^^v<>>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<v<v<><><vv>^>>^v>>^v^>><^><vv>^><^vv>>><v<>>^>vv^v^<<v><>^^<^v^<<v<<>v>>^<<v>v^v>v><v^>v><^<v^>>^<vv^>vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<<v^<<v<>^<v<^v<<^^^>v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<><v>^><v^^>>^^v^<v^v><v>v>vv<<<^>>><v<^vv>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^><v>v<<^v><v<>^^^v>^^^>^<^^>v<<^v>v<v>v>v^^>^>v>^vv>>v^<v<^^>v<<<><vvv<^>^<^^v><^^<^<v<<^>^v<<^vv>>v>vvv>^v>vvv<vv^^^vvv^^>>^<><><v<<vvv>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^<v^^>^<>>^<^<<vvv>v>^<^^<>>><>><<v^<>v<>><^vvv>v>><v>>^>v<^^>v^^vv>v^^<><^v<v^^>v^^v><^^<>^>v>>vv<v<><>>^<<^^vv>v<v<^v^<<^^^>v<^^v<v^v^>v<v^^>^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<><v^>>^<<v^^v^^^<<<>^><>^<vv><v^>>v^<>^^<^<>v<v>^v<>v><<>^<^^^v><vvv>^<^<^><v^^>>>><>^><<v<>v>^^<^>^<><v><vv>v<vv<v^>>^^<<^v^<><^v<>^v<<v^v^v<><<<<<^^<^>v<v<><<>^v^>^v^v>^<^>^<v><^>v<<vv<<<<v^<^vv<>v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^<vv^^^<^>>v^<v<vv<>v
|
||||
vv<<>>vv<^>^^<<^>v>^v<<^^<v<><v^><<^^><vv>^>>vv<<>^v><>>>^^<<<v<<>^vv>vvv<<><<><v^^>v^<v^^>v>v>vv^>v>^v<v<<<vv>^<v><v<^>>^>>^v>><>^<^><<><>>>vv<<vv>>>v>><>vv<<>>v<vv^>v>^<vvv^^v>^vv<><vv^>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<<v>>>^v^>vvv^v>v<^v<<>>^<v<<^>v^^v^<v<<><^<>^<vv^^v<>^<<v>>v><>><><<^v<<vv<<>v<^<<>>><>>vv^>^<<>^^v>^><v>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<<v>^^^^^v^^>^<<v<<>v<v^^<<<><><^><^v<^<>v<^v^v>^<v^vvv>>v><^><><v<^^><^v^<<><v>^>^>^^v^<v<^<><<v<>^<>^>vvvv^v^v^v^v><><><>v^<v^v<<>^v^<v^^^v^<v^v<<v^<><<v<>>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<<v<v^^<<<v<v^^^<>^^v>^<v^v<v^>^v<vv>^v^^<<^><vv>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><<v^<vvv>^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><v<^vvv><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^><v^v<v^vvv^v^v>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^><v>^vvvv>v<<v>v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^<v^v>>^<v>v^^<^^vv^<<>><v<vv^^^>v<^v>>><<^^v><vv<v>^<^v^^^v<vv>>^^^^<^^^<^>v<^<>>^<^>vvv<^<v>><>v<^^>><^><^v<vvv^v^^><><<<^^v^^><^v<<>v
|
||||
^vv<>v>^v>^<><vv^<>^v><vv^vv^^v^<<<v><>><><^>^^^^<<vv>v^<>^><>^v<<<v^^><v^<v^v^v^>vv<v<^>>>v^<<v>>v<v^>><>v>v^^<<<>>^v>^vvv<v^><vv^><^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<v><<v<v<><>>^v^vvvvvv^v^<<v^<^<>>v<<v^>v<>vv<><<<v>^v><><v^>>><^v^v>v<v<<<><vv>>v>>v><^v><<v>>^vv>v^v<v>^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><vvv><^>^vvv>v<<<<>^>v<^^<><v><^<^>>^vv<^v>^<v^<<>v^>^^>^^><^vv<<^<><<<v><^<<^v<vvv^>^v^>^><v^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^<v^<v^<<^<v>^v<>>><v<<^vv<><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v<v^<^^v<v^^>^v<>^v<<^>>v>>^^v>^^v><vvv<>v><^^v<<<<v>vv^<><v>><<>vv^<<><^<<^^^<v<^>v>^<<<<^>v>^v^^><>^<^vv><vv>v>>^^>>^><^>^<^v^>^<v<^<^<^>>>^>v<<>><^^<<>vv><^<<<>v>^^v>v<v^^>vvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<vv><v<v^<^v<<^^v^<<<v<><^><vv^^^v>>v<>^<v^vv><>>^<><<v<<^v>^^^>><>v^<v<^^^v<v><^><^v^^>>v<<vv<<vv^<>^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^><v^<^<^^>><v><vv^<<^<vv<v<v><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v><v>>>^v><<>^v>>v>^
|
||||
<v^>>^^>^><<<>v>>^><<><v<<^><>^<><>>^>>>v^vv<v<^v>^<<>^>^<vv^<^vv^>v<>>><v<v>>v<<vv^vv^>v<>v^>>v<<<<<v>>v<vv^v>v^v^<<v^^>v^>^>>vvv<>>^vv>^v^><<v<<>^^^<v<v>v<>>v^vv<v>^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<<vvv^^vvv^v^>>^v<v>>><^><^^^<vv^>>v<vv^<><<>>>v>^v^<^<vv>>v^^<v^v<<<><<vv^vvv^>v>v>>>v>^>^<vv>v<^<^^<^vv<v<>>^<>^v>vv>^<v^vv^>^>><^v^v>v<<v><<v<<>>v^^^>^^>^<>^>v>>v>><v<^<>>><v>vv><vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v<v^>^>v^^>>>>v>v<^v>><v<>^v^><>^^<>^<<<>^<>>><v>>>v><>^v^v^<<<<v^^^^>^<<<<>v<^^^v><><>^^v^v<^^^<v<vvv<<^>^>^<^^<v<>^<<v^><v>>vvv<^v^>^v><>v^v^^<>>^v><<v<<<^v><v><<<v<v>vv^^>v<^^<><<<>>>>><<v><<^<>>^v<vvv>>vvv<<v^<^v^<>>v<<^><v^^<>>v>v<>><vv<<^v>^>^^v>><^<^<^^^v<v^vv>v^<><v<^vv><^^v<^<^<>^>^<v<^^>v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^v<v^>v^v^>><v^^v>v>^v<<^>v<<^^v<v>^v>^v<^^>>>>v><>^>vv>^v<v^v^<<>v<^v>^><vv<>v>v<^^<>v<v^^^<^<^^<v>^><v>^v^>>v^^>^v<v<>^>v<^vv^^^v<><v^vvv><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><v><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv
|
||||
<><^>^v^>v^^^<>^^^<><>>>>vv<<v>^v><v^v^^^>v>^^><<>v>^<^v^vv^<vvvv<><>>^<v<<>^^^<v<^vv^v<^v>^v^>vv^><^><v<^^^>>^v^v^^vvvv>><<<v<<vvvv<>vvv><><^^>v^>><>^<>^^v^^v>^<v^<>>^^v<vv>^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<vvvv<v<^^><>><><v^vvv>v^^v<>v>^v<<^^<v<<v<v<>vv^<<v<<^>>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v<v^^>>><>^<<^v^<v^v<^v^^v<><^<^<^vv>>^>vv^^>>^<><>^<v>>>vvv^>v^^>vv^vv<<>v><v<<^vvv><<v<v>vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>><v>v<<v<^<>v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^<vvv^v>^v<v><<<v<v<^<>^v<<^v<v<v^^<<vv^^v<>vv^>^^<v>>>><>^>^^<v^v>>><<vv<<^>v>>>^v>^>>v<^^v<>^vv<v^>v>^^>>>v^>v<<v<^^^^><^<^v><^v>^^>^v>^<>v^<vv^><v<>^<>vv>v><><v><v^<vv><^v^>^^<<<<>><<><vvv<vvv>^^<<>v^><v^<^>^^>^^vv<^^v^^>^>vv>>^<>v><<v>v>v^^<v>^vv^vv>vvv^>vv>vv^<v>>>>v<^^><^>>vv>^><<><^><<v>v>><<v>>vv^<><<^<^<>^><v<<<>v>v^v<<v<^><>v^><<v^<>^^v<>^>vv^v<v<^<<v<vv<>>>>^^^v>>>^><<<^<^<^^v<<<v^<<^<><>><>^^vvv>^vv>>^v<v^^><><^v<><vv>v>^v^><>^v<<v>v^^^><^>v^vv<<<v<>vv>v<v^<<vv>><^v<^<v<vv>^^><^^<v>
|
||||
<v^v><^<^v>vvv^v<^v^^>vv^><><>vvv<v<><v>><>v<v<<>v^^^<v>>^<^^<<^v^v>^v^<<^<v^v<v^^<v^^<<^v^>>>v<^^<><^v<v>^<<v>>>>>^<<>^v^<<>><<v^^>^<^><<>v^>^>v>vv<v^^<^v<<v>^<<v^>vv^^^^vv>^>vv<v^<>>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^<v<^>><^<><<^^vv<vv^<v><v^<>>>^>v^^^v<<v<v^<<^^^>><v^^^<^^><<vv^^<>^v^<><v^><^>>v^<v<v^^>^v<^>v>^<v<>^<>v<<^vv^v><^v^v<^vv^><><^^<<v^<^v^v>>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<v^><><<v^^><^^<>vv>^vv^^v^v>^><^vvvv^v^<v<<vv<<^<v^>>^<^^vvvv^<^<v<<v>v<^<<<v><>v>><>>^<vv>v^^><>^v>^v><<<^^^^^<<^><<v^v<v>v^>v<v^<>>v>v^^^^v><^><vvv>>^>^><>v>vv<<<v^v<^<vv^<>>>^><>v<><^<><v^<>>^^<^>^^^v^^<<>>vv>><^<<v><<<>^v<<^v^v<<>^>^vv>><>v<<vv^>^^<>v^>v>>vv<^vv<v>>>>>v<<vvv<v><>v><><^<<^<^><<<<>v<v<<vv^v>>>v><>v<>v<^vv><<>v>><v^>v>vv><^>><>>>^^^>v>^<>v<v^v<><>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><<v^^>>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^<v^>>^vvv>>vv^^vv^><<v>^^<<><^>^v^v>>^<v<><^<^^^<<^>v>>^vvv>v>><^>^<^v><v<<v><^v>^<v<vvvv>v<vv<v^^><v<^>^^<<^>^^<<>>vv^^<^
|
||||
<<<^<^v<^v>>v<v<<>^^>><><^>v<vvvvv>v>^^^vvv<<<v^<^^<^^v<>>^>v>^><<<<v^v><^v<v<^>v<v<^>^v>^>><<^vv>^^<>v>>><v^>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^<v<vv<<<<^^><v<>vv<v^<><<v^v>^^<^vv^<^><^<^<vv>^v^<<v^<v^<v^<^v<>><<^><^>>^<v^>^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>><vv^>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^<vv^>><v<^>^v<^^v><v<^>^<^v><<>^<^^v<^^v^<><<>^<vv<^vv^^^>^<<v<>v>vv>><^>v>v<vv<vv^^><>^v>v<<<><vv<<^<v>v^<>vv<>^<^>vv^^<^<^>>><<vv<>v^^vv><<^<>^<<<>v><v>vv^><^>><>><^^><^v>v>><>><v^<v^v>v>>v^<vv>^<<>>v>vv^>^v>v<^>><>>vvv<<vv>^>^>^<vvv^v><vvv>^^>^>^>^><>v><^<v^^^<<<<<v^^<<^<<^^>>>vv><v<><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^><v>>v^v^>^^v>vv^v<<v^^^v<>vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^<vv>vvv<<>^<<<>^<vv^v>>^v>v>v^><><^>><v<^vvv>>>^>^<^^^<vvv>><>vvvvv<v^>^v<v<>v>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>><vvvv>^^><^<vv>>>v><^>v^^><<v^v<<^<>^>v^<<>^><vvv^<><^^>>^><<vvv<v<>vv>>^^<<><vv<<>>>^><<v^^^><<v>^v>v<<v>v^>v<<>v
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user