From 3b69ef2618263005d0f6dcf618c4e99028bfeee1 Mon Sep 17 00:00:00 2001 From: VicRen Date: Fri, 6 Nov 2020 11:12:16 +0800 Subject: [PATCH] 36: double-base palindromes --- 36_double_base_palindromes/main.go | 42 ++++++++ 36_double_base_palindromes/main_test.go | 131 ++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 36_double_base_palindromes/main.go create mode 100644 36_double_base_palindromes/main_test.go diff --git a/36_double_base_palindromes/main.go b/36_double_base_palindromes/main.go new file mode 100644 index 0000000..bdf51e1 --- /dev/null +++ b/36_double_base_palindromes/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "strconv" + "strings" +) + +func main() { + sum := 0 + for i := 0; i < 1e6; i++ { + if isPalindromeDecimal(i) && isPalindromeString(convertToBinary(i)) { + sum += i + } + } + fmt.Println("sum:", sum) +} + +func isPalindromeDecimal(n int) bool { + return isPalindromeString(strconv.Itoa(n)) +} + +func convertToBinary(num int) string { + s := "" + if num == 0 { + return "0" + } + for ; num > 0; num /= 2 { + lsb := num % 2 + s = strconv.Itoa(lsb) + s + } + return s +} + +func isPalindromeString(s string) bool { + pb := strings.Builder{} + for i := len(s); i > 0; i-- { + pb.WriteString(s[i-1 : i]) + } + pstr := pb.String() + return s == pstr +} diff --git a/36_double_base_palindromes/main_test.go b/36_double_base_palindromes/main_test.go new file mode 100644 index 0000000..4a643fb --- /dev/null +++ b/36_double_base_palindromes/main_test.go @@ -0,0 +1,131 @@ +package main + +import ( + "testing" +) + +func Test_isPalindrome(t *testing.T) { + tt := []struct { + name string + input int + want bool + }{ + { + "1", + 1, + true, + }, + { + "11", + 11, + true, + }, + { + "1001", + 1001, + true, + }, + { + "123456654321", + 123456654321, + true, + }, + { + "123456754321", + 123456754321, + false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := isPalindromeDecimal(tc.input) + if got != tc.want { + t.Errorf("IsPalindrome(%d)=%v, want %v", tc.input, got, tc.want) + } + }) + } +} + +func Test_isPalindromeString(t *testing.T) { + type args struct { + s string + } + tests := []struct { + name string + args args + want bool + }{ + { + "1", + args{"1"}, + true, + }, + { + "11", + args{"11"}, + true, + }, + { + "1001", + args{"1001"}, + true, + }, + { + "123456654321", + args{"123456654321"}, + true, + }, + { + "123456754321", + args{"123456754321"}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isPalindromeString(tt.args.s); got != tt.want { + t.Errorf("isPalindromeString() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_convertToBinary(t *testing.T) { + type args struct { + num int + } + tests := []struct { + name string + args args + want string + }{ + { + "1", + args{1}, + "1", + }, + { + "2", + args{2}, + "10", + }, + { + "3", + args{3}, + "11", + }, + { + "7", + args{7}, + "111", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := convertToBinary(tt.args.num); got != tt.want { + t.Errorf("convertToBinary() = %v, want %v", got, tt.want) + } + }) + } +}