01.fs (831B) - raw
1 include ../utils/dmath.f 2 3 : 2cells 4 * ; 4 : 2!0 0 0 rot 2! ; 5 : 4dup 3 pick 3 pick 3 pick 3 pick ; 6 7 : darray create 2cells allot does> swap 2cells + ; 8 9 6 darray top3 10 variable cals 11 12 2variable tmp 13 : to-num ( a u -- d ) tmp 2!0 14 0 do dup r@ + c@ h# 30 - 0 15 tmp 2@ 10 1 m*/ d+ tmp 2! loop drop tmp 2@ ; 16 17 18 \ d1 == highest 19 : get-top3 ( -- d3 d2 d1 ) 0 top3 2@ 1 top3 2@ 2 top3 2@ ; 20 21 \ stole from peter 22 : dpivot ( d1 d2 -- min max ) 4dup d< if else 2swap then ; 23 : check-total 24 get-top3 cals 2@ 25 dpivot 2 top3 2! 26 dpivot 1 top3 2! 27 dpivot 0 top3 2! 28 2drop ; 29 30 : add-calories ( u -- ) cals 2@ d+ cals 2! ; 31 : process-line ( -- a n ) pad pad 10 accept dup 0= 32 if 2drop check-total cals 2!0 exit 33 then to-num add-calories ; 34 : solve cals 2!0 2252 0 do process-line loop 35 get-top3 d. cr \ part 1 36 get-top3 d+ d+ d. cr \ part 2 37 bye ; 38 solve