Paste: Two Sums solution (Rosetta Code)
Author: | CapitalEx |
Mode: | factor |
Date: | Thu, 27 Jul 2023 02:54:58 |
Plain Text |
: find-pair ( seq target -- pair )
'[ first2 + _ = ] find nip ;
: find-indices ( seq pair -- pair )
[ '[ _ index ] map ] when* ;
: two-sum ( target seq -- pair )
[ 2 <combinations> swap find-pair ] keep find-indices ;
Author: | CapitalEx |
Mode: | factor |
Date: | Thu, 27 Jul 2023 03:06:55 |
Plain Text |
: (find-pair) ( seq target -- pair )
'[ first2 + _ = ] find nip ;
: find-pairs ( target seq -- seq pair/f )
[ 2 <combinations> swap find-pair ] keep ;
: find-indices ( seq pair/f -- indices/f )
[ '[ _ index ] map ] when* ;
: two-sum ( target seq -- pair )
find-pairs find-indices ;
Author: | CapitalEx |
Mode: | factor |
Date: | Thu, 27 Jul 2023 16:53:00 |
Plain Text |
: prep-hashtable ( sum seq -- hashtable sum seq )
tuck [ H{ } [ spin [ set-at ] keep ] reduce-index ] 2dip ;
: complements ( sum seq -- seq' )
[ - ] with map ;
: find-indices ( key assoc -- index/f index/f )
[ [ ?of nip ] with find ] keepd at ;
: result/empty ( index/f index/f -- pair )
2dup and [ 2array ] [ 2drop { } ] if ;
: two-sum ( sum seq -- pair )
prep-hashtable complements find-indices result/empty ;
Author: | CapitalEx |
Mode: | factor |
Date: | Thu, 27 Jul 2023 21:51:57 |
Plain Text |
: build-lookup ( seq -- hashtable )
H{ } [ set-of ] reduce-index ;
: build-pairs ( sum seq -- pairs )
[ [ - ] keep 2array ] with map! ;
: lookup ( hashtable pairs -- index/f )
first2 [ of ] bi-curry@ bi and ;
: find-sum ( hashtable seq -- sum )
[ lookup ] with map! sift ;
: two-sum ( sum seq -- pair )
[ nip build-lookup ] [ build-pairs ] 2bi find-sum ;
Author: | CapitalEx |
Mode: | factor |
Date: | Fri, 28 Jul 2023 02:30:28 |
Plain Text |
math.combinatorics sequences ;
IN: rosetta-code.two-sum
DEFER: (two-sum)
TUPLE: helper
sum seq index hash ;
: <two-sum-helper> ( sum seq -- helper )
\ helper new
swap >>seq
swap >>sum
0 >>index
H{ } clone >>hash ;
: no-sum ( helper -- empty )
drop { } ;
: in-bounds? ( helper -- ? )
[ index>> ]
[ seq>> length ] bi < ;
: next-sum ( helper -- pair )
dup in-bounds? [ (two-sum) ]
[ no-sum ] if ;
: next-index ( helper -- helper )
[ 1 + ] change-index ;
: remember-item ( helper -- helper )
dup [ hash>> ]
[ index>> dup ]
[ seq>> ] tri nth swap set-of drop ;
: result ( helper index -- helper )
swap index>> 2array ;
: find-compliment-index ( helper -- helper index/f )
dup [ sum>> ]
[ index>> ]
[ seq>> nth - ]
[ ] quad hash>> at ;
: (two-sum) ( helper -- pair )
remember-item find-compliment-index
[ result ] [ next-index next-sum ] if* ;
: two-sum ( sum seq -- pair )
Author: | CapitalEx |
Mode: | factor |
Date: | Fri, 28 Jul 2023 03:59:22 |
Plain Text |
USING: accessors arrays assocs combinators.extras kernel math
math.combinatorics sequences ;
IN: rosetta-code.two-sum
DEFER: (two-sum)
TUPLE: helper
sum seq index hash ;
: <two-sum-helper> ( sum seq -- helper )
\ helper new
swap >>seq
swap >>sum
0 >>index
H{ } clone >>hash ;
: no-sum ( helper -- empty )
drop { } ;
: in-bounds? ( helper -- ? )
[ index>> ]
[ seq>> length ] bi < ;
: next-sum ( helper -- pair )
dup in-bounds? [ (two-sum) ]
[ no-sum ] if ;
: next-index ( helper -- helper )
[ 1 + ] change-index ;
: remember-item ( helper -- helper )
dup [ hash>> ]
[ index>> ]
[ seq>> nth ]
[ index>> ] quad set-of drop ;
: result ( helper index -- helper )
swap index>> 2array ;
: find-compliment-index ( helper -- helper index/f )
dup [ sum>> ]
[ index>> ]
[ seq>> nth - ]
[ ] quad hash>> at ;
: (two-sum) ( helper -- pair )
remember-item find-compliment-index
[ result ] [ next-index next-sum ] if* ;
: two-sum ( sum seq -- pair )
<two-sum-helper> (two-sum) ;
New Annotation