Brace expansion using ranges: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Raku}}: Tidy, DRY, no functional changes) |
(julia example) |
||
Line 867: | Line 867: | ||
rangeless{random}string -> |
rangeless{random}string -> |
||
rangeless{random}string</pre> |
rangeless{random}string</pre> |
||
=={{header|Julia}}== |
|||
Julia currently does not handle certain trigraphs in strings correctly, such as , so that test is omitted. |
|||
<lang julia>prefixzeros(str) = length(str) > 1 && str[1] == '0' ? length(str) : 0 |
|||
function ranged(str) |
|||
rang = split(str[2:end-1], "..") |
|||
delta = length(rang) > 2 ? parse(Int, rang[3]) : 1 |
|||
if delta < 0 |
|||
rang[1], rang[2], delta = rang[2], rang[1], -delta |
|||
end |
|||
if '0' <= rang[1][1] <= '9' || rang[1][1] == '-' |
|||
x, y = parse(Int, rang[1]), parse(Int, rang[2]) |
|||
pad = max(prefixzeros(rang[1]), prefixzeros(rang[2])) |
|||
return [string(x, pad=pad) for x in range(x, step=(x < y) ? delta : -delta, stop=y)] |
|||
else |
|||
x, y, z = rang[1][end], rang[2][end], rang[1][1:end-1] |
|||
return [z * string(x) for x in range(x, step=(x < y) ? delta : -delta, stop=y)] |
|||
end |
|||
end |
|||
function splatrange(s) |
|||
m = match(r"([^\{]*)(\{[^}]+\.\.[^\}]+\})(.*)", s) |
|||
m == nothing && return [s] |
|||
cap = m.captures |
|||
return [a * b for b in splatrange(cap[3]), |
|||
a in [cap[1] * string(x) for x in ranged(cap[2])]][:] |
|||
end |
|||
for test in [ |
|||
"simpleNumberRising{1..3}.txt", |
|||
"simpleAlphaDescending-{Z..X}.txt", |
|||
"steppedDownAndPadded-{10..00..5}.txt", |
|||
"minusSignFlipsSequence {030..20..-5}.txt", |
|||
"combined-{Q..P}{2..1}.txt", |
|||
"li{teral", |
|||
"rangeless{}empty", |
|||
"rangeless{random}string", |
|||
] |
|||
println(test, "->\n", [" " * x * "\n" for x in splatrange(test)]...) |
|||
end |
|||
</lang>{{out}} |
|||
<pre> |
|||
simpleNumberRising{1..3}.txt-> |
|||
simpleNumberRising1.txt |
|||
simpleNumberRising2.txt |
|||
simpleNumberRising3.txt |
|||
simpleAlphaDescending-{Z..X}.txt-> |
|||
simpleAlphaDescending-Z.txt |
|||
simpleAlphaDescending-Y.txt |
|||
simpleAlphaDescending-X.txt |
|||
steppedDownAndPadded-{10..00..5}.txt-> |
|||
steppedDownAndPadded-10.txt |
|||
steppedDownAndPadded-05.txt |
|||
steppedDownAndPadded-00.txt |
|||
minusSignFlipsSequence {030..20..-5}.txt-> |
|||
minusSignFlipsSequence 020.txt |
|||
minusSignFlipsSequence 025.txt |
|||
minusSignFlipsSequence 030.txt |
|||
combined-{Q..P}{2..1}.txt-> |
|||
combined-Q2.txt |
|||
combined-Q1.txt |
|||
combined-P2.txt |
|||
combined-P1.txt |
|||
li{teral-> |
|||
li{teral |
|||
rangeless{}empty-> |
|||
rangeless{}empty |
|||
rangeless{random}string-> |
|||
rangeless{random}string |
|||
</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |