diff --git a/golang/internal/io_sample/bench.go b/golang/internal/io_sample/bench.go new file mode 100644 index 0000000..965b11a --- /dev/null +++ b/golang/internal/io_sample/bench.go @@ -0,0 +1,54 @@ +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, 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.Fprint(writer, str); err != nil { + return err + } + } + return nil +} + +func ReadFile(filename string) (io.ReadCloser, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + return file, nil +} + +func MyFileReader(reader io.ReadCloser) error { + defer reader.Close() + rdr := bufio.NewReader(reader) + var item int + for { + _, err := fmt.Fscanf(rdr, "%d ", &item) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + fmt.Println(item) + } +} diff --git a/golang/internal/module2/merge_sort.go b/golang/internal/module2/merge_sort.go new file mode 100644 index 0000000..f09cc71 --- /dev/null +++ b/golang/internal/module2/merge_sort.go @@ -0,0 +1,72 @@ +package module2 + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +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] <= b[j]) { + merged[k] = a[i] + i++ + } else { + merged[k] = b[j] + j++ + } + } + return merged +} + +func MergeSort(arr []int, l int, r int) []int { + if len(arr) <= 1 { + return arr + } + // Находим середину массива + 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 MergeTask() { + 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") + line = strings.TrimSuffix(line, " ") + str_arr := strings.Split(line, " ") + arr := make([]int, n) + for idx, val := range str_arr { + arr[idx], err = strconv.Atoi(val) + if err != nil { + panic(err) + } + } + 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/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/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/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") + } + } 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/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)) + }) + }) + +} 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)) + }) +} 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