Day17
This commit is contained in:
parent
a4b68faa9d
commit
83834436a1
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user