75 lines
1.3 KiB
Bash
75 lines
1.3 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
declare -A mappings
|
||
|
|
||
|
gcd() {
|
||
|
local a=$1
|
||
|
local b=$2
|
||
|
while [ $b -ne 0 ]
|
||
|
do
|
||
|
local t=$b
|
||
|
b=$(($a % $b))
|
||
|
a=$t
|
||
|
done
|
||
|
echo ${a#-}
|
||
|
}
|
||
|
|
||
|
lcm() {
|
||
|
local d=$(gcd $1 $2)
|
||
|
echo $(($1 * $2 / $d))
|
||
|
}
|
||
|
|
||
|
findcount() {
|
||
|
cur=$1
|
||
|
instructions=$2
|
||
|
pattern=$3
|
||
|
count=0
|
||
|
while [[ $cur != $pattern ]]
|
||
|
do
|
||
|
for (( idx = 0; idx < ${#instructions}; idx++ ))
|
||
|
do
|
||
|
((count += 1))
|
||
|
instruction=${instructions:$idx:1}
|
||
|
part=0
|
||
|
if [ $instruction = "R" ]
|
||
|
then
|
||
|
part=4
|
||
|
fi
|
||
|
mapping=${mappings[$cur]}
|
||
|
cur=${mapping:$part:3}
|
||
|
if [[ $cur == $pattern ]]
|
||
|
then
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
done
|
||
|
echo $count
|
||
|
}
|
||
|
|
||
|
# Parse inputs
|
||
|
file="input.txt"
|
||
|
instructions=$(head -n1 $file)
|
||
|
|
||
|
while read line || [ -n "$line" ]
|
||
|
do
|
||
|
key=${line%% *}
|
||
|
values=${line##*(}
|
||
|
values=${values%)}
|
||
|
mappings[$key]=${values/,/}
|
||
|
done <<< $(tail -n +3 $file)
|
||
|
|
||
|
# Part 1
|
||
|
echo "Part 1: $(findcount "AAA" $instructions "ZZZ")"
|
||
|
|
||
|
# Part 2
|
||
|
count=1
|
||
|
for key in ${!mappings[@]}
|
||
|
do
|
||
|
if [[ $key != *A ]]
|
||
|
then
|
||
|
continue
|
||
|
fi
|
||
|
cur=$key
|
||
|
count=$(lcm $count $(findcount $cur $instructions "*Z"))
|
||
|
done
|
||
|
echo "Part 2: $count"
|