: walk ( stack point -- stack' ) { [ clone [ 1 + ] change-x over push ] [ clone [ 1 - ] change-x over push ] [ clone [ 1 + ] change-y over push ] [ clone [ 1 - ] change-y over push ] } cleave ; : ?walk ( total seen stack point -- total seen stack ) dup walkable? [ [ 1 + ] 3dip walk ] [ drop ] if ; : until-empty ( seq quot -- ) [ dup empty? ] swap until drop ; inline : ?adjoin ( elt set -- elt/f ) 2dup in? [ 2drop f ] [ dupd adjoin ] if ; : (ant) ( total seen stack -- total' ) [ dup pop pick ?adjoin [ ?walk ] when* ] until-empty drop ; : ant-no-locals ( -- total ) 0 HS{ } clone V{ } clone 1000 1000 over push (ant) ;