52 lines
1.2 KiB
Bash
Executable File
52 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# ex2.bash: Advent2020 game, day 23/game 2.
|
|
|
|
CMD=${0##*/}
|
|
shopt -s extglob
|
|
set -o noglob
|
|
|
|
declare -A next # next[i] is cup right to i (ring)
|
|
declare -i end runs cup _cup
|
|
|
|
read -r str
|
|
tmp="${str//?()/x}"
|
|
tmp=${tmp#x}
|
|
IFS=x read -ra array <<< "$tmp"
|
|
|
|
cup=${array[0]}
|
|
end=1000000
|
|
runs=10000000
|
|
|
|
_cup=$cup
|
|
# initialize the next array with input cups
|
|
for _next in "${array[@]:1}"; do
|
|
next[$_cup]=$_next
|
|
_cup=$_next
|
|
done
|
|
# initialize the next array (up to end)
|
|
for ((_next = 10; _next <= end; ++_next)); do
|
|
next[$_cup]=$_next
|
|
_cup=$_next
|
|
done
|
|
next[$_cup]=$cup # close the ring
|
|
|
|
_cup=$cup
|
|
declare -i _1st _2nd _3rd dest
|
|
# make the moves: a simple sub linked list operation.
|
|
for ((i = 1; i <= runs; ++i)); do
|
|
_1st="${next[$cup]}"
|
|
_2nd="${next[$_1st]}"
|
|
_3rd="${next[$_2nd]}"
|
|
dest=$cup
|
|
while
|
|
(( --dest > 0 )) || dest=$end
|
|
(( dest == _1st || dest == _2nd || dest == _3rd ))
|
|
do :; done
|
|
(( tmp=next[$dest], next[$dest]=_1st, next[$cup]=next[$_3rd], next[$_3rd]=tmp ))
|
|
(( cup=next[$cup] ))
|
|
done
|
|
|
|
printf "%s: res=%d\n" "$CMD" $(( next[1] * next[${next[1]}] ))
|
|
exit 0
|