Day 23 (bash) part 2 (~7mn run)

This commit is contained in:
2022-10-08 21:29:47 +02:00
parent d2d66dc763
commit cd41685cb5
5 changed files with 66 additions and 10 deletions

View File

@@ -485,3 +485,15 @@ ex1.bash: res=31314
ex2.bash: res=32760 ex2.bash: res=32760
time: 1:21.92 real, 81.89 user, 0.01 sys time: 1:21.92 real, 81.89 user, 0.01 sys
context-switch: 462+1, page-faults: 0+5135 context-switch: 462+1, page-faults: 0+5135
=========================================
================= day23 =================
=========================================
ex1.bash: res=75893264
time: 0:00.01 real, 0.01 user, 0.00 sys
context-switch: 0+1, page-faults: 0+166
ex2.bash: res=38162588308
time: 6:52.50 real, 412.30 user, 0.14 sys
context-switch: 2219+1, page-faults: 0+30233

View File

@@ -1,8 +0,0 @@
ex1.bash: res=2211
time: 0:01.72 real, 1.71 user, 0.00 sys
context-switch: 9+1, page-faults: 0+1090
ex2.bash: res=vv,nlxsmb,rnbhjk,bvnkk,ttxvphb,qmkz,trmzkcfg,jpvz
time: 0:01.75 real, 1.74 user, 0.00 sys
context-switch: 36+4, page-faults: 0+1388

View File

@@ -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? Using your labeling, simulate 100 moves. What are the labels on the cups after cup 1?
Your puzzle answer was 75893264. Your puzzle answer was 75893264.
The first half of this puzzle is complete! It provides one gold star: *
--- Part Two --- --- 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. 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. 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? 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
View 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