2022-12-09 21:37:26 +01:00
package main
import (
"AOC2022/helper"
"fmt"
"math"
"os"
"strconv"
"strings"
)
type Simulation struct {
headPos [ 2 ] int
tailPos [ ] [ 2 ] int
tailPast map [ [ 2 ] int ] bool
}
func main ( ) {
args := os . Args [ 1 : ]
lines := helper . ReadTextFile ( args [ 0 ] )
tails := [ ] [ 2 ] int { { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } , { 0 , 0 } }
simulation := Simulation { [ 2 ] int { 0 , 0 } , tails , make ( map [ [ 2 ] int ] bool ) }
for _ , line := range lines {
direction , distance := getDirectionAndDistance ( line )
for i := 0 ; i < distance ; i ++ {
move ( & simulation . headPos , direction )
for i , _ := range tails {
simulation . moveTail ( i )
}
}
}
fmt . Println ( len ( simulation . tailPast ) )
}
func getDirectionAndDistance ( line string ) ( [ 2 ] int , int ) {
splitLine := strings . Split ( line , " " )
distance := helper . RemoveError ( strconv . Atoi ( splitLine [ 1 ] ) )
switch splitLine [ 0 ] {
case "U" :
return [ 2 ] int { 0 , 1 } , distance
case "D" :
return [ 2 ] int { 0 , - 1 } , distance
case "R" :
return [ 2 ] int { 1 , 0 } , distance
case "L" :
return [ 2 ] int { - 1 , 0 } , distance
default :
return [ 2 ] int { 0 , 0 } , distance
}
}
func ( simulation * Simulation ) moveTail ( i int ) {
activeTail := & simulation . tailPos [ i ]
if len ( simulation . tailPos ) - 1 == i {
simulation . tailPast [ * activeTail ] = true
}
var nextKnot [ 2 ] int
if i == 0 {
nextKnot = simulation . headPos
} else {
nextKnot = simulation . tailPos [ i - 1 ]
}
direction := getDirectionFromTo ( nextKnot [ : ] , activeTail [ : ] )
if getLength ( direction [ : ] ) < 2 {
return
}
if direction [ 0 ] > 0 {
activeTail [ 0 ] ++
}
if direction [ 0 ] < 0 {
activeTail [ 0 ] --
}
if direction [ 1 ] > 0 {
activeTail [ 1 ] ++
}
if direction [ 1 ] < 0 {
activeTail [ 1 ] --
}
if len ( simulation . tailPos ) - 1 == i {
simulation . tailPast [ * activeTail ] = true
}
}
func move ( object * [ 2 ] int , direction [ 2 ] int ) {
object [ 0 ] += direction [ 0 ]
object [ 1 ] += direction [ 1 ]
}
func getDirectionFromTo ( X , Y [ ] int ) [ ] int {
direction := [ ] int { }
for i , _ := range X {
direction = append ( direction , X [ i ] - Y [ i ] )
}
return direction
}
func getLength ( X [ ] int ) float64 {
temp := float64 ( 0 )
for i , _ := range X {
temp += math . Pow ( float64 ( X [ i ] ) , 2 )
}
return math . Sqrt ( temp )
}
func ( simulation * Simulation ) print ( size int ) {
for i := 0 ; i < size ; i ++ {
tempArr := ""
for j := 0 ; j < size ; j ++ {
pos := [ 2 ] int { j , size - 1 - i }
if [ 2 ] int { 0 , 0 } == pos {
tempArr += "S"
} else if simulation . tailPast [ pos ] {
tempArr += "#"
} else if simulation . headPos == pos {
tempArr += "H"
2022-12-11 04:28:52 +01:00
} else if helper . Contains2Int ( simulation . tailPos , pos ) {
2022-12-09 21:37:26 +01:00
tempArr += "T"
} else {
tempArr += "."
}
}
fmt . Println ( tempArr )
}
}