diff --git a/code_kata_230816/binary_tree_test.go b/code_kata_230816/binary_tree_test.go new file mode 100644 index 0000000..5d4afed --- /dev/null +++ b/code_kata_230816/binary_tree_test.go @@ -0,0 +1,119 @@ +package main + +import ( + "testing" +) + +func preOrder(n *node) string { + var ret string + stack := MakeStack() + p := n + for p != nil || !stack.IsEmpty() { + if p != nil { + ret = ret + p.value + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + p = p.right + } + } + return ret +} + +func inOrder(n *node) string { + var ret string + stack := MakeStack() + p := n + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + ret = ret + p.value + p = p.right + } + } + return ret +} + +func postOrder(n *node) string { + var ret string + stack := MakeStack() + p := n + var r *node = nil + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + p = stack.Top().(*node) + if p.right != nil && p.right != r { + p = p.right + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + ret = ret + p.value + r = p + p = nil + } + } + } + return ret +} + +func TestPreOrder(t *testing.T) { + want := "ABDECFG" + got := preOrder(makeBinaryTree()) + if got != want { + t.Errorf("preOrder = %v, want %v\n", got, want) + } +} + +func TestInOrder(t *testing.T) { + want := "DBEAFCG" + got := inOrder(makeBinaryTree()) + if got != want { + t.Errorf("preOrder = %v, want %v\n", got, want) + } +} + +func TestPostOrder(t *testing.T) { + want := "DEBFGCA" + got := postOrder(makeBinaryTree()) + if got != want { + t.Errorf("preOrder = %v, want %v\n", got, want) + } +} + +type node struct { + left *node + right *node + value string +} + +func makeBinaryTree() *node { + return &node{ + left: &node{ + left: &node{ + value: "D", + }, + right: &node{ + value: "E", + }, + value: "B", + }, + right: &node{ + left: &node{ + value: "F", + }, + right: &node{ + value: "G", + }, + value: "C", + }, + value: "A", + } +} diff --git a/code_kata_230816/int_to_string_test.go b/code_kata_230816/int_to_string_test.go new file mode 100644 index 0000000..192bc1f --- /dev/null +++ b/code_kata_230816/int_to_string_test.go @@ -0,0 +1,35 @@ +package main + +import "testing" + +func IntToString(n int) string { + ret := make([]byte, 0) + for n > 0 { + ret = append([]byte{byte('0' + n%10)}, ret...) + n /= 10 + } + return string(ret) +} + +func TestIntToString(t *testing.T) { + tt := []struct { + name string + input int + want string + }{ + {"1", 1, "1"}, + {"12", 12, "12"}, + {"123", 123, "123"}, + {"32123", 32123, "32123"}, + {"1232123", 1232123, "1232123"}, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := IntToString(tc.input) + if got != tc.want { + t.Errorf("IntToString(%d) = %s, want %s\n", tc.input, got, tc.want) + } + }) + } +} diff --git a/code_kata_230816/prime_factors_test.go b/code_kata_230816/prime_factors_test.go new file mode 100644 index 0000000..02ab4cd --- /dev/null +++ b/code_kata_230816/prime_factors_test.go @@ -0,0 +1,45 @@ +package main + +import ( + "reflect" + "testing" +) + +func PrimeFactorsOf(n int) []int { + ret := make([]int, 0) + d := 2 + for d < n { + for n%d == 0 { + ret = append(ret, d) + n /= d + } + d++ + } + if n > 1 { + ret = append(ret, n) + } + return ret +} + +func TestPrimeFactorsOf(t *testing.T) { + tt := []struct { + name string + input int + want []int + }{ + {"1", 1, []int{}}, + {"2", 2, []int{2}}, + {"4", 4, []int{2, 2}}, + {"8", 8, []int{2, 2, 2}}, + {"9", 9, []int{3, 3}}, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := PrimeFactorsOf(tc.input) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("PrimeFactors(%d) = %v, want %v\n", tc.input, got, tc.want) + } + }) + } +} diff --git a/code_kata_230816/stack.go b/code_kata_230816/stack.go new file mode 100644 index 0000000..9e3414a --- /dev/null +++ b/code_kata_230816/stack.go @@ -0,0 +1,35 @@ +package main + +type Stack []interface{} + +func MakeStack() *Stack { + return &Stack{} +} + +func (s Stack) Len() int { + return len(s) +} + +func (s Stack) IsEmpty() bool { + return len(s) == 0 +} + +func (s Stack) Top() interface{} { + if s.IsEmpty() { + return nil + } + return s[len(s)-1] +} + +func (s *Stack) Push(item interface{}) { + *s = append(*s, item) +} + +func (s *Stack) Pop() interface{} { + if s.IsEmpty() { + return nil + } + ret := (*s)[len(*s)-1] + *s = (*s)[:len(*s)-1] + return ret +} diff --git a/code_kata_230817/binary_tree_test.go b/code_kata_230817/binary_tree_test.go new file mode 100644 index 0000000..485909d --- /dev/null +++ b/code_kata_230817/binary_tree_test.go @@ -0,0 +1,117 @@ +package main + +import "testing" + +func preOrder(n *node) string { + stack := MakeStack() + p := n + var ret string + for p != nil || !stack.IsEmpty() { + if p != nil { + ret = ret + p.value + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + p = p.right + } + } + return ret +} + +func inOrder(n *node) string { + var ret string + stack := MakeStack() + p := n + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + ret += p.value + p = p.right + } + } + return ret +} + +func postOrder(n *node) string { + var ret string + stack := MakeStack() + p := n + var r *node = nil + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + p = stack.Top().(*node) + if p.right != nil && p.right != r { + p = p.right + stack.Push(p) + p = p.left + } else { + p = stack.Pop().(*node) + ret += p.value + r = p + p = nil + } + } + } + return ret +} + +func TestPreOrder(t *testing.T) { + want := "ABDECFG" + got := preOrder(makeBinaryTree()) + if got != want { + t.Errorf("preOrder = %s, want %s\n", got, want) + } +} + +func TestInOrder(t *testing.T) { + want := "DBEAFCG" + got := inOrder(makeBinaryTree()) + if got != want { + t.Errorf("inOrder = %s, want %s\n", got, want) + } +} + +func TestPostOrder(t *testing.T) { + want := "DEBFGCA" + got := postOrder(makeBinaryTree()) + if got != want { + t.Errorf("postOrder = %s, want %s\n", got, want) + } +} + +type node struct { + left *node + right *node + value string +} + +func makeBinaryTree() *node { + return &node{ + left: &node{ + left: &node{ + value: "D", + }, + right: &node{ + value: "E", + }, + value: "B", + }, + right: &node{ + left: &node{ + value: "F", + }, + right: &node{ + value: "G", + }, + value: "C", + }, + value: "A", + } +} diff --git a/code_kata_230817/stack.go b/code_kata_230817/stack.go new file mode 100644 index 0000000..9e3414a --- /dev/null +++ b/code_kata_230817/stack.go @@ -0,0 +1,35 @@ +package main + +type Stack []interface{} + +func MakeStack() *Stack { + return &Stack{} +} + +func (s Stack) Len() int { + return len(s) +} + +func (s Stack) IsEmpty() bool { + return len(s) == 0 +} + +func (s Stack) Top() interface{} { + if s.IsEmpty() { + return nil + } + return s[len(s)-1] +} + +func (s *Stack) Push(item interface{}) { + *s = append(*s, item) +} + +func (s *Stack) Pop() interface{} { + if s.IsEmpty() { + return nil + } + ret := (*s)[len(*s)-1] + *s = (*s)[:len(*s)-1] + return ret +}