76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
package day25
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"math"
|
|
)
|
|
|
|
type Lock struct {
|
|
diagram string
|
|
combination int
|
|
}
|
|
|
|
type Key struct {
|
|
diagram string
|
|
combination int
|
|
}
|
|
|
|
type Pair struct {
|
|
l Lock
|
|
k Key
|
|
}
|
|
|
|
func Part1(input string) int {
|
|
data := strings.Split(input, "\n\n")
|
|
locks := make([]Lock, 0)
|
|
keys := make([]Key, 0)
|
|
pairs := make([]Pair, 0)
|
|
|
|
for _, in := range data {
|
|
if in[0] == '#' {
|
|
locks = append(locks, Lock{diagram: in, combination: combination(in, '.') })
|
|
} else {
|
|
keys = append(keys, Key{diagram: in, combination: combination(in, '#')})
|
|
}
|
|
}
|
|
|
|
for _, l := range locks {
|
|
for _, k := range keys {
|
|
if key_fits(l.combination, k.combination) {
|
|
pairs = append(pairs, Pair{l: l, k: k})
|
|
}
|
|
}
|
|
}
|
|
fmt.Printf("locks: %d, keys: %d\n", len(locks), len(keys))
|
|
fmt.Printf("pair0 lock\n%s\n%d\n", pairs[0].l.diagram , pairs[0].l.combination)
|
|
fmt.Printf("pair0 key\n%s\n%d\n",pairs[0].k.diagram, pairs[0].k.combination)
|
|
return len(pairs)
|
|
}
|
|
|
|
func Part2(input string) int {
|
|
return 0
|
|
}
|
|
|
|
func combination(d string, k rune) int {
|
|
comb := 0
|
|
rows := strings.Split(d, "\n")
|
|
columns := len(rows[0])
|
|
for _, r := range rows {
|
|
for i, c := range r {
|
|
if c == k {
|
|
comb += 1 * int(math.Pow10(columns - i - 1))
|
|
}
|
|
}
|
|
}
|
|
return comb
|
|
}
|
|
|
|
func key_fits(l int, k int) bool {
|
|
for i:=1;i<6;i++ {
|
|
ll := l % int(math.Pow10(i))
|
|
kk := k % int(math.Pow10(i))
|
|
if ll < kk { return false }
|
|
}
|
|
return true
|
|
} |