Compare commits
10 Commits
a498cc2acf
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 636a704dde | |||
| 7272fee707 | |||
| 229a2b9f30 | |||
| 102da06e29 | |||
| 6c463eff43 | |||
| 3c5e92749f | |||
| 3a2a5afac6 | |||
| 1d015253bd | |||
| 19b8711a83 | |||
| e5a179ab5a |
@@ -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
93
day11/stones_cached.go
Normal 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
122
day13/clawmachine.go
Normal 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
1279
day13/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
142
day13/hugeclawmachine.go
Normal file
142
day13/hugeclawmachine.go
Normal 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
500
day14/data.txt
Normal 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
96
day14/easteregg.go
Normal 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
87
day14/safetyfactor.go
Normal 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
71
day15/data.txt
Normal 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
223
day15/gps.go
Normal 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
207
day16/allbestpaths.go
Normal 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
141
day16/data.txt
Normal file
@@ -0,0 +1,141 @@
|
||||
#############################################################################################################################################
|
||||
#.#.....#.........#...#.......#.......#.......#.................#...#...#.........#...#.........#.....#.....#.......#.......#...#.......#..E#
|
||||
#.#.###.#.###.#####.#.#.#####.#.#.###.#.###.###.#####.#.#######.#.###.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.###.#.#####.#.###.###.#.###.#.#.#.#
|
||||
#.....#.#...#.......................#...#...#.....#...#.#.....#.......#...#...#.#...#...........#...#...#.....#.#.....#...#.....#...#.#.....#
|
||||
#.#####.###.#.#.#####.#####.###.###.#########.#####.#####.###.#.#.#.#######.###.#####.#.###.#.#####.#######.###.#.#######.#######.###.#####.#
|
||||
#.#...#.#...#...#...#.....#.#.#...#...........#...#.#.....#...#.#.#...#.......#.#.....#...#.#...#...#...#.....#...#.#...#.........#...#.....#
|
||||
#.#.#.#.#.###.#.###.###.###.#.#.#.#############.#.#.#.#####.###.#.###.#.#####.#.#########.#.###.#.###.#.#.###.#####.#.#.###########.###.#.#.#
|
||||
#...#...#.....#...#...#.....#...#.....#.....#...#.#.#.#...#...#.#.#...#.#.....#.............#...#.#.#.#...#.......#...#...#.........#...#...#
|
||||
###.###.#####.#.#.#.#.#########.###.#.###.#.#.###.#.#.#.#####.#.#.#.###.#.###.###############.#.#.#.#.#####.#####.###.#.###.###########.#####
|
||||
#...#...#...#...#...#.#.#...........#.......#.#.....#.#.....#.#...#.#...#.#.....#...........................#.......#.#...#...#.......#.....#
|
||||
#.###.###.#.#.#.#####.#.#.###.#.#########.#.#.#######.#####.#.#.#.#.#.###.#####.###.#######.#####.#.###.#.#########.###.#.###.#.#####.#####.#
|
||||
#.#...#...#.........#.#...#...#.#.......#...#.......#.#.....#...#.#.#.#.#.........................#.#...#.......#.#...#.#...#.#...#.#...#...#
|
||||
#.#.#######.#.#.#####.#####.###.#.#.#####.#######.#.#.#.###.###.###.#.#.###.#.###.#.#.###.#.#.#####.#.#########.#.###.#.#.###.###.#.###.###.#
|
||||
#.#.......#...#.....#.....#.#.....#.#.....#...#.#...#.#.#...#...#...#.....#.#.......#.#.....#...#.....#...................#...#...#...#...#.#
|
||||
#.#######.#####.###.#####.#.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#####.#.#######.#.#######.#.#####.#########.#.#.###.#.###.###.#.###.#.#
|
||||
#.#...#...#...#.#.#.....#.#...#...#.........#...#...#...#...#.....#...#.....#.#...#...#.#.....#.#.....#.........#.#.#.#...#.........#.#...#.#
|
||||
#.#.###.###.#.#.#.###.#.#.###.###.#########.###.###.#######.#######.#.#.#######.#.#.###.#.#.###.#####.#########.#.#.#.#.###############.###.#
|
||||
#.#.........#.#...#...#...#...#.....#.......#...#.#.......#.#...#.....#...#.....#...#...#.#.....#...#...#.....#.#.....#.................#...#
|
||||
#.###########.#####.#.###.#.#######.#.#######.###.#######.#.###.#.#######.#.#########.###.#######.#####.#.###.#.#.#######.#.#.#########.#####
|
||||
#.#...#.....#...#...#.#...#.....#...#.#.....#.#.....#...#...#...#.#.......#.#.......#...#...#.#.........#...#...#...#.....#.#...#.#.....#...#
|
||||
#.#.#.#####.###.#.###.#.#######.#.###.###.###.###.#.###.#.###.###.#.#.#.###.#.#####.#######.#.#.#####.###.#.#######.#.#.#.#####.#.#.#####.#.#
|
||||
#...#.#.....#.#.#...#.#.#.......#.#.....#...#.....#.#.......#.#...#.#...#...#...#.#...#.....#...#...#.#...#.....#...#.#.#.......#...#...#.#.#
|
||||
#####.#.###.#.#.#.#.#.#.#.#######.###.#.#.#.#######.#.#####.#.#.###.#.###.#.###.#.###.#.#########.#.###.###.#####.###.#.###.#####.###.###.#.#
|
||||
#...............#.#.#.#...#.....#.....#.#.#...#...#.#...#.#.....#...#...#.#.#.......#.#...#.......#.....#.....#...#...#...#.#.......#...#.#.#
|
||||
#.#.#.#.#.###.#.#.#.#####.#.#.#.###.###.#.###.#.#.#.###.#.#.#####.#######.###.#######.#.#.#.###############.#.#.#########.#.#.#####.###.#.#.#
|
||||
#.......#.#.#.#.#.....#...#.#.#...#.#...#...#.#.#.#.....#.#.......#.....#...#...#...#.#...#.#.#.....#.......#.#.#.....#...#.#.#...#.....#.#.#
|
||||
#.#######.#.#.#.###.#.#.#.#.#.#####.#.#####.#.#.#.#######.#####.#.#.###.###.#.###.#.#.#.###.#.#.#.#.###.###.#.#.###.#.#.###.#.#.#.#####.#.#.#
|
||||
#...#.....#...#...#.....#...#.......#...#...#...#...#...#.......#...#...#.#...#...#...#.#...#...#.#.....#...#.#.#...#...#...#...#.....#.#.#.#
|
||||
#.#.###.#######.#.#.#.#.###############.#.#######.#.#.###.###########.#.#.#####.#####.#.###.#.###.#.#######.#.#.#.#####.#.#.#.#######.###.#.#
|
||||
#.#...#...#...........#...#.#...........#.....#...#.#.#...#...#.........#.#.....#.#...#.....#...#...#.....#...#.#.#.....#...............#.#.#
|
||||
#####.#.#.#.#############.#.#.#####.#.###.#####.###.#.#.###.###.#.#####.#.#.#####.#.#############.#.#.###.#####.#.#####.#######.#######.#.#.#
|
||||
#.....#.#.#...#...........#...#...#...#...#.....#.....#...#.....#.#.......#.....#.#...#...#.....#.#.#...#.#...#.#.#...........#.......#...#.#
|
||||
#.#####.#.###.#.###############.#.#.#######.#.###########.#.#####.#.###########.#.###.#.#.###.#.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#####.#
|
||||
#.......#...#.#...#.....#.......#...#.......#.#...........#.#...#.#...#.........#...#...#.....#...#...#.#.#.#.#.#...#.#.......#...#.....#.#.#
|
||||
#.#.###.#.###.###.###.#.#.#############.#####.#.#.###########.#.#.#.###.#########.###.#############.#.#.#.#.#.#.#.###.###########.#.###.#.#.#
|
||||
#.#.....#.....#...#...#.#.....#...#.....#...#.#.....#.........#.#.#.#...#...#...#.....#...#...#...#.#...#...#...#...#.......#.....#.#.....#.#
|
||||
#.###########.#.###.###.###.#.#.#.#.#.#####.#.#####.#.#####.###.#.#.#.###.#.#.#.#######.#.#.#.#.#.#.###############.#######.#.#####.#####.#.#
|
||||
#...........#.#.....#.....#.#.#.#.#.#.#...#.......#.#.#...#.#...#.#.#.....#...#.#...#...#...#...#...#.#.............#.....#...#...#...#...#.#
|
||||
#.#########.#########.###.#.#.#.###.#.#.#.#.#######.#.###.#.#.###.#.###########.#.#.#.###############.#.###############.#.#######.###.#.###.#
|
||||
#.#.......#.#.........#...#.#.#.....#.#.#...#...#...#...#.#.#...#.#...#.#.....#...#...#...#.......#.....#.........#.....#.#.........#.#.....#
|
||||
#.#.#####.#.#.###.###.#.#####.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###.#.#.###.#########.#.#.#####.#.#####.#######.#.#.###.#.#####.###.###.#.#
|
||||
#.........#...#.#.#...#.#.....#.......#.#.#.#.#.#.....#...#.....#.#.#.#.#.#.........#...#...#...#...#.....#...#...#.#...#...#...#.#...#...#.#
|
||||
###.#######.###.#.#.###.#.#####.#######.#.###.#.#####.#######.#.#.#.#.#.#.#.#######.#.#.###.###.#####.#######.#.###.###.#.###.#.###.###.###.#
|
||||
#...#.....#...#.#.#.#...#...#.#.........#.#...#.....#...#.....#.#.#.#.#...#.#.....#.#.#...#.....#.#...#.....#...#.....#.#.#...#.....#...#.#.#
|
||||
#.###.###.###.#.#.#.#.#####.#.#.#######.#.#.#.#.#######.#.#####.#.#.#.#####.###.#.#.#.###.#####.#.#.#.#.###.#.###.###.#.#.#.#######.#.###.#.#
|
||||
#...#.#.#...#...#.#.#.#.....#...#.....#.#.....#.......#.#.#...#...#.#.......#...#.#...#.#.....#.#...#...#.#.........#.#.#.#.#.#.............#
|
||||
###.#.#.###.###.#.###.#.#####.###.###.#.#########.#.#.#.#.#.#.#####.#########.###.#####.#####.#.#####.###.#.#######.###.#.#.#.#.#.#.#.###.#.#
|
||||
#...#.#.#...#.#.#.......#...#.#.......#...#.....#...#.#...#.#.................#...........#...#.#...#.#...#...#...#.....#.#.#.......#...#...#
|
||||
#####.#.#.###.#.#########.#.#.#.###.#######.###.#.###.#####.#########.#################.###.###.#.#.#.###.###.#.#.#########.#.###.#.###.###.#
|
||||
#.......#...#...#.........#.#.#.#.....#.....#...#...#.......#.........#...#.....#...#...#...#...#.#.#.....#...#.#...........#.#.#.#...#...#.#
|
||||
#.#########.#.###.#########.#.#.#####.#.#####.###############.#######.#.#.#.###.###.#.###.###.###.#.#####.#.###.###.#########.#.#.###.###.###
|
||||
#.#...#.....#...#...#.#.....#.#...#.#...#.............#.....#.....#...#.#.#...#...#.#...#...#.....#...#...#.#...#...#...#...#...#.#...#.#...#
|
||||
#.#.#.#.#####.#.###.#.#.#####.###.#.#####.###########.#.###.#####.#####.#.###.###.#.#.#####.#########.#.###.#.###.###.#.#.#####.#.#.###.###.#
|
||||
#.#.#.#.........#.....#.#.....#...#.....#.#.#.......#...#.#.#...#.......#...#.#...#...#...#.......#.......#.#.#...#...#.#.......#.......#.#.#
|
||||
#.###.###.###.#.#.###.#.###.###.#.#####.#.#.#.#.###.#####.#.#.#.###.#####.###.#.#####.#.#.#######.###.#####.#.#.###.###.###############.#.#.#
|
||||
#...#.#.......#.#...#.....#.#...#.#...#.....#.#...#.....#.#...#...#...#...#...#.....#...#.......#...#.......#.#.#...#.....#...........#...#.#
|
||||
###.#.#.#.###.#.###.#####.###.#####.#.#######.###.#####.#.#######.#####.###.#.#####.###.#.#####.###.#######.#.###.#######.#.#.#######.#####.#
|
||||
#.#.#.#...#...#.#.#...#.....#.#.....#.#...#...#.......#.#.......#.....#.....#.....#.....#...#.....#...#.....#...#.......#.....#...#.#.....#.#
|
||||
#.#.#.###.#.#.#.#.###.###.#.#.#.#####.#.#.#.###.###.###.#.#####.#####.#.#####.#.#.###.###.#.#.###.#.#.#.###.###.#####.#.#.#####.#.#.#####.#.#
|
||||
#...................#.....#...#.....#...#.....#.#...#...#.#...#.....#.#...#...#.#.#...#...#...#.....#...#...........#.#.#.#.....#...........#
|
||||
#.###.#.#.###.#####.#####.#.#######.#########.#.#####.###.#.#.#####.#.###.#####.#.###.#.#.#########.#####.###########.#.#.#.#####.#.#.#####.#
|
||||
#.#.#...#.........#...#...#.#.......#.....#.....#.....#...#.#.#...#.....#.......#.#...#.#.#.......#.......#.......#...#.#.#...#.#.#.#.....#.#
|
||||
#.#.#.#.#.###.###.#####.#####.#######.###.#.###.#.#####.###.#.#.#.#####.#########.#.#.#.###.#####.#.#####.#.#####.#.###.#.###.#.#.#.#####.#.#
|
||||
#.#...#.......#...#...#.......#.......#.#.#.....#.#.....#...#...#.....#.....#.....#.#.#.....#.....#.#.........#...........#.#.#.#.#.....#...#
|
||||
#.#.###.#.###.#.###.#.#########.#######.#.#.#####.#######.###########.#####.#####.#.#########.#####.#.#######.###########.#.#.#.#.###.#.###.#
|
||||
#.#...#.#.....#.....#.........#.#.......#.#.....#.#.....#.......#...#.....#.....#.#.......#...#...#.#.......#...#...#...#.#.#.#.#...#.#.#...#
|
||||
#.###.#.#.#.#.###.#######.#.###.#.#####.#.#####.#.#.###.#.#.###.#.###.###.#####.#.#.#.###.#.###.#.#########.###.#.#.#.#.#.#.#.#.###.#.###.###
|
||||
#...#.#.#...........#.....#.#...#.#.#...#.....#.#...#...#.#.#.#.#.#.....#.#...#.#...#...#.#.....#.........#.#...#.#...#.#...#...#.#.#.....#.#
|
||||
###.#.#.#.###.###.#.#.#######.###.#.#.#.#####.#.#####.#.#.#.#.#.#.#.###.#.#.###.#.#.###.#.#############.###.#.###.#####.#######.#.#.#.#####.#
|
||||
#.................#.#.....#...#...#.#.......#.#.#.....#.#...#.#.#.#.#.#.#.#...#.#.#...#.....#.....#...#...#.#...#...#...#...#...#.#.#.......#
|
||||
#.#.###.#.###.#.#########.#.###.#.#.#######.#.###.###########.#.#.#.#.#.#.###.#.#.###.###.#.#.###.#.#.###.#.###.#.###.###.#.#.###.#.#.###.#.#
|
||||
#.#...#.#.#...#.#.........#.#...#.#.........#.....#...#...#...#.#.#.#.#.#.#...#.#.#.....#.#...#.#...#...#...#.#.#.#...#.......#...#.#.....#.#
|
||||
#.###.#.#.#.#.#.#.#####.#.#.#.###.###.#.#########.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#####.#.#.###.#######.#####.#.#.#.###.#######.#.#.#######.#
|
||||
#...#.#...#.#.........#...#.#.#.#...#...#.....#...#.#...#...#.....#.#.....#...#.#...#...#...#.....#.....#.....#...#.....#.....#.#.#.#.......#
|
||||
#.###.#.#.#.###.#####.#.###.#.#.###.###.#.###.#.###.###########.#.#.#.#.###.###.###.#######.#.#####.#####.#.#####.#######.###.#.#.#.#.#.#####
|
||||
#.#...#...#.#.#...#...#...#.#.....#...#...#...#...#...............#.....#...#...#...........#.#...#...#.#.#...........#.#...#...#.#.#.......#
|
||||
#.#.#####.#.#.###.#.#####.#.#.#####.#.###########.###.#######.###.#########.#.###############.#.#.###.#.#.#########.#.#.#.#.###.###.###.###.#
|
||||
#...#.....#.#.....#.....#.#.#.#...#.#.............#...#...#...#.#.#.........#.........#.........#...#.#...........#.#.#.....#...#...#.....#.#
|
||||
#.#####.#.#.###.#######.###.###.#.###############.#.###.#.#.#.#.#.#.#.###############.###########.###.#.#####.#####.#.#####.#####.###.#.###.#
|
||||
#.#.....#.#...#...#...#...#.....#.....#.........#.#...#.#...#...#...#.#.............#...#.............#.#...#.....#.#.......#...#.#.#.#...#.#
|
||||
#.#.#####.#.#.###.#.#.###.###########.#.#######.#####.#.#####.###.#.#.#.###########.###.#.#####.###.#####.#.#.###.#.#########.#.#.#.#.#.#.#.#
|
||||
#...#...........#.#.#.#.#...........#...#...#.#.......#.#.#.......#.#...#.........#.....#.....#...#...#...#...#.#...#.........#.#.#.#.#.#...#
|
||||
#####.#.#.#.###.#.#.#.#.#.#.###.###.#####.#.#.#########.#.#.#######.###.#####.###.###########.###.###.#.#######.#.###.#########.#.#.#.#.#####
|
||||
#.............#...#.#...#...#.#.#...#.....#...#.........#.........#...#.....#...#...#...#...#...#.#.....#.....#.#.#...#.......#...#.#...#...#
|
||||
#.#.#####.#.###.###.#########.#.#.#####.#######.###.#############.###.###.#.#####.#.#.#.#.#.###.#.#####.#.###.#.#.#.###.#.#######.#.###.###.#
|
||||
#.#.#.....#.#...#.............#.#.#...#...#.......#.....#.......#.#.#.....#.......#.#.#...#.#...#.#...#.#.....#...#.#...#.#.....#.....#.#...#
|
||||
#.###.###.#.#.###.#.###.#.#####.#.#.#.###.#.###########.#.#####.#.#.#############.#.#.#####.#.###.#.#.###.#.###.###.#.###.#.###.#.#.###.#.#.#
|
||||
#...#.#.#.#...#.....#...#.#.....#...#.#...#.#...#.....#.#...#...#...#.....#.......#.....#.#...#...#.#.....#...#...#.#.#...#.#.#...#...#...#.#
|
||||
###.#.#.#.#.#########.###.#.#########.#.#.#.###.#.###.#.###.#.#####.#.###.#.###.###.###.#.#####.###.#########.#####.#.#####.#.###.###.#.#.#.#
|
||||
#...#...#.#.#.......#.#.......#.....#.#.#.#...#.#...#.....#.#...#.....#...#...#.....#...#.#.........#.......#.....#.#.#.....#.....#.#...#...#
|
||||
#.###.###.#.###.###.#.#.#####.#.###.#.#.#.###.#.###.#######.###.#############.#######.###.#.#########.#####.#####.#.#.#.#####.###.#.#.#.#.###
|
||||
#...#.#...#...#...#...#.#...#.#...#.....#.#.#.#...#.......#...#...........#...#.......#...#.#...#.........#.....#.....#.......#.....#.#.#.#.#
|
||||
#.#.#.#.#####.###.#####.#.#.#.###########.#.#.###.#######.###.#######.###.#.#########.#.###.#.#.#.#########.#.#######.###.#.#####.#.#.#.#.#.#
|
||||
#.#...#.....#...#...#.....#.#.......#...#...#...#.......#.....#.......#...#.......#...#.....#.#.#...#.......#.......#.....#.....#...#.....#.#
|
||||
#.#######.#####.#.#.#######.#######.#.#.#######.#.#####.#############.#.#########.#.#.#####.#.#.###.#.#########.#.###.###.#.###.#.#####.#.#.#
|
||||
#.#.....#.#...#.#.#.#...#...#.....#...#.#.......#.#.....#.............#.........#.#...#...#...#...#.#...#.......#...#.#...#.#...#.......#...#
|
||||
#.###.###.#.#.#.#.#.#.#.#####.###.#####.#.#######.#####.#####.#.#.#.#.#######.###.#.###.#.###.#.#.#.###.#.###.#.###.#.#.#.#.#.#########.#.#.#
|
||||
#...#...#.#.#.#.#.#...#...#...#.#...#...#...#.#...#...#.#.....#...#.#.#.#.....#...#...#.#.......#.#...#.#...#.#.....#.#.#...#.......#.#.....#
|
||||
###.###.#.#.#.#.#.#######.#.###.#.###.#####.#.#.#.#.#.#.#.#####.###.#.#.#.#.###.###.#.#.#########.###.#.###.#.#.#.###.#####.#######.#.###.#.#
|
||||
#.#...#.#...#...#.#.....#...........#.....#.....#...#.#.#.#.#...#...#...#.#.#...#...#.......#.....#...#...#.#...#...#.....#.#.#.....#.....#.#
|
||||
#.#.#.#.#####.###.#####.###########.###.###.#.###.#.#.#.#.#.#.#####.###.#.###.###.###########.#########.#.#.#######.#####.#.#.#.#####.#####.#
|
||||
#...#.#...#.....#...#.....#.....#.....#.#...#.#.#...#.#.............#...#.....#.#.....#.#.....#.........#.#.#.....#.......#...#.#.....#.....#
|
||||
#.#.#.#.###.###.###.#.#####.###.#.###.#.#.###.#.#####.#####.###################.#####.#.#.#####.#######.###.#.#.###############.#.###.#.#####
|
||||
#.#.#.#...#...#.#.....#...#...#...#...#...#.......#...#.....#.#...........#.........#.#.#.#.....#.......#...#.#...............#.#.#...#.#...#
|
||||
#.#.#.###.###.#.#.#####.#.###.#####.###############.###.###.#.#.#.#####.###.#######.#.#.#.###.#######.###.#########.#########.#.#.#.###.###.#
|
||||
#.#.#...#.....#...#.....#.....#...#.......#.......#.#.........#.#.........#.#.....#...#.#...#...#...#.#.#.......#...#.......#...#.#...#.#...#
|
||||
#.#####.#.#####.###.#.#########.#########.#.#####.#.#.#####.#.#.###.#####.#.#.#.#.#####.###.#.#.#.#.#.#.#.#.#.#.#.###.###########.###.#.#.#.#
|
||||
#.#.....#.#...#...#...#.#...#...........#.#.....#...#...#...#.#...#.....#...#.#.#.......#...#.#...#.#...#.#.#...#...#.#.........#.#.#.#...#.#
|
||||
#.#.#######.#.###.###.#.#.#.#.#######.#.#.#####.#######.#.###.###.#####.#######.#######.#.###.#####.#.###.#.#.#.###.#.#.#######.#.#.#.#####.#
|
||||
#...#.......#.#.....#.#...#.#.#.#...#.#.#.....#.....#.#...#...#.#...............#...#...#.#.#...#...#.#.....#.....#.#...#.....#...#.#.....#.#
|
||||
#.#####.#####.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###.#.#.###.###.#####.#########.#.#.#####.#.#.#.#.###.#.###.#####.#.#.###.#.#.#####.###.###.#
|
||||
#.......#...#...#...#.#...#.#.#.#.#.#.#...#...#...#.#.....#...#.#...#.......#.....#...#...#.....#...#.#...#.....#.#.#.....#.#.....#...#.#...#
|
||||
#########.#.###.#####.#.###.#.#.#.#.#.#####.#######.#.###.###.#.#.#.#.#.###.#.###.###.#.###.#######.#.###.#####.#.#.#######.#####.#.#.#.#.###
|
||||
#...#.....#...#...#...#.#.#.....#.#...#...........#.#...#...#...#.#...#.#...#.#.....#.#.#.#.#.....#.#.....#.....#.#...#...........#.#.#.....#
|
||||
#.#.#.#####.#.###.#.###.#.#.#####.###.#.#.###.#.#.#.###.#.###.###.#####.###.#.#.#.###.#.#.#.###.#.#.###.#.#.#.###.###.#######.#.#.#.#.#.###.#
|
||||
#.#.#.#...#.#...#.#.#.#.#...#.....#...#.....#.#.#.#...#.#...#.#...#...#...#.#.#.#...#.#.#...#...#.#...#.#.#...#.#...#.#.......#.....#.#...#.#
|
||||
#.###.#.###.#####.#.#.#.###.#.#############.#.#.#.###.###.#.#.#.#####.###.#.#.#.###.#.#.#.###.#.#####.#.#.#.#.#.###.#.#.#####.#######.###.#.#
|
||||
#.....#...#.#...#...#.#.#...#...#...#...#...#...#...#...#.#...#.......#...#...#...#...#.#.#...#.#...#.#.#.#.#.#...#.#...#...#.....#...#...#.#
|
||||
#.#######.#.#.#.#####.#.#.#.###.#.#.#.#.#.###.#####.###.###########.###.#########.#####.#.#.###.#.#.#.###.###.#.#.#.#.###.#.#####.#####.###.#
|
||||
#.........#...#.......#.#.#...#...#.#.#...#.....#.....#.....#...#...#...#.......#.......#...#.....#.#...#.....#.#.#.#.#...#.......#...#.....#
|
||||
#####.#######.###.###.#.#.###.#####.#.#####.###.#####.#####.#.#.#.###.###.#####.#############.#####.#.#.#######.###.#.###.#####.#.#.#.#####.#
|
||||
#...#.#.....#...#...#.#.#.#...#...#.#.....#...#.....#.......#.#...#...#.......#.#...........#...#.#.#.#.......#.....#...#.....#.#...#.....#.#
|
||||
#.#.#.#.###.#######.###.#.#####.#.#.#####.#.#######.#######.#.#####.###.#####.###.#####.###.###.#.#.#####.###.#.#######.#####.#.#######.#.#.#
|
||||
#.#...#.#...#.....#.#...#.......#.#.......#.#.....#.....#...#.#...#.#.....#...#.........#...#...#.#.......#...#.....#.........#...#...#.#.#.#
|
||||
#.#####.#.###.###.#.#.###########.###########.#.#.#.#.###.###.#.#.#.#####.#.###.#####.#.#.###.###.#.###############.#.#######.#####.#.###.#.#
|
||||
#.....#.#.#...#.....#...........#.......#.....#...#.#...#...#.#.#.#...#...#.....#...#.#.#...#.#.....#.......#.....#.#.#...#...#...#.#.#...#.#
|
||||
#####.#.#.###.#.###.###.#.#####.#.#####.###.###.###.#.#.###.#.###.#.#.#.#.#######.#.###.###.#.#.#####.#####.#.#.#.#.###.#.#.###.#.#.#.#.#.#.#
|
||||
#...#.#.#.....#.#.........................................#.#...#...#...#.....#...#.....#...#.#.#...#.#...#.#.#.#.#...........#.#...#...#.#.#
|
||||
#.#.#.#.#####.###.#.###.#.###.#.#.#.#########.#.#.#.#.###.#.###.###.###.#####.#.#########.###.#.###.#.#.#.#.#.#.#####.#.#.#####.#########.#.#
|
||||
#.#...#.#.....#...#.....#.#...#...#.........#.#.....#...#...#...#.....#.....#.#...#.....#.....#.#...#...#.#...#.....#...#.#.....#.......#...#
|
||||
#.#####.#.#####.###.#.#.#.#########.###.#####.#.#.###.###.###.###.#.#######.#.###.#.#.#########.#.#.###.#.#######.#.#####.#.#####.###.###.###
|
||||
#.....#.#.....#.....#.#.#...#.....#...#.....#...#.......#.#...#...#.........#.#.#.#.#.........#...#.....#.....#...#...#.#.#...#.....#...#...#
|
||||
#####.#.###########.#.#.#.#.#.###.###.#####.###.#.###.#.###.#####.#.#.#.#####.#.#.#########.#.#.###.###.#.#.###.#####.#.#.###.#.#######.###.#
|
||||
#.....#...#.......#.#.#...#.#...#.#...#.#...#...#...#.#.#...#.....#.#.#.....#.#.#.........#.#...#.......#...............#.....#.#...#...#...#
|
||||
#.#######.#.#.###.#.#.#.#.#.###.#.#.###.#.###.#.#.#.#.#.#.#####.#.#.###.###.#.#.#########.#.###.#.###.#.###.#.###.#.###.#########.#.#.#.#.###
|
||||
#.#.......#.#...#...#...#.#...#.#.#...#.#.....#...#.#.#.........#.#.......#.#.#...........................#.#...#.#.........#.....#...#.#.#.#
|
||||
#.#.#######.#.#.#####.#.#.#.#.#.#.###.#.#######.#.#.#.#.###########.###.###.#.#.###.#.#########.#######.#.#.###.#.#.#######.#.#####.#####.#.#
|
||||
#.#.#.......#.....#...#.#.#.#...#...............#.#.#.............#...#.#...#.#...#.#.#.......#.........#.......#.#.....#.....#.....#...#.#.#
|
||||
#.#.#.#######.###.#####.#.#.#######.#.#####.###.#.#.#.#.#########.#.#.#.#.###.###.#.#.#.#####.#.#####.#####.###.#.#.###.#############.#.#.#.#
|
||||
#S#...........#.........#.........#.........#.........#.............#.....#.......#.#.......#.......#...........#.....#...............#.....#
|
||||
#############################################################################################################################################
|
||||
176
day16/maze.go
Normal file
176
day16/maze.go
Normal 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
125
day17/computer.go
Normal 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
5
day17/data.txt
Normal 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
107
day17/reversed.go
Normal 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
204
day18/blocked.go
Normal 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
3450
day18/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
191
day18/maze.go
Normal file
191
day18/maze.go
Normal 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
402
day19/data.txt
Normal 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
69
day19/rearrangements.go
Normal 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
31
day19/towelpatterns.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user