2018 day 12 complete
This commit is contained in:
parent
fc49bd9c94
commit
c7af2e1eb7
185
2018/day12/day12.go
Normal file
185
2018/day12/day12.go
Normal file
@ -0,0 +1,185 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var row map[int]bool
|
||||
var transitions []*Transition
|
||||
|
||||
func main() {
|
||||
inp := StdinToStringSlice()
|
||||
BuildRow(inp[0])
|
||||
for _, v := range inp[2:] {
|
||||
transitions = append(transitions, NewTransition(v))
|
||||
}
|
||||
fmt.Print("St: ")
|
||||
PrintState()
|
||||
for i := 0; i < 20; i++ {
|
||||
Tick()
|
||||
fmt.Printf("%2d: ", i)
|
||||
PrintState()
|
||||
}
|
||||
fmt.Println("Total:", GetSum())
|
||||
}
|
||||
|
||||
func Tick() {
|
||||
m := make(map[int]bool)
|
||||
lowest, highest := 0, 0
|
||||
for i := range row {
|
||||
if i < lowest {
|
||||
lowest = i
|
||||
}
|
||||
if i > highest {
|
||||
highest = i
|
||||
}
|
||||
}
|
||||
for i := lowest - 2; i <= highest+2; i++ {
|
||||
m[i] = GetNextValue(i)
|
||||
}
|
||||
lowest, highest = 0, 0
|
||||
for k := range m {
|
||||
if k < lowest && m[k] {
|
||||
lowest = k
|
||||
}
|
||||
if k > highest && m[k] {
|
||||
highest = k
|
||||
}
|
||||
}
|
||||
row = make(map[int]bool)
|
||||
for i := lowest; i <= highest; i++ {
|
||||
row[i] = m[i]
|
||||
}
|
||||
}
|
||||
|
||||
func GetSum() int {
|
||||
var ret int
|
||||
lowest, highest := 0, 0
|
||||
for i := range row {
|
||||
if i < lowest {
|
||||
lowest = i
|
||||
}
|
||||
if i > highest {
|
||||
highest = i
|
||||
}
|
||||
}
|
||||
for i := lowest; i <= highest; i++ {
|
||||
if row[i] {
|
||||
ret += i
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func BuildRow(inp string) {
|
||||
inp = strings.Split(inp, ": ")[1]
|
||||
row = make(map[int]bool)
|
||||
for i, v := range inp {
|
||||
row[i] = rb(v)
|
||||
}
|
||||
}
|
||||
|
||||
func GetIdxValue(idx int) byte {
|
||||
var ret byte
|
||||
for i := idx + 2; i >= idx-2; i-- {
|
||||
ret = ret << 1
|
||||
if row[i] {
|
||||
ret = ret | 1
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetNextValue(idx int) bool {
|
||||
idxVal := GetIdxValue(idx)
|
||||
for _, v := range transitions {
|
||||
if v.GetValue() == idxVal {
|
||||
return v.next
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func GetValueString(b byte) string {
|
||||
var ret string
|
||||
for i := 0; i < 5; i++ {
|
||||
if (b & 1) == 1 {
|
||||
ret = ret + "#"
|
||||
} else {
|
||||
ret = ret + "."
|
||||
}
|
||||
b = b >> 1
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func PrintState() {
|
||||
lowest, highest := -2, 30
|
||||
for i := range row {
|
||||
if i < lowest {
|
||||
lowest = i
|
||||
}
|
||||
if i > highest {
|
||||
highest = i
|
||||
}
|
||||
}
|
||||
fmt.Print("(", lowest, ") ")
|
||||
for i := lowest; i <= highest; i++ {
|
||||
if row[i] {
|
||||
fmt.Print("#")
|
||||
} else {
|
||||
fmt.Print(".")
|
||||
}
|
||||
}
|
||||
fmt.Println(" (", highest, ") ")
|
||||
}
|
||||
|
||||
type Transition struct {
|
||||
state []bool
|
||||
next bool
|
||||
}
|
||||
|
||||
func NewTransition(inp string) *Transition {
|
||||
var state []bool
|
||||
var next bool
|
||||
pts := strings.Split(inp, " => ")
|
||||
for i := len(pts[0]) - 1; i >= 0; i-- {
|
||||
state = append(state, bb(pts[0][i]))
|
||||
}
|
||||
next = bb(pts[1][0])
|
||||
t := &Transition{
|
||||
state: state,
|
||||
next: next,
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *Transition) GetValue() byte {
|
||||
var ret byte
|
||||
for _, v := range t.state {
|
||||
ret = ret << 1
|
||||
if v {
|
||||
ret = ret | 1
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func rb(r rune) bool {
|
||||
return bb(byte(r))
|
||||
}
|
||||
func bb(b byte) bool {
|
||||
return b == '#'
|
||||
}
|
||||
|
||||
func StdinToStringSlice() []string {
|
||||
var input []string
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
input = append(input, scanner.Text())
|
||||
}
|
||||
return input
|
||||
}
|
34
2018/day12/input
Normal file
34
2018/day12/input
Normal file
@ -0,0 +1,34 @@
|
||||
initial state: ##.#..########..##..#..##.....##..###.####.###.##.###...###.##..#.##...#.#.#...###..###.###.#.#
|
||||
|
||||
####. => #
|
||||
##.#. => .
|
||||
.##.# => .
|
||||
..##. => .
|
||||
..... => .
|
||||
.#.#. => #
|
||||
.###. => .
|
||||
.#.## => .
|
||||
#.#.# => .
|
||||
.#... => #
|
||||
#..#. => #
|
||||
....# => .
|
||||
###.. => .
|
||||
##..# => #
|
||||
#..## => #
|
||||
..#.. => .
|
||||
##### => .
|
||||
.#### => #
|
||||
#.##. => #
|
||||
#.### => #
|
||||
...#. => .
|
||||
###.# => .
|
||||
#.#.. => #
|
||||
##... => #
|
||||
...## => #
|
||||
.#..# => .
|
||||
#.... => .
|
||||
#...# => .
|
||||
.##.. => #
|
||||
..### => .
|
||||
##.## => .
|
||||
..#.# => #
|
16
2018/day12/testinput
Normal file
16
2018/day12/testinput
Normal file
@ -0,0 +1,16 @@
|
||||
initial state: #..#.#..##......###...###
|
||||
|
||||
...## => #
|
||||
..#.. => #
|
||||
.#... => #
|
||||
.#.#. => #
|
||||
.#.## => #
|
||||
.##.. => #
|
||||
.#### => #
|
||||
#.#.# => #
|
||||
#.### => #
|
||||
##.#. => #
|
||||
##.## => #
|
||||
###.. => #
|
||||
###.# => #
|
||||
####. => #
|
Loading…
Reference in New Issue
Block a user