|
@@ -0,0 +1,60 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "slices"
|
|
|
+ "testing"
|
|
|
+)
|
|
|
+
|
|
|
+func TestExamples(t *testing.T) {
|
|
|
+ cases := []struct {
|
|
|
+ start []uint64
|
|
|
+ steps int
|
|
|
+ expected []uint64
|
|
|
+ }{
|
|
|
+ {[]uint64{0, 1, 10, 99, 999}, 1,
|
|
|
+ []uint64{1, 2024, 1, 0, 9, 9, 2021976},
|
|
|
+ },
|
|
|
+ {[]uint64{125, 17}, 6,
|
|
|
+ []uint64{2097446912, 14168, 4048, 2, 0, 2, 4, 40, 48, 2024, 40, 48, 80, 96, 2, 8, 6, 7, 6, 0, 3, 2},
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, c := range cases {
|
|
|
+ actual := make([]uint64, 0, 64)
|
|
|
+ previous := make([]uint64, len(c.start), 64)
|
|
|
+ copy(previous, c.start)
|
|
|
+
|
|
|
+ for i := 0; i < c.steps; i++ {
|
|
|
+ actual = actual[:0]
|
|
|
+ actual = step(previous, actual)
|
|
|
+ if len(actual) > len(previous) {
|
|
|
+ previous = make([]uint64, len(actual), 2*len(previous))
|
|
|
+ }
|
|
|
+ copy(previous, actual)
|
|
|
+ }
|
|
|
+
|
|
|
+ if !slices.Equal(actual, c.expected) {
|
|
|
+ t.Errorf("expected %v; got %v", c.expected, actual)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestExample2(t *testing.T) {
|
|
|
+ start := []uint64{125, 17}
|
|
|
+ expected := 55312
|
|
|
+
|
|
|
+ actual := make([]uint64, 0, 64)
|
|
|
+ previous := make([]uint64, len(start), 64)
|
|
|
+ copy(previous, start)
|
|
|
+
|
|
|
+ for i := 0; i < 25; i++ {
|
|
|
+ actual = actual[:0]
|
|
|
+ actual = step(previous, actual)
|
|
|
+ if len(actual) > len(previous) {
|
|
|
+ previous = make([]uint64, len(actual), 2*len(previous))
|
|
|
+ }
|
|
|
+ copy(previous, actual)
|
|
|
+ }
|
|
|
+ if len(actual) != expected {
|
|
|
+ t.Errorf("expected %d; got %d", expected, len(actual))
|
|
|
+ }
|
|
|
+}
|