From 95c6b7fc0412212a09378a2cf02aa98cffb2e336 Mon Sep 17 00:00:00 2001 From: Eugeny Konstantinov Date: Fri, 17 Mar 2023 22:20:56 +0300 Subject: [PATCH 1/4] Added template for radix sort --- golang/internal/module2/radix.go | 15 +++++++ golang/tests/module2/bubble_test.go | 2 +- golang/tests/module2/radix_test.go | 67 +++++++++++++++++++++++++++++ python/src/module2/radix_sort.py | 48 +++++++++++++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 golang/internal/module2/radix.go create mode 100644 golang/tests/module2/radix_test.go create mode 100644 python/src/module2/radix_sort.py diff --git a/golang/internal/module2/radix.go b/golang/internal/module2/radix.go new file mode 100644 index 0000000..b22b4d0 --- /dev/null +++ b/golang/internal/module2/radix.go @@ -0,0 +1,15 @@ +package module2 + +import ( + "fmt" +) + +func Radix() { + var n int + fmt.Scanln(&n) + arr := make([]string, n) + for i := 0; i < n; i++ { + fmt.Scanln(&arr[i]) + } + fmt.Println(arr) +} diff --git a/golang/tests/module2/bubble_test.go b/golang/tests/module2/bubble_test.go index 6a07b6a..d0900e6 100644 --- a/golang/tests/module2/bubble_test.go +++ b/golang/tests/module2/bubble_test.go @@ -1,4 +1,4 @@ -package module1_test +package module2_test import ( "io" diff --git a/golang/tests/module2/radix_test.go b/golang/tests/module2/radix_test.go new file mode 100644 index 0000000..614d38c --- /dev/null +++ b/golang/tests/module2/radix_test.go @@ -0,0 +1,67 @@ +package module2_test + +import ( + "io" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "isuct.ru/informatics2022/internal/module2" + "isuct.ru/informatics2022/tests/helpers" +) + +func TestRadix(t *testing.T) { + assert := assert.New(t) + + defer func(v *os.File) { os.Stdin = v }(os.Stdin) + defer func(v *os.File) { os.Stdout = v }(os.Stdout) + t.Run("Sample test", func(t *testing.T) { + r, w := helpers.Replacer(`9 +12 +32 +45 +67 +98 +29 +61 +35 +09 +`, t) + os.Stdin = r + os.Stdout = w + + module2.Radix() + w.Close() + out, _ := io.ReadAll(r) + assert.Equal(`Initial array: +12, 32, 45, 67, 98, 29, 61, 35, 09 +********** +Phase 1 +Bucket 0: empty +Bucket 1: 61 +Bucket 2: 12, 32 +Bucket 3: empty +Bucket 4: empty +Bucket 5: 45, 35 +Bucket 6: empty +Bucket 7: 67 +Bucket 8: 98 +Bucket 9: 29, 09 +********** +Phase 2 +Bucket 0: 09 +Bucket 1: 12 +Bucket 2: 29 +Bucket 3: 32, 35 +Bucket 4: 45 +Bucket 5: empty +Bucket 6: 61, 67 +Bucket 7: empty +Bucket 8: empty +Bucket 9: 98 +********** +Sorted array: +09, 12, 29, 32, 35, 45, 61, 67, 98 +`, string(out)) + }) +} diff --git a/python/src/module2/radix_sort.py b/python/src/module2/radix_sort.py new file mode 100644 index 0000000..c783967 --- /dev/null +++ b/python/src/module2/radix_sort.py @@ -0,0 +1,48 @@ +""" +>>> import io, sys +>>> sys.stdin = io.StringIO(chr(10).join(["9","12","32","45","67","98","29","61","35","09"])) +>>> radix_sort() +Initial array: +12, 32, 45, 67, 98, 29, 61, 35, 09 +********** +Phase 1 +Bucket 0: empty +Bucket 1: 61 +Bucket 2: 12, 32 +Bucket 3: empty +Bucket 4: empty +Bucket 5: 45, 35 +Bucket 6: empty +Bucket 7: 67 +Bucket 8: 98 +Bucket 9: 29, 09 +********** +Phase 2 +Bucket 0: 09 +Bucket 1: 12 +Bucket 2: 29 +Bucket 3: 32, 35 +Bucket 4: 45 +Bucket 5: empty +Bucket 6: 61, 67 +Bucket 7: empty +Bucket 8: empty +Bucket 9: 98 +********** +Sorted array: +09, 12, 29, 32, 35, 45, 61, 67, 98 +""" + + +def radix_sort(): + n = int(input()) + arr = [] + for i in range(n): + arr.append(input()) + print(arr) + pass + + +if __name__ == "__main__": + import doctest + doctest.testmod(verbose=True) \ No newline at end of file From def26b60af4e00a20fb26c5b749fd3d3aa6e574e Mon Sep 17 00:00:00 2001 From: Eugeny Konstantinov Date: Sat, 1 Apr 2023 00:05:09 +0300 Subject: [PATCH 2/4] Added reading from buffered stream --- golang/internal/io_sample/bench.go | 49 ++++++++++++++++++++++++++++++ golang/main.go | 13 ++++++-- 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 golang/internal/io_sample/bench.go diff --git a/golang/internal/io_sample/bench.go b/golang/internal/io_sample/bench.go new file mode 100644 index 0000000..c07f68a --- /dev/null +++ b/golang/internal/io_sample/bench.go @@ -0,0 +1,49 @@ +package io_sample + +import ( + "bufio" + "fmt" + "io" + "os" +) + +// Write file that will emulate io stream +// it not bytes precise, but close enough +func WriteFile(size int64, filename string) error { + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + writer := bufio.NewWriterSize(file, int(size)) + defer writer.Flush() + for i := int64(0); i < size; i++ { + str := fmt.Sprintf("%d ", i) + if len(str) >= writer.Available() { + break + } + if _, err := fmt.Fprintf(writer, "%d ", i); err != nil { + return err + } + } + return nil +} + +func ReadFile(filename string) error { + file, err := os.Open(filename) + if err != nil { + return err + } + reader := bufio.NewReader(file) + var item int + for { + _, err := fmt.Fscanf(reader, "%d ", &item) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + fmt.Println(item) + } +} diff --git a/golang/main.go b/golang/main.go index 8d32ddc..5c1513c 100644 --- a/golang/main.go +++ b/golang/main.go @@ -3,10 +3,19 @@ package main import ( "fmt" - "isuct.ru/informatics2022/internal/module1" + "isuct.ru/informatics2022/internal/io_sample" ) func main() { fmt.Println("Hello world") - module1.Summ() + err := io_sample.WriteFile(8096, "test.txt") + if err != nil { + fmt.Printf("error writing file :%v \n", err) + } + fmt.Printf("File wrote sucessfully") + err = io_sample.ReadFile("test.txt") + if err != nil { + fmt.Println("error while reading file") + } + } From 4ef4b6c78b7f4eba205e8d0b6d23ba6806538301 Mon Sep 17 00:00:00 2001 From: Eugeny Konstantinov Date: Fri, 14 Apr 2023 09:08:11 +0300 Subject: [PATCH 3/4] Add io sample --- golang/internal/io_sample/bench.go | 23 ++-- golang/internal/module2/merge_sort.go | 68 +++++++++++ golang/internal/module4/list.go | 71 +++++++++++ golang/tests/module2/merge_test.go | 164 ++++++++++++++++++++++++++ 4 files changed, 317 insertions(+), 9 deletions(-) create mode 100644 golang/internal/module2/merge_sort.go create mode 100644 golang/internal/module4/list.go create mode 100644 golang/tests/module2/merge_test.go diff --git a/golang/internal/io_sample/bench.go b/golang/internal/io_sample/bench.go index c07f68a..965b11a 100644 --- a/golang/internal/io_sample/bench.go +++ b/golang/internal/io_sample/bench.go @@ -15,29 +15,34 @@ func WriteFile(size int64, filename string) error { return err } defer file.Close() - writer := bufio.NewWriterSize(file, int(size)) + writer := bufio.NewWriterSize(file, 5) defer writer.Flush() for i := int64(0); i < size; i++ { str := fmt.Sprintf("%d ", i) - if len(str) >= writer.Available() { - break - } - if _, err := fmt.Fprintf(writer, "%d ", i); err != nil { + // if len(str) >= writer.Available() { + // break + // } + if _, err := fmt.Fprint(writer, str); err != nil { return err } } return nil } -func ReadFile(filename string) error { +func ReadFile(filename string) (io.ReadCloser, error) { file, err := os.Open(filename) if err != nil { - return err + return nil, err } - reader := bufio.NewReader(file) + return file, nil +} + +func MyFileReader(reader io.ReadCloser) error { + defer reader.Close() + rdr := bufio.NewReader(reader) var item int for { - _, err := fmt.Fscanf(reader, "%d ", &item) + _, err := fmt.Fscanf(rdr, "%d ", &item) if err != nil { if err == io.EOF { return nil diff --git a/golang/internal/module2/merge_sort.go b/golang/internal/module2/merge_sort.go new file mode 100644 index 0000000..925c824 --- /dev/null +++ b/golang/internal/module2/merge_sort.go @@ -0,0 +1,68 @@ +package module2 + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +func Merge(a []Item, b []Item) []Item { + merged := make([]Item, len(a)+len(b)) + i := 0 + j := 0 + for k := 0; k < len(merged); k++ { + if j >= len(b) || (i < len(a) && a[i].Value < b[j].Value) { + merged[k] = a[i] + i += 1 + } else { + merged[k] = b[j] + j += 1 + } + } + return merged +} + +func Sort(source []Item) []Item { + if len(source) <= 1 { + return source + } + L := source[0 : len(source)/2] + R := source[len(source)/2:] + L = Sort(L) + R = Sort(R) + res := Merge(L, R) + fmt.Printf("%d %d %d %d\n", res[0].Index, res[len(res)-1].Index, res[0].Value, res[len(res)-1].Value) + return res +} + +type Item struct { + Index int + Value int +} + +func MergeSort() { + var n int + fmt.Scanln(&n) + reader := bufio.NewReader(os.Stdin) + line, err := reader.ReadString('\n') + if err != nil { + panic(err) + } + line = strings.TrimSuffix(line, "\n") + line = strings.TrimSuffix(line, "\r") + str_arr := strings.Split(line, " ") + arr := make([]Item, n) + for idx, val := range str_arr { + value, err := strconv.Atoi(val) + arr[idx] = Item{ + Value: value, + Index: idx + 1, + } + if err != nil { + panic(err) + } + } + fmt.Println(arr) +} diff --git a/golang/internal/module4/list.go b/golang/internal/module4/list.go new file mode 100644 index 0000000..438f48f --- /dev/null +++ b/golang/internal/module4/list.go @@ -0,0 +1,71 @@ +package module4 + +import ( + "errors" + "fmt" +) + +type List struct { + Head *Item + Tail *Item + Size int +} + +type Item struct { + Value int + Next *Item +} + +func (l *List) Add(item Item) { + if l.Size == 0 { + l.Head = &item + } else { + l.Tail.Next = &item + } + l.Tail = &item + l.Size += 1 +} + +func (l *List) GetByIndex(index int) (*Item, error) { + if index >= l.Size { + return nil, errors.New("Index out of bound") + } + if index == l.Size-1 { + return l.Tail, nil + } + if index == 0 { + return l.Head, nil + } + + item := l.Head + for i := 0; i <= index-1; i++ { + item = item.Next + } + return item, nil +} + +func Sample() { + list := List{ + Head: nil, + Tail: nil, + Size: 0, + } + item := Item{ + Value: 5, + Next: nil, + } + list.Add(item) + list.Add(Item{ + Value: 6, + Next: nil, + }) + list.Add(Item{ + Value: 7, + Next: nil, + }) + + fmt.Println(list.GetByIndex(0)) + fmt.Println(list.GetByIndex(1)) + fmt.Println(list.GetByIndex(2)) + +} diff --git a/golang/tests/module2/merge_test.go b/golang/tests/module2/merge_test.go new file mode 100644 index 0000000..6e0f4a3 --- /dev/null +++ b/golang/tests/module2/merge_test.go @@ -0,0 +1,164 @@ +package module2_test + +import ( + "io" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "isuct.ru/informatics2022/internal/module2" + "isuct.ru/informatics2022/tests/helpers" +) + +func TestMergeSort(t *testing.T) { + assert := assert.New(t) + + defer func(v *os.File) { os.Stdin = v }(os.Stdin) + defer func(v *os.File) { os.Stdout = v }(os.Stdout) + t.Run("Test Merge", func(t *testing.T) { + t.Run("Test equal length", func(t *testing.T) { + a := []module2.Item{ + { + Index: 1, + Value: 1, + }, + { + Index: 2, + Value: 3, + }, + { + Index: 3, + Value: 5, + }, + } + b := []module2.Item{ + { + Index: 1, + Value: 2, + }, + { + Index: 2, + Value: 4, + }, + { + Index: 3, + Value: 6, + }, + } + expected := []module2.Item{ + { + Index: 1, + Value: 1, + }, + { + Index: 1, + Value: 2, + }, + { + Index: 2, + Value: 3, + }, + { + Index: 2, + Value: 4, + }, + { + Index: 3, + Value: 5, + }, + { + Index: 3, + Value: 6, + }, + } + result := module2.Merge(a, b) + assert.EqualValues(expected, result) + }) + // t.Run("Test first zero lenght", func(t *testing.T) { + // a := []int{} + // b := []int{2, 4, 6} + // expected := []int{2, 4, 6} + // result := module2.Merge(a, b) + // assert.EqualValues(expected, result) + // }) + // t.Run("Test second zero lenght", func(t *testing.T) { + // a := []int{1, 3, 5} + // b := []int{} + // expected := []int{1, 3, 5} + // result := module2.Merge(a, b) + // assert.EqualValues(expected, result) + // }) + // t.Run("Test second values less than first", func(t *testing.T) { + // a := []int{1, 3, 5, 6, 7, 8} + // b := []int{2, 4, 6} + // expected := []int{1, 2, 3, 4, 5, 6, 6, 7, 8} + // result := module2.Merge(a, b) + // assert.EqualValues(expected, result) + // }) + }) + t.Run("Test Sort", func(t *testing.T) { + t.Run("Test array with even len", func(t *testing.T) { + a := []module2.Item{ + { + Index: 1, + Value: 5, + }, + { + Index: 2, + Value: 4, + }, + { + Index: 3, + Value: 3, + }, + { + Index: 4, + Value: 2, + }, + } + expected := []module2.Item{ + { + Index: 4, + Value: 2, + }, + { + Index: 3, + Value: 3, + }, + { + Index: 2, + Value: 4, + }, + { + Index: 1, + Value: 5, + }, + } + result := module2.Sort(a) + assert.EqualValues(expected, result) + }) + // t.Run("Test array with odd len", func(t *testing.T) { + // a := []int{5, 4, 3, 2, 1} + // expected := []int{1, 2, 3, 4, 5} + // result := module2.Sort(a) + // assert.EqualValues(expected, result) + // }) + }) + t.Run("Test merge sort", func(t *testing.T) { + r, w := helpers.Replacer(`5 +5 4 3 2 1 +`, t) + os.Stdin = r + os.Stdout = w + + module2.MergeSort() + w.Close() + out, _ := io.ReadAll(r) + assert.Equal(`1 2 4 5 +4 5 1 2 +3 5 1 3 +1 5 1 5 +1 2 3 4 5 +`, string(out)) + }) +} From 292be90943e984c5f35d786914a9403d79e8edb5 Mon Sep 17 00:00:00 2001 From: Eugeny Konstantinov Date: Sat, 22 Apr 2023 07:20:14 +0300 Subject: [PATCH 4/4] Fixed merge sort --- golang/internal/module2/merge_sort.go | 64 ++++++------- golang/tests/module2/merge_sort_test.go | 114 ++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 30 deletions(-) create mode 100644 golang/tests/module2/merge_sort_test.go diff --git a/golang/internal/module2/merge_sort.go b/golang/internal/module2/merge_sort.go index 925c824..f09cc71 100644 --- a/golang/internal/module2/merge_sort.go +++ b/golang/internal/module2/merge_sort.go @@ -8,41 +8,41 @@ import ( "strings" ) -func Merge(a []Item, b []Item) []Item { - merged := make([]Item, len(a)+len(b)) - i := 0 - j := 0 +func Merge(a []int, b []int) []int { + var i int = 0 + var j int = 0 + merged := make([]int, len(a)+len(b)) for k := 0; k < len(merged); k++ { - if j >= len(b) || (i < len(a) && a[i].Value < b[j].Value) { + if j >= len(b) || (i < len(a) && a[i] <= b[j]) { merged[k] = a[i] - i += 1 + i++ } else { merged[k] = b[j] - j += 1 + j++ } } return merged } -func Sort(source []Item) []Item { - if len(source) <= 1 { - return source +func MergeSort(arr []int, l int, r int) []int { + if len(arr) <= 1 { + return arr } - L := source[0 : len(source)/2] - R := source[len(source)/2:] - L = Sort(L) - R = Sort(R) - res := Merge(L, R) - fmt.Printf("%d %d %d %d\n", res[0].Index, res[len(res)-1].Index, res[0].Value, res[len(res)-1].Value) - return res -} - -type Item struct { - Index int - Value int + // Находим середину массива + m := len(arr) / 2 + // Сортируем левую и правую половины независимо + left := MergeSort(arr[0:m], l, l+m) + right := MergeSort(arr[m:], l+m, r) + // Сливаем отсортированные половины + fmt.Printf("%d %d ", l+1, r) + result := Merge(left, right) + if len(result) > 0 { + fmt.Printf("%d %d\n", result[0], result[len(result)-1]) + } + return result } -func MergeSort() { +func MergeTask() { var n int fmt.Scanln(&n) reader := bufio.NewReader(os.Stdin) @@ -52,17 +52,21 @@ func MergeSort() { } line = strings.TrimSuffix(line, "\n") line = strings.TrimSuffix(line, "\r") + line = strings.TrimSuffix(line, " ") str_arr := strings.Split(line, " ") - arr := make([]Item, n) + arr := make([]int, n) for idx, val := range str_arr { - value, err := strconv.Atoi(val) - arr[idx] = Item{ - Value: value, - Index: idx + 1, - } + arr[idx], err = strconv.Atoi(val) if err != nil { panic(err) } } - fmt.Println(arr) + result := MergeSort(arr, 0, len(arr)) + for idx, val := range result { + if idx < len(result)-1 { + fmt.Printf("%d ", val) + } else { + fmt.Printf("%d\n", val) + } + } } diff --git a/golang/tests/module2/merge_sort_test.go b/golang/tests/module2/merge_sort_test.go new file mode 100644 index 0000000..99a2981 --- /dev/null +++ b/golang/tests/module2/merge_sort_test.go @@ -0,0 +1,114 @@ +package module2_test + +import ( + "bufio" + "fmt" + "io" + "os" + "testing" + + "github.com/stretchr/testify/require" + "isuct.ru/informatics2022/internal/module2" + m2 "isuct.ru/informatics2022/internal/module2" + "isuct.ru/informatics2022/tests/helpers" +) + +func TestMergeSort(t *testing.T) { + require := require.New(t) + t.Run("Test merge", func(t *testing.T) { + expected := []int{1, 2, 3, 4} + t.Run("Test merge equal length", func(t *testing.T) { + a := []int{1, 3} + b := []int{2, 4} + result := m2.Merge(a, b) + require.EqualValues(expected, result) + }) + t.Run("Test merge first shorter length", func(t *testing.T) { + a := []int{1} + b := []int{2, 3, 4} + result := m2.Merge(a, b) + require.EqualValues(expected, result) + }) + t.Run("Test merge second short length", func(t *testing.T) { + a := []int{1, 2, 3} + b := []int{4} + result := m2.Merge(a, b) + require.EqualValues(expected, result) + }) + }) + + t.Run("Test merge sort", func(t *testing.T) { + defer func(v *os.File) { os.Stdin = v }(os.Stdin) + defer func(v *os.File) { os.Stdout = v }(os.Stdout) + + t.Run("Test single item array", func(t *testing.T) { + r, w := helpers.Replacer(`1 +1 +`, t) + os.Stdin = r + os.Stdout = w + + module2.MergeTask() + w.Close() + out, _ := io.ReadAll(r) + require.Equal(`1 +`, string(out)) + }) + t.Run("Test two items array", func(t *testing.T) { + r, w := helpers.Replacer(`2 +3 1 +`, t) + os.Stdin = r + os.Stdout = w + + module2.MergeTask() + w.Close() + out, _ := io.ReadAll(r) + require.Equal(`1 2 1 3 +1 3 +`, string(out)) + }) + t.Run("Test 5 items array", func(t *testing.T) { + r, w := helpers.Replacer(`5 +5 4 3 2 1 +`, t) + os.Stdin = r + os.Stdout = w + + module2.MergeTask() + w.Close() + out, _ := io.ReadAll(r) + require.Equal(`1 2 4 5 +4 5 1 2 +3 5 1 3 +1 5 1 5 +1 2 3 4 5 +`, string(out)) + }) + t.Run("Test 100000 items array", func(t *testing.T) { + r, w := helpers.Replacer(`10000 +`, t) + os.Stdin = r + os.Stdout = w + + writer := bufio.NewWriterSize(w, int(10000)) + + for i := 9999; i >= 0; i-- { + fmt.Fprintf(writer, "%d ", i) + } + fmt.Fprint(writer, "\n") + writer.Flush() + + module2.MergeTask() + w.Close() + out, _ := io.ReadAll(r) + require.Equal(`1 2 4 5 +4 5 1 2 +3 5 1 3 +1 5 1 5 +1 2 3 4 5 +`, string(out)) + }) + }) + +}