9
main.go
9
main.go
@@ -3,7 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/thatguygriff/aoc2020/twentyfour"
|
"github.com/thatguygriff/aoc2020/twentyfive"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -100,6 +100,9 @@ func main() {
|
|||||||
// fmt.Println(twentythree.PartTwo())
|
// fmt.Println(twentythree.PartTwo())
|
||||||
|
|
||||||
// Day 24
|
// Day 24
|
||||||
fmt.Println(twentyfour.PartOne())
|
// fmt.Println(twentyfour.PartOne())
|
||||||
fmt.Println(twentyfour.PartTwo())
|
// fmt.Println(twentyfour.PartTwo())
|
||||||
|
|
||||||
|
// Day 25
|
||||||
|
fmt.Println(twentyfive.PartOne())
|
||||||
}
|
}
|
||||||
|
65
twentyfive/day_twentyfive.go
Normal file
65
twentyfive/day_twentyfive.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package twentyfive
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type key struct {
|
||||||
|
public int
|
||||||
|
sub int
|
||||||
|
loopsize int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *key) generatePublic() {
|
||||||
|
v := 1
|
||||||
|
|
||||||
|
for i := 0; i < k.loopsize; i++ {
|
||||||
|
v *= k.sub
|
||||||
|
v %= 20201227
|
||||||
|
}
|
||||||
|
|
||||||
|
k.public = v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *key) encryption(public int) int {
|
||||||
|
v := 1
|
||||||
|
|
||||||
|
for i := 0; i < k.loopsize; i++ {
|
||||||
|
v *= public
|
||||||
|
v %= 20201227
|
||||||
|
}
|
||||||
|
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *key) determineLoopSize() {
|
||||||
|
if k.public == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
v := 1
|
||||||
|
loopsize := 0
|
||||||
|
for v != k.public {
|
||||||
|
v *= k.sub
|
||||||
|
v %= 20201227
|
||||||
|
loopsize++
|
||||||
|
}
|
||||||
|
|
||||||
|
k.loopsize = loopsize
|
||||||
|
}
|
||||||
|
|
||||||
|
// PartOne What encryption key is the handshake trying to establish?
|
||||||
|
func PartOne() string {
|
||||||
|
card := key{
|
||||||
|
public: 2069194,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
door := key{
|
||||||
|
public: 16426071,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
card.determineLoopSize()
|
||||||
|
door.determineLoopSize()
|
||||||
|
|
||||||
|
return fmt.Sprintf("The handshake is trying to establish the key %d", door.encryption(card.public))
|
||||||
|
}
|
63
twentyfive/day_twentyfive_test.go
Normal file
63
twentyfive/day_twentyfive_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package twentyfive
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func Test_generate_encryption(t *testing.T) {
|
||||||
|
card := key{
|
||||||
|
public: 5764801,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
door := key{
|
||||||
|
public: 17807724,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
card.determineLoopSize()
|
||||||
|
door.determineLoopSize()
|
||||||
|
|
||||||
|
if card.loopsize != 8 {
|
||||||
|
t.Logf("expected loop size of 8, got %d", card.loopsize)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
if door.loopsize != 11 {
|
||||||
|
t.Logf("expected loop size of 11, got %d", door.loopsize)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
encryption1 := card.encryption(door.public)
|
||||||
|
encryption2 := door.encryption(card.public)
|
||||||
|
|
||||||
|
if encryption1 != 14897079 {
|
||||||
|
t.Logf("Expected encryption key of 14897079, got %d", encryption1)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
if encryption1 != encryption2 {
|
||||||
|
t.Logf("Expected to generate the same encryption key, got %d and %d", encryption1, encryption2)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_part_one(t *testing.T) {
|
||||||
|
card := key{
|
||||||
|
public: 2069194,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
door := key{
|
||||||
|
public: 16426071,
|
||||||
|
sub: 7,
|
||||||
|
}
|
||||||
|
|
||||||
|
card.determineLoopSize()
|
||||||
|
door.determineLoopSize()
|
||||||
|
|
||||||
|
encryption1 := card.encryption(door.public)
|
||||||
|
|
||||||
|
if encryption1 != 11576351 {
|
||||||
|
t.Logf("Expected encryption key 11576351, got %d", encryption1)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
2
twentyfive/input.txt
Normal file
2
twentyfive/input.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
2069194
|
||||||
|
16426071
|
2
twentyfive/sample.txt
Normal file
2
twentyfive/sample.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
5764801
|
||||||
|
17807724
|
Reference in New Issue
Block a user