day21; a little bit hacky, but working
This commit is contained in:
parent
91dcccf17f
commit
e9ee54b0d9
114
day21/day.go
Normal file
114
day21/day.go
Normal file
@ -0,0 +1,114 @@
|
||||
package day21
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"tools"
|
||||
)
|
||||
|
||||
var revIndex = map[int]int{
|
||||
0: 1,
|
||||
1: 1,
|
||||
2: 6,
|
||||
3: 2,
|
||||
4: 7,
|
||||
5: 3,
|
||||
6: 8,
|
||||
7: 4,
|
||||
}
|
||||
|
||||
func scramble(s string, instr []string, reverse bool) string {
|
||||
sb := []byte(s)
|
||||
for _, inst := range instr {
|
||||
parts := strings.Split(inst, " ")
|
||||
if parts[0] == "swap" && parts[1] == "position" {
|
||||
x, _ := strconv.Atoi(parts[2])
|
||||
y, _ := strconv.Atoi(parts[5])
|
||||
sb[x], sb[y] = sb[y], sb[x]
|
||||
} else if parts[0] == "swap" && parts[1] == "letter" {
|
||||
x := bytes.Index(sb, []byte(parts[2]))
|
||||
y := bytes.Index(sb, []byte(parts[5]))
|
||||
sb[x], sb[y] = sb[y], sb[x]
|
||||
} else if parts[0] == "rotate" && parts[1] == "left" {
|
||||
x, _ := strconv.Atoi(parts[2])
|
||||
if reverse {
|
||||
sb = append(sb[len(sb)-(x%len(sb)):], sb[:len(sb)-(x%len(sb))]...)
|
||||
} else {
|
||||
sb = append(sb[x%len(sb):], sb[:x%len(sb)]...)
|
||||
}
|
||||
} else if parts[0] == "rotate" && parts[1] == "right" {
|
||||
x, _ := strconv.Atoi(parts[2])
|
||||
if reverse {
|
||||
sb = append(sb[x%len(sb):], sb[:x%len(sb)]...)
|
||||
} else {
|
||||
sb = append(sb[len(sb)-(x%len(sb)):], sb[:len(sb)-(x%len(sb))]...)
|
||||
}
|
||||
} else if parts[0] == "rotate" && parts[1] == "based" {
|
||||
var x int
|
||||
if reverse {
|
||||
x = bytes.Index(sb, []byte(parts[6]))
|
||||
x = revIndex[x]
|
||||
sb = append(sb[x%len(sb):], sb[:x%len(sb)]...)
|
||||
} else {
|
||||
x = bytes.Index(sb, []byte(parts[6]))
|
||||
if x >= 4 {
|
||||
x++
|
||||
}
|
||||
x++
|
||||
sb = append(sb[len(sb)-(x%len(sb)):], sb[:len(sb)-(x%len(sb))]...)
|
||||
}
|
||||
} else if parts[0] == "reverse" && parts[1] == "positions" {
|
||||
x, _ := strconv.Atoi(parts[2])
|
||||
y, _ := strconv.Atoi(parts[4])
|
||||
var ns []byte
|
||||
for i := 0; i < x; i++ {
|
||||
ns = append(ns, sb[i])
|
||||
}
|
||||
for i := y; i >= x; i-- {
|
||||
ns = append(ns, sb[i])
|
||||
}
|
||||
sb = append(ns, sb[y+1:]...)
|
||||
} else if parts[0] == "move" && parts[1] == "position" {
|
||||
x, _ := strconv.Atoi(parts[2])
|
||||
y, _ := strconv.Atoi(parts[5])
|
||||
if reverse {
|
||||
c := sb[y]
|
||||
sb = append(sb[:y], sb[y+1:]...)
|
||||
sb = append(sb[:x+1], sb[x:]...)
|
||||
sb[x] = c
|
||||
} else {
|
||||
c := sb[x]
|
||||
sb = append(sb[:x], sb[x+1:]...)
|
||||
sb = append(sb[:y+1], sb[y:]...)
|
||||
sb[y] = c
|
||||
}
|
||||
} else {
|
||||
fmt.Println("ERROR: unknown instruction:", inst)
|
||||
}
|
||||
}
|
||||
|
||||
return string(sb)
|
||||
}
|
||||
|
||||
func Part1(puzzle tools.AoCPuzzle) interface{} {
|
||||
inp := puzzle.GetInputArray()
|
||||
startString := inp[0]
|
||||
password := scramble(startString, inp[1:], false)
|
||||
|
||||
return password
|
||||
}
|
||||
|
||||
func Part2(puzzle tools.AoCPuzzle) interface{} {
|
||||
inp := puzzle.GetInputArray()
|
||||
var rinp []string
|
||||
for x := len(inp) - 1; x > 0; x-- {
|
||||
rinp = append(rinp, inp[x])
|
||||
}
|
||||
startString := "fbgdceah"
|
||||
//startString := "gfdhebac"
|
||||
password := scramble(startString, rinp, true)
|
||||
|
||||
return password
|
||||
}
|
||||
101
inputs/21
Normal file
101
inputs/21
Normal file
@ -0,0 +1,101 @@
|
||||
abcdefgh
|
||||
reverse positions 1 through 6
|
||||
rotate based on position of letter a
|
||||
swap position 4 with position 1
|
||||
reverse positions 1 through 5
|
||||
move position 5 to position 7
|
||||
swap position 4 with position 0
|
||||
swap position 4 with position 6
|
||||
rotate based on position of letter a
|
||||
swap position 0 with position 2
|
||||
move position 5 to position 2
|
||||
move position 7 to position 1
|
||||
swap letter d with letter c
|
||||
swap position 5 with position 3
|
||||
reverse positions 3 through 7
|
||||
rotate based on position of letter d
|
||||
swap position 7 with position 5
|
||||
rotate based on position of letter f
|
||||
swap position 4 with position 1
|
||||
swap position 3 with position 6
|
||||
reverse positions 4 through 7
|
||||
rotate based on position of letter c
|
||||
move position 0 to position 5
|
||||
swap position 7 with position 4
|
||||
rotate based on position of letter f
|
||||
reverse positions 1 through 3
|
||||
move position 5 to position 3
|
||||
rotate based on position of letter g
|
||||
reverse positions 2 through 5
|
||||
rotate right 0 steps
|
||||
rotate left 0 steps
|
||||
swap letter f with letter b
|
||||
rotate based on position of letter h
|
||||
move position 1 to position 3
|
||||
reverse positions 3 through 6
|
||||
rotate based on position of letter h
|
||||
swap position 4 with position 3
|
||||
swap letter b with letter h
|
||||
swap letter a with letter h
|
||||
reverse positions 1 through 6
|
||||
swap position 3 with position 6
|
||||
swap letter e with letter d
|
||||
swap letter e with letter h
|
||||
swap position 1 with position 5
|
||||
rotate based on position of letter a
|
||||
reverse positions 4 through 5
|
||||
swap position 0 with position 4
|
||||
reverse positions 0 through 3
|
||||
move position 7 to position 2
|
||||
swap letter e with letter c
|
||||
swap position 3 with position 4
|
||||
rotate left 3 steps
|
||||
rotate left 7 steps
|
||||
rotate based on position of letter e
|
||||
reverse positions 5 through 6
|
||||
move position 1 to position 5
|
||||
move position 1 to position 2
|
||||
rotate left 1 step
|
||||
move position 7 to position 6
|
||||
rotate left 0 steps
|
||||
reverse positions 5 through 6
|
||||
reverse positions 3 through 7
|
||||
swap letter d with letter e
|
||||
rotate right 3 steps
|
||||
swap position 2 with position 1
|
||||
swap position 5 with position 7
|
||||
swap letter h with letter d
|
||||
swap letter c with letter d
|
||||
rotate based on position of letter d
|
||||
swap letter d with letter g
|
||||
reverse positions 0 through 1
|
||||
rotate right 0 steps
|
||||
swap position 2 with position 3
|
||||
rotate left 4 steps
|
||||
rotate left 5 steps
|
||||
move position 7 to position 0
|
||||
rotate right 1 step
|
||||
swap letter g with letter f
|
||||
rotate based on position of letter a
|
||||
rotate based on position of letter b
|
||||
swap letter g with letter e
|
||||
rotate right 4 steps
|
||||
rotate based on position of letter h
|
||||
reverse positions 3 through 5
|
||||
swap letter h with letter e
|
||||
swap letter g with letter a
|
||||
rotate based on position of letter c
|
||||
reverse positions 0 through 4
|
||||
rotate based on position of letter e
|
||||
reverse positions 4 through 7
|
||||
rotate left 4 steps
|
||||
swap position 0 with position 6
|
||||
reverse positions 1 through 6
|
||||
rotate left 2 steps
|
||||
swap position 5 with position 3
|
||||
swap letter b with letter d
|
||||
swap letter b with letter d
|
||||
rotate based on position of letter d
|
||||
rotate based on position of letter c
|
||||
rotate based on position of letter h
|
||||
move position 4 to position 7
|
||||
9
inputs/21_test
Normal file
9
inputs/21_test
Normal file
@ -0,0 +1,9 @@
|
||||
abcde
|
||||
swap position 4 with position 0
|
||||
swap letter d with letter b
|
||||
reverse positions 0 through 4
|
||||
rotate left 1 step
|
||||
move position 1 to position 4
|
||||
move position 3 to position 0
|
||||
rotate based on position of letter b
|
||||
rotate based on position of letter d
|
||||
3
main.go
3
main.go
@ -20,6 +20,7 @@ import (
|
||||
"aoc2016/day18"
|
||||
"aoc2016/day19"
|
||||
"aoc2016/day20"
|
||||
"aoc2016/day21"
|
||||
"aoc2016/day23"
|
||||
"aoc2016/day24"
|
||||
"flag"
|
||||
@ -59,7 +60,7 @@ func initDayFunctions() {
|
||||
18: {1: day18.Part1, 2: day18.Part2},
|
||||
19: {1: day19.Part1, 2: day19.Part2},
|
||||
20: {1: day20.Part1, 2: day20.Part2},
|
||||
// 21: {1: day21.Part1, 2: day21.Part2},
|
||||
21: {1: day21.Part1, 2: day21.Part2},
|
||||
// 22: {1: day22.Part1, 2: day22.Part2},
|
||||
23: {1: day23.Part1, 2: day23.Part2},
|
||||
24: {1: day24.Part1, 2: day24.Part2},
|
||||
|
||||
Loading…
Reference in New Issue
Block a user