Day 23 (bash) part 2 (~7mn run)
This commit is contained in:
@@ -75,8 +75,6 @@ After the crab is done, what order will the cups be in? Starting after the cup l
|
||||
Using your labeling, simulate 100 moves. What are the labels on the cups after cup 1?
|
||||
|
||||
Your puzzle answer was 75893264.
|
||||
|
||||
The first half of this puzzle is complete! It provides one gold star: *
|
||||
--- Part Two ---
|
||||
|
||||
Due to what you can only assume is a mistranslation (you're not exactly fluent in Crab), you are quite surprised when the crab starts arranging many cups in a circle on your raft - one million (1000000) in total.
|
||||
@@ -90,3 +88,7 @@ The crab is going to hide your stars - one each - under the two cups that will e
|
||||
In the above example (389125467), this would be 934001 and then 159792; multiplying these together produces 149245887792.
|
||||
|
||||
Determine which two cups will end up immediately clockwise of cup 1. What do you get if you multiply their labels together?
|
||||
|
||||
Your puzzle answer was 38162588308.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
50
2020/day23/ex2.bash
Executable file
50
2020/day23/ex2.bash
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/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
|
||||
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
|
Reference in New Issue
Block a user