Skip to content

Module1, module2, module3, module4 and module5 solutions + tests #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: Ermakova_Ksenija_Dmitrievna
Choose a base branch
from
Open
10 changes: 8 additions & 2 deletions golang/go.mod
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
module isuct.ru/informatics2022

go 1.16
go 1.19

require github.com/stretchr/testify v1.8.1 // indirect
require github.com/stretchr/testify v1.8.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
)
2 changes: 1 addition & 1 deletion golang/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
Expand Down
20 changes: 20 additions & 0 deletions golang/internal/module1/hello.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package module1

import (
"bufio"
"fmt"
"os"
"strings"
)

func SayHello() {
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")
fmt.Printf("Hello, %s!", line)
}
50 changes: 50 additions & 0 deletions golang/internal/module2/task1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package module2

import (
"bufio"
"fmt"
"io"
"os"
"reflect"
)

func printSlice(slice []int, length int, writer io.Writer) {
i := 0
for ; i < length-1; i++ {
fmt.Fprintf(writer, "%d ", slice[i])
}
fmt.Fprintf(writer, "%d\n", slice[i])
}

func bubbleSort(numbers []int, length int) (hasChanged bool) {
swapper := reflect.Swapper(numbers)
writer := bufio.NewWriter(os.Stdout)

for i := 0; i < length-1; i++ {
for j := 0; j < length-1-i; j++ {
if numbers[j] > numbers[j+1] {
swapper(j, j+1)
hasChanged = true
printSlice(numbers, length, writer)
}
}
writer.Flush()
}
return hasChanged
}

func SolutionBubbleSort() {
n := 0
reader := bufio.NewReader(os.Stdin)
fmt.Fscanln(reader, &n)

numbers := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscanf(reader, "%d", &numbers[i])
}

hasChanged := bubbleSort(numbers, n)
if !hasChanged {
fmt.Print(0)
}
}
60 changes: 60 additions & 0 deletions golang/internal/module2/task2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package module2

import (
"bufio"
"fmt"
"log"
"os"
"reflect"
)

const idIndex = 0
const priceIndex = 1

func swapColumns(listOfItems [][]int, indexSortedElem, indexKeyElem int) {
swapper := reflect.Swapper(listOfItems)
if (listOfItems[indexSortedElem][priceIndex] == listOfItems[indexKeyElem][priceIndex]) &&
(listOfItems[indexKeyElem][idIndex] < listOfItems[indexSortedElem][idIndex]) {
swapper(indexKeyElem, indexSortedElem)
} else if listOfItems[indexKeyElem][priceIndex] > listOfItems[indexSortedElem][priceIndex] {
swapper(indexKeyElem, indexSortedElem)
}
}

func insertionSort(listOfItems [][]int, length int) {
for i := 1; i < length; i++ {
for j := i; j > 0; j-- {
if listOfItems[j][priceIndex] < listOfItems[j-1][priceIndex] {
break
} else {
swapColumns(listOfItems, j-1, j)
}
}
}
}

func printListOfItems(listOfItems [][]int, length int) {
writer := bufio.NewWriter(os.Stdout)
for i := 0; i < length; i++ {
_, err := fmt.Fprintf(writer, "%d %d\n", listOfItems[i][idIndex], listOfItems[i][priceIndex])
if err != nil {
log.Fatal(err)
}
}
writer.Flush()
}

func SolutionInsertionSort() {
reader := bufio.NewReader(os.Stdin)
n := 0
fmt.Fscanln(reader, &n)

listOfItems := make([][]int, n)
for i := 0; i < n; i++ {
listOfItems[i] = make([]int, 2)
fmt.Fscanf(reader, "%d %d\n", &listOfItems[i][idIndex], &listOfItems[i][priceIndex])
}

insertionSort(listOfItems, n)
printListOfItems(listOfItems, n)
}
78 changes: 78 additions & 0 deletions golang/internal/module2/task3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package module2

import (
"bufio"
"fmt"
"math"
"os"
)

func merge(numbers []int, startIndex, middleIndex, endIndex int) {
quantityOfElemsOnLeft := middleIndex - startIndex
quantityOfElemsOnRight := endIndex - middleIndex + 1

left := make([]int, quantityOfElemsOnLeft+1)
right := make([]int, quantityOfElemsOnRight+1)

left[quantityOfElemsOnLeft] = math.MaxInt
right[quantityOfElemsOnRight] = math.MaxInt

for i := 0; i < quantityOfElemsOnLeft; i++ {
left[i] = numbers[startIndex+i]
}

for j := 0; j < quantityOfElemsOnRight; j++ {
right[j] = numbers[middleIndex+j]
}

i, j := 0, 0
k := startIndex
for ; k <= endIndex; k++ {
if left[i] <= right[j] {
numbers[k] = left[i]
i++
} else {
numbers[k] = right[j]
j++
}
}

fmt.Printf("%d %d %d %d\n", startIndex+1, endIndex+1, numbers[startIndex], numbers[endIndex])
}

func mergeSort(numbers []int, startIndex, endIndex int) {
if endIndex > startIndex {
/*
Пришлось включить серединный элемент в правую часть, а не в левую,
чтобы ответы на задачу совпадали с яндекс контестом
*/
middleIndex := (startIndex+endIndex)/2 + (startIndex+endIndex)%2
mergeSort(numbers, startIndex, middleIndex-1)
mergeSort(numbers, middleIndex, endIndex)
merge(numbers, startIndex, middleIndex, endIndex)
}
}

func printSortedSliceMergeSort(numbers []int, length int) {
writer := bufio.NewWriter(os.Stdout)
i := 0
for ; i < length-1; i++ {
fmt.Fprintf(writer, "%d ", numbers[i])
}
fmt.Fprintf(writer, "%d", numbers[i])
writer.Flush()
}

func SolutionMergeSort() {
reader := bufio.NewReader(os.Stdin)
n := 0
fmt.Fscanln(reader, &n)

numbers := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscanf(reader, "%d", &numbers[i])
}

mergeSort(numbers, 0, n-1)
printSortedSliceMergeSort(numbers, n)
}
66 changes: 66 additions & 0 deletions golang/internal/module2/task4.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package module2

import (
"bufio"
"fmt"
"math"
"os"
)

func mergeInvCount(numbers []int, startIndex, middleIndex, endIndex int) (invCount int64) {
quantityOfElemsOnLeft := middleIndex - startIndex + 1
quantityOfElemsOnRight := endIndex - middleIndex

left := make([]int, quantityOfElemsOnLeft+1)
right := make([]int, quantityOfElemsOnRight+1)

left[quantityOfElemsOnLeft] = math.MaxInt
right[quantityOfElemsOnRight] = math.MaxInt

for i := 0; i < quantityOfElemsOnLeft; i++ {
left[i] = numbers[startIndex+i]
}

for j := 0; j < quantityOfElemsOnRight; j++ {
right[j] = numbers[middleIndex+1+j]
}

i, j := 0, 0
k := startIndex
for ; k <= endIndex; k++ {
if left[i] <= right[j] {
numbers[k] = left[i]
i++
} else {
numbers[k] = right[j]
invCount += int64(middleIndex) - int64(startIndex) - int64(i) + 1
j++
}
}

return invCount
}

func mergeSortInvCount(numbers []int, startIndex, endIndex int) (invCount int64) {
if endIndex > startIndex {
middleIndex := (startIndex + endIndex) / 2
invCount = mergeSortInvCount(numbers, startIndex, middleIndex)
invCount += mergeSortInvCount(numbers, middleIndex+1, endIndex)
invCount += mergeInvCount(numbers, startIndex, middleIndex, endIndex)
}
return invCount
}

func SolutionInversionCount() {
reader := bufio.NewReader(os.Stdin)
n := 0
fmt.Fscanln(reader, &n)

numbers := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscanf(reader, "%d", &numbers[i])
}

invCount := mergeSortInvCount(numbers, 0, n-1)
fmt.Print(invCount)
}
Loading