USING: combinators deques dlists io.encodings.ascii io.files kernel literals locals math math.parser prettyprint sequences sorting ; IN: aoc.2020.01fast CONSTANT: input $[ "resource:work/aoc/2020/01/input.txt" ascii file-lines [ string>number ] map natural-sort ] DEFER: find-sum :: (find-sum) ( deque target -- pair ) deque peek-front :> low deque peek-back :> high low high + :> sum { { [ sum target = ] [ { low high } ] } { [ sum target < ] [ deque pop-front drop deque target find-sum ] } [ deque pop-back drop deque target find-sum ] } cond ; : find-sum ( deque target -- pair/f ) over deque-empty? [ 2drop f ] [ (find-sum) ] if ; : >deq ( seq -- deque ) DL{ } clone [ push-all-back ] keep ; : part1 ( -- ) input >deq 2020 find-sum product . ; :: part2 ( -- ) ! Part 2 runs in about 2 ms. { } :> pair! input [ 2020 swap - input >deq swap find-sum dup pair! ] find nip pair first2 * * . ;