diff --git a/extra/rosetta-code/multisplit/authors.txt b/extra/rosetta-code/multisplit/authors.txt new file mode 100644 index 0000000000..8e1955f8e1 --- /dev/null +++ b/extra/rosetta-code/multisplit/authors.txt @@ -0,0 +1 @@ +Alexander Ilin diff --git a/extra/rosetta-code/multisplit/multisplit-tests.factor b/extra/rosetta-code/multisplit/multisplit-tests.factor new file mode 100644 index 0000000000..e7094d8e9a --- /dev/null +++ b/extra/rosetta-code/multisplit/multisplit-tests.factor @@ -0,0 +1,8 @@ +! Copyright (C) 2020 Alexander Ilin. +! See http://factorcode.org/license.txt for BSD license. +USING: sequences strings tools.test rosetta-code.multisplit ; +IN: rosetta-code.multisplit.tests + +{ { "a" "" "b" "" "c" } } [ + "a!===b=!=c" { "==" "!=" "=" } multisplit [ >string ] map +] unit-test diff --git a/extra/rosetta-code/multisplit/multisplit.factor b/extra/rosetta-code/multisplit/multisplit.factor new file mode 100644 index 0000000000..b082be9123 --- /dev/null +++ b/extra/rosetta-code/multisplit/multisplit.factor @@ -0,0 +1,22 @@ +! Copyright (C) 2020 Alexander Ilin. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays fry kernel make sequences ; + +IN: rosetta-code.multisplit + +: ?pair ( ? x -- {?,x}/f ) + over [ 2array ] [ 2drop f ] if ; + +: best-separator ( seq -- pos index ) + dup [ first ] map infimum '[ first _ = ] filter first first2 ; + +: first-subseq ( separators seq -- n separator ) + dupd [ swap [ subseq-start ] dip ?pair ] curry map-index sift + [ drop f f ] [ best-separator rot nth ] if-empty ; + +: multisplit ( string separators -- seq ) + '[ + [ _ over first-subseq dup ] [ + length -rot cut-slice swap , swap tail-slice + ] while 2drop , + ] { } make ; diff --git a/extra/rosetta-code/multisplit/tags.txt b/extra/rosetta-code/multisplit/tags.txt new file mode 100644 index 0000000000..1e107f52e4 --- /dev/null +++ b/extra/rosetta-code/multisplit/tags.txt @@ -0,0 +1 @@ +examples