! Copyright (C) 2022 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: grouping kernel math math.parser sequences splitting ; IN: 2022-aoc5 : parse-crate-line ( string -- seq ) 4 group harvest [ [ "[] " member? ] trim ] { } map-as ; : parse-move-line ( string -- count,from,to ) " " split { 1 3 5 } swap nths [ dec> ] map first3 [ 1 - ] bi@ 3array ; : parse-aoc5-lines ( string -- crates insns ) "\n\n" split1 [ split-lines but-last [ parse-crate-line ] map flip [ reverse >vector harvest ] V{ } map-as ] [ split-lines [ parse-move-line ] map ] bi* ; :: do-move ( seqs n from to -- ) seqs { from to } swap nths first2 '[ _ _ [ pop ] [ push ] bi* ] n swap times ; :: do-move2 ( seqs n from to -- ) V{ } clone :> temp from seqs nth '[ _ pop temp push ] n swap times temp reverse to seqs nth push-all ; : aoc5-1 ( string -- seqs ) parse-aoc5-lines [ dupd first3 do-move ] each [ last ] map concat ; : aoc5-2 ( string -- seqs ) parse-aoc5-lines [ dupd first3 do-move2 ] each [ last ] map concat ;