package common import ( "bufio" "strconv" ) type Arrangement struct { numbers []int } func (arrangement *Arrangement) Mix(number int) { newSequence := make([]int, len(arrangement.numbers)) var newIndex int currentIndices := make([]int, len(arrangement.numbers)) for i := range arrangement.numbers { currentIndices[i] = i newSequence[i] = arrangement.numbers[i] } for i := 0; i < number; i++ { for j := 0; j < len(currentIndices); j++ { offset := currentIndices[j] currentNumber := arrangement.numbers[j] newIndex = offset + currentNumber newIndex = (newIndex % (len(newSequence) - 1) + len(newSequence) - 1) % (len(newSequence) - 1) newSequence = append(newSequence[:offset], newSequence[offset + 1:]...) newSequence = append(newSequence[:newIndex+1], newSequence[newIndex:]...) newSequence[newIndex] = currentNumber for i := range currentIndices { if newIndex <= currentIndices[i] && currentIndices[i] < offset { currentIndices[i]++ } else if offset < currentIndices[i] && currentIndices[i] <= newIndex { currentIndices[i]-- } } currentIndices[j] = newIndex } } arrangement.numbers = newSequence } func (arrangement *Arrangement) ApplyDecryptionKey(key int) { for i := range arrangement.numbers { arrangement.numbers[i] *= key } } func (arrangement *Arrangement) GetCoordinates() (int, int, int) { var locationOf0 int for i := range(arrangement.numbers) { if arrangement.numbers[i] == 0 { locationOf0 = i } } x := arrangement.numbers[(locationOf0 + 1000) % len(arrangement.numbers)] y := arrangement.numbers[(locationOf0 + 2000) % len(arrangement.numbers)] z := arrangement.numbers[(locationOf0 + 3000) % len(arrangement.numbers)] return x, y, z } func Parse(scanner bufio.Scanner) Arrangement { arrangement := Arrangement{} for scanner.Scan() { line := scanner.Text() number, _ := strconv.Atoi(line) arrangement.numbers = append(arrangement.numbers, number) } return arrangement }