From 091bc3eca3cbbd6caf74587ed7cdf93baaacd0c8 Mon Sep 17 00:00:00 2001 From: miguel Date: Mon, 22 Apr 2024 15:06:39 +0100 Subject: [PATCH 1/7] feat(findspairs): new exam exercise test and solution --- solutions/findpairs/main.go | 54 +++++++++++++++++++++++++++++++++ tests/findpairs_test/main.go | 58 ++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 solutions/findpairs/main.go create mode 100644 tests/findpairs_test/main.go diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go new file mode 100644 index 00000000..0db6d22d --- /dev/null +++ b/solutions/findpairs/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "os" + "strconv" + "strings" +) + +func findPairs(arr []int, targetSum int) [][]int { + var pairs [][]int + for i := 0; i < len(arr); i++ { + for j := i + 1; j < len(arr); j++ { + if arr[i]+arr[j] == targetSum { + pairs = append(pairs, []int{i, j}) + } + } + } + return pairs +} + +func main() { + if len(os.Args) != 3 { + fmt.Println("Usage: go run . [array] ") + return + } + + arrayStr := os.Args[1] + arrayStr = strings.TrimPrefix(arrayStr, "[") + arrayStr = strings.TrimSuffix(arrayStr, "]") + strNums := strings.Split(arrayStr, ",") + var arr []int + for _, strNum := range strNums { + num, err := strconv.Atoi(strings.TrimSpace(strNum)) + if err != nil { + fmt.Printf("Invalid number:%s\n", strNum) + return + } + arr = append(arr, num) + } + + targetSum, err := strconv.Atoi(os.Args[2]) + if err != nil { + fmt.Println("Invalid target sum.") + return + } + + pairs := findPairs(arr, targetSum) + if len(pairs) > 0 { + fmt.Printf("Pairs with sum %d: %v\n", targetSum, pairs) + } else { + fmt.Println("No pairs found.") + } +} diff --git a/tests/findpairs_test/main.go b/tests/findpairs_test/main.go new file mode 100644 index 00000000..63ef9f65 --- /dev/null +++ b/tests/findpairs_test/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "github.com/01-edu/go-tests/lib/challenge" +) + +func main() { + tests := []struct { + arr string + targetSum string + want string + }{ + { + arr: "[1, 2, 3, 4, 5]", + targetSum: "6", + want: "Pairs with sum 6: [[0 4] [1 3]]", + }, + { + arr: "[1, 2, 3, 4, 5, 1]", + targetSum: "6", + want: "Pairs with sum 6: [[0 4] [1 3]]", + }, + { + arr: "[-1, 2, -3, 4, -5]", + targetSum: "1", + want: "Pairs with sum 1: [[0 1] [2 3]]", + }, + { + arr: "[1, 2, 3, 4, 5]", + targetSum: "-5", + want: "Pairs with sum -5: [[0 3] [1 2]]", + }, + { + arr: "[1, 2, 3, 4, 5]", + targetSum: "10", + want: "No pairs found.", + }, + { + arr: "[1, 2, 3, 4, 20, -4, 5]", + targetSum: "2 5", + want: "Invalid target sum.", + }, + { + arr: "[1, 2, 3, 4, 20, -4, 5]", + targetSum: "l", + want: "Invalid target sum.", + }, + { + arr: "[1, 2, 3, 4, 20, p, 5]", + targetSum: "5", + want: "Invalid number: p", + }, + } + + for _, tc := range tests { + challenge.Program("findpairs", tc.arr, tc.targetSum) + } +} From 026ed1e8322efb182f2cfd0a4b244410ca026629 Mon Sep 17 00:00:00 2001 From: miguel Date: Mon, 22 Apr 2024 16:50:23 +0100 Subject: [PATCH 2/7] fix(findspairs):broken test --- tests/findpairs_test/main.go | 53 ++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/tests/findpairs_test/main.go b/tests/findpairs_test/main.go index 63ef9f65..50e67b9b 100644 --- a/tests/findpairs_test/main.go +++ b/tests/findpairs_test/main.go @@ -1,7 +1,10 @@ package main import ( - "github.com/01-edu/go-tests/lib/challenge" + "fmt" + "os" + "os/exec" + "path" ) func main() { @@ -13,46 +16,74 @@ func main() { { arr: "[1, 2, 3, 4, 5]", targetSum: "6", - want: "Pairs with sum 6: [[0 4] [1 3]]", + want: "Pairs with sum 6: [[0 4] [1 3]]\n", }, { arr: "[1, 2, 3, 4, 5, 1]", targetSum: "6", - want: "Pairs with sum 6: [[0 4] [1 3]]", + want: "Pairs with sum 6: [[0 4] [1 3] [4 5]]\n", }, { arr: "[-1, 2, -3, 4, -5]", targetSum: "1", - want: "Pairs with sum 1: [[0 1] [2 3]]", + want: "Pairs with sum 1: [[0 1] [2 3]]\n", }, { - arr: "[1, 2, 3, 4, 5]", + arr: "[-1, -2, -3, -4, -5]", targetSum: "-5", - want: "Pairs with sum -5: [[0 3] [1 2]]", + want: "Pairs with sum -5: [[0 3] [1 2]]\n", }, { arr: "[1, 2, 3, 4, 5]", targetSum: "10", - want: "No pairs found.", + want: "No pairs found.\n", }, { arr: "[1, 2, 3, 4, 20, -4, 5]", targetSum: "2 5", - want: "Invalid target sum.", + want: "Invalid target sum.\n", }, { arr: "[1, 2, 3, 4, 20, -4, 5]", targetSum: "l", - want: "Invalid target sum.", + want: "Invalid target sum.\n", }, { arr: "[1, 2, 3, 4, 20, p, 5]", targetSum: "5", - want: "Invalid number: p", + want: "Invalid number: p\n", }, } for _, tc := range tests { - challenge.Program("findpairs", tc.arr, tc.targetSum) + got, _ := runStudentProgram("findpairs", []string{tc.arr, tc.targetSum}...) + if got != tc.want { + fmt.Printf("\ngot: %+v\nwant: %+v\n", got, tc.want) + os.Exit(1) + } + } +} + +func runStudentProgram(exercise string, args ...string) (string, bool) { + run := func(pkg string) (string, bool) { + binaryPath := path.Join(os.TempDir(), "binaries", path.Base(path.Dir(pkg)), path.Base(pkg)) + if _, err := os.Stat(binaryPath); os.IsNotExist(err) { + if b, err := exec.Command("go", "build", "-o", binaryPath, pkg).CombinedOutput(); err != nil { + return string(b), false + } + } + if fi, err := os.Stat(binaryPath); err != nil || fi.Mode()&0111 == 0 { + return "go run: cannot run non-main package\n", false + } + cmd := exec.Command(binaryPath, args...) + b, err := cmd.CombinedOutput() + if err != nil { + if _, ok := err.(*exec.ExitError); !ok { + return err.Error(), false + } + return string(b) + err.Error(), false + } + return string(b), true } + return run(path.Join("student", exercise)) } From fded084ec5c51c3982a3458855757d1bab6b2b44 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 2 May 2024 14:40:17 +0100 Subject: [PATCH 3/7] fix(findpairs): add tests according to the new conditions in the subject --- solutions/findpairs/main.go | 34 +++++++++++++++++++++++++++++----- tests/findpairs_test/main.go | 15 +++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go index 0db6d22d..ab8013b9 100644 --- a/solutions/findpairs/main.go +++ b/solutions/findpairs/main.go @@ -19,27 +19,51 @@ func findPairs(arr []int, targetSum int) [][]int { return pairs } +func isValidArrayFormat(s string) bool { + s = strings.TrimSpace(s) + if len(s) < 2 || s[0] != '[' || s[len(s)-1] != ']' { + return false + } + + s = s[1 : len(s)-1] + parts := strings.Split(s, ",") + for _, part := range parts { + part = strings.TrimSpace(part) + if _, err := strconv.Atoi(part); err != nil { + return false + } + } + + return true +} + func main() { if len(os.Args) != 3 { - fmt.Println("Usage: go run . [array] ") + fmt.Println("Invalid input.") return } arrayStr := os.Args[1] - arrayStr = strings.TrimPrefix(arrayStr, "[") - arrayStr = strings.TrimSuffix(arrayStr, "]") + targetStr := os.Args[2] + + if !isValidArrayFormat(arrayStr) { + fmt.Println("Invalid input.") + return + } + + arrayStr = strings.Trim(arrayStr, "[]") strNums := strings.Split(arrayStr, ",") var arr []int for _, strNum := range strNums { num, err := strconv.Atoi(strings.TrimSpace(strNum)) if err != nil { - fmt.Printf("Invalid number:%s\n", strNum) + fmt.Printf("Invalid number: %s\n", strNum) return } arr = append(arr, num) } - targetSum, err := strconv.Atoi(os.Args[2]) + targetSum, err := strconv.Atoi(targetStr) if err != nil { fmt.Println("Invalid target sum.") return diff --git a/tests/findpairs_test/main.go b/tests/findpairs_test/main.go index 50e67b9b..2d28c0db 100644 --- a/tests/findpairs_test/main.go +++ b/tests/findpairs_test/main.go @@ -53,6 +53,21 @@ func main() { targetSum: "5", want: "Invalid number: p\n", }, + { + arr: "[1, 2, 3, 4, 20, 5", + targetSum: "5", + want: "Invalid input.\n", + }, + { + arr: "1, 2, 3, 4, 20, 5", + targetSum: "5", + want: "Invalid input.\n", + }, + { + arr: "1 2 3 4 20 5", + targetSum: "5", + want: "Invalid input.\n", + }, } for _, tc := range tests { From 64105e1f665a7ad37c2394d1656c37a12deab82d Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 2 May 2024 16:32:58 +0100 Subject: [PATCH 4/7] fix(findpairs) fix solution and change error output in the test --- solutions/findpairs/main.go | 5 ++--- tests/findpairs_test/main.go | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go index ab8013b9..06c5b7d1 100644 --- a/solutions/findpairs/main.go +++ b/solutions/findpairs/main.go @@ -30,10 +30,9 @@ func isValidArrayFormat(s string) bool { for _, part := range parts { part = strings.TrimSpace(part) if _, err := strconv.Atoi(part); err != nil { - return false + return true } } - return true } @@ -57,7 +56,7 @@ func main() { for _, strNum := range strNums { num, err := strconv.Atoi(strings.TrimSpace(strNum)) if err != nil { - fmt.Printf("Invalid number: %s\n", strNum) + fmt.Printf("Invalid number:%s\n", strNum) return } arr = append(arr, num) diff --git a/tests/findpairs_test/main.go b/tests/findpairs_test/main.go index 2d28c0db..03c8f756 100644 --- a/tests/findpairs_test/main.go +++ b/tests/findpairs_test/main.go @@ -73,7 +73,8 @@ func main() { for _, tc := range tests { got, _ := runStudentProgram("findpairs", []string{tc.arr, tc.targetSum}...) if got != tc.want { - fmt.Printf("\ngot: %+v\nwant: %+v\n", got, tc.want) + fmt.Printf("findpairs %q %q -> ", tc.arr, tc.targetSum) + fmt.Printf("got: %q instead of %q\n", got, tc.want) os.Exit(1) } } From 5b788a64899621798f59fd4e0d833c5caca6c1f8 Mon Sep 17 00:00:00 2001 From: miguel Date: Mon, 6 May 2024 17:27:22 +0100 Subject: [PATCH 5/7] fix(findpairs): add test case and fix sol --- solutions/findpairs/main.go | 21 +++++++++++---------- tests/findpairs_test/main.go | 5 +++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go index 06c5b7d1..b3bc43e2 100644 --- a/solutions/findpairs/main.go +++ b/solutions/findpairs/main.go @@ -25,14 +25,14 @@ func isValidArrayFormat(s string) bool { return false } - s = s[1 : len(s)-1] - parts := strings.Split(s, ",") - for _, part := range parts { - part = strings.TrimSpace(part) - if _, err := strconv.Atoi(part); err != nil { - return true - } - } + // s = s[1 : len(s)-1] + // parts := strings.Split(s, ",") + // for _, part := range parts { + // part = strings.TrimSpace(part) + // if _, err := strconv.Atoi(part); err != nil { + // return true + // } + // } return true } @@ -54,9 +54,10 @@ func main() { strNums := strings.Split(arrayStr, ",") var arr []int for _, strNum := range strNums { - num, err := strconv.Atoi(strings.TrimSpace(strNum)) + s := strings.TrimSpace(strNum) + num, err := strconv.Atoi(s) if err != nil { - fmt.Printf("Invalid number:%s\n", strNum) + fmt.Printf("Invalid number:%s\n", s) return } arr = append(arr, num) diff --git a/tests/findpairs_test/main.go b/tests/findpairs_test/main.go index 03c8f756..87aad8c5 100644 --- a/tests/findpairs_test/main.go +++ b/tests/findpairs_test/main.go @@ -53,6 +53,11 @@ func main() { targetSum: "5", want: "Invalid number: p\n", }, + { + arr: "[1, 2, 3, 4, 20, p, 5]", + targetSum: "5", + want: "Invalid number: p\n", + }, { arr: "[1, 2, 3, 4, 20, 5", targetSum: "5", From 1c618f5dc42d0295c1153b402c6cfa5ebf05cf62 Mon Sep 17 00:00:00 2001 From: miguel Date: Mon, 6 May 2024 17:28:22 +0100 Subject: [PATCH 6/7] fix(findpairs): fix sol --- solutions/findpairs/main.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go index b3bc43e2..0794f379 100644 --- a/solutions/findpairs/main.go +++ b/solutions/findpairs/main.go @@ -24,15 +24,6 @@ func isValidArrayFormat(s string) bool { if len(s) < 2 || s[0] != '[' || s[len(s)-1] != ']' { return false } - - // s = s[1 : len(s)-1] - // parts := strings.Split(s, ",") - // for _, part := range parts { - // part = strings.TrimSpace(part) - // if _, err := strconv.Atoi(part); err != nil { - // return true - // } - // } return true } From e923356329c8d9d14c4851be7d4c2e02f30bc4c6 Mon Sep 17 00:00:00 2001 From: miguel Date: Wed, 8 May 2024 18:01:42 +0100 Subject: [PATCH 7/7] fix(findpairs): fix solution --- solutions/findpairs/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/findpairs/main.go b/solutions/findpairs/main.go index 0794f379..917d826c 100644 --- a/solutions/findpairs/main.go +++ b/solutions/findpairs/main.go @@ -48,7 +48,7 @@ func main() { s := strings.TrimSpace(strNum) num, err := strconv.Atoi(s) if err != nil { - fmt.Printf("Invalid number:%s\n", s) + fmt.Printf("Invalid number: %s\n", s) return } arr = append(arr, num)