Combine AoC Repos
This commit is contained in:
111
2016/day02/main.go
Normal file
111
2016/day02/main.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
input := stdinToStringSlice()
|
||||
var press []rune
|
||||
keypad := initKeypad("diamond")
|
||||
pos := '5'
|
||||
for _, i := range input {
|
||||
for _, j := range i {
|
||||
pos = moveFinger(j, pos, keypad)
|
||||
}
|
||||
press = append(press, pos)
|
||||
}
|
||||
fmt.Println("Code: ", string(press))
|
||||
}
|
||||
|
||||
func moveFinger(dir rune, start rune, keypad map[string]rune) rune {
|
||||
// Find the starting button
|
||||
var startX, startY int
|
||||
for k, v := range keypad {
|
||||
if v == start {
|
||||
// Found it
|
||||
strCoords := strings.Split(k, ";")
|
||||
startY = atoi(strCoords[0])
|
||||
startX = atoi(strCoords[1])
|
||||
}
|
||||
}
|
||||
switch dir {
|
||||
case 'U':
|
||||
newY := startY - 1
|
||||
if keypad[itoa(newY)+";"+itoa(startX)] != 0 {
|
||||
return keypad[itoa(newY)+";"+itoa(startX)]
|
||||
}
|
||||
case 'R':
|
||||
newX := startX + 1
|
||||
if keypad[itoa(startY)+";"+itoa(newX)] != 0 {
|
||||
return keypad[itoa(startY)+";"+itoa(newX)]
|
||||
}
|
||||
case 'D':
|
||||
newY := startY + 1
|
||||
if keypad[itoa(newY)+";"+itoa(startX)] != 0 {
|
||||
return keypad[itoa(newY)+";"+itoa(startX)]
|
||||
}
|
||||
case 'L':
|
||||
newX := startX - 1
|
||||
if keypad[itoa(startY)+";"+itoa(newX)] != 0 {
|
||||
return keypad[itoa(startY)+";"+itoa(newX)]
|
||||
}
|
||||
}
|
||||
return start
|
||||
}
|
||||
|
||||
func initKeypad(tp string) map[string]rune {
|
||||
ret := make(map[string]rune)
|
||||
switch tp {
|
||||
case "diamond":
|
||||
ret["0;2"] = '1'
|
||||
ret["1;1"] = '2'
|
||||
ret["1;2"] = '3'
|
||||
ret["1;3"] = '4'
|
||||
ret["2;0"] = '5'
|
||||
ret["2;1"] = '6'
|
||||
ret["2;2"] = '7'
|
||||
ret["2;3"] = '8'
|
||||
ret["2;4"] = '9'
|
||||
ret["3;1"] = 'A'
|
||||
ret["3;2"] = 'B'
|
||||
ret["3;3"] = 'C'
|
||||
ret["4;2"] = 'D'
|
||||
case "square":
|
||||
currKey := 1
|
||||
for i := 0; i < 3; i++ {
|
||||
for j := 0; j < 3; j++ {
|
||||
ret[itoa(i)+";"+itoa(j)] = rune(currKey)
|
||||
currKey++
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func itoa(i int) string {
|
||||
return strconv.Itoa(i)
|
||||
}
|
||||
|
||||
func atoi(i string) int {
|
||||
var ret int
|
||||
var err error
|
||||
if ret, err = strconv.Atoi(i); err != nil {
|
||||
log.Fatal("Invalid Atoi")
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func stdinToStringSlice() []string {
|
||||
var input []string
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
input = append(input, scanner.Text())
|
||||
}
|
||||
return input
|
||||
}
|
||||
Reference in New Issue
Block a user