nushell
I'm still travelling, so another phone attempt. Jet lag says sleep, so just part 1 for now:
def part1 [filename: string] {
mut input = open $filename | lines |
each { parse '{index}: {children}' | update children { split row " " } | first } |
insert paths { null }
print $"Data loaded, ($input | length) devices"
$input = explore-path $input you
$input | where index == you | get 0.paths
}
def explore-path [devices, start: string] {
print $"Exploring ($start)"
let dev = $devices | where index == $start | first
if ($dev | get paths) != null {
print "Already explored"
return $devices
}
# Shadow with mutable version
mut devices = $devices
mut paths = 0
let is_out = $dev | get children | where ($it == out) | is-not-empty
if $is_out {
print $"Found an out device: ($start)"
$paths = 1
} else {
for child in ($dev | get children ) {
$devices = explore-path $devices $child
$paths += $devices | where index == $child | get 0.paths
}
}
# Shadow with immutable... wtf
let paths = $paths
print $"Setting paths for ($start) to ($paths)"
$devices = $devices | update paths { |row| if $row.index == $start {
$paths } else {} }
$devices
}
I made a rubber duck for all your debugging needs: