Brace expansion using ranges: Difference between revisions
Content added Content deleted
m (add the extra examples from Wren) |
Thundergnat (talk | contribs) (→{{header|Raku}}: Rearrange, make expand sub self-contained, add some more stringy handling options and fails, test) |
||
Line 1,124: | Line 1,124: | ||
$incr.=abs; |
$incr.=abs; |
||
if try +$start |
if try all( +$start, +$end ) ~~ Numeric { |
||
$incr = - $incr if $start > $end; |
$incr = - $incr if $start > $end; |
||
Line 1,134: | Line 1,134: | ||
@return = @this.map: { $string.subst($range, sprintf("%{'0' ~ max $sl, $el}d", $_) ) } |
@return = @this.map: { $string.subst($range, sprintf("%{'0' ~ max $sl, $el}d", $_) ) } |
||
} |
} |
||
elsif $start |
elsif try +$start ~~ Numeric or +$end ~~ Numeric { |
||
return $string #fail |
|||
} |
|||
else { |
|||
my @this = $start lt $end ?? ($start, (*.ord + $incr).chr …^ * gt $end) !! ($start, (*.ord + $incr).chr …^ * lt $end); |
|||
my @this; |
|||
if $start.chars + $end.chars > 2 { |
|||
return $string if $start.succ eq $start or $end.succ eq $end; # fail |
|||
@this = $start lt $end ?? ($start, (*.succ xx $incr).tail …^ * gt $end) !! ($start, (*.pred xx $incr).tail …^ * lt $end); |
|||
} |
|||
else { |
|||
$incr = -$incr if $start gt $end; |
|||
@this = $start lt $end ?? ($start, (*.ord + $incr).chr …^ * gt $end) !! ($start, (*.ord + $incr).chr …^ * lt $end); |
|||
} |
|||
@return = @this.map: { $string.subst($range, sprintf("%s", $_) ) } |
|||
} |
} |
||
} |
} |
||
Line 1,150: | Line 1,159: | ||
@return = $these.join: ' ' |
@return = $these.join: ' ' |
||
} |
} |
||
} |
|||
my $cnt = 1; |
|||
while $cnt != +@return { |
|||
$cnt = +@return; |
|||
@return.=map: { |.&expand } |
|||
} |
} |
||
@return |
@return |
||
Line 1,169: | Line 1,183: | ||
# Test some other features |
# Test some other features |
||
'stop point not in sequence-{02..10..3}.txt' |
|||
# Emoji lists |
|||
steppedAlphaRising{P..Z..2}.txt |
|||
emoji{☃,☄}{★,🇺🇸,☆}lists |
|||
'simple {just,give,me,money} list' |
|||
{thatʼs,what,I,want} |
|||
'emoji {☃,☄}{★,🇺🇸,☆} lists' |
|||
'alphanumeric mix{ab7..ac1}.txt' |
|||
'alphanumeric mix{0A..0C}.txt' |
|||
# |
# fail by design |
||
'stops after endpoint-{02..10..3}.txt' |
|||
'mixed terms fail {7..C}.txt' |
|||
# Simple list |
|||
'multi char emoji ranges fail {🌵🌵..🌵🌶}' |
|||
'simple {I,want,my,money,back} list' |
|||
# Prefix, list |
|||
_{I,want,my,money,back} |
|||
# Postfix, list |
|||
{I,want,my,money,back}! |
|||
# List, no prefix, postfix |
|||
{I,want,my,money,back} |
|||
# fail by design |
|||
'alphanumeric mix{a..1}.txt' |
|||
> -> $test { |
> -> $test { |
||
say "$test ->"; |
say "$test ->"; |
||
say (' ' xx * Z~ expand $test).join: "\n"; |
|||
my $cnt = -1; |
|||
while $cnt != +@strings { |
|||
$cnt = +@strings; |
|||
@strings.=map: { |.&expand } |
|||
} |
|||
say (' ' xx * Z~ @strings).join: "\n"; |
|||
say ''; |
say ''; |
||
} |
} |
||
Line 1,244: | Line 1,243: | ||
rangeless{random}string |
rangeless{random}string |
||
stop point not in sequence-{02..10..3}.txt -> |
|||
emoji{☃,☄}{★,🇺🇸,☆}lists -> |
|||
stop point not in sequence-02.txt |
|||
emoji☃★lists |
|||
stop point not in sequence-05.txt |
|||
emoji☃🇺🇸lists |
|||
stop point not in sequence-08.txt |
|||
emoji☃☆lists |
|||
emoji☄★lists |
|||
emoji☄🇺🇸lists |
|||
emoji☄☆lists |
|||
steppedAlphaRising{P..Z..2}.txt -> |
|||
steppedAlphaRisingP.txt |
|||
steppedAlphaRisingR.txt |
|||
steppedAlphaRisingT.txt |
|||
steppedAlphaRisingV.txt |
|||
steppedAlphaRisingX.txt |
|||
steppedAlphaRisingZ.txt |
|||
simple { |
simple {just,give,me,money} list -> |
||
simple |
simple just list |
||
simple |
simple give list |
||
simple |
simple me list |
||
simple money list |
simple money list |
||
simple back list |
|||
{thatʼs,what,I,want} -> |
|||
thatʼs what I want |
|||
_I |
|||
_want |
|||
emoji {☃,☄}{★,🇺🇸,☆} lists -> |
|||
_my |
|||
emoji ☃★ lists |
|||
_money |
|||
emoji ☃🇺🇸 lists |
|||
_back |
|||
emoji ☃☆ lists |
|||
emoji ☄★ lists |
|||
emoji ☄🇺🇸 lists |
|||
emoji ☄☆ lists |
|||
alphanumeric mix{ab7..ac1}.txt -> |
|||
alphanumeric mixab7.txt |
|||
alphanumeric mixab8.txt |
|||
alphanumeric mixab9.txt |
|||
alphanumeric mixac0.txt |
|||
alphanumeric mixac1.txt |
|||
alphanumeric mix{0A..0C}.txt -> |
|||
{I,want,my,money,back}! -> |
|||
alphanumeric mix0A.txt |
|||
I! |
|||
alphanumeric mix0B.txt |
|||
want! |
|||
alphanumeric mix0C.txt |
|||
my! |
|||
money! |
|||
back! |
|||
mixed terms fail {7..C}.txt -> |
|||
{I,want,my,money,back} -> |
|||
mixed terms fail {7..C}.txt |
|||
multi char emoji ranges fail {🌵🌵..🌵🌶} -> |
|||
alphanumeric mix{a..1}.txt -> |
|||
multi char emoji ranges fail {🌵🌵..🌵🌶} |
|||
alphanumeric mix{a..1}.txt |
|||
</pre> |
</pre> |
||