Paste: AoC 2022 day 13
        
	
	
	
		| Author: | xr | 
|---|
		| Mode: | factor | 
|---|
		| Date: | Wed, 14 Dec 2022 22:43:50 | 
|---|
	
	Plain Text |
	
	
USING: combinators.smart sorting math.vectors match arrays vectors grouping aoc math math.order sequences peg.ebnf multiline lists math.parser kernel
 sequences.extras sequences.deep ;
IN: aoc2022-13
EBNF: (parse) [=[
  n = [0-9]+ => [[ dec> ]]
  list = "["~ ((list|n) ","*~)* "]"~
]=]
: test-input ( -- seq )
  P" work/aoc2022-13/input.txt" load-file ;
: up ( x -- seq )
  dup sequence?
  [ 1vector ]
  unless ;
: first-cmp ( seq -- <=> )
  [ +eq+ = not ] filter
  [ length 0 > ]
  [ first ]
  [ drop +eq+ ]
  smart-if ;
MATCH-VARS: ?val ;
DEFER: compare
: (list-compare) ( x x -- x )
  [ up ] bi@ [ compare ] 2map first-cmp ;
: list-compare ( x x -- x )
    [ (list-compare) ] [ [ up ] bi@ [ length ] bi@ <=> ] 2bi 2array
    {
      { { +eq+ +lt+ } [ +lt+ ] }
      { { +eq+ +eq+ } [ +eq+ ] }
      { { +eq+ +gt+ } [ +gt+ ] }
      { { +lt+ ?val } [ +lt+ ] }
      { { +gt+ ?val } [ +gt+ ] }
    } match-cond ;
: compare ( seq seq -- <=> )
  2dup [ number? ] bi@ and
  [ <=> ]
  [ list-compare ]
  if ; inline recursive
: parse ( -- seq )
  test-input
  harvest [ (parse) ] map ;
:: part1 ( -- n )
  parse
  [ <evens> ] [ <odds> ] bi
  [ >vector ] bi@ :> ( l r )
  l r [ compare ] 2map :> compare-list
  compare-list
  +lt+ swap indices
  1 v+n sum ;
: mycompare ( obj1 obj2 -- <=> )
  compare
;
: part2 ( -- n )
  parse
  V{ V{ V{ 2 } } V{ V{ 6 } } } append
  [ mycompare ] sort
  [ V{ V{ 2 } }  swap index 1 + ] [ V{ V{ 6 } } swap index 1 + ] bi
  *
  ;
	
	
		New Annotation