USING: fry io.encodings.ascii io.files kernel locals math math.functions math.parser prettyprint sequences splitting ; IN: aoc.2020.13 : wait ( depart id -- n ) tuck mod - ; : part1 ( -- ) "input.txt" ascii file-lines first2 [ dec> ] dip ",x" split harvest [ dec> ] map dupd [ wait ] with infimum-by [ wait ] keep * . ; : next-fixed ( search fixed n index -- search fixed' ) '[ dup _ wait _ = ] [ over + ] until ; :: find-time ( seq -- n ) seq unclip dup rot [ 1 + over integer? [ over mod over :> n next-fixed [ n lcm ] dip ] [ 2drop ] if ] each-index nip ; : part2 ( -- ) "input.txt" ascii file-lines second "," split [ dec> ] map find-time . ; ! 11 ms ! The key insight for part 2 is that not only do single buses ! have fixed cycles, but pairs of buses also have (much longer) ! fixed cycles for appearing near each other. So the more input ! there is, the larger the search increment becomes.