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