diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fbb4582 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +run: + go test ./... -cover \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2c4fb50 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module git.maximhutz.com/practice + +go 1.24.10 + +require github.com/stretchr/testify v1.11.1 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..cc8b3f4 --- /dev/null +++ b/go.sum @@ -0,0 +1,9 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/two_sum/main.go b/pkg/two_sum/main.go new file mode 100644 index 0000000..05f289c --- /dev/null +++ b/pkg/two_sum/main.go @@ -0,0 +1,49 @@ +package two_sum + +import ( + "slices" +) + +type Index struct { + Index int + Value int +} + +func ByValue(a, b Index) int { + return a.Value - b.Value +} + +func ToIndices(list []int) []Index { + result := []Index{} + + for index, value := range list { + result = append(result, Index{index, value}) + } + + slices.SortFunc(result, ByValue) + return result +} + +// https://leetcode.com/problems/two-sum/description/ + +func TwoSum(nums []int, target int) []int { + numbers := ToIndices(nums) + lower, upper := 0, len(numbers)-1 + + for lower < upper { + current_sum := numbers[lower].Value + numbers[upper].Value + + if current_sum < target { + lower++ + } else if current_sum > target { + upper-- + } else { + return []int{ + numbers[lower].Index, + numbers[upper].Index, + } + } + } + + return nil +} diff --git a/pkg/two_sum/main_test.go b/pkg/two_sum/main_test.go new file mode 100644 index 0000000..374d3c3 --- /dev/null +++ b/pkg/two_sum/main_test.go @@ -0,0 +1,14 @@ +package two_sum_test + +import ( + "testing" + + "git.maximhutz.com/practice/pkg/two_sum" + "github.com/stretchr/testify/assert" +) + +func TestTwoSum(t *testing.T) { + assert.Equal(t, two_sum.TwoSum([]int{2, 7, 11, 15}, 9), []int{0, 1}) + assert.Equal(t, two_sum.TwoSum([]int{3, 2, 4}, 6), []int{1, 2}) + assert.Equal(t, two_sum.TwoSum([]int{3, 3}, 6), []int{0, 1}) +} diff --git a/pkg/wildcard_matching/main.go b/pkg/wildcard_matching/main.go new file mode 100644 index 0000000..e9eed83 --- /dev/null +++ b/pkg/wildcard_matching/main.go @@ -0,0 +1,47 @@ +package wildcard_matching + +var Cache = map[[2]string]bool{} + +func MatchesCached(letters, pattern string) bool { + key := [2]string{letters, pattern} + + if matches, exists := Cache[key]; exists { + return matches + } + + result := Matches(letters, pattern) + Cache[key] = result + return result +} + +func RemoveLeadingWildcards(pattern string) string { + for i := 0; i < len(pattern); i++ { + if pattern[i] != '*' { + return pattern[i:] + } + } + + return "" +} + +func Matches(letters string, pattern string) bool { + if len(letters) == 0 && len(pattern) == 0 { + return true + } + + if len(pattern) != 0 && pattern[0] == '*' { + for i := 0; i <= len(letters); i++ { + if MatchesCached(letters[i:], RemoveLeadingWildcards(pattern)) { + return true + } + } + + return false + } + + if len(pattern) != 0 && len(letters) != 0 && (pattern[0] == '?' || pattern[0] == letters[0]) { + return MatchesCached(letters[1:], pattern[1:]) + } + + return false +} diff --git a/pkg/wildcard_matching/main_test.go b/pkg/wildcard_matching/main_test.go new file mode 100644 index 0000000..aac33e4 --- /dev/null +++ b/pkg/wildcard_matching/main_test.go @@ -0,0 +1,32 @@ +package wildcard_matching_test + +import ( + "testing" + + "git.maximhutz.com/practice/pkg/wildcard_matching" + "github.com/stretchr/testify/assert" +) + +func TestTwoSum1(t *testing.T) { + assert.Equal(t, false, wildcard_matching.Matches("aa", "a")) +} + +func TestTwoSum2(t *testing.T) { + assert.Equal(t, true, wildcard_matching.Matches("aa", "*")) +} + +func TestTwoSum3(t *testing.T) { + assert.Equal(t, false, wildcard_matching.Matches("cb", "?a")) +} + +func TestTwoSum4(t *testing.T) { + assert.Equal(t, true, wildcard_matching.Matches("banana", "**********")) +} + +func TestTwoSum5(t *testing.T) { + assert.Equal(t, true, wildcard_matching.Matches("", "******")) +} + +func TestTwoSum6(t *testing.T) { + assert.Equal(t, false, wildcard_matching.Matches("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", "*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************a")) +}