This commit is contained in:
Karl Spickermann 2022-12-18 03:28:01 +01:00
parent a4b68faa9d
commit 83834436a1

View File

@ -3,6 +3,7 @@ package main
import ( import (
"AOC2022/helper" "AOC2022/helper"
"fmt" "fmt"
"os"
) )
type Field struct { type Field struct {
@ -17,59 +18,44 @@ type Block struct {
} }
func main() { func main() {
//args := os.Args[1:] args := os.Args[1:]
lines := helper.ReadTextFile("day17/input") lines := helper.ReadTextFile(args[0])
field := Field{createField(), Block{}, 0} field := Field{createField(), Block{}, 0}
field.addBlock() field.addBlock()
fieldCopy := Field{createField(), Block{}, 0} fieldCopy := Field{createField(), Block{}, 0}
fieldCopy.addBlock() fieldCopy.addBlock()
heightForBlocks := part1(fieldCopy, lines) heightForBlocks := part1(fieldCopy, lines)
currentPrefix := 0 currentPrefix := 0
currentCycle := len(lines[0]) currentCycle := 1
finished := false finished := false
for !finished { for !finished {
if currentPrefix < currentCycle { if currentPrefix < currentCycle {
currentPrefix++ currentPrefix++
fmt.Println(currentPrefix)
} else { } else {
fmt.Println(currentCycle) currentPrefix = 0
currentCycle += len(lines[0]) currentCycle++
} }
fieldCopy = Field{createField(), Block{}, 0} fieldCopy = Field{createField(), Block{}, 0}
fieldCopy.addBlock() fieldCopy.addBlock()
finished = checkCycle(currentPrefix, currentCycle, fieldCopy, lines) finished = checkCycle(currentPrefix, currentCycle, heightForBlocks)
} }
fmt.Println(currentCycle) fmt.Println(currentCycle)
part2(field, lines) part2(currentPrefix, currentCycle, field, lines)
} }
func checkCycle(prefix, cycle int, field Field, lines []string) bool { func checkCycle(prefix, cycle int, heightForBlocks map[int]int) bool {
currentJetMove := 0 cycleHeight := heightForBlocks[cycle+prefix] - heightForBlocks[prefix]
values := make(map[int]int) for i := prefix; i < len(heightForBlocks); i += cycle {
for field.spawnedBlocks != 4*cycle+prefix { if !(heightForBlocks[i+cycle]-heightForBlocks[i] == cycleHeight) {
field.move(rune(lines[0][currentJetMove]))
if (field.spawnedBlocks-prefix)%cycle == 0 {
values[field.spawnedBlocks] = len(field.field) - field.getLineWithHighestRock()
}
currentJetMove++
if currentJetMove == len(lines[0]) {
currentJetMove = 0
}
}
cycleHeight := values[cycle+prefix] - values[prefix]
for i := prefix; i < 3*cycle+prefix; i += cycle {
if !(values[i+cycle]-values[i] == cycleHeight) {
return false return false
} }
} }
return true return true
} }
func part2(field Field, lines []string) { func part2(prefix, cycle int, field Field, lines []string) {
prefix := 25
cycle := 35
suffix := (1000000000000 - prefix) % cycle suffix := (1000000000000 - prefix) % cycle
prefixHeight := 0 prefixHeight := 0
cycleHeight := 0 cycleHeight := 0
@ -95,16 +81,22 @@ func part2(field Field, lines []string) {
} }
func part1(field Field, lines []string) (heightForBlocks map[int]int) { func part1(field Field, lines []string) (heightForBlocks map[int]int) {
heightForBlocks = make(map[int]int)
currentJetMove := 0 currentJetMove := 0
for field.spawnedBlocks != 2023 { solutionPart1 := 0
for field.spawnedBlocks != 50000 {
field.move(rune(lines[0][currentJetMove])) field.move(rune(lines[0][currentJetMove]))
if field.spawnedBlocks == 2023 {
solutionPart1 = len(field.field) - field.getLineWithHighestRock()
}
heightForBlocks[field.spawnedBlocks] = len(field.field) - field.getLineWithHighestRock() heightForBlocks[field.spawnedBlocks] = len(field.field) - field.getLineWithHighestRock()
currentJetMove++ currentJetMove++
if currentJetMove == len(lines[0]) { if currentJetMove == len(lines[0]) {
currentJetMove = 0 currentJetMove = 0
} }
} }
fmt.Printf("%v : %v \n", field.spawnedBlocks, (len(field.field) - field.getLineWithHighestRock())) fmt.Printf("%v : %v \n", field.spawnedBlocks, solutionPart1)
return
} }
func getNewBlock(spawnedBlocks int) Block { func getNewBlock(spawnedBlocks int) Block {