aoc-forth

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

03.fs (1139B) - raw


      1 \ A bit sloppy
      2 variable total1
      3 variable total2
      4 
      5 : barray create allot does> + ;
      6 : c@+ dup c@ >r 1+ r> ;
      7 128 barray charbuf
      8 128 barray charbuf2
      9 
     10 \ TODO use erase
     11 : clear-buf 0 charbuf 128 erase ;
     12 : clear-buf2 0 charbuf2 128 erase ;
     13 : set-charbuf ( a u -- ) 0 do c@+ charbuf 1 swap c! loop drop ;
     14 : set-charbuf2 ( a u -- ) 0 do c@+ charbuf2 1 swap c! loop drop ;
     15 
     16 : intersect ( -- ) \ mutates charbuf
     17 128 0 do r@ charbuf c@ r@ charbuf2 c@ and r@ charbuf c! loop
     18 ;
     19 
     20 : priority ( c -- u ) 96 mod dup 65 >= if 38 - then ; 
     21 : read-rucksack ( n -- a n ) 50 * pad + dup 50 accept ;
     22 : compartments ( a u -- a1 u1 a2 n2 ) 
     23     2 / 2dup swap over + swap ;
     24 : get-duplicate ( c ) 
     25     128 0 do r@ charbuf c@ if r@ unloop exit then loop ;
     26 
     27 : set1 compartments 
     28 set-charbuf set-charbuf2 intersect
     29 get-duplicate priority total1 +!
     30 clear-buf clear-buf2
     31 ;
     32 
     33 : set3 
     34 set-charbuf 
     35 set-charbuf2 
     36 intersect clear-buf2
     37 set-charbuf2 intersect
     38 get-duplicate priority total2 +!
     39 clear-buf clear-buf2
     40 ;
     41 
     42 : solve 100 0 do 
     43   0 read-rucksack 2dup set1 
     44   1 read-rucksack 2dup set1  
     45   2 read-rucksack 2dup set1 
     46   set3
     47   loop
     48   total1 ? cr
     49   total2 ? 
     50   bye
     51 ; solve bye