Compare commits

...

10 Commits

Author SHA1 Message Date
636a704dde add day19; to slow to solve part2 2024-12-21 15:53:17 +01:00
7272fee707 add day18 2024-12-19 10:01:57 +01:00
229a2b9f30 new strategy, but still not working 2024-12-18 21:01:43 +01:00
102da06e29 add day17; part 2 is incomplete 2024-12-18 09:57:43 +01:00
6c463eff43 add day16 2024-12-17 09:03:26 +01:00
3c5e92749f add part 2 of day 11 2024-12-15 21:38:26 +01:00
3a2a5afac6 add day 15 part 1 2024-12-15 20:54:35 +01:00
1d015253bd add day14 2024-12-14 14:41:12 +01:00
19b8711a83 add part 2 of day 13 2024-12-14 12:14:48 +01:00
e5a179ab5a add day13 part 1 2024-12-14 10:39:50 +01:00
22 changed files with 7722 additions and 1 deletions

View File

@@ -69,7 +69,7 @@ func main() {
numbers = append(numbers, num)
}
for range 75 {
for range 25 {
numbers = apply_rules(numbers)
}
fmt.Println(len(numbers))

93
day11/stones_cached.go Normal file
View File

@@ -0,0 +1,93 @@
package main
import (
"os"
"fmt"
"strconv"
"strings"
)
// ---------------------------------------
type Stone int64
func (s Stone) blink() [2]Stone {
stones := [...]Stone{-1, -1}
num_str := strconv.Itoa(int(s))
switch {
// rule 1
case s == 0:
stones[0] = 1
// rule 2
case len(num_str) % 2 == 0:
num1, err := strconv.Atoi(num_str[:len(num_str) / 2])
check(err)
num2, err := strconv.Atoi(num_str[len(num_str) / 2:])
check(err)
stones[0] = Stone(num1)
stones[1] = Stone(num2)
// rule 3
default:
stones[0] = s * 2024
}
return stones
}
// ---------------------------------------
type Pair struct {
s Stone
n_steps uint32
}
var population_number_cache map[Pair]uint64
func population_number(s Stone, n_steps uint32) uint64 {
cache := population_number_cache[Pair{s, n_steps}]
if cache != 0 { return cache }
new_stones := s.blink()
if n_steps == 0 { return 1 }
p := population_number(new_stones[0], n_steps - 1)
if new_stones[1] > -1 {
p += population_number(new_stones[1], n_steps - 1)
}
population_number_cache[Pair{s, n_steps}] = p
return p
}
func check(e error) { if e != nil { panic(e) } }
func main() {
// read in file
dat, err := os.ReadFile("data.txt")
check(err)
dat_str := strings.TrimSpace(string(dat))
line_arr := strings.Split(dat_str, " ")
// convert to list of numbers
stones := make([]Stone, 0, len(line_arr))
for _, e := range line_arr {
num, err := strconv.Atoi(e)
check(err)
stones = append(stones, Stone(num))
}
// init cache
population_number_cache = make(map[Pair]uint64)
// main calc
len_acc := uint64(0)
for _, stone := range stones {
len_acc += population_number(stone, 75)
}
fmt.Println(len_acc)
}

122
day13/clawmachine.go Normal file
View File

@@ -0,0 +1,122 @@
package main
import (
"fmt"
"os"
"math"
"errors"
"strings"
"regexp"
"strconv"
)
// data types
type Vec struct {
x uint32
y uint32
}
func (v Vec) Sub(other Vec) Vec {
return Vec{x: v.x - other.x, y: v.y - other.y}
}
func (v Vec) Mul(skalar uint32) Vec {
return Vec{x: v.x * skalar, y: v.y *skalar}
}
func (v Vec) VecDiv(other Vec) (float64, error) {
/* Returns an error if v and other do not lie on a staight line.
* It holds: v.VecDiv(other).Abs() = v.Abs() / other.Abs()
*/
cx := float64(v.x) / float64(other.x)
cy := float64(v.y) / float64(other.y)
if abs(cx - cy) > 10e-5 { return 0, errors.New("vectors do not lie in a straight line") }
return cx, nil
}
func (v Vec) Abs() float64 {
return math.Sqrt(float64(v.x * v.x + v.y * v.y))
}
type ClawMachine struct {
buttonA Vec
buttonB Vec
price Vec
}
func (cm ClawMachine) FindPath(max_presses_per_button uint32) ([2]uint32, error) {
/* Find all combinations of cm.buttonA and cm.buttonB that result in cm.price .
* => x1 * cm.buttonA + x2 * cm.buttonB = cm.price
* where x1, x2 are of type uint and x1,x2 <= max_presses_per_button
*
* Returns a list of all the [x1, x2] where the equation is solvable with the
* restrictions above.
*/
for i := range max_presses_per_button {
x1, err := cm.price.Sub( cm.buttonB.Mul(i + 1) ).VecDiv( cm.buttonA )
if err != nil || uint32(x1 - 10e-5) > max_presses_per_button { continue }
x2, err := cm.price.Sub( cm.buttonA.Mul(uint32(x1)) ).VecDiv( cm.buttonB )
if err == nil && i + 1 == uint32(x2) {
return [2]uint32{uint32(x1), uint32(x2)}, nil
}
}
return [2]uint32{0,0}, errors.New("no path found")
}
// general util
func check(e error) {
if e != nil { panic(e) }
}
func abs(n float64) float64 {
if n < 0 { return -n }
return n
}
// main loop
func main() {
// read in file
dat, err := os.ReadFile("data.txt")
check(err)
dat_str := strings.TrimSpace(string(dat))
cms := make([]ClawMachine, 0)
pattern := regexp.MustCompile(`\d+`)
numbers := [6]uint32{}
for _, machine_str := range strings.Split(dat_str, "\n\n") {
// collect numbers as ints
for i, match := range pattern.FindAllString(machine_str, -1) {
numInt, err := strconv.Atoi(match)
check(err)
numbers[i] = uint32(numInt)
}
// construct ClawMachines
cms = append(cms, ClawMachine{
Vec{numbers[0],numbers[1]},
Vec{numbers[2], numbers[3]},
Vec{numbers[4],numbers[5]},
})
}
// calculate cost
cost := 0
for _, cm := range cms {
path, err := cm.FindPath(100)
if err == nil {
cost += int(path[0]) * 3 + int(path[1])
}
}
fmt.Println(cost)
}

1279
day13/data.txt Normal file

File diff suppressed because it is too large Load Diff

142
day13/hugeclawmachine.go Normal file
View File

@@ -0,0 +1,142 @@
package main
import (
"fmt"
"os"
"math"
"errors"
"strings"
"regexp"
"strconv"
)
// data types
type Vec struct {
x float64
y float64
}
func (v Vec) Add(other Vec) Vec {
return Vec{x: v.x + other.x, y: v.y + other.y}
}
func (v Vec) Sub(other Vec) Vec {
return Vec{x: v.x - other.x, y: v.y - other.y}
}
func (v Vec) Mul(skalar float64) Vec {
return Vec{x: v.x * skalar, y: v.y *skalar}
}
func (v Vec) VecDiv(other Vec) (float64, error) {
/* Returns an error if v and other do not lie on a staight line.
* It holds: v.VecDiv(other).Abs() = v.Abs() / other.Abs()
*/
cx := float64(v.x) / float64(other.x)
cy := float64(v.y) / float64(other.y)
if abs(cx - cy) > 10e-5 { return 0, errors.New("vectors do not lie in a straight line") }
return cx, nil
}
func (v Vec) Abs() float64 {
return math.Sqrt(float64(v.x * v.x + v.y * v.y))
}
func (v Vec) IsNatural() bool {
intX := int(v.x + 10e-5)
intY := int(v.y + 10e-5)
return abs(float64(intX) - v.x) < 10e-5 && abs(float64(intY) - v.y) < 10e-5
}
type Matrix struct {
c0 Vec // left column
c1 Vec // right column
}
func (m Matrix) LinearTransform(v Vec) Vec {
return m.c0.Mul(v.x).Add( m.c1.Mul(v.y) )
}
func (m Matrix) Inverse() (Matrix, error) {
det := m.c0.x * m.c1.y - m.c0.y * m.c1.x
if det == 0 {
return Matrix{}, errors.New("Matrix is not invertable")
}
invDet := 1 / det
invMatrix := Matrix{
Vec{ m.c1.y, -m.c0.y}.Mul(invDet),
Vec{-m.c1.x, m.c0.x}.Mul(invDet),
}
return invMatrix, nil
}
type ClawMachine struct {
buttonA Vec
buttonB Vec
price Vec
}
func (cm ClawMachine) GetTransform() (Matrix, error) {
return Matrix{cm.buttonA, cm.buttonB}.Inverse()
}
// general util
func check(e error) {
if e != nil { panic(e) }
}
func abs(n float64) float64 {
if n < 0 { return -n }
return n
}
// main loop
func main() {
// read in file
dat, err := os.ReadFile("data.txt")
check(err)
dat_str := strings.TrimSpace(string(dat))
cms := make([]ClawMachine, 0)
pattern := regexp.MustCompile(`\d+`)
numbers := [6]float64{}
for _, machine_str := range strings.Split(dat_str, "\n\n") {
// collect numbers as ints
for i, match := range pattern.FindAllString(machine_str, -1) {
numInt, err := strconv.Atoi(match)
check(err)
numbers[i] = float64(numInt)
}
// construct ClawMachines
cms = append(cms, ClawMachine{
Vec{numbers[0], numbers[1]},
Vec{numbers[2], numbers[3]},
Vec{numbers[4] + 10000000000000, numbers[5] + 10000000000000},
})
}
// calculate cost
cost := 0
for _, cm := range cms {
inv, err := cm.GetTransform()
check(err)
price_trans := inv.LinearTransform(cm.price)
if price_trans.IsNatural() {
cost += int(price_trans.x + 10e-5) * 3 + int(price_trans.y + 10e-5)
}
}
fmt.Println(cost)
}

500
day14/data.txt Normal file
View File

@@ -0,0 +1,500 @@
p=82,15 v=-7,-48
p=39,5 v=28,65
p=32,82 v=-40,69
p=74,67 v=92,-85
p=58,76 v=30,86
p=31,64 v=-62,5
p=38,70 v=67,32
p=68,81 v=-45,61
p=32,42 v=-8,-34
p=18,79 v=60,40
p=55,36 v=93,26
p=63,52 v=-58,-44
p=9,35 v=86,-55
p=4,101 v=-64,40
p=10,47 v=-59,-25
p=25,73 v=-62,37
p=25,38 v=-23,52
p=27,70 v=88,-91
p=5,41 v=-59,-78
p=16,22 v=-14,61
p=18,29 v=88,26
p=86,82 v=-92,37
p=92,10 v=8,93
p=35,95 v=-16,-83
p=47,3 v=59,-34
p=42,23 v=80,-58
p=75,35 v=-66,-27
p=76,28 v=7,51
p=17,42 v=-27,-13
p=65,25 v=-61,87
p=6,39 v=-64,-79
p=65,29 v=64,-24
p=65,2 v=-76,41
p=2,91 v=81,-15
p=28,4 v=-75,44
p=39,82 v=-65,-66
p=43,26 v=70,-58
p=40,52 v=-96,83
p=58,94 v=30,-88
p=54,76 v=69,-38
p=25,70 v=-18,-96
p=91,60 v=45,-22
p=18,48 v=34,-50
p=25,7 v=83,-34
p=47,70 v=54,34
p=56,102 v=38,-24
p=5,75 v=24,-68
p=98,10 v=-95,-33
p=17,40 v=34,-26
p=40,93 v=-52,-40
p=68,11 v=-19,-33
p=46,9 v=-29,94
p=47,45 v=44,52
p=59,0 v=15,40
p=93,96 v=89,70
p=7,52 v=19,11
p=98,5 v=89,-59
p=36,26 v=-26,-78
p=1,98 v=-38,-86
p=52,28 v=-79,11
p=16,17 v=73,48
p=47,30 v=45,-68
p=46,96 v=80,-38
p=35,78 v=13,86
p=8,60 v=-90,-70
p=50,5 v=67,65
p=16,71 v=-36,38
p=58,93 v=-16,12
p=54,4 v=-76,-64
p=16,16 v=91,47
p=53,28 v=49,-8
p=88,85 v=84,11
p=82,78 v=75,-85
p=24,31 v=42,-25
p=25,14 v=-5,38
p=77,39 v=2,-45
p=80,88 v=-93,77
p=41,4 v=54,-62
p=13,43 v=-38,28
p=72,10 v=-40,4
p=68,87 v=-77,31
p=81,93 v=-27,-71
p=73,68 v=-32,58
p=93,68 v=19,-48
p=55,69 v=-6,6
p=75,86 v=-97,-66
p=22,14 v=-47,-55
p=4,51 v=-77,30
p=16,69 v=60,-96
p=24,53 v=-41,-24
p=86,41 v=-58,-47
p=23,68 v=96,-69
p=6,82 v=-31,88
p=26,48 v=21,78
p=1,5 v=55,-60
p=82,61 v=4,-47
p=86,84 v=-53,87
p=50,3 v=59,-60
p=74,76 v=96,-21
p=38,96 v=44,91
p=85,43 v=-92,29
p=56,57 v=-81,-20
p=14,7 v=-28,-9
p=86,14 v=-53,95
p=42,12 v=-78,-86
p=14,12 v=78,-59
p=86,94 v=-40,45
p=88,84 v=60,-24
p=91,78 v=17,-28
p=59,24 v=74,71
p=78,102 v=21,85
p=34,81 v=75,-65
p=17,70 v=-28,85
p=59,76 v=67,33
p=87,18 v=-7,-60
p=5,52 v=-33,-41
p=50,81 v=-78,-68
p=29,84 v=-80,-44
p=28,55 v=23,-95
p=82,29 v=4,99
p=31,30 v=47,23
p=52,60 v=59,59
p=55,62 v=97,90
p=81,100 v=-71,92
p=76,65 v=-53,59
p=61,83 v=-50,-38
p=13,7 v=86,88
p=81,41 v=-91,53
p=49,87 v=-42,-13
p=9,61 v=-59,81
p=72,76 v=55,-99
p=91,18 v=-17,71
p=22,36 v=-80,-51
p=80,34 v=66,-54
p=26,46 v=-93,-49
p=3,8 v=-34,-66
p=4,67 v=-95,-14
p=70,96 v=73,-66
p=53,17 v=46,-31
p=49,53 v=-78,85
p=3,22 v=90,-87
p=20,24 v=68,-58
p=86,66 v=71,-98
p=51,55 v=-86,-46
p=11,31 v=-51,-83
p=68,41 v=42,-90
p=40,96 v=67,-33
p=26,57 v=96,84
p=71,79 v=-45,-43
p=98,21 v=-28,77
p=94,97 v=-9,96
p=19,46 v=-51,44
p=76,77 v=-58,-68
p=0,93 v=19,-36
p=71,52 v=-4,1
p=19,49 v=-70,5
p=20,63 v=60,30
p=29,29 v=-88,22
p=74,47 v=-66,26
p=5,11 v=86,97
p=74,101 v=-94,51
p=25,80 v=79,-44
p=56,76 v=-65,-46
p=26,49 v=52,80
p=65,41 v=43,-77
p=37,25 v=-5,-25
p=17,21 v=52,20
p=83,68 v=99,85
p=74,40 v=-53,76
p=47,53 v=-37,-38
p=52,95 v=64,-48
p=80,61 v=9,58
p=28,94 v=13,-10
p=100,6 v=32,-12
p=36,72 v=51,69
p=72,53 v=-78,-74
p=56,14 v=7,54
p=100,21 v=-90,-32
p=12,44 v=-53,44
p=22,33 v=-88,23
p=4,91 v=-77,63
p=29,30 v=-40,-63
p=59,2 v=-34,-83
p=55,85 v=51,85
p=4,57 v=-46,-19
p=88,75 v=71,36
p=19,59 v=-88,-68
p=3,86 v=-14,-22
p=97,78 v=-38,37
p=34,10 v=-52,18
p=73,28 v=-44,-68
p=2,10 v=65,-27
p=41,35 v=-91,-77
p=39,35 v=5,-1
p=94,3 v=45,66
p=85,39 v=43,-81
p=86,87 v=-58,9
p=58,71 v=51,85
p=96,25 v=68,70
p=37,62 v=-81,-65
p=71,90 v=-96,-37
p=29,102 v=21,14
p=9,73 v=-71,-92
p=50,18 v=-55,98
p=5,23 v=62,58
p=50,82 v=-89,-5
p=48,48 v=-9,57
p=51,98 v=-16,-26
p=10,10 v=-5,-3
p=35,61 v=-99,49
p=82,95 v=14,-39
p=14,5 v=-88,93
p=56,15 v=-16,16
p=69,88 v=-2,-37
p=0,82 v=-72,-76
p=64,75 v=67,36
p=85,89 v=6,-42
p=46,51 v=52,53
p=36,70 v=-52,92
p=12,35 v=55,-7
p=37,92 v=-86,-91
p=58,47 v=97,-95
p=10,7 v=92,75
p=48,84 v=2,62
p=85,80 v=84,89
p=42,0 v=-65,38
p=67,100 v=-14,16
p=16,98 v=-49,39
p=15,67 v=98,-71
p=61,96 v=64,-13
p=5,64 v=-63,71
p=28,7 v=-26,-34
p=75,5 v=92,69
p=29,19 v=-21,3
p=26,22 v=-69,-95
p=90,46 v=-56,-75
p=96,92 v=71,-50
p=76,9 v=52,-39
p=60,15 v=25,45
p=47,47 v=-78,3
p=94,39 v=-82,-78
p=93,45 v=-36,-47
p=83,35 v=35,-52
p=38,32 v=-78,-79
p=39,66 v=75,-46
p=26,43 v=-31,79
p=34,44 v=-39,53
p=70,88 v=46,40
p=41,81 v=83,38
p=46,56 v=18,-51
p=93,6 v=-9,-4
p=87,86 v=-7,64
p=99,50 v=-33,28
p=16,60 v=34,-50
p=64,37 v=-81,75
p=76,0 v=23,-38
p=33,56 v=-60,53
p=54,63 v=2,-19
p=85,30 v=35,-6
p=23,65 v=89,-1
p=47,96 v=51,-52
p=72,65 v=-61,87
p=7,72 v=55,36
p=62,85 v=46,-92
p=28,98 v=-85,-85
p=53,14 v=-51,-10
p=46,39 v=-55,22
p=84,68 v=-61,7
p=85,25 v=9,49
p=9,87 v=42,-90
p=84,79 v=79,32
p=49,78 v=-86,-14
p=100,72 v=53,34
p=47,30 v=82,-48
p=5,77 v=48,-99
p=96,0 v=-15,-34
p=56,76 v=-78,-46
p=96,2 v=-5,31
p=89,58 v=-30,-72
p=3,45 v=-67,75
p=43,18 v=-10,76
p=77,54 v=92,80
p=55,1 v=88,-57
p=44,77 v=48,-14
p=75,5 v=40,-30
p=88,74 v=55,-84
p=48,65 v=72,57
p=27,75 v=-5,39
p=17,7 v=30,32
p=34,15 v=5,-4
p=72,28 v=56,74
p=42,21 v=36,23
p=36,24 v=-79,-51
p=95,69 v=-69,89
p=19,22 v=-44,43
p=50,9 v=-16,74
p=77,24 v=-29,66
p=24,73 v=-67,-69
p=24,83 v=-85,41
p=54,67 v=49,88
p=15,66 v=-27,97
p=22,59 v=-18,-76
p=30,5 v=5,-36
p=82,22 v=76,-30
p=100,88 v=97,45
p=44,16 v=-81,-57
p=69,13 v=86,-90
p=48,74 v=49,-56
p=43,88 v=-65,-91
p=51,100 v=49,-53
p=0,23 v=-25,-30
p=40,80 v=93,39
p=31,19 v=-88,-83
p=33,0 v=88,-88
p=53,17 v=5,-31
p=9,22 v=-64,-38
p=60,53 v=7,81
p=18,88 v=94,22
p=97,14 v=-24,62
p=88,59 v=-64,30
p=31,82 v=49,61
p=53,96 v=-71,21
p=9,75 v=-85,-43
p=3,35 v=86,29
p=80,92 v=-40,77
p=65,97 v=51,13
p=57,9 v=-14,72
p=12,97 v=19,38
p=14,43 v=-41,53
p=73,97 v=4,2
p=82,84 v=-61,36
p=83,76 v=43,-46
p=73,28 v=-31,-25
p=62,15 v=-19,72
p=75,74 v=36,11
p=84,15 v=56,44
p=40,4 v=-52,-87
p=76,59 v=-72,-82
p=23,51 v=-49,82
p=9,60 v=-46,-50
p=91,48 v=50,-51
p=1,87 v=94,-37
p=24,40 v=-52,29
p=67,77 v=64,60
p=90,53 v=1,79
p=25,20 v=-66,19
p=67,24 v=46,-51
p=0,73 v=-78,4
p=41,25 v=-78,-36
p=15,94 v=91,-91
p=81,50 v=30,53
p=34,24 v=85,-26
p=41,1 v=-34,-36
p=45,33 v=5,24
p=55,46 v=-36,45
p=55,89 v=72,-12
p=61,32 v=-99,74
p=6,36 v=58,-25
p=17,38 v=-57,-81
p=35,28 v=62,73
p=2,4 v=84,20
p=18,5 v=-84,-83
p=70,80 v=25,-41
p=70,96 v=-55,-9
p=25,34 v=12,-78
p=92,4 v=45,-84
p=74,55 v=61,-20
p=11,82 v=-72,-41
p=6,20 v=-33,-80
p=1,21 v=-38,-83
p=29,70 v=-70,-45
p=88,60 v=-4,55
p=24,47 v=7,-88
p=29,13 v=-30,95
p=60,65 v=64,-23
p=44,38 v=98,-69
p=31,15 v=-61,95
p=20,90 v=26,-14
p=58,99 v=64,92
p=21,30 v=18,24
p=95,65 v=-29,33
p=86,57 v=97,84
p=21,102 v=-44,-83
p=71,61 v=69,56
p=57,46 v=80,53
p=38,78 v=-86,-97
p=78,78 v=4,61
p=87,68 v=-7,31
p=100,67 v=-82,-43
p=50,60 v=75,-97
p=54,91 v=-99,66
p=93,83 v=-74,63
p=20,49 v=16,-19
p=1,71 v=73,-50
p=89,2 v=-4,43
p=31,79 v=-57,88
p=54,81 v=-91,-77
p=77,49 v=42,84
p=33,6 v=-57,-10
p=41,62 v=-83,6
p=71,16 v=85,-50
p=31,54 v=-70,-22
p=39,26 v=-5,-80
p=24,14 v=-36,98
p=50,100 v=-16,13
p=3,7 v=34,-6
p=59,84 v=64,-42
p=3,3 v=34,70
p=88,34 v=17,-94
p=86,16 v=45,42
p=68,1 v=-64,-67
p=77,64 v=53,83
p=17,36 v=21,26
p=80,83 v=-6,51
p=64,49 v=69,84
p=45,34 v=10,74
p=8,0 v=-36,38
p=94,3 v=92,-68
p=41,11 v=49,97
p=68,23 v=-1,72
p=88,101 v=30,32
p=74,94 v=-53,-12
p=25,45 v=97,99
p=78,76 v=17,59
p=97,24 v=-23,-58
p=89,19 v=91,-97
p=33,35 v=-88,-1
p=17,44 v=57,-45
p=67,11 v=12,-7
p=15,31 v=60,-56
p=32,9 v=-88,44
p=77,51 v=-9,-75
p=23,89 v=99,-15
p=60,82 v=-86,7
p=25,31 v=83,48
p=9,49 v=24,29
p=98,77 v=-82,-16
p=53,19 v=-2,79
p=64,29 v=-4,-52
p=76,97 v=17,-62
p=64,4 v=2,47
p=6,36 v=91,55
p=81,92 v=-22,69
p=94,74 v=-43,-42
p=92,55 v=71,83
p=9,33 v=-67,-98
p=6,66 v=68,-71
p=69,46 v=-99,-91
p=67,63 v=-86,-48
p=26,60 v=26,-50
p=99,55 v=45,55
p=20,39 v=-23,-50
p=85,67 v=-95,-19
p=71,100 v=-57,-67
p=100,5 v=-82,69
p=90,39 v=24,81
p=31,28 v=37,87
p=85,15 v=87,-63
p=44,96 v=49,-62
p=29,63 v=-38,-1
p=74,82 v=-4,-57
p=0,86 v=-4,-69
p=43,80 v=-65,-37
p=23,62 v=-80,5
p=20,71 v=-26,32
p=72,34 v=-32,-54
p=20,87 v=63,-21
p=78,6 v=87,-34
p=24,7 v=52,-31
p=95,29 v=-82,-32
p=67,36 v=-71,-79
p=8,81 v=-77,10
p=32,44 v=31,-48
p=36,102 v=-83,-10
p=66,90 v=-50,37
p=4,95 v=-49,-29
p=69,79 v=9,11
p=96,74 v=60,-83
p=75,74 v=-30,-18
p=81,19 v=-35,-54
p=93,23 v=63,-85
p=69,0 v=-37,-57
p=20,67 v=-23,-71
p=84,34 v=-46,14
p=94,81 v=76,10
p=43,99 v=98,-89
p=67,39 v=-86,-78
p=54,55 v=-62,-93
p=48,20 v=-43,-15
p=54,56 v=-74,64
p=67,50 v=-68,63
p=38,27 v=98,-82
p=35,45 v=-13,53
p=19,63 v=43,-9
p=33,63 v=-62,-67
p=22,73 v=27,66
p=5,57 v=-87,-74
p=50,65 v=10,-20
p=18,51 v=78,83
p=58,84 v=-55,-13

96
day14/easteregg.go Normal file
View File

@@ -0,0 +1,96 @@
package main
import ("os"; "strings"; "fmt"; "strconv"; "regexp")
type Board struct {
width uint8
height uint8
}
type Robot struct {
x uint8
y uint8
vx int8
vy int8
}
func (r Robot) Step(b Board, n uint) Robot {
pos_vx := int(r.vx)
pos_vy := int(r.vy)
if pos_vx < 0 { pos_vx = int(b.width) + pos_vx }
if pos_vy < 0 { pos_vy = int(b.height) + pos_vy }
new_x := uint( uint(r.x) + uint(pos_vx) * n ) % uint(b.width)
new_y := uint( uint(r.y) + uint(pos_vy) * n ) % uint(b.height)
return Robot{uint8(new_x), uint8(new_y), r.vx, r.vy}
}
func check(e error) {
if e != nil {
panic(e)
}
}
func abs(n int) uint {
if n < 0 { return uint(-n) }
return uint(n)
}
func NewRobot(line string) Robot {
pattern := regexp.MustCompile(`-?\d+`)
matches := pattern.FindAllString(line, -1)
numbers := [4]int{}
for i, match := range matches {
num, err := strconv.Atoi(match)
check(err)
numbers[i] = num
}
return Robot{uint8(numbers[0]), uint8(numbers[1]), int8(numbers[2]), int8(numbers[3])}
}
func print_board(rs []Robot, b Board) {
num_fields := int(b.width) * int(b.height)
str := make([]byte, 0, num_fields + int(b.height) + 1)
for i := range num_fields + int(b.height) {
switch {
case (i + 1) % (int(b.width) + 1) == 0: str = append(str, '\n')
default: str = append(str, '.')
}
}
str = append(str, 0)
for _, r := range rs {
offset := int(r.y) * int(b.width + 1) + int(r.x)
str[offset] = '#'
}
fmt.Println(string(str))
}
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
lines := strings.Split(strings.TrimSpace(string(dat)), "\n")
board := Board{width: 101, height: 103}
robots := make([]Robot, 0, 100)
for _, line := range lines {
robots = append(robots, NewRobot(line))
}
// run simulation
for i := range 10000 {
for j := range robots {
robots[j] = robots[j].Step(board, 1)
}
fmt.Println("------------\nafter", i, "seconds")
print_board(robots, board)
}
}

87
day14/safetyfactor.go Normal file
View File

@@ -0,0 +1,87 @@
package main
import ("os"; "strings"; "fmt"; "strconv"; "regexp")
type Board struct {
width uint8
height uint8
}
type Robot struct {
x uint8
y uint8
vx int8
vy int8
}
func (r Robot) Step(b Board, n uint) Robot {
pos_vx := int(r.vx)
pos_vy := int(r.vy)
if pos_vx < 0 { pos_vx = int(b.width) + pos_vx }
if pos_vy < 0 { pos_vy = int(b.height) + pos_vy }
new_x := uint( uint(r.x) + uint(pos_vx) * n ) % uint(b.width)
new_y := uint( uint(r.y) + uint(pos_vy) * n ) % uint(b.height)
return Robot{uint8(new_x), uint8(new_y), r.vx, r.vy}
}
func check(e error) {
if e != nil {
panic(e)
}
}
func abs(n int) uint {
if n < 0 { return uint(-n) }
return uint(n)
}
func NewRobot(line string) Robot {
pattern := regexp.MustCompile(`-?\d+`)
matches := pattern.FindAllString(line, -1)
numbers := [4]int{}
for i, match := range matches {
num, err := strconv.Atoi(match)
check(err)
numbers[i] = num
}
return Robot{uint8(numbers[0]), uint8(numbers[1]), int8(numbers[2]), int8(numbers[3])}
}
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
lines := strings.Split(strings.TrimSpace(string(dat)), "\n")
board := Board{101, 103}
robots := make([]Robot, 0, 100)
for _, line := range lines {
robots = append(robots, NewRobot(line))
}
// run simulation
for i := range robots {
robots[i] = robots[i].Step(board, 100)
}
// count in quadrants
q1, q2, q3, q4 := 0, 0, 0, 0
for _, r := range robots {
switch {
case r.x < (board.width / 2) && r.y < (board.height / 2): q1++
case r.x > (board.width / 2) && r.y < (board.height / 2): q2++
case r.x < (board.width / 2) && r.y > (board.height / 2): q3++
case r.x > (board.width / 2) && r.y > (board.height / 2): q4++
}
}
fmt.Println(q1, q2, q3, q4)
fmt.Println(q1 * q2 * q3 * q4)
}

71
day15/data.txt Normal file
View File

@@ -0,0 +1,71 @@
##################################################
#O..O......O....OOO..O.OO.#.O#.OO..O.#.#....#..O.#
##.O.OO.#.O...O..O.#.O.O.#O..O..OO#..O#O#O#...O..#
#...O...OOOO.O#OO.#O#.O.#O...#.#..O.O..O........##
#O.#.O..O.....#O.#.#.#O.....O.....O....O....O..O##
#O#...O...O#..#.O##O#.O....#OOO..O..O...O...#....#
#.O....O...###.O..O.O#....O#..O..O...O.OO.OO#...O#
#O..##...O.......O.O.#.O..O.OOOO...#..OOO.OO.O...#
#...O....O.O..O....O.......#....#..O.OOO....#O..O#
##O....OO.....OOO.#O.#O.#OO#O...........O......#.#
#O#.......#........#OO.....O.#..#..O...OO.....O.O#
#O##...OO..#.O...OOOO..O..O.#.O.OO#...O.O.#O...O.#
#O#O.#O..O.....O#.##.O......O..#...O....OO....O#O#
#O...O....#.O..##....O.#.....#...##O##...#.O.....#
#OO...OO#...O#.#.O.O..O..OO..OO.O..O.....#..#.OOO#
#..#O.#O.#..O.OO.....O#....O.OO...#..O.O.#OO.##..#
#O..O.##...O....O..#OO..O..O..O...O..O...........#
##O....O....O..O...O#..O....O.OO......O.O..O....O#
#OOOOO.#....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.....#
#..OOO.....O#......O...#..O..O.#..O..OO#O..O.#.O.#
#.OO...O..O.O.O##OO.O.OO#.................#..O.#.#
#.#..#O#.O.........O.O...O.#......O.O..O...O.O..O#
#..O.OOO......#...O.O...@.O..O...O.OO..#...O..O#O#
#...#O...OO.O...O..OO..###O..O....O......##....O.#
#....O.#.##...O#.#O.OOO...#.O.......#O.#.##......#
##.O..O.OO..O.#.....O..OO..O#....#..O#...#..O....#
#OOO.O.OOO.O..O..O..O..#OOO....#O..O.......OO..#.#
#..O......O.O...O....O.OOO#......O.#....O.....OO.#
#....#..O#......OOOO.O......O.OOOO...O..O.#.....O#
##...OO....#.OO....OOO..O.#.OO.#O..O##..O..O.....#
#..OOO...O....O.....O#O...O...O.....OOOO...O..#.O#
#...#....#.OO..#.......OO..OOO.O.#.....O....O.O..#
#O.O.........OO.O..OO##O..OO.O.........OO.O..OO..#
#...O...#OO#O..O..#..O#OO.....O..#O.....OO.....O.#
#O..O##O...OOO#OO.O....O#.O.O#..O..OOO..O#.O..##.#
#.O..O...OO..O#O.#.O.OO.#OO...O..OO..O.O.O..O..OO#
##.O.......O.OO..O#.##O.....O....#.....OO.O.#.#OO#
#O#..O.....OOO#.....O.......O....O...#..O..O##...#
#.#..O.OO..#.O.OOOO.O..............O...O....O#...#
#....O..O..#..##..OOO...........O........O....OO##
#OOO.#...O....O.....#.......OO#.O..OOOO..OO......#
#......O...........OOOO#OO.......O........O.OOO.O#
#........O.O.#....#...O.#O..O.#....O.O#..#..#O#..#
##................O...OO..O.#O.OO#.O.....O..O..OO#
#.O...OO.........#OO......O.O.OOO......O#........#
#............O.#.........O.....O.O...#.O......OO.#
#O..O......#O...OOO......#..#.#.....O#O.O.....O#.#
##################################################
v>v^<v<^^<v<<>>>>vv<>vvv^><>>vvv><v<v^>><vvv>vv^>vvv^vvv<>><vv^>v>v>>^><>v<<<<vv^>^<^^^<^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<v<^^v^^^^>^v><>^<v^>^<>><v^>vv>><^vv^v^^v<vvv<>><v^><>>><<^>^<<v>^<^>><^>>v^vv>>>v<^>^<>^<^v>^v<>v<>vv<v>vv^v<v>v<^^>vv>^<^<<^^v><>>^^<>^>>>v^v<v>v<>vvvvvv^<>^><<v<<v<v<>v^<v^^^v><^<v>>vv>v>>v^v^^v<<>v<>v>v>^v^vv^^<v<<v<<<^v><>><>v>>v<^<<^><^^v^<v<>><^>^^<^^>><<vvvv<>vvv<>>>>^<v<v>^^v><v^^>vv><<<v<>^<^^v^>v<v><>>^>><^<<>^<>^^^^vvvv^^>^v<<>^vvv>^<<^><v<v<<>>v<^v<>^>v^<><^><<<>^<vv^>><><<vvv>^<>vv><>>v<^^>>v^^<^^>vv<v><<^<^^vv<^^v>^^>>>>v^v>>vv^>v<>^v>v<<<^<>>vv^>^^<^<<vvvv^<<><<^^>^<v^<<^v<>>^>>^>><vv<^vv<<<<>v><><^<<<><^<v^v<^<vv>v^>>^v<>v<><<>v><^^^v>>^<<>vv<>^^><<^>><v<>^>^><v^<><^<>^<^^^^<^>v<^^<vvv^<^<><v^>>>>>><><>^<>^^>v>>^^<<<>>^v<^>v>^<vv>^><^>v<<><^<v>>^<^>^<v^<v<>><<v<<^vv^vv>v<<^vv^^>><v^^^^<<><>v<^<^^^><<v^>>>>^v^^<v<<<^vv<<vv>>>><>v^vv>v^><>^><>^<^<v<<>v<v^vv>v<<v^^<^<^v^<><^v<^>>>^^<>^vv^vv^<>^
><<^v<^v<<>><>^^v>>v^^<v<^>^v^>v<^<^>v^v<<<<<<>vv>^>v<vv^v<><<>>>>>^^vv<^v^v^><>^^v<^^vv>vv^^vv<v<<<^^^^<><><v><><>>v><^^>^^><^>v^><^^<>^<^vv><>>>^^<^>vv>v<v^>v^v<><^<>^^v<>>^v>><v><v^<><v^>vv>^<^>^v<^v<^<^v<>vv<v<>vv<^<<^><v^v^>v^>v<vvvvv><<><>><^<<<vv<^v<^^v<^v^<<>v<><^^>><v<^^^vv<<>^v^v<>^^><<<v^<v>v^vv^^^vv<<<v<v^^>>^v<^^^^^^>v<<v<<>^>><vv>^v>^><^<<^v>^<^>>>^v>>v><<>vv>>v^>^v<<^<v<v<vv<>^><vv<vvvvv<>vvv^<>><><^v^<<>^vv^<>><>v>vvv^<v<>v>^vv<>v^vv><<vv^v^v>^^>^><>v<<<^<^^v^vv><<^v>v^>><^<v<>^<>v^>v>^<^v^<><^>><>^>^v<<v>>^<<v<^<^v^^>>^v<<vvv^v<v<^>^vv<v><v^><v^<>>><<v<^<^>^^>>vv^^v>>v^^v^^v<^vv<>><^>^^^>vv<><^>>><v>^>v^vvv<v><>^>vv>v^v<>>>^>^>v^v>vv<v><><^<<^^v<>>^^<><>><^>v<v<<v^><v^vv>v><<v>v^^<v^^<<v^^<^^<<>v<vv><<^<<v><>^<><v>>^^vv^<>^>^vvv<>^^<>>^><<^^<^v<^^v<^^^^v<<^vv^>>>vv^v>^<>^^<><^^><>^<>v<^>v^<<>^<v>v>v<v>>v^v^v>>^v^^^^>^<>vv^>v^^>><<<>v><^<v<v<^<v>>^vv^<^>>>^<v^><><^<<<^>vvvv<v<v<^^>^v>v>^v^v^>^<^v^>><^<v^vv<>^^<^^v><<^>vv^>vv><<>>><v>^<>vv<^v^>>^><^^v<vv^^>vvv>^^>v>>v<>v
<<^vv<vv><<<<><<v^vv>>^v>>>v<<><v<v<vv<><<>^v^v<^v^v>^vv^>>>v^v^vv<<v^<^>>>^v><><<<v>v<>>>>^<vv^^vvvv^<>v>v><v<>^vv>v<<<>v<^vv<>^^v>>>v^<<<^>v<v><v><>v^<>>v^><vv<>>^v>>>^<<>^^<v<<^^^<>v>^><>v^>v<v>^<><v<^^vv>^>>^vvv>v^>>^<><v^>v<<^^>>>>^><<v^<^^v>>^><vv^^<v<>v^>v>vv<><^v<v<^>v<<vv<vv>v<>>^>>^><v^^<^<v<v^><><<^v<v>vv^<vv^^>>v^>v^^^>vv>v^<vvvv<<>v>v>^>vv><<>><v^v^^<v>>^^v>>vv^^v>^v>^<vv>^^^<^vvvv><<^^vv<<><^^>><vvv><>><<^v>>^^<v^vvv^vv>v<<><<>^><^v<>^<<v^>>>^v^^v<>v^><^^v^><<>v>^vv<v^^v>v^v^^^><v<<<^>><^v>>><v^>>><v^>^>v<<^vv>>><<<vvv>^<^vvv^>><>>>^<v<>^v<<^v^v<^v^<<<^v>v>v>^v^^<><^<^>^>^v><^>v^^^<<vv<^<v<><^>v<^v^^><v<^><>^v^vv^v<><<<><<^vv^>><>>^^<v<v^v>v<^>^<>vv<>><<<^>^<vv>^>^v<v<<<v<><>>^>><^v><<vv>v<>v>>>><^^v^v<^v<>v^<<^v<v^<>v<v^^<^>^<^>v<^>vv<v<>v><<^v>vv>^^v<^^>^vv^>v^>vv<^^v^^v<^>><v<>^<<<>vv^v^v<>v^^<^>v^>>^>>><>>>^v<^v^^^v^^^v>v>v<^<^vvv^vv<^<<<vvvv^^>v>v^vv^>vv>v<>><^><v<<^><v^<^v>>v^><v>v>>>v><>^^v<><vv^v>^<>>^><^^>^<<<v>^<v^v^>^v^^v^<^^vv<^^v^^<>v^^^<v<<v^v<>><>^v<^^vv>>^
<^v^<^>v^^<>v<v^>v^><^>^>^><^v^^<^<^>><^>>>><>><v^v^><<<^>^v<<v<><>v>vvvv<<<^^>v>^>>^<<<>^^vvv<>^v^^<<<>v<>>v><>vv^>vvv>v>>>>^<v>>^<v^>v>^><<vv^^v^<><<v>^<<vv^<>^^><^>><^vvv>>v^v<>^<>^v<<<^>v^>^<^v>v^<^<^^>v^v<>v^v>^<<v<^v<v>v><>^>v<^<^>^<vv>v^vvv><v<vv<><^^^v<>v^<<^>^vv>^^<^>>>vvv<^><v<>>^^<^>vvv^<^v^^<>><<v^^>v<v^^<>^<<^<>^vv^v>^v<>>^<^<<<>v^v<v<<>vv<>^v<^<<>^<>^<<^>v<>>><v>>v<<<<^<v>><^^>v<^v>^v<^v^v<v>>><v^>v><<<>^vvv^^v^><^vv<>>^>^^<<v>^^>><v<<<v^<<v>>^^><^vv^<<>v<^<v^>v<>>^^>^vv><<^v<vvv^><v><>^>^<v^^<><v<v><<<<vv>^^<<v<>>^>^>>v^vv<^v><^<v>^v><vvvv>v<<><><>v^<>v>vv<^^>><>v<<>><><^^<><>>^<><<^vv><>^^v>>^>>>v<v>>^^<^v><v>>v^^vv<>><<<vvv^^^^>>^>v<<^>v^^<>>>vv>^^^^vv^^<^v^>^<<<^v<>v><^vvv^>>^<v<>vv>v<vv>>v<<<><<<<>vv>v<<><>>vv^^<><>>v^<<>>^>^>>v<<<vv^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^<^<>^vvv>>v<^vvvvvvvvv^^vv<^v<^<<>^<>^>^vv^<<v^>v<v<><><><<<>^^>>>v<>>><^<<>^<><^<>^<>>>^v>vv^^<>^^<>^>^v><v
><>v<^v^>>^^^vvv^^^v>^<<v><>>>>>^>>v^<v<^>^<^^<>v>>><vvv>><v<<><>^v<v<v^>>^v>v^>>^<^><<<v^>^<>v^v<<<^v<v<^>>^^^v>>><<><><>vv^>>^v>>^^vv^<><v^^<^v>v^>>vv><v<v>>^><^<<<^^><v^><>^<<<<^><v^<><<<v>^v^><^^^>^vv>v<<v><<^><^<^><<v^<<^^^v^vvv>v>v><><><v<vvv<><vv<v>v^<<^v^v^v>><><v^^^>v>>>^v<>^^v>^>><vv<><><v<>v^<vvv^>v^^<<vv<<v><v<><<>><^<<v<>^vvv^>vv^^v<vv^v^^vvvvv<<v<v<^^^^^<<v>v^v^>>>><v><><v><>^>v>^>>v>vv^<<^v>^>vv<<>>^v>v><>^><^v^>^vv>^>vvv<^<<^>^^<<v>>^vvv<<vvv>^^>v><^<><><v<^><<^v^>>v<>^^>v^v<^v<vv>>vv^v^<vv>^>v<v<vvv<<>>v^>v^><><<<<>>>>^<v<^<^>v>^>^^^^v>^^>^^^<v>^vv^>>>><>><>^>^>v>v^>>>^^^>vv>^v<>v><><^v>>^<^>>>>><>><v^<><<>v^v>v<v^v<>^>v^>>>^>><^>vv>>>><v><^>^v>>^><^>^>vv<v<>>vvv<^<><^<>>^>^^v<vv><>^^<>><>^v>>^v^><<v<<<><^>v>>><v<^^^>>v>>^^^>vv>>v^>>v<<^^>v>vv^>^v<^><<v><^v<^v>v<>>v^<>>^<v<>^>v<v^<>v>^>>v^v><<<><v<>><v^v>>vv<>>v>v^^<>v>^^>^^^<v<^v<<<^v^>>v<^^<<^<<v^^>>^<vvvv><>^v^^<<>>v><>^v<vv<<<v>^<v<<>><v^>v>>^>>>v>^v>^<>^^v><^v<v>v^><<<<^><><>vv<v^>><v<^<<>>^v>><>v<<v>>><<vv><<>><<
^<vv<^><>>v^vv<^v<v^^>>>^><v^<v<<<><<><<vvv<<><<<<<v>>><<^>>v^<><>>^<v<>^<vvv<^<v^^<<<v^>>vv^v><>v^^<v<^^^^^><v><>^>>v>v^^><<v<v<<>>vv^<>vvv>^v><>^v><<v^<v^>><>^v><^><<>v^>^v>v>>><>^v<>v<<<<<v<^><v><^><v^<v<<>>v>v><><^v^vv<<>>><v^<v<^>^v>^^>><>^>^^>^^^<^v<v>^<vvv^^^^<v^>v<<>vv<<>^<^>>^v<^<v<<<>^>v^>^<v^<<v<^<v><^^<<>vvv<<>v><>>^^><<^>v^<>vvv<^<^^>>^^<>>^^<^>^^v>^vvv>><^><^vvvv<v>v^v^<v^^>v>>v>^v><<>v>v<<<^>v<><^<<^<>v^><>vvvvvv>vv<><^v>v^<><v<>^><<<<>>^^vv<<^>>v^>>>^^<^<<v^<<^<<<v<v<^vv^v>vv<<^<<<>><<>^v^v<^>>>><><^><<><v<<v^><^<v^<v^>^v<vv>>vvv^>^<^v<<<^^>v<<>><>vv>^<<<<<><^<^^v>^><><v>^^v>vvvv>^^>^>>>vv^^>v><vv^><>v<v<<^><v^v><^v<^<v><>>v><^v>^v^>><vv<>><><>><v>v<vvv>v^<>>^>^>v^>>>>^v<^^<>><v>><<v<v><<vvv<vv<<<<<<^<<>v<>>^vv^><v^<<>^><v^v>><>>vv<<^v>^^^v^><vv<v>>^^>>>v>>^v^v<>>^<<^>^><^<>>vvvvvv>^^<>v>^>v^<<<v<><v<>>^>>^v<^v^<^<><<^<><^^^vvv^^^v^><><^^^<<<>>v<^^vv>vv>^<v^<>v>v^><>>v^^^^<^^>>^<v^<>v>>><v<<<<vv<^v>>v^>vv<>vv>^>vv>><^<>^<vvv>>v<>>v<v<<v>^<v<^<>^^^^^v<<>>^><^v^<>v>v<^>vv
<>><>^<^v><>^>><^^^>^^^^v<>^<<vv^^><^^^>><><^^^><<<>v^>><<v><v<^v^<<>>>^v<^v<<<^^vv><vv><vv>^v<^>v^<v^v>>>^^v<<^^>^<<><v^><>v><^<>>><>^v^v^v<v>>v><<v>><><>^<v<^><^<vv^^>^<^<vv^v>^^^<<<vv<<^v<v^<vv>>v^^>^v>vvv>v><^^v^v<<<>^><v<v<<^v>>v>vv><><vv<^^^v^<>>^^^>^<v^v>vvv<<><>^>>>>>>vv<vvv<v<>>v><<>v>^<><>^v<v<v<vvv^^^>^^><^<^<>v^<>^vv<^^^<^<^>>vv^v^<^><<^v^v>v<><<>>v<vv><v>v<vv<><^>><>^^vvv<^^^^^^^v>>^><><>v>><vvv<vv^^^^<v<<<^v^v^^v^^vv>vv>^<^>v<<^>^<^vvv<vv^v^v<>>vvvv<<^>vv>vvv<v<v<>^vvvv>v>^^^<<^<<v<^vv<v>^<^<vv><vv<v<v^^^^<^^^<v^^^^<v^<v>v>><^^v>v<v><^vv^>v^v<^<v><vv<v<<<vv<vv^<^<vv<><<v>v<v<>vv^^<>vv^<v^v<^^v^^^^<vv^vv>><<v>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^>vv<vv>>v<<<<^><v>v<v<^vv^>^<><^v<>^>v^^<^^v^^vv^>>^<^>v><><^<v^>v>^^>>><^<vv>v>>^v<^v>>^>^>^>>^vv><>vv><>v><>vv>><^>vv>v^>vv^>^^v^>v>>^<vv><>^^><^<<^>><<v^^>><<<^^<<^v>v<<^>>>^^<^v<>>v>><v>v<^>v<^^>><<<^^>>^v<^>^
<><^^><<>^^v>^<^><<^><>^^v^<^><<<<^<v><>v^^>^<<^<v^<v^v>v<<<<>^><<vv><<^vv>v<>>^>^>^vv>>^>^^vv<^><^>>>><^^^>>v>^v<^v>>>^v>><^<^>^^<<vv<><^^vv><>>vv<^<^v^<^>v^<<^v^vvv^v>><v^v<>v><vvv^^^<^>^v^<>v<v^<^<v<<^<^<>vv^^<vv^>>^vv>>v<><vv<><<^^<<>v>^v>^^v<<<>>>>v>v>v^v<<<><<^v^>><>><v<>v>v>>>v<v><vv>^<<>>>^<^^v<^<v><v<^v>^vv>><<v<^vv>^<>vvv><><>><<<<>>^^v><v>^<>><<><^<>>v^vvv<><>v>^>v^vv^<v>vv^v^v<v<v>v^<<^<><v>>^v^^vvv^<v^>vvv^vvv<v>^>><^<<<vvv><<v<^>v^v>>v><v^v>^v^^>^<>v^^v^><<<<v^vv^^v<v<>v>^<^v>^v><>vv<v^^>vv<^>>>^<>>>v^<v><v>vv^<<<><><^>^><>>v^vv^>^<><<>>>v^><v^vv<v<><v<><^<vv<><<^v><v><<>>^vvv>>v^<^>v^><>^vv^><v^><<<v<vv>><^vv^><^^v><>vv^<^v>^^<^<v^<<<>v>>>>><^v>^><>>vvv><><v<>>v><>^<>^^>><v^<<><<vv<>^><v^^v<^^>><v>v<v^^<^<<<^>vv>>v^>v^v^^^^vvvvv<^^v<>>>^v^v>>^<v^<<^>v<^>>^^<<^^^>>><vv>v<<><v><v<<v<vv^^^v<<<>>^>^^<v^^><>^^^>^>>^<v<<v<>^v<<^^^v>><<vv^vv<v<v^^<<v>v><<v>>>v<^<<>v<><>v>^v<>^v>^>^^<^>v^v^>v<^>^>>v^<^^vv<v><v<^^>>>v>>v^v><^<^vvvv>v><^vv^<vv<>><vvv^vv<>v^<<v>>v<^v>^>v>^v^^v>v^v^
>><>>><>^>^^<>^v>^v>>^vvvvv^vv<><^v^>>><^^<v<<v>>v<<v<>v>>^<<<v>v>>><^<vvv>v^v<^<<<^^^v>^>v>v<>^<v^<v^v<><<v<vv<>>v<v>^<v>^<<><<^>v^^><<>>>v^>v^<^v>v>>v<><>^><<<><^>^>^>>>^><vv>^<v>>>>^<><<<>^^>^<^v>^^<vv<^v^^^vv^<v<v>^v<^v<><>>v^>>>><>^^<^^v^v^<v>>>v<^v^>^>^^^v<^v><<v<^>>^^<^>vv<<<>>^v>^^<v<^v<vv<v<<^v<>vv><v^^<^v><^>^v>><<<<vv^><>^<>>^>vv^v^>v<^><v<<v^>>^>^v^>v^>^<<^^>^><>^^v^<>vv<><><v<<v<v<<<^<^<<><vvv^>>v<<^v>>>>><><v^<v<v<>^^v<>>v>^v^<>^<^v<>^v<<<<>^v<v^v>>>^v<v<^>vv<^><><v^^<^><^>>^^v>^^>^><^>>>v>^^v<^>v>^v>>vv<v^>v<^>vv<<^^v^vv>v^<<v<^>v^vvv>^^><v<<^<^><>^>^^<<<v>^^^^<><>><v<v<<^><^<^v>v^<^v>><^<<>>^<<>>^>><>^><^^vvv^v>>^>vv^>>v<>^^<><>vv>v<>v^<<v^v<v>^<><<v>>v>vv><^^<^>>vv^^^>vvv<^>^^v^v<vv<^^>v^<<><vv<v<vv<<^>^<^<>^>>v<><^<<<>^>>^^^<>^^^<v>^^^^^>^<^vvvv^^v><<^vv<>><^v^v^>v^vv^^>^v^v>>v>>^<>vv<^vv^<^^>v^>^<v^^v<>v<v^<<<>^^>><>^^v<>^<<<>>><>^^<v<<>v>><<^v^<><>>^<vv<^^<><v^><<>>>^v^^v^<^v^v<<v^><v^<^<>>^<v^<<<v><<^><<vvv<^>^>v^<v>^v>v<^<v^vv>^^^<><^v^<>v>><v>v^v^vv><^<>^^>^>^<v^
^>^vv<<^^^v^>^<v^v<<^<>v^^><><v^v<v<v<v<^<>>v<<vv^><<<<><>v<>^^^^v^^^vv^v^<^vv>>>><<v<v>^>><^^^><<>v>v^>v>>^>><^^v<<<^<<>v><^>vv^vvvv^>v<^^>><>^><<>>>^^v><<^<^v<><>^<>v<><v<v<v><v<^vv><>v>v<v>v><<^>>v<^^>^>v<vv><^^^<><>v><>>><<v<><^<>vvvv<vv<><^>^><>>^<>^^>^<^v^v^^^^<^><vv<<vv>>v^<<<<><>><>vv^<v^>vv^><^^v^>v^<<>vvv>v<^>><v^^v^>^^<^^v>v^^v>^v<^>v<<^v>^<vv>^<<^<^<v>v<^>^<>>>>vvvv^^^>^^>^>^><^^>>>^<>>v^<<^>^<v^^^^^>><^^<vv<>v>^<v><^>^<^<^<v><v<><><^^>>><<^>^>^^v^<^>^>^vv^v^vvv^><<vv^^<^^v<v^<<^^^v<^<v<^>^^^vvv^^vv<^v><<^^<^<vv>^<<<v<vv^<><vvvv<<^<vv<<<^^><^>>>^v<v^>^<^>^><>vv^^>v><^vv<^<v<^<^><^^<<<>><<v<v><<v^v<><v>vv<v^^>v^<v<^><^>v^^v^^<<vvvv<v^^<><^<>v>v<>>^><^v>vv^^v>>vv<v^>^<>^<^<<v^^vv^vv>^<<<^v>><><^v>><<<v<<^v<<<v<<v>^vv><><><^>v^<vvv^^>^^vvv^v<v<v^<^v<vvv<^v<<vv>^<<^v<>^>vvvv<<^v^>^v<<<<<><^<^^^<vvv<<v^v>^v><>>v<v^v<<<>>>v^<>^>vvv<^<>>^^<><v^>>>>^^v<>^vvv>>^^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^vv>>>^>^>><vv^v><^^>^vv>>^vvvvv<^<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<>vvvv>^^^^>vv><>vv^v<^v>v^v>v<<<<>^^<<^^<><v<v^<v>>vv^<vv^<^>><<v<<v<v^^^<^<^^vv<<^v<<v<v>^^v>^^<^^>>>><<>>vv^<vv^vv^^<<v^<>^><^^<v>vvvv<><>^^v<>v<^><<><v>^^^v<v^>v>>^^v^vv><v>^vv>v>vvv^^v>vv<vv>>>^^^vv^v^<<v^>>><vvv<^v^>^>^v<><>^vv><><<<v><^v>v>^<vv<vv^^<vv>>>^<<v^<^<^^^>>^v^v^<<>v<<v^^<^v^>>^^<>vvvvvv^^<v<v<v>>^v>>vvvv<<^^<v<><^^v<v<<v>v<<>^><v^vv^>vvv>v<<v^<<<><<vv<<v>>>^vvv>^^^>v<><<v<v>vv>^<<vv<^^><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>>>>vvv><^^<<v^^v^>^<^<><vv<^^^<^<^<v>v^<<<^v<v^v<^vvv^<v>v>^<^v>^><<^^v>><v<>v<<<^v><^>v>v^v>^>vv^^<>>^>^v^<^^>^^>v>>^v^>>^>^>^>>^^>>>^v<v^v>v^>^v><^>^<v^<<^^>^^<<>>>v^^<><^v<>><<<<v>^vv^<<v^><vv><v><^<<^v^v^^<v<v<v<^<>v^v<^<^>><<v<<>>^><^^>vv>>vvvv>vv>vv<>^v>v>>><<<v<v<>^<
^^v^^^^^><v><^v^v^vv^v<^v^^>^vvvv>^^^^^^<v><v<><>v^v<^<>^>^^<<<v^<v<^>^v><^^^><v><^^^<v^vv<^<vv<<^><>><<v^><^v><>v^<^^>^v>^v>><<vv>^^^<^^>^^v<><<<v^v<^^^^^vv>^>>^^>><<<v^<<v^><<^vv^^vvv^<>>v^^v>^<<v<^>^>v^>><>>><<^>><<v>^>v<^<>vv<vv>><^v^<><<><vvvv><v^>^vvvv^^>^>^<><>v^>>^v><>^v<^<<^<><^v^^>><<<><><<<v<^<^v^^vv<^v>v>^<<^^^<>v<>^v^<^vv<v^<^>^v>^^^>^>v^v^^^v<<v>v>v^<v^v<<>v<^>^v><<v<>v^v><<v<^>><><^v<v<vvv<><v<^^^<^<<^^^<vv^<^>v^v><<^v>^^<>^<<v<^v><vv^>v^><v<<<^<^v<^^^^vv^><v><<<^>>^<<^^<<<><><>>vv<vvv^<^<>vv><<v^^><^>>><^v^^>>>^<^^>>^^^<v><<^<^^vv^^<v<v><^<v^<>v>>>^<>vv>^v<^^<^>>v>>><<v^^<<>>>>>v<<^^<v>>^^^vv<^v<<^<v>>><^^><>v^v<>v^<<<>^>>^^^v^vv><^vv<>>^>^>>><v^<<v^v^<>vv^>v<v><^^<>^<^v<>v^><^<<^>v>>^<^^v>^<^>^vvv<><^^^<>><><<><v<>vvvv>^<vv^><<<v<v^<<<>^^<<v<^<v^v^v^v>^v>^<^v^vv>^>><<>>>^vv>^<v>^<v<^vv><v<><>>vvv<^vv<<<>v^>^v>vvv^>^v^v>vv^<v<v^>>><>^^^>^<<>^><>^<<>v<>^^<><v<^<v^<^^v>vv^<>v<v>^^<v>><<><<vvv^<v>^>^^<<<<>>^>vv>^><><^^<>v^v>v<<><>^^>>>^>^>vv>^v^v<v<^^><v^<^<v<<v><<<<v>>^<^
v^vv><^<^^<>v^<vv<>^v<>>>v><<<<^^<v<<<>>^>vv<^<><<<>^v<<^^^v><>><v<<><<^>^<><vv^^^>>^<>^^v>v>^v<<<>^<><vvv<>>^v>^>v<>>^vvvv^<><>v>vv^<<^>>v>^><<>v<<^v^<<>v^>^>v<>^vv>vv<v<>^v<v^vv>vv^<<>^<^><v<^^v<v^><^^^<^><v<^<v<<>>vvvv><^v^v<v><<<^^^v>^>^^<v^<<vv><>v<<<><vv^>><<v>vv>vv>>vv^v^<><^^v>><<>^v<vv^^vv<<vvv<<v<>v^>^^v>>vv<^<<<<^<>^^><>>>><>vv<<^<>^^vv><v><^v<^>v>>v><^^^><><<v<v<^^<>^v>vvvv><<^v^<>vv^^>^v^v<v<>^>><<>>v<^^><v>>v<^^><^vvv^v<<v>vv^>v<><v^<v^>v^v>vv^<<^^<<<><><^>vv<><^v>v^^>^<>><^<v<^>v<v^^^^vv^>^><>v><<v^^v^>^>^<vv>>^><>v<^v>><>>>^><^<v^^<v^^><^<^>>^<v^<<>vvv<v^vv^v>v>>v>^>^>>><<><vv<>^^v>v^^v>v><^<>^<v>v<><<>>v>^<^<<v<^>v<^^>v^<<v^^<v>^v>>vv^>^>^v>^^<>v<<<><^v^v<v<>>vv>^>^<>>><^^v^<<v^<>^<>>><<^^v<v<vvv>v>v^^<<^>>v^v^>^<v><vv^<^<>vv^<^^v>vv^v>><><^^<v^vv^<<^^<<^vv<>>v<v>>^vv^v<^^v>><<>v<^^>^<<v>>>v>>v<v<>^v^<>v<>^<v^^<^<<v<<^<<^v<^><<<^><<^>^>^v>v^<v<vv>v>^<<^><^^^vv^><v^v>^v<<^v><^^vv<vv^<<><<v<>^>v<v^v>>v^<<><<v><vvv^v>^>v<vv>>>v>><^v<^<>^v^v^<><<vv>v<>v<v^vvvvv^v>v><<^<v<>
vv>><^<><v^v^>vv^><v^<>>^>>v<^v^^<v^v^>^v<^^><vv^v^^^<v>>><><<v^>v<v^>>v^vv<<^v^<<<<<^v>>v>v>^<<<>^>v^>>><v<^>v<<v>>v^><>^><^^^^^v<v<>^<^v<v^>^v<<>><>vvv<^^>>^<>>^v<>vv<v^v^>><^<vv^v>^<>>^^^^^^><^<v^>>v>v>v^<^^<v^v^><^^><>v>^<^>>vvvv>>>vv<>>><v<^v>v^v^>^>>>>>>>v<^>^<vvv>^^v>v>v<vvv>v<v^^>v^^^v<v^<^^vv<^<v><<^><v^^<<>>vv<>v<^^^^><<v^><<v^<vvv<v^^<vvvv^v^v<^<<>>>^>>^>^>^v^^<^>>^v^^<vv<^>v^vvv>^><^^<v<v>^v^<>^>>^>^^>v<^^v>>^^v>^vv>^v>v>vv^><>^>>>^>^v<^<>v^>>v<v<v^>>^><><<<v^vv^>v>v><<<>vv>v^<v><^^v^>><^v^>v>v^vv^^vv><>vv<v>>><^v>^^^<^^^>>^^^^v>><><<v^<^<vvv^^<vv^<^>v>>^<<^>^vv^<v>>^v^v<><^><<v>>^>^>^<<^vvv>v>>^>^>v<<^v^^^<<^^^<^vv^^^<<^v<^>>^<^<>>^<><>^<><^<^v<^v^<^<^^v<><><<>vv^v>^<>><^<^vvv>>^v>^^^^<^^<>vv<>^v>><<^v^v<^v>^v^^><v<^<<<>><v>v^^>><^<>^>vv^v^^vv<>v<>^v<<>>^><^^>vv^>><^<>vv<><<<>>>><^>><v^><^^<v>^<v><v<>><^^v<^^v>>><<<<>^v><v>^^vv^>>>>^<<vvv^>>v<<>vv><>v><<^<v^>>>v>v^<><>v>>><<v>vv>^^v>>^^^v^v<<^v^^^v>><<^<><>^<vv>vv^<v>^v<v^<vv><v^><v><^v<v><v><vv<<>^<v^<>^>v^<^<v<<>v<<^<>^v
>^v<v>^^<><<><^v<^<v^<>^^^<>>v><<<>v><>^v>^^^<v<^>^<vvv<^>^v>v<^v^><<>vv<>^v><>^vv<<v^>^<v<<v^v<<<<<<<<v^v>v<^vv^><>^<v^><<>v^>>vv<^vvv>v>^^^vv<v<vv<v^>v^^<<v^^^v<<^<<^^<v>v^^^^<<v>>^^v<<<><>vv<^v^<<^^^>v<vv^<v^>vv^<<v>^<v>^<><vv^^^^<><^^<>>>^<>^<>^^v>>^^vvv<v^>>v<^<vvv><<<>^<<^v^><^>>^>>v^<^vvv>vv>^><^>><<^>^><^>^v<><^v^^v^<>v^v>v<<<<><^<v><^>>v<>v^<v><<>v^^^>>^>v<>^v>^v><^v>^<<^<vv<v^<v<>v><><vv>vv<><><vvv^<>^^v>>^^>v<<<<vv><<vv<^v<v^><<>^<v>><^^vv>vv><v>>v^>>><v<^<>v>^v>v>v>^vv^<v^^><^>v<v<v^^>vv>^<^<>><v<<v<>^<v^^^>^v>v<>^>>^vv<<>v^^v^^^^^^^<v^v><v><>v^^><v>^^<>>>^^<<^^><^<vv^v>v^><v<v^>v<v>v^^>^v><<><>^<>^^<^><>v^><><<><^>>^^>>vvv>>>vvv><>>><^^v^>v<<^v>v^<><v><<^>>v^><>v^^><^^<^>^<v<>vv^>>^^><<^v^<>^>vvv><<^^><>^^v<>^v^^^^^>v<vv>>^>vv<><<<>>vvvv^^>^^v>>>v>vvv<v<^^vv>v>^>><v><^v>^<v><^>^^<^<^<v<^v<v>^^<^v>v^<<><vvv>v^><>v>>v<<<>v^^^><>>><v>^<<v^v^><>v^<>>^v>>v^v^vvv^<><vv>v><<vvv>^v<<^<v<>^^^v^^<<^v^><vv>v^v<v>^<>v<vv<<^v>^<<>v>v<^>^v<>v>><v^><>v^<>>^v^<<<v^>vv<><v<^<<><^^>><v^^>^>
^<^v^<v>v^^>v>vv><<<<<^>v>>vvv<<^v<><>^vv>v<>^>vv<>^<^>^v>^>^>v^v<<^v>vv<^^>^^^v<v>>^<^<v^<^<^v<<<>v>v<>vv><>>v><v>vv>v^^<^^<v^v>>v>>>vv>^v^>^^<>v<v^^vv^^<v<<^^v^vv<v>>vv^v^<^vv>v>^>>>><^<^vvvvv<<>>v>>v<v>>><^^<v>^v>v<><v<vv<^<><^^v^>^<^<^<^v>><v>v>^<^^^v><<>v^>v>>^^>^v><^<>^^v<<<v>><><v>vv^^<v>>^>><v<v<^^^^^^<>>v^<^<>v^<>v><^>^^>^>>^>><v^<^><v>v<^>^<<<>>^^<<<>>^^v>^<><^<v^^<v<<^<>v<^<^<>><v^<>>v^^>>v^^<<><^vv^<>^^<v^<v>^>v^><vv>vvv^^^<<v^<<^<vv<<>><>^>v>vv^<>vvv^v>><><<><v^^v^<>v<<v^vv<^^vvv><vv^<<^<^<>>>>>vv<<<vv<v<<>vv<^v<<v<^>^<<>v>v<>^v^v<v<><<<<vv^^<^>^^>v^v<<<<vv>v<>>v>vv^v<<<>v>^^v>^><>^^<>v^<<<v<>v^v<vv>><vv<^vv<<^<<^^>>v^>v><<v^^^^>><^^v^vvv<^^>vv^<>><<<<^>vvv>^>vv<>v^>>^^><>>^<>><><^>>>>>^<>v^>^vv^>>>vv<v>^vvv>>v^<v><^><^^v><><<<<<<vv<><v><v>><>v>><^v<<>^>>>^<v^<<<><>>^vv>><v>^v<<>v>>^v^v<^>^^v<<><^^><>><^v<>>>>^^v<vv<>vv<<>^v<>^<^<>v>v<v^^<^vv^>>><^v^v<^>>>^<<v<><>v><v<vv<>>><>v^><^<^><<>v>>>^<><>v^^^vvv^><<<<v^v^v<^^^<^^<v<^v>v>^^<^><<v<v><>>^>v>v<^<vvv<<<>>^vvv>>v<v<v^>v<
<>>^<^vv>>><><^v^>^>v<vv><v^v<>><<^^vv<>^<>vvvvv<v><vv^^^<^<<^<v<<v>v^^^^v>v<v^>^<^<<^^>^<v^v<<>^>v^^><v>>><<^v<^<^<<v><><v<^<>>vv>vv<v>^><v^^v^>^vv><^>^^v><^^^<<vv^^^^v>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<>>vv<^^><v^>^<<<v>^>^^>v>v>^><^>>^><<^v^v^<<>v><^>v<>^^^<>v<^>^<v<>^^v^<^<v>>^><^vv<<^^><<<vv<<<>^vvvv>^^^^<vv^<>^>vv<^<^>><<><>v<><v<<<><^v<>vvv<>v<<>>v<^^<v>^>v<<>>^v>^>^vv<>v^>^v^v<^^><<><<<<><<><<<<>v>v<><^>^^><>v^^v<v^vv>^<<><v<v^<v<v<<>^vvvvv^><^>v<v^v><<<vvv<vvv><^<^v^vv^v>>vvv>v^>^>vvv<<>v<^<v^><^v<^>v<^>v^>^>^v<vv<<v<v>v<v><v<<>^<>^<v>^^^<>>>>v<v<>^v<<<<^v<<><<^v<^>^vvv<vv^v<v<<vv><v<^><><<^^><<^>v<^<^^^v^>>^^>vv^v>^>>><vvv<^>>^>><v<<<>>><>>^<v^vv<>v^^^><<v><^vvv>>v^^^<v<^><v>v<>><>v^<^>>>>v^^v^v>^^^v>v<v>^v>><v<^<v<>>^><<^^>v<>^>^^<>>v>vv<v<^<v<>^<>vv<>>v^><^^<<v<^><vv><^v<v>>>v>>^>>^^^v<<<^^><<>vv^<v<^>^>^v>>><^vv<><><>^<v<^^>>>>>v^^<>^v<vvv>>v<><^>^^^v^><<>v<vv>vv<<<v
^<v^<>>v^>>><>><>v^<><>>>^vvv^^<<^v^v>^><^>v^^<>><^v>^>^v<v<<vv^<<^^><^^>vv<v>><<^^^v>^v>v<<^^v^^<vvv^v>^^>^^<<^>^v>>><^v^v^v<<v^><v>>^>^v<<v>>v><>><v<^v^^><<^>^<v^<vv>^v>^^<>>v><<^^v<<>>^vvv<^<^^<>^v^<^^>vv<><^^<>v<vvv^>v><<v<<v<<>^v<<>v>><^><<^vv^v><v><vv>^^<<<vvvv<<vv>><>>v<^vv<^<^v<v>>>><>^<vv^><<<v^><^v<<v^^<>^vv<>>vv>>>vv<<^<<>vv><>v>>>v<>>vv^^^^vv<^<^v<>>v>>v^v^^<<^^<<^v>v<^>v^^<><<>>v<v<^v^v^v>><v<<>vv^<>v<vvvv>><vv<>vv>>^>>v<^v>v>><<^>^<>v^^<>v<>>v<<v^vv<^^^^vv^>v>v^>><<^>^^v<v>^v<>^^vv^>^<^>^v^^<<v^>^^<><^<>^<>^^v<<^<<vv<^vv^v^>^<vv<>^v>v>vv<^><<^^^<>v<<v<v><v>v>^>^^^<<>v<^^<^^^<^><^^>vv^<<>v>vv^<>>^^v<>v<^<<^^vvvv<>><v<^vv>^>^^v^>v^v^v>v^>v^>vv>v><v><<v^v^^^<^v>><^v<>v><>>v><v><v<<^>v^^^^>><^^v^^>^vv>>vv>>>>v<v^>><<v>>v^<v^<^<^v<<<v>vv<<^^<><><v><v^v<<^v<<vv<^^<>><<><><<^<<<<v><>>^>v^v>v^^^<>^v>v^>^><v^<^<v^^vv<^><><^^v>v>^^v^>>^<><<^<<v>><v>>^v<><<>>>^v<vvv^v<^><>vv>^^^<<>>>>^><<^<<><<<>>>v>>^>v><^v^<vv>>vv^<v>vv^^<>v>>>v>^>>^v><>>v<vvv<<^<v^>>^><^<^<>v>vv<v^^>v^<>>><^^<<v<
><^>v^>>>>^v^>v^>vvvv>><vv^<><v<vv><<<>><v<^<^<<>>v^><<<>v<^<>v<<><^vvv^^>v^<<<><<<><^>v<<<>>>^<^<<<vvv^v>v<^v<<^v^<><^vv^v^>^<<vv^v>vv><>>>>^<>>v><<<<^^^>^<v<vv>>^^><v^<<>><vv<><v<>^v<^^vv<><^>v<>>>>v<>>^^^v<<^><>v<>v><>^><^v>v>>^vv^^vvvv^<<<<<v<<>^>v>^vv<>v^^v>><^v><v>^v><>^v<^v><v^<<vvv^<>^v^^>^^v^^^<vv^v^<^<^v>^<><>>^>><^^>^v<^vv><^^v^<<vv<>^^<v>><^><><<>^^^v>^v>vv^>>>v^v<<<^^^>v><v<v<v><^^vvv<>>vv^<<^v^><<vv<<^v^>vv>^>^><vvv>v^^^vv<v<^v^v^^^<>>^v^v<<v>^^v<<<<v<>^<>>>^^>>v^<<^v>^<^v>>v<^>>vvv<<^><^>>v<>v<><^^^vvv<>^<v^^v>v^>v><<>^<v^^>>v<<<^^<>>^v<><<v><^<>>><v<v^><<v^<<>vv^<^<^>^>v^^<^<vvv^>v>v>^^>>v><^^<><<<v>^<>v>^v><^^<<<>^>>><<<^^<<^^<vv<>^<><vv>>>>v>^>>>^^>><v>vv^><>><v>^^v<vv><<>><v^<>^<>>><><>^^^v<>><>^<<v>v>^><^><v>>vv^^<v>v^v^^<^>v>v^^<><>>^>v>vv>vv>vv^>^>^vvv<v>^>>>>^vvv^<^>v<v<<v<<v<v><vv<>v<>v>>>^vv<<<^><<<vv<<v<^^^>v^>>v<<>^<>>>v^v>v^^<^^^^><v>^^>v<>vv<>^<v^>>>^^<<v>v<^>v^<v<^^<^>>><^<^v<v>v>>^>>^v^^>>vvvv^>v>>v<v<<<vvv<<vv^v<^vv^^^<<^^<^^<>v^^<v<^^v^><>>vvv<^^^^vv>>>
v<><<^<v^>v^><>v<<><v<>vvvv>>>vv<vv^^<<vv>vv<v^<>v<^v^v<vv^<><<<v>v^>v^^>^vv<<vv^<><<<<>v>v^>v<>^v^><<<>v^vvv><<<vv<>>v>v><<<>^<^>v<<>v><v>^>>v<>>^^<>v><<vv^v>^v>^<<^^<<v<v><v>v^^^<^^<><>v>v>v><<<^><v<>v>^vv><^^^^vv^<v>^vv^><>>v<^<><^<<^>^v>^v>vv>v>><>^v<<>v><>v^<^^>>vv^^vvv<><v^^<^<^>^v<^>>vv^^><v^<<v^>vv^v<<><v^vv<><<vv><v>^<^>>v>^v><<><^<>^>^vv^v><>>>^v^<<v^<^v^>v^<vv^><vv<>^^<^<<^>vvv^v<<^^vv<^<v>>v>v>^^vv><>v^^<v<<<^<v>^v><<>^v><<v>>v^>><v>^v^<v<<>>^^>v^v<^^v<>><v^^v^>v<>>^^>^><<<^v>>^vv<^>^vv^^>^<>^<>v^>>^v^><<^<><>><><^<<v<<v>^<<><v<<>^^^v<<<>v>v<^v>>v<^>^<<>^v^<<>vv<v><^^v>v<<><><<<vv<v<v><v>vvv^<^vv<v<<^v^v^v<^>^^v^^^^v>>vv^vvv><v^>^<^^>v^><><>^^<^^v<<vv^>v>^<>v>vvv<<v>>vv<>^<v<<<^>v<>vv>>><>^<^v<><<>v^<>>v^^^^v^v<v^^^><<><>^>v^>v^^^v>>^>>^<<<<^v^v<>v<<>><<v>>v>v<>>^^>v>^<^^^v^^<<v<>^>>>>><>^<><^v><vv<>vv^<><vv<>><v>v>>v>^>^v<<<>^<>^<^^<^<>v><^^v<><^^<<vv<v><^v><vv^^>>v^^>^<v^>>vvvvv<^^>^v^><<v>><<<^<v<<>>v>v^v<^<<><><>^<v^^><^<v^^>>v>^<v<>v^v<>>v>v^v^><>v^v>v<<><^^<v<^v>><<>v

223
day15/gps.go Normal file
View File

@@ -0,0 +1,223 @@
package main
import ( "os"; "fmt"; "strings" )
// ----------------------------------------
type Direction uint8
const (
Up Direction = iota
Down Direction = iota
Left Direction = iota
Right Direction = iota
)
func NewDirections(str string) []Direction {
direct := make([]Direction, 0, len(str))
for _, char := range []byte(str) {
switch {
case char == '<': direct = append(direct, Left)
case char == '>': direct = append(direct, Right)
case char == '^': direct = append(direct, Up)
case char == 'v': direct = append(direct, Down)
default:
}
}
return direct
}
// ----------------------------------------
type Field struct {
robot [2]int
field [][]byte
}
func NewField(str string) *Field {
field := make([][]byte, 0)
var robot [2]int
for y, line := range strings.Split(str, "\n") {
for x, char := range []byte(line) {
if char == '@' { robot = [...]int{x, y} }
}
field = append(field, []byte(line))
}
return &Field{robot: robot, field: field}
}
func (f *Field) StepUp() {
switch {
// blocked
case f.field[f.robot[1] - 1][f.robot[0]] == '#':
return
// free to move
case f.field[f.robot[1] - 1][f.robot[0]] == '.':
f.field[f.robot[1] - 1][f.robot[0]] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[1]--
return
// infront of box
default:
loop := true
for i := 2 ; loop; i++ {
switch {
case f.field[f.robot[1] - i][f.robot[0]] == '#': return
case f.field[f.robot[1] - i][f.robot[0]] == 'O': continue
case f.field[f.robot[1] - i][f.robot[0]] == '.':
// shift boxes
f.field[f.robot[1] - i][f.robot[0]] = 'O'
loop = false
}
}
// continue shifting boxes
f.field[f.robot[1] - 1][f.robot[0]] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[1]--
return
}
}
func (f *Field) StepDown() {
switch {
// blocked
case f.field[f.robot[1] + 1][f.robot[0]] == '#':
return
// free to move
case f.field[f.robot[1] + 1][f.robot[0]] == '.':
f.field[f.robot[1] + 1][f.robot[0]] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[1]++
return
// infront of box
default:
loop := true
for i := 2 ; loop; i++ {
switch {
case f.field[f.robot[1] + i][f.robot[0]] == '#': return
case f.field[f.robot[1] + i][f.robot[0]] == 'O': continue
case f.field[f.robot[1] + i][f.robot[0]] == '.':
// shift boxes
f.field[f.robot[1] + i][f.robot[0]] = 'O'
loop = false
}
}
// continue shifting boxes
f.field[f.robot[1] + 1][f.robot[0]] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[1]++
return
}
}
func (f *Field) StepRight() {
switch {
// blocked
case f.field[f.robot[1]][f.robot[0] + 1] == '#':
return
// free to move
case f.field[f.robot[1]][f.robot[0] + 1] == '.':
f.field[f.robot[1]][f.robot[0] + 1] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[0]++
return
// infront of box
default:
loop := true
for i := 2 ; loop; i++ {
switch {
case f.field[f.robot[1]][f.robot[0] + i] == '#': return
case f.field[f.robot[1]][f.robot[0] + i] == 'O': continue
case f.field[f.robot[1]][f.robot[0] + i] == '.':
// shift boxes
f.field[f.robot[1]][f.robot[0] + i] = 'O'
loop = false
}
}
// continue shifting boxes
f.field[f.robot[1]][f.robot[0] + 1] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[0]++
return
}
}
func (f *Field) StepLeft() {
switch {
// blocked
case f.field[f.robot[1]][f.robot[0] - 1] == '#':
return
// free to move
case f.field[f.robot[1]][f.robot[0] - 1] == '.':
f.field[f.robot[1]][f.robot[0] - 1] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[0]--
return
// infront of box
default:
loop := true
for i := 2 ; loop; i++ {
switch {
case f.field[f.robot[1]][f.robot[0] - i] == '#': return
case f.field[f.robot[1]][f.robot[0] - i] == 'O': continue
case f.field[f.robot[1]][f.robot[0] - i] == '.':
// shift boxes
f.field[f.robot[1]][f.robot[0] - i] = 'O'
loop = false
}
}
// continue shifting boxes
f.field[f.robot[1]][f.robot[0] - 1] = '@'
f.field[f.robot[1]][f.robot[0]] = '.'
f.robot[0]--
return
}
}
func (f *Field) Print() {
for _, line := range f.field {
fmt.Println(string(line))
}
}
func (f *Field) Gps() int {
acc := 0
for y, line := range f.field {
for x, char := range line {
if char == 'O' {
acc += 100 * y + x
}
}
}
return acc
}
// ----------------------------------------
func check(err error) { if err != nil { panic(err) } }
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
field := NewField(strings.Split(input, "\n\n")[0])
directions := NewDirections(strings.Split(input, "\n\n")[1])
//field.Print()
for _, d := range directions {
switch {
case d == Up: field.StepUp()
case d == Down: field.StepDown()
case d == Right: field.StepRight()
case d == Left: field.StepLeft()
}
//field.Print()
}
fmt.Println(field.Gps())
}

207
day16/allbestpaths.go Normal file
View File

@@ -0,0 +1,207 @@
package main
import ( "os"; "fmt"; "strings")
// ----------------------------------------
type Direction uint8
const (
Up Direction = iota
Down Direction = iota
Left Direction = iota
Right Direction = iota
)
// ----------------------------------------
type Path struct {
position [2]uint
direction Direction
}
func (p Path) StepUnbound(d Direction) Path {
switch {
case d == Down: p.position[1]++
case d == Up: p.position[1]--
case d == Left: p.position[0]--
case d == Right: p.position[0]++
}
p.direction = d
return p
}
// ----------------------------------------
type Maze struct {
start [2]uint
end [2]uint
field [][]byte
}
func NewMaze(str string) *Maze {
var maze Maze
for y, line := range strings.Split(str, "\n") {
line_arr := make([]byte, len(line))
for x, char := range []byte(line) {
switch {
case char == 'S':
line_arr[x] = '.'
maze.start = [...]uint{uint(x), uint(y)}
case char == 'E':
line_arr[x] = '.'
maze.end = [...]uint{uint(x), uint(y)}
default: line_arr[x] = char
}
}
maze.field = append(maze.field, line_arr)
}
return &maze
}
func (m *Maze) Step(path Path) []Path {
out := make([]Path, 0, 4)
if m.field[path.position[1] + 1][path.position[0]] == '.' && path.direction != Up {
out = append(out, path.StepUnbound(Down))
}
if m.field[path.position[1] - 1][path.position[0]] == '.' && path.direction != Down {
out = append(out, path.StepUnbound(Up))
}
if m.field[path.position[1]][path.position[0] + 1] == '.' && path.direction != Left {
out = append(out, path.StepUnbound(Right))
}
if m.field[path.position[1]][path.position[0] - 1] == '.' && path.direction != Right {
out = append(out, path.StepUnbound(Left))
}
return out
}
func (m *Maze) Start() Path {
return Path{m.start, Right}
}
func (m *Maze) Finished(path Path) bool {
return m.end == path.position
}
func (m *Maze) Print() {
for _, line := range m.field {
fmt.Println(string(line))
}
}
// ----------------------------------------
type MazeGraph struct {
cost uint
position [2]uint
children []*MazeGraph
}
var new_maze_graph_visited map[Path]uint
func NewMazeGraph(m *Maze, start Path, cost uint) *MazeGraph {
children := make([]*MazeGraph, 0, 3)
// finish reached?
if m.Finished(start) { return &MazeGraph{ cost: cost, position: start.position, children: children } }
// check for loop
value, exists := new_maze_graph_visited[start]
if exists {
if value < cost { return nil }
}
new_maze_graph_visited[start] = cost
// build subgraphs/ children
for _, path := range m.Step(start) {
var child *MazeGraph
if start.direction != path.direction {
child = NewMazeGraph(m, path, cost + 1001)
} else {
child = NewMazeGraph(m, path, cost + 1)
}
if child != nil { children = append(children, child) }
}
// found dead end
if len(children) == 0 { return nil }
return &MazeGraph{ cost: cost, children: children, position: start.position }
}
func (graph *MazeGraph) Leaves() []*MazeGraph {
out := make([]*MazeGraph, 0)
if len(graph.children) == 0 {
out = append(out, graph)
return out
}
for _, g := range graph.children {
out = append(out, g.Leaves()...)
}
return out
}
func (graph *MazeGraph) PathsToLeaves(leave_cost uint) [][2]uint {
out := make([][2]uint, 0)
if len(graph.children) == 0 {
// leave found
if graph.cost == leave_cost {
return append(out, graph.position)
} else {
return nil
}
}
// collect from children
for _, g := range graph.children {
subpath := g.PathsToLeaves(leave_cost)
if subpath != nil {
out = append(out, subpath...)
}
}
// if all children returned nil
if len(out) == 0 { return nil }
return append(out, graph.position)
}
// ----------------------------------------
func check(err error) { if err != nil { panic(err) } }
func uniq_count(slice [][2]uint) int {
m := make(map[[2]uint]bool)
for _, s := range slice {
m[s] = true
}
return len(m)
}
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
maze := NewMaze(input)
var best *MazeGraph
new_maze_graph_visited = make(map[Path]uint)
maze_graph := NewMazeGraph(maze, maze.Start(), 0)
for _, leave := range maze_graph.Leaves() {
if best == nil || best.cost > leave.cost { best = leave }
}
fmt.Println(best.cost)
fmt.Println(uniq_count(maze_graph.PathsToLeaves(best.cost)))
}

141
day16/data.txt Normal file
View File

@@ -0,0 +1,141 @@
#############################################################################################################################################
#.#.....#.........#...#.......#.......#.......#.................#...#...#.........#...#.........#.....#.....#.......#.......#...#.......#..E#
#.#.###.#.###.#####.#.#.#####.#.#.###.#.###.###.#####.#.#######.#.###.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.###.#.#####.#.###.###.#.###.#.#.#.#
#.....#.#...#.......................#...#...#.....#...#.#.....#.......#...#...#.#...#...........#...#...#.....#.#.....#...#.....#...#.#.....#
#.#####.###.#.#.#####.#####.###.###.#########.#####.#####.###.#.#.#.#######.###.#####.#.###.#.#####.#######.###.#.#######.#######.###.#####.#
#.#...#.#...#...#...#.....#.#.#...#...........#...#.#.....#...#.#.#...#.......#.#.....#...#.#...#...#...#.....#...#.#...#.........#...#.....#
#.#.#.#.#.###.#.###.###.###.#.#.#.#############.#.#.#.#####.###.#.###.#.#####.#.#########.#.###.#.###.#.#.###.#####.#.#.###########.###.#.#.#
#...#...#.....#...#...#.....#...#.....#.....#...#.#.#.#...#...#.#.#...#.#.....#.............#...#.#.#.#...#.......#...#...#.........#...#...#
###.###.#####.#.#.#.#.#########.###.#.###.#.#.###.#.#.#.#####.#.#.#.###.#.###.###############.#.#.#.#.#####.#####.###.#.###.###########.#####
#...#...#...#...#...#.#.#...........#.......#.#.....#.#.....#.#...#.#...#.#.....#...........................#.......#.#...#...#.......#.....#
#.###.###.#.#.#.#####.#.#.###.#.#########.#.#.#######.#####.#.#.#.#.#.###.#####.###.#######.#####.#.###.#.#########.###.#.###.#.#####.#####.#
#.#...#...#.........#.#...#...#.#.......#...#.......#.#.....#...#.#.#.#.#.........................#.#...#.......#.#...#.#...#.#...#.#...#...#
#.#.#######.#.#.#####.#####.###.#.#.#####.#######.#.#.#.###.###.###.#.#.###.#.###.#.#.###.#.#.#####.#.#########.#.###.#.#.###.###.#.###.###.#
#.#.......#...#.....#.....#.#.....#.#.....#...#.#...#.#.#...#...#...#.....#.#.......#.#.....#...#.....#...................#...#...#...#...#.#
#.#######.#####.###.#####.#.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#####.#.#######.#.#######.#.#####.#########.#.#.###.#.###.###.#.###.#.#
#.#...#...#...#.#.#.....#.#...#...#.........#...#...#...#...#.....#...#.....#.#...#...#.#.....#.#.....#.........#.#.#.#...#.........#.#...#.#
#.#.###.###.#.#.#.###.#.#.###.###.#########.###.###.#######.#######.#.#.#######.#.#.###.#.#.###.#####.#########.#.#.#.#.###############.###.#
#.#.........#.#...#...#...#...#.....#.......#...#.#.......#.#...#.....#...#.....#...#...#.#.....#...#...#.....#.#.....#.................#...#
#.###########.#####.#.###.#.#######.#.#######.###.#######.#.###.#.#######.#.#########.###.#######.#####.#.###.#.#.#######.#.#.#########.#####
#.#...#.....#...#...#.#...#.....#...#.#.....#.#.....#...#...#...#.#.......#.#.......#...#...#.#.........#...#...#...#.....#.#...#.#.....#...#
#.#.#.#####.###.#.###.#.#######.#.###.###.###.###.#.###.#.###.###.#.#.#.###.#.#####.#######.#.#.#####.###.#.#######.#.#.#.#####.#.#.#####.#.#
#...#.#.....#.#.#...#.#.#.......#.#.....#...#.....#.#.......#.#...#.#...#...#...#.#...#.....#...#...#.#...#.....#...#.#.#.......#...#...#.#.#
#####.#.###.#.#.#.#.#.#.#.#######.###.#.#.#.#######.#.#####.#.#.###.#.###.#.###.#.###.#.#########.#.###.###.#####.###.#.###.#####.###.###.#.#
#...............#.#.#.#...#.....#.....#.#.#...#...#.#...#.#.....#...#...#.#.#.......#.#...#.......#.....#.....#...#...#...#.#.......#...#.#.#
#.#.#.#.#.###.#.#.#.#####.#.#.#.###.###.#.###.#.#.#.###.#.#.#####.#######.###.#######.#.#.#.###############.#.#.#########.#.#.#####.###.#.#.#
#.......#.#.#.#.#.....#...#.#.#...#.#...#...#.#.#.#.....#.#.......#.....#...#...#...#.#...#.#.#.....#.......#.#.#.....#...#.#.#...#.....#.#.#
#.#######.#.#.#.###.#.#.#.#.#.#####.#.#####.#.#.#.#######.#####.#.#.###.###.#.###.#.#.#.###.#.#.#.#.###.###.#.#.###.#.#.###.#.#.#.#####.#.#.#
#...#.....#...#...#.....#...#.......#...#...#...#...#...#.......#...#...#.#...#...#...#.#...#...#.#.....#...#.#.#...#...#...#...#.....#.#.#.#
#.#.###.#######.#.#.#.#.###############.#.#######.#.#.###.###########.#.#.#####.#####.#.###.#.###.#.#######.#.#.#.#####.#.#.#.#######.###.#.#
#.#...#...#...........#...#.#...........#.....#...#.#.#...#...#.........#.#.....#.#...#.....#...#...#.....#...#.#.#.....#...............#.#.#
#####.#.#.#.#############.#.#.#####.#.###.#####.###.#.#.###.###.#.#####.#.#.#####.#.#############.#.#.###.#####.#.#####.#######.#######.#.#.#
#.....#.#.#...#...........#...#...#...#...#.....#.....#...#.....#.#.......#.....#.#...#...#.....#.#.#...#.#...#.#.#...........#.......#...#.#
#.#####.#.###.#.###############.#.#.#######.#.###########.#.#####.#.###########.#.###.#.#.###.#.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#####.#
#.......#...#.#...#.....#.......#...#.......#.#...........#.#...#.#...#.........#...#...#.....#...#...#.#.#.#.#.#...#.#.......#...#.....#.#.#
#.#.###.#.###.###.###.#.#.#############.#####.#.#.###########.#.#.#.###.#########.###.#############.#.#.#.#.#.#.#.###.###########.#.###.#.#.#
#.#.....#.....#...#...#.#.....#...#.....#...#.#.....#.........#.#.#.#...#...#...#.....#...#...#...#.#...#...#...#...#.......#.....#.#.....#.#
#.###########.#.###.###.###.#.#.#.#.#.#####.#.#####.#.#####.###.#.#.#.###.#.#.#.#######.#.#.#.#.#.#.###############.#######.#.#####.#####.#.#
#...........#.#.....#.....#.#.#.#.#.#.#...#.......#.#.#...#.#...#.#.#.....#...#.#...#...#...#...#...#.#.............#.....#...#...#...#...#.#
#.#########.#########.###.#.#.#.###.#.#.#.#.#######.#.###.#.#.###.#.###########.#.#.#.###############.#.###############.#.#######.###.#.###.#
#.#.......#.#.........#...#.#.#.....#.#.#...#...#...#...#.#.#...#.#...#.#.....#...#...#...#.......#.....#.........#.....#.#.........#.#.....#
#.#.#####.#.#.###.###.#.#####.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###.#.#.###.#########.#.#.#####.#.#####.#######.#.#.###.#.#####.###.###.#.#
#.........#...#.#.#...#.#.....#.......#.#.#.#.#.#.....#...#.....#.#.#.#.#.#.........#...#...#...#...#.....#...#...#.#...#...#...#.#...#...#.#
###.#######.###.#.#.###.#.#####.#######.#.###.#.#####.#######.#.#.#.#.#.#.#.#######.#.#.###.###.#####.#######.#.###.###.#.###.#.###.###.###.#
#...#.....#...#.#.#.#...#...#.#.........#.#...#.....#...#.....#.#.#.#.#...#.#.....#.#.#...#.....#.#...#.....#...#.....#.#.#...#.....#...#.#.#
#.###.###.###.#.#.#.#.#####.#.#.#######.#.#.#.#.#######.#.#####.#.#.#.#####.###.#.#.#.###.#####.#.#.#.#.###.#.###.###.#.#.#.#######.#.###.#.#
#...#.#.#...#...#.#.#.#.....#...#.....#.#.....#.......#.#.#...#...#.#.......#...#.#...#.#.....#.#...#...#.#.........#.#.#.#.#.#.............#
###.#.#.###.###.#.###.#.#####.###.###.#.#########.#.#.#.#.#.#.#####.#########.###.#####.#####.#.#####.###.#.#######.###.#.#.#.#.#.#.#.###.#.#
#...#.#.#...#.#.#.......#...#.#.......#...#.....#...#.#...#.#.................#...........#...#.#...#.#...#...#...#.....#.#.#.......#...#...#
#####.#.#.###.#.#########.#.#.#.###.#######.###.#.###.#####.#########.#################.###.###.#.#.#.###.###.#.#.#########.#.###.#.###.###.#
#.......#...#...#.........#.#.#.#.....#.....#...#...#.......#.........#...#.....#...#...#...#...#.#.#.....#...#.#...........#.#.#.#...#...#.#
#.#########.#.###.#########.#.#.#####.#.#####.###############.#######.#.#.#.###.###.#.###.###.###.#.#####.#.###.###.#########.#.#.###.###.###
#.#...#.....#...#...#.#.....#.#...#.#...#.............#.....#.....#...#.#.#...#...#.#...#...#.....#...#...#.#...#...#...#...#...#.#...#.#...#
#.#.#.#.#####.#.###.#.#.#####.###.#.#####.###########.#.###.#####.#####.#.###.###.#.#.#####.#########.#.###.#.###.###.#.#.#####.#.#.###.###.#
#.#.#.#.........#.....#.#.....#...#.....#.#.#.......#...#.#.#...#.......#...#.#...#...#...#.......#.......#.#.#...#...#.#.......#.......#.#.#
#.###.###.###.#.#.###.#.###.###.#.#####.#.#.#.#.###.#####.#.#.#.###.#####.###.#.#####.#.#.#######.###.#####.#.#.###.###.###############.#.#.#
#...#.#.......#.#...#.....#.#...#.#...#.....#.#...#.....#.#...#...#...#...#...#.....#...#.......#...#.......#.#.#...#.....#...........#...#.#
###.#.#.#.###.#.###.#####.###.#####.#.#######.###.#####.#.#######.#####.###.#.#####.###.#.#####.###.#######.#.###.#######.#.#.#######.#####.#
#.#.#.#...#...#.#.#...#.....#.#.....#.#...#...#.......#.#.......#.....#.....#.....#.....#...#.....#...#.....#...#.......#.....#...#.#.....#.#
#.#.#.###.#.#.#.#.###.###.#.#.#.#####.#.#.#.###.###.###.#.#####.#####.#.#####.#.#.###.###.#.#.###.#.#.#.###.###.#####.#.#.#####.#.#.#####.#.#
#...................#.....#...#.....#...#.....#.#...#...#.#...#.....#.#...#...#.#.#...#...#...#.....#...#...........#.#.#.#.....#...........#
#.###.#.#.###.#####.#####.#.#######.#########.#.#####.###.#.#.#####.#.###.#####.#.###.#.#.#########.#####.###########.#.#.#.#####.#.#.#####.#
#.#.#...#.........#...#...#.#.......#.....#.....#.....#...#.#.#...#.....#.......#.#...#.#.#.......#.......#.......#...#.#.#...#.#.#.#.....#.#
#.#.#.#.#.###.###.#####.#####.#######.###.#.###.#.#####.###.#.#.#.#####.#########.#.#.#.###.#####.#.#####.#.#####.#.###.#.###.#.#.#.#####.#.#
#.#...#.......#...#...#.......#.......#.#.#.....#.#.....#...#...#.....#.....#.....#.#.#.....#.....#.#.........#...........#.#.#.#.#.....#...#
#.#.###.#.###.#.###.#.#########.#######.#.#.#####.#######.###########.#####.#####.#.#########.#####.#.#######.###########.#.#.#.#.###.#.###.#
#.#...#.#.....#.....#.........#.#.......#.#.....#.#.....#.......#...#.....#.....#.#.......#...#...#.#.......#...#...#...#.#.#.#.#...#.#.#...#
#.###.#.#.#.#.###.#######.#.###.#.#####.#.#####.#.#.###.#.#.###.#.###.###.#####.#.#.#.###.#.###.#.#########.###.#.#.#.#.#.#.#.#.###.#.###.###
#...#.#.#...........#.....#.#...#.#.#...#.....#.#...#...#.#.#.#.#.#.....#.#...#.#...#...#.#.....#.........#.#...#.#...#.#...#...#.#.#.....#.#
###.#.#.#.###.###.#.#.#######.###.#.#.#.#####.#.#####.#.#.#.#.#.#.#.###.#.#.###.#.#.###.#.#############.###.#.###.#####.#######.#.#.#.#####.#
#.................#.#.....#...#...#.#.......#.#.#.....#.#...#.#.#.#.#.#.#.#...#.#.#...#.....#.....#...#...#.#...#...#...#...#...#.#.#.......#
#.#.###.#.###.#.#########.#.###.#.#.#######.#.###.###########.#.#.#.#.#.#.###.#.#.###.###.#.#.###.#.#.###.#.###.#.###.###.#.#.###.#.#.###.#.#
#.#...#.#.#...#.#.........#.#...#.#.........#.....#...#...#...#.#.#.#.#.#.#...#.#.#.....#.#...#.#...#...#...#.#.#.#...#.......#...#.#.....#.#
#.###.#.#.#.#.#.#.#####.#.#.#.###.###.#.#########.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#####.#.#.###.#######.#####.#.#.#.###.#######.#.#.#######.#
#...#.#...#.#.........#...#.#.#.#...#...#.....#...#.#...#...#.....#.#.....#...#.#...#...#...#.....#.....#.....#...#.....#.....#.#.#.#.......#
#.###.#.#.#.###.#####.#.###.#.#.###.###.#.###.#.###.###########.#.#.#.#.###.###.###.#######.#.#####.#####.#.#####.#######.###.#.#.#.#.#.#####
#.#...#...#.#.#...#...#...#.#.....#...#...#...#...#...............#.....#...#...#...........#.#...#...#.#.#...........#.#...#...#.#.#.......#
#.#.#####.#.#.###.#.#####.#.#.#####.#.###########.###.#######.###.#########.#.###############.#.#.###.#.#.#########.#.#.#.#.###.###.###.###.#
#...#.....#.#.....#.....#.#.#.#...#.#.............#...#...#...#.#.#.........#.........#.........#...#.#...........#.#.#.....#...#...#.....#.#
#.#####.#.#.###.#######.###.###.#.###############.#.###.#.#.#.#.#.#.#.###############.###########.###.#.#####.#####.#.#####.#####.###.#.###.#
#.#.....#.#...#...#...#...#.....#.....#.........#.#...#.#...#...#...#.#.............#...#.............#.#...#.....#.#.......#...#.#.#.#...#.#
#.#.#####.#.#.###.#.#.###.###########.#.#######.#####.#.#####.###.#.#.#.###########.###.#.#####.###.#####.#.#.###.#.#########.#.#.#.#.#.#.#.#
#...#...........#.#.#.#.#...........#...#...#.#.......#.#.#.......#.#...#.........#.....#.....#...#...#...#...#.#...#.........#.#.#.#.#.#...#
#####.#.#.#.###.#.#.#.#.#.#.###.###.#####.#.#.#########.#.#.#######.###.#####.###.###########.###.###.#.#######.#.###.#########.#.#.#.#.#####
#.............#...#.#...#...#.#.#...#.....#...#.........#.........#...#.....#...#...#...#...#...#.#.....#.....#.#.#...#.......#...#.#...#...#
#.#.#####.#.###.###.#########.#.#.#####.#######.###.#############.###.###.#.#####.#.#.#.#.#.###.#.#####.#.###.#.#.#.###.#.#######.#.###.###.#
#.#.#.....#.#...#.............#.#.#...#...#.......#.....#.......#.#.#.....#.......#.#.#...#.#...#.#...#.#.....#...#.#...#.#.....#.....#.#...#
#.###.###.#.#.###.#.###.#.#####.#.#.#.###.#.###########.#.#####.#.#.#############.#.#.#####.#.###.#.#.###.#.###.###.#.###.#.###.#.#.###.#.#.#
#...#.#.#.#...#.....#...#.#.....#...#.#...#.#...#.....#.#...#...#...#.....#.......#.....#.#...#...#.#.....#...#...#.#.#...#.#.#...#...#...#.#
###.#.#.#.#.#########.###.#.#########.#.#.#.###.#.###.#.###.#.#####.#.###.#.###.###.###.#.#####.###.#########.#####.#.#####.#.###.###.#.#.#.#
#...#...#.#.#.......#.#.......#.....#.#.#.#...#.#...#.....#.#...#.....#...#...#.....#...#.#.........#.......#.....#.#.#.....#.....#.#...#...#
#.###.###.#.###.###.#.#.#####.#.###.#.#.#.###.#.###.#######.###.#############.#######.###.#.#########.#####.#####.#.#.#.#####.###.#.#.#.#.###
#...#.#...#...#...#...#.#...#.#...#.....#.#.#.#...#.......#...#...........#...#.......#...#.#...#.........#.....#.....#.......#.....#.#.#.#.#
#.#.#.#.#####.###.#####.#.#.#.###########.#.#.###.#######.###.#######.###.#.#########.#.###.#.#.#.#########.#.#######.###.#.#####.#.#.#.#.#.#
#.#...#.....#...#...#.....#.#.......#...#...#...#.......#.....#.......#...#.......#...#.....#.#.#...#.......#.......#.....#.....#...#.....#.#
#.#######.#####.#.#.#######.#######.#.#.#######.#.#####.#############.#.#########.#.#.#####.#.#.###.#.#########.#.###.###.#.###.#.#####.#.#.#
#.#.....#.#...#.#.#.#...#...#.....#...#.#.......#.#.....#.............#.........#.#...#...#...#...#.#...#.......#...#.#...#.#...#.......#...#
#.###.###.#.#.#.#.#.#.#.#####.###.#####.#.#######.#####.#####.#.#.#.#.#######.###.#.###.#.###.#.#.#.###.#.###.#.###.#.#.#.#.#.#########.#.#.#
#...#...#.#.#.#.#.#...#...#...#.#...#...#...#.#...#...#.#.....#...#.#.#.#.....#...#...#.#.......#.#...#.#...#.#.....#.#.#...#.......#.#.....#
###.###.#.#.#.#.#.#######.#.###.#.###.#####.#.#.#.#.#.#.#.#####.###.#.#.#.#.###.###.#.#.#########.###.#.###.#.#.#.###.#####.#######.#.###.#.#
#.#...#.#...#...#.#.....#...........#.....#.....#...#.#.#.#.#...#...#...#.#.#...#...#.......#.....#...#...#.#...#...#.....#.#.#.....#.....#.#
#.#.#.#.#####.###.#####.###########.###.###.#.###.#.#.#.#.#.#.#####.###.#.###.###.###########.#########.#.#.#######.#####.#.#.#.#####.#####.#
#...#.#...#.....#...#.....#.....#.....#.#...#.#.#...#.#.............#...#.....#.#.....#.#.....#.........#.#.#.....#.......#...#.#.....#.....#
#.#.#.#.###.###.###.#.#####.###.#.###.#.#.###.#.#####.#####.###################.#####.#.#.#####.#######.###.#.#.###############.#.###.#.#####
#.#.#.#...#...#.#.....#...#...#...#...#...#.......#...#.....#.#...........#.........#.#.#.#.....#.......#...#.#...............#.#.#...#.#...#
#.#.#.###.###.#.#.#####.#.###.#####.###############.###.###.#.#.#.#####.###.#######.#.#.#.###.#######.###.#########.#########.#.#.#.###.###.#
#.#.#...#.....#...#.....#.....#...#.......#.......#.#.........#.#.........#.#.....#...#.#...#...#...#.#.#.......#...#.......#...#.#...#.#...#
#.#####.#.#####.###.#.#########.#########.#.#####.#.#.#####.#.#.###.#####.#.#.#.#.#####.###.#.#.#.#.#.#.#.#.#.#.#.###.###########.###.#.#.#.#
#.#.....#.#...#...#...#.#...#...........#.#.....#...#...#...#.#...#.....#...#.#.#.......#...#.#...#.#...#.#.#...#...#.#.........#.#.#.#...#.#
#.#.#######.#.###.###.#.#.#.#.#######.#.#.#####.#######.#.###.###.#####.#######.#######.#.###.#####.#.###.#.#.#.###.#.#.#######.#.#.#.#####.#
#...#.......#.#.....#.#...#.#.#.#...#.#.#.....#.....#.#...#...#.#...............#...#...#.#.#...#...#.#.....#.....#.#...#.....#...#.#.....#.#
#.#####.#####.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###.#.#.###.###.#####.#########.#.#.#####.#.#.#.#.###.#.###.#####.#.#.###.#.#.#####.###.###.#
#.......#...#...#...#.#...#.#.#.#.#.#.#...#...#...#.#.....#...#.#...#.......#.....#...#...#.....#...#.#...#.....#.#.#.....#.#.....#...#.#...#
#########.#.###.#####.#.###.#.#.#.#.#.#####.#######.#.###.###.#.#.#.#.#.###.#.###.###.#.###.#######.#.###.#####.#.#.#######.#####.#.#.#.#.###
#...#.....#...#...#...#.#.#.....#.#...#...........#.#...#...#...#.#...#.#...#.#.....#.#.#.#.#.....#.#.....#.....#.#...#...........#.#.#.....#
#.#.#.#####.#.###.#.###.#.#.#####.###.#.#.###.#.#.#.###.#.###.###.#####.###.#.#.#.###.#.#.#.###.#.#.###.#.#.#.###.###.#######.#.#.#.#.#.###.#
#.#.#.#...#.#...#.#.#.#.#...#.....#...#.....#.#.#.#...#.#...#.#...#...#...#.#.#.#...#.#.#...#...#.#...#.#.#...#.#...#.#.......#.....#.#...#.#
#.###.#.###.#####.#.#.#.###.#.#############.#.#.#.###.###.#.#.#.#####.###.#.#.#.###.#.#.#.###.#.#####.#.#.#.#.#.###.#.#.#####.#######.###.#.#
#.....#...#.#...#...#.#.#...#...#...#...#...#...#...#...#.#...#.......#...#...#...#...#.#.#...#.#...#.#.#.#.#.#...#.#...#...#.....#...#...#.#
#.#######.#.#.#.#####.#.#.#.###.#.#.#.#.#.###.#####.###.###########.###.#########.#####.#.#.###.#.#.#.###.###.#.#.#.#.###.#.#####.#####.###.#
#.........#...#.......#.#.#...#...#.#.#...#.....#.....#.....#...#...#...#.......#.......#...#.....#.#...#.....#.#.#.#.#...#.......#...#.....#
#####.#######.###.###.#.#.###.#####.#.#####.###.#####.#####.#.#.#.###.###.#####.#############.#####.#.#.#######.###.#.###.#####.#.#.#.#####.#
#...#.#.....#...#...#.#.#.#...#...#.#.....#...#.....#.......#.#...#...#.......#.#...........#...#.#.#.#.......#.....#...#.....#.#...#.....#.#
#.#.#.#.###.#######.###.#.#####.#.#.#####.#.#######.#######.#.#####.###.#####.###.#####.###.###.#.#.#####.###.#.#######.#####.#.#######.#.#.#
#.#...#.#...#.....#.#...#.......#.#.......#.#.....#.....#...#.#...#.#.....#...#.........#...#...#.#.......#...#.....#.........#...#...#.#.#.#
#.#####.#.###.###.#.#.###########.###########.#.#.#.#.###.###.#.#.#.#####.#.###.#####.#.#.###.###.#.###############.#.#######.#####.#.###.#.#
#.....#.#.#...#.....#...........#.......#.....#...#.#...#...#.#.#.#...#...#.....#...#.#.#...#.#.....#.......#.....#.#.#...#...#...#.#.#...#.#
#####.#.#.###.#.###.###.#.#####.#.#####.###.###.###.#.#.###.#.###.#.#.#.#.#######.#.###.###.#.#.#####.#####.#.#.#.#.###.#.#.###.#.#.#.#.#.#.#
#...#.#.#.....#.#.........................................#.#...#...#...#.....#...#.....#...#.#.#...#.#...#.#.#.#.#...........#.#...#...#.#.#
#.#.#.#.#####.###.#.###.#.###.#.#.#.#########.#.#.#.#.###.#.###.###.###.#####.#.#########.###.#.###.#.#.#.#.#.#.#####.#.#.#####.#########.#.#
#.#...#.#.....#...#.....#.#...#...#.........#.#.....#...#...#...#.....#.....#.#...#.....#.....#.#...#...#.#...#.....#...#.#.....#.......#...#
#.#####.#.#####.###.#.#.#.#########.###.#####.#.#.###.###.###.###.#.#######.#.###.#.#.#########.#.#.###.#.#######.#.#####.#.#####.###.###.###
#.....#.#.....#.....#.#.#...#.....#...#.....#...#.......#.#...#...#.........#.#.#.#.#.........#...#.....#.....#...#...#.#.#...#.....#...#...#
#####.#.###########.#.#.#.#.#.###.###.#####.###.#.###.#.###.#####.#.#.#.#####.#.#.#########.#.#.###.###.#.#.###.#####.#.#.###.#.#######.###.#
#.....#...#.......#.#.#...#.#...#.#...#.#...#...#...#.#.#...#.....#.#.#.....#.#.#.........#.#...#.......#...............#.....#.#...#...#...#
#.#######.#.#.###.#.#.#.#.#.###.#.#.###.#.###.#.#.#.#.#.#.#####.#.#.###.###.#.#.#########.#.###.#.###.#.###.#.###.#.###.#########.#.#.#.#.###
#.#.......#.#...#...#...#.#...#.#.#...#.#.....#...#.#.#.........#.#.......#.#.#...........................#.#...#.#.........#.....#...#.#.#.#
#.#.#######.#.#.#####.#.#.#.#.#.#.###.#.#######.#.#.#.#.###########.###.###.#.#.###.#.#########.#######.#.#.###.#.#.#######.#.#####.#####.#.#
#.#.#.......#.....#...#.#.#.#...#...............#.#.#.............#...#.#...#.#...#.#.#.......#.........#.......#.#.....#.....#.....#...#.#.#
#.#.#.#######.###.#####.#.#.#######.#.#####.###.#.#.#.#.#########.#.#.#.#.###.###.#.#.#.#####.#.#####.#####.###.#.#.###.#############.#.#.#.#
#S#...........#.........#.........#.........#.........#.............#.....#.......#.#.......#.......#...........#.....#...............#.....#
#############################################################################################################################################

176
day16/maze.go Normal file
View File

@@ -0,0 +1,176 @@
package main
import ( "os"; "fmt"; "strings")
// ----------------------------------------
type Direction uint8
const (
Up Direction = iota
Down Direction = iota
Left Direction = iota
Right Direction = iota
)
// ----------------------------------------
type Path struct {
position [2]uint
direction Direction
}
func (p Path) StepUnbound(d Direction) Path {
switch {
case d == Down: p.position[1]++
case d == Up: p.position[1]--
case d == Left: p.position[0]--
case d == Right: p.position[0]++
}
p.direction = d
return p
}
// ----------------------------------------
type Maze struct {
start [2]uint
end [2]uint
field [][]byte
}
func NewMaze(str string) *Maze {
var maze Maze
for y, line := range strings.Split(str, "\n") {
line_arr := make([]byte, len(line))
for x, char := range []byte(line) {
switch {
case char == 'S':
line_arr[x] = '.'
maze.start = [...]uint{uint(x), uint(y)}
case char == 'E':
line_arr[x] = '.'
maze.end = [...]uint{uint(x), uint(y)}
default: line_arr[x] = char
}
}
maze.field = append(maze.field, line_arr)
}
return &maze
}
func (m *Maze) Step(path Path) []Path {
out := make([]Path, 0, 4)
if m.field[path.position[1] + 1][path.position[0]] == '.' && path.direction != Up {
out = append(out, path.StepUnbound(Down))
}
if m.field[path.position[1] - 1][path.position[0]] == '.' && path.direction != Down {
out = append(out, path.StepUnbound(Up))
}
if m.field[path.position[1]][path.position[0] + 1] == '.' && path.direction != Left {
out = append(out, path.StepUnbound(Right))
}
if m.field[path.position[1]][path.position[0] - 1] == '.' && path.direction != Right {
out = append(out, path.StepUnbound(Left))
}
return out
}
func (m *Maze) Start() Path {
return Path{m.start, Right}
}
func (m *Maze) Finished(path Path) bool {
return m.end == path.position
}
func (m *Maze) Print() {
for _, line := range m.field {
fmt.Println(string(line))
}
}
// ----------------------------------------
type MazeGraph struct {
cost uint
children []*MazeGraph
}
var new_maze_graph_visited map[Path]uint
func NewMazeGraph(m *Maze, start Path, cost uint) *MazeGraph {
children := make([]*MazeGraph, 0, 3)
// finish reached?
if m.Finished(start) { return &MazeGraph{ cost, children } }
// check for loop
value, exists := new_maze_graph_visited[start]
if exists {
if value <= cost { return nil }
}
new_maze_graph_visited[start] = cost
// build subgraphs/ children
for _, path := range m.Step(start) {
var child *MazeGraph
if start.direction != path.direction {
child = NewMazeGraph(m, path, cost + 1001)
} else {
child = NewMazeGraph(m, path, cost + 1)
}
if child != nil { children = append(children, child) }
}
// found dead end
if len(children) == 0 { return nil }
// collapse if there is only one possible way
if len(children) == 0 { return children[0] }
return &MazeGraph{ cost: cost, children: children }
}
func (graph *MazeGraph) Leaves() []*MazeGraph {
out := make([]*MazeGraph, 0)
if len(graph.children) == 0 {
out = append(out, graph)
return out
}
for _, g := range graph.children {
out = append(out, g.Leaves()...)
}
return out
}
// ----------------------------------------
func check(err error) { if err != nil { panic(err) } }
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
maze := NewMaze(input)
var best *MazeGraph
new_maze_graph_visited = make(map[Path]uint)
for _, leave := range NewMazeGraph(maze, maze.Start(), 0).Leaves() {
if best == nil || best.cost > leave.cost { best = leave }
}
fmt.Println(best.cost)
}

125
day17/computer.go Normal file
View File

@@ -0,0 +1,125 @@
package main
import ("math"; "errors"; "strconv"; "strings"; "fmt"; "os")
//---------------------------------------------------------
func check(err error) { if err != nil { panic(err) } }
//---------------------------------------------------------
type Computer struct {
pc uint
ra uint
rb uint
rc uint
mem []byte
}
func NewComputer(input string) *Computer {
registers := strings.Split(input, "\n\n")[0]
memory := strings.Split(strings.Split(input, "\n\n")[1], " ")[1]
lines := strings.Split(registers, "\n")
ra, err := strconv.Atoi(strings.TrimSpace(strings.Split(lines[0], ":")[1]))
check(err)
rb, err := strconv.Atoi(strings.TrimSpace(strings.Split(lines[1], ":")[1]))
check(err)
rc, err := strconv.Atoi(strings.TrimSpace(strings.Split(lines[2], ":")[1]))
check(err)
mem := make([]byte, 0)
for _, str := range strings.Split(memory, ",") {
num, err := strconv.Atoi(str)
check(err)
mem = append(mem, byte(num))
}
return &Computer{ pc: 0, ra: uint(ra), rb: uint(rb), rc: uint(rc), mem: mem }
}
func (c *Computer) literalop() uint {
// current literal operator
return uint(c.mem[c.pc + 1])
}
func (c *Computer) comboop() uint {
// current combo operator
val := uint(c.mem[c.pc + 1])
switch {
case val == 4: val = c.ra
case val == 5: val = c.rb
case val == 6: val = c.rc
case val == 7: panic("invalid program")
}
return val
}
func (c *Computer) adv(op uint) uint {
// division
numerator := c.ra
denominator := math.Pow(2, float64(op))
return uint(float64(numerator) / float64(denominator))
}
func (c *Computer) bxl(op uint) uint {
// bitwise xor
return c.rb ^ op
}
func (c *Computer) bst(op uint) uint {
// mod 8
return op % 8
}
func (c *Computer) jnz(op uint) {
// jump if non zero
if c.ra == 0 {
return
} else {
c.pc = op - 2
return
}
}
func (c *Computer) bxc() uint {
// bitwise xor
return c.rb ^ c.rc
}
func (c *Computer) out(op uint) {
fmt.Print(op % 8, ",")
}
func (c *Computer) tick() error {
// returns an error if the program halts
if c.pc >= uint(len(c.mem)) { return errors.New("halted") }
instr := c.mem[c.pc]
switch {
case instr == 0: c.ra = c.adv(c.comboop())
case instr == 1: c.rb = c.bxl(c.literalop())
case instr == 2: c.rb = c.bst(c.comboop())
case instr == 3: c.jnz(c.literalop())
case instr == 4: c.rb = c.bxc()
case instr == 5: c.out(c.comboop())
case instr == 6: c.rb = c.adv(c.comboop())
case instr == 7: c.rc = c.adv(c.comboop())
}
c.pc += 2
return nil
}
//---------------------------------------------------------
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
comp := NewComputer(input)
for comp.tick() == nil {}
}

5
day17/data.txt Normal file
View File

@@ -0,0 +1,5 @@
Register A: 41644071
Register B: 0
Register C: 0
Program: 2,4,1,2,7,5,1,7,4,4,0,3,5,5,3,0

107
day17/reversed.go Normal file
View File

@@ -0,0 +1,107 @@
package main
import (
"fmt"
"strconv"
)
func reverseSlice(slice []uint) {
for i, j := 0, len(slice)-1; i < j; i, j = i+1, j-1 {
slice[i], slice[j] = slice[j], slice[i]
}
}
func compressedProgram(ra uint) []uint {
out := make([]uint, 0)
var A, B uint
A = ra
for {
B = ((A % 8) ^ 2) ^ 7 ^ (A >> ((A % 8) ^ 2))
A = A >> 3
out = append(out, B%8)
if A == 0 {
break
}
}
return out
}
func reversedProgram(out []uint) uint {
reverseSlice(out)
A := uint(0)
for _, o := range out {
// find next n bits so that o is returned
n := 2
searching := true
for searching {
n++
// for every combination of n bits
for i := range 1 << n {
A_ := (A << n) + uint(i)
//fmt.Println("add", i, "as binary with", n, "bits")
//fmt.Println("old", strconv.FormatUint(uint64(A), 2))
//fmt.Println("new", strconv.FormatUint(uint64(A_), 2))
if o == ((A_%8)^2)^7^(A_>>((A_%8)^2))%8 {
A = A_
//fmt.Println("valid")
//fmt.Println("yields", compressedProgram(A))
searching = false
break
}
//fmt.Println("invalid")
}
}
}
return A
}
func main() {
/*
fmt.Println(input)
a := uint64(0)
for _, elem := range input {
expected_d := elem ^ 7
for b := range 8 {
e := uint64(b ^ 2)
c := (((a << 3) | uint64(b)) >> (e)) % 8
actual_d := c ^ e
if uint64(expected_d) == actual_d {
fmt.Println(b)
fmt.Println(e)
fmt.Println(c)
a = a << 3
a = a | uint64(b)
fmt.Println(strconv.FormatUint(a, 2))
fmt.Println(a, 2)
break
}
}
}
fmt.Println(a)
//fmt.Println(strconv.FormatUint(a, 2))
*/
//fmt.Println(compressedProgram(41644071))
input := []uint{2, 4, 1, 2, 7, 5, 1, 7, 4, 4, 0, 3, 5, 5, 3, 0}
fmt.Println("-- input: ", input, "--")
ra := reversedProgram(input)
fmt.Println("-- ra: ", ra, "--")
}

204
day18/blocked.go Normal file
View File

@@ -0,0 +1,204 @@
package main
import (
"os"
"fmt"
"strings"
"strconv"
)
// ----------------------------------------
type Direction uint8
const (
Up Direction = iota
Down Direction = iota
Left Direction = iota
Right Direction = iota
)
// ----------------------------------------
type Position struct {
coord [2]uint
direc Direction
}
func (p Position) StepUnbound(d Direction) Position {
switch {
case d == Down: p.coord[1]++
case d == Up: p.coord[1]--
case d == Left: p.coord[0]--
case d == Right: p.coord[0]++
}
p.direc = d
return p
}
// ----------------------------------------
type Maze struct {
start [2]uint
end [2]uint
field [][]byte
blocks_added [][2]uint
}
func NewMaze(byte_positions string, bytes_to_load uint, size [2]uint) *Maze {
/* size = [2]unit{x,y} */
var maze Maze
// create board
maze.field = make([][]byte, 0, size[1] + 2)
for i := range size[1] + 2 {
line := make([]byte, size[0] + 2)
for j := range line {
if i == 0 || uint(i) == size[1] + 1 || j == 0 || uint(j) == size[0] + 1 {
line[j] = '#'
} else {
line[j] = '.'
}
}
maze.field = append(maze.field, line)
}
// add byte corruptions
maze.blocks_added = make([][2]uint, 0)
lines := strings.Split(byte_positions, "\n")
for i, line := range lines {
if uint(i) >= bytes_to_load { break }
x, err := strconv.Atoi(strings.Split(line, ",")[0])
check(err)
y, err := strconv.Atoi(strings.Split(line, ",")[1])
check(err)
maze.field[y + 1][x + 1] = '#'
maze.blocks_added = append(maze.blocks_added, [2]uint{uint(x + 1), uint(y + 1)})
}
// set start/ end
maze.start = [2]uint{1,1}
maze.end = size
return &maze
}
func (m *Maze) Step(pos Position) []Position {
out := make([]Position, 0, 4)
if m.field[pos.coord[1] + 1][pos.coord[0]] == '.' && pos.direc != Up {
out = append(out, pos.StepUnbound(Down))
}
if m.field[pos.coord[1] - 1][pos.coord[0]] == '.' && pos.direc != Down {
out = append(out, pos.StepUnbound(Up))
}
if m.field[pos.coord[1]][pos.coord[0] + 1] == '.' && pos.direc != Left {
out = append(out, pos.StepUnbound(Right))
}
if m.field[pos.coord[1]][pos.coord[0] - 1] == '.' && pos.direc != Right {
out = append(out, pos.StepUnbound(Left))
}
return out
}
func (m *Maze) PopCorruptedBlock() [2]uint {
block := m.blocks_added[len(m.blocks_added)-1]
m.blocks_added = m.blocks_added[:len(m.blocks_added)-1]
m.field[block[1]][block[0]] = '.'
return block
}
func (m *Maze) Start() Position {
return Position{m.start, Right}
}
func (m *Maze) Finished(pos Position) bool {
return m.end == pos.coord
}
func (m *Maze) Print() {
for _, line := range m.field {
fmt.Println(string(line))
}
}
// ----------------------------------------
type MazeGraph struct {
cost uint
children []*MazeGraph
}
var new_maze_graph_visited map[Position]uint
func NewMazeGraph(m *Maze, start Position, cost uint) *MazeGraph {
children := make([]*MazeGraph, 0, 3)
// finish reached?
if m.Finished(start) { return &MazeGraph{ cost, children } }
// check for loop
value, exists := new_maze_graph_visited[start]
if exists {
if value <= cost { return nil }
}
new_maze_graph_visited[start] = cost
// build subgraphs/ children
for _, position := range m.Step(start) {
child := NewMazeGraph(m, position, cost + 1)
if child != nil { children = append(children, child) }
}
// found dead end
if len(children) == 0 { return nil }
// collapse if there is only one possible way
if len(children) == 0 { return children[0] }
return &MazeGraph{ cost: cost, children: children }
}
func (graph *MazeGraph) Leaves() []*MazeGraph {
out := make([]*MazeGraph, 0)
if len(graph.children) == 0 {
out = append(out, graph)
return out
}
for _, g := range graph.children {
out = append(out, g.Leaves()...)
}
return out
}
// ----------------------------------------
func check(err error) { if err != nil { panic(err) } }
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
maze := NewMaze(input, 10e10, [2]uint{71,71})
// check if paths exits
var pos [2]uint
new_maze_graph_visited = make(map[Position]uint)
for NewMazeGraph(maze, maze.Start(), 0) == nil {
pos = maze.PopCorruptedBlock()
new_maze_graph_visited = make(map[Position]uint)
}
fmt.Println(pos[0] - 1, ",", pos[1] - 1)
}

3450
day18/data.txt Normal file

File diff suppressed because it is too large Load Diff

191
day18/maze.go Normal file
View File

@@ -0,0 +1,191 @@
package main
import (
"os"
"fmt"
"strings"
"strconv"
)
// ----------------------------------------
type Direction uint8
const (
Up Direction = iota
Down Direction = iota
Left Direction = iota
Right Direction = iota
)
// ----------------------------------------
type Position struct {
coord [2]uint
direc Direction
}
func (p Position) StepUnbound(d Direction) Position {
switch {
case d == Down: p.coord[1]++
case d == Up: p.coord[1]--
case d == Left: p.coord[0]--
case d == Right: p.coord[0]++
}
p.direc = d
return p
}
// ----------------------------------------
type Maze struct {
start [2]uint
end [2]uint
field [][]byte
}
func NewMaze(byte_positions string, bytes_to_load uint, size [2]uint) *Maze {
/* size = [2]unit{x,y} */
var maze Maze
// create board
maze.field = make([][]byte, 0, size[1] + 2)
for i := range size[1] + 2 {
line := make([]byte, size[0] + 2)
for j := range line {
if i == 0 || uint(i) == size[1] + 1 || j == 0 || uint(j) == size[0] + 1 {
line[j] = '#'
} else {
line[j] = '.'
}
}
maze.field = append(maze.field, line)
}
// add byte corruptions
lines := strings.Split(byte_positions, "\n")
for i, line := range lines {
if uint(i) >= bytes_to_load { break }
x, err := strconv.Atoi(strings.Split(line, ",")[0])
check(err)
y, err := strconv.Atoi(strings.Split(line, ",")[1])
check(err)
maze.field[y + 1][x + 1] = '#'
}
// set start/ end
maze.start = [2]uint{1,1}
maze.end = size
return &maze
}
func (m *Maze) Step(pos Position) []Position {
out := make([]Position, 0, 4)
if m.field[pos.coord[1] + 1][pos.coord[0]] == '.' && pos.direc != Up {
out = append(out, pos.StepUnbound(Down))
}
if m.field[pos.coord[1] - 1][pos.coord[0]] == '.' && pos.direc != Down {
out = append(out, pos.StepUnbound(Up))
}
if m.field[pos.coord[1]][pos.coord[0] + 1] == '.' && pos.direc != Left {
out = append(out, pos.StepUnbound(Right))
}
if m.field[pos.coord[1]][pos.coord[0] - 1] == '.' && pos.direc != Right {
out = append(out, pos.StepUnbound(Left))
}
return out
}
func (m *Maze) Start() Position {
return Position{m.start, Right}
}
func (m *Maze) Finished(pos Position) bool {
return m.end == pos.coord
}
func (m *Maze) Print() {
for _, line := range m.field {
fmt.Println(string(line))
}
}
// ----------------------------------------
type MazeGraph struct {
cost uint
children []*MazeGraph
}
var new_maze_graph_visited map[Position]uint
func NewMazeGraph(m *Maze, start Position, cost uint) *MazeGraph {
children := make([]*MazeGraph, 0, 3)
// finish reached?
if m.Finished(start) { return &MazeGraph{ cost, children } }
// check for loop
value, exists := new_maze_graph_visited[start]
if exists {
if value <= cost { return nil }
}
new_maze_graph_visited[start] = cost
// build subgraphs/ children
for _, position := range m.Step(start) {
child := NewMazeGraph(m, position, cost + 1)
if child != nil { children = append(children, child) }
}
// found dead end
if len(children) == 0 { return nil }
// collapse if there is only one possible way
if len(children) == 0 { return children[0] }
return &MazeGraph{ cost: cost, children: children }
}
func (graph *MazeGraph) Leaves() []*MazeGraph {
out := make([]*MazeGraph, 0)
if len(graph.children) == 0 {
out = append(out, graph)
return out
}
for _, g := range graph.children {
out = append(out, g.Leaves()...)
}
return out
}
// ----------------------------------------
func check(err error) { if err != nil { panic(err) } }
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
maze := NewMaze(input, 1024, [2]uint{71,71})
//maze.Print()
var best *MazeGraph
new_maze_graph_visited = make(map[Position]uint)
for _, leave := range NewMazeGraph(maze, maze.Start(), 0).Leaves() {
if best == nil || best.cost > leave.cost { best = leave }
}
fmt.Println(best.cost)
}

402
day19/data.txt Normal file
View File

@@ -0,0 +1,402 @@
rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb
wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur
bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb
wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur
wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur
rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb
rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb
buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb
ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur
uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur
bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu
wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb
rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg
rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb
wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur
wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr
bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr
rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu
rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu
ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb
wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww
ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww
grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb
buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg
gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur
rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw
grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub
wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur
bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur
gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg
uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr
ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur
uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu
grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw
rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr
gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur
bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw
rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg
wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr
uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr
wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur
uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb
urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru
wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur
brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub
gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub
wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur
urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu
wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw
wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur
rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb
rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur
bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur
rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur
rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru
bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb
gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg
bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu
urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur
wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur
ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr
uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur
ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur
gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur
bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg
buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg
urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg
rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb
ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb
wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb
ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg
bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw
ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw
wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb
bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu
wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg
bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur
ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw
rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu
wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw
rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru
guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur
gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw
ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur
bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg
guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw
rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu
uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur
bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug
bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr
bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub
ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw
rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg
ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu
bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg
wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr
grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur
ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw
rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr
urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb
grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub
uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur
gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu
rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb
wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr
ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur
rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub
wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw
ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb
wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg
uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur
bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu
bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu
bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb
wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru
rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu
gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur
ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw
uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub
wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur
urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur
rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug
gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr
bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu
uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur
guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb
bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru
ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr
ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu
gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr
gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu
burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb
bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb
guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug
bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg
bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru
rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur
ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg
rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur
wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg
wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu
burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur
bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg
wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu
gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr
guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg
wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur
wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu
wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg
wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur
bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw
rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr
wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg
grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur
uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu
gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb
grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub
gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu
wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr
urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr
rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru
wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur
gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw
rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg
bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb
bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug
uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw
bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur
ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb
uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur
rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg
bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww
wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur
grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr
brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr
wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur
wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww
bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur
bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur
ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru
bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur
wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg
ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr
gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu
uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu
wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur
brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw
rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb
ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw
wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru
ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur
bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg
wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur
urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw
gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu
uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw
bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu
gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg
wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr
brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur
gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru
wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu
grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg
wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu
wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru
gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub
ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur
guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug
rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur
wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg
wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw
grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr
wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr
gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur
wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr
rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur
brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr
wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg
uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg
brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr
buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg
rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg
ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg
bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr
rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu
wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur
ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu
ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw
grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr
bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug
rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr
burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug
wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr
buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg
wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr
buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu
bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg
burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur
uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu
grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw
wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb
brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru
rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur
rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb
wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur
ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg
gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug
gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw
uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub
uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw
urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu
grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur
bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur
rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb
gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu
bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg
wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur
gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr
rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg
uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu
uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr
uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb
bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur
rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb
rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu
gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb
rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr
buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb
rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur
grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr
rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg
urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb
rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg
wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw
brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur
uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur
grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur
ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww
bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw
wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb
rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru
gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr
ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur
wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur
gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg
ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw
urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub
rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg
uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur
rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw
wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur
rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr
bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu
uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg
buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr
uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur
ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr
uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur
rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur
ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur
bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw
wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur
gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur
rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg
brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu
gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur
rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg
brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg
gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb
wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr
rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru
uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg
gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw
wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb
bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw
urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu
urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg
ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb
wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur
ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu
bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg
ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg
buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur
gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu
guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur
grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw
bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur
ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg
ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu
wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg
wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu
wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur
rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg
brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw
gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw
wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb
ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur
uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu
bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb
wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur
wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr
rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw
wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr
ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr
rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr
wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur
gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw
bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg
gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru
bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg
bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb
guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb
uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww
ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur
wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb
wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb
wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw
ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur
wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur
urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu
bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw
brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug
uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu
wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur
uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur
bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu
brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur
gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur
rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu
buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur
uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu
rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur
rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur
bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur
bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub
rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr
guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb
grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb
rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg
bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb
uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur
bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu
urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg
ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu
grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw
rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg
uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur
grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg
grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb
ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr
wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww
rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur
buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw
wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr
gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb
urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb
bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu
ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww
uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru
bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw
wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww

69
day19/rearrangements.go Normal file
View File

@@ -0,0 +1,69 @@
package main
import (
"fmt"
"strings"
"os"
)
func count(pattern string, towels []string) int {
counter := 0
// Iterate over the map in sorted key order
for _, t := range towels {
if pattern == t { counter++ }
if strings.HasPrefix(pattern, t) {
counter += count(pattern[len(t):], towels)
}
}
return counter
}
func count_with_map(pattern string, pmap map[string]int) int {
counter := 0
for key, val := range pmap {
if pattern == key { return val }
if strings.HasPrefix(pattern, key) {
counter += count_with_map(pattern[len(key):], pmap)
}
}
return counter
}
func construct_pmap(towels []string) map[string]int {
pmap := make(map[string]int)
for _, t := range towels {
pmap[t] = count(t, towels)
}
return pmap
}
func check(err error) {
if err != nil { panic(err) }
}
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
towels := strings.Split(strings.Split(input, "\n\n")[0], ", ")
patterns := strings.Split(input, "\n\n")[1]
// maps pattern to number of combinations
pmap := construct_pmap(towels)
counter := 0
for i, pattern := range strings.Split(patterns, "\n") {
counter += count_with_map(pattern, pmap)
}
fmt.Println(counter)
}

31
day19/towelpatterns.go Normal file
View File

@@ -0,0 +1,31 @@
package main
import (
"fmt"
"regexp"
"strings"
"os"
)
func check(err error) {
if err != nil { panic(err) }
}
func main() {
dat, err := os.ReadFile("data.txt")
check(err)
input := strings.TrimSpace(string(dat))
towels := strings.Split(input, "\n\n")[0]
towels = strings.Replace(towels, ", ", "|", -1)
patterns := strings.Split(input, "\n\n")[1]
r := regexp.MustCompile("^(" + towels + ")+$")
counter := 0
for _, line := range strings.Split(patterns, "\n") {
if r.MatchString(line) { counter++ }
}
fmt.Println(counter)
}