aoc-forth

Advent of code solutions in UF forth
git clone git://git.alexwennerberg.com/aoc-forth
Log | Files | Refs | README

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