diff --git a/28_number_spiral_diagonals/main.go b/28_number_spiral_diagonals/main.go new file mode 100644 index 0000000..1e68bec --- /dev/null +++ b/28_number_spiral_diagonals/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "errors" + "fmt" +) + +func main() { + nums, _ := findSprialDiagonals(1001) + sum := 0 + for _, n := range nums { + sum += n + } + fmt.Printf("nums=%v\nsum=%d\n", nums, sum) +} + +func findSprialDiagonals(width int) ([]int, error) { + if width%2 == 0 { + return nil, errors.New("invalid width") + } + x := 3 + ret := []int{1} + cw := 3 + d := 2 + for width/cw > 0 { + ret = append(ret, []int{x, x + d, x + 2*d, x + 3*d}...) + x = x + 3*d + cw + 1 + cw += 2 + d = cw - 1 + } + return ret, nil +} diff --git a/28_number_spiral_diagonals/main_test.go b/28_number_spiral_diagonals/main_test.go new file mode 100644 index 0000000..da53740 --- /dev/null +++ b/28_number_spiral_diagonals/main_test.go @@ -0,0 +1,61 @@ +package main + +import ( + "reflect" + "testing" +) + +func Test_findSprialDiagonals(t *testing.T) { + type args struct { + width int + } + tests := []struct { + name string + args args + want []int + wantErr bool + }{ + { + "1", + args{1}, + []int{1}, + false, + }, + { + "2", + args{2}, + nil, + true, + }, + { + "3", + args{3}, + []int{1, 3, 5, 7, 9}, + false, + }, + { + "5", + args{5}, + []int{1, 3, 5, 7, 9, 13, 17, 21, 25}, + false, + }, + { + "7", + args{7}, + []int{1, 3, 5, 7, 9, 13, 17, 21, 25, 31, 37, 43, 49}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := findSprialDiagonals(tt.args.width) + if (err != nil) != tt.wantErr { + t.Errorf("findSprialDiagonals() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("findSprialDiagonals() = %v, want %v", got, tt.want) + } + }) + } +}