Brace expansion using ranges: Difference between revisions
Content added Content deleted
(Added Wren) |
|||
Line 1,119: | Line 1,119: | ||
alphanumeric mix{a..1}.txt -> |
alphanumeric mix{a..1}.txt -> |
||
alphanumeric mix{a..1}.txt |
alphanumeric mix{a..1}.txt |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{libheader|Wren-fmt}} |
|||
Added a further example to test mixed number/alpha ranges which apparently are not expanded. |
|||
<lang ecmascript>import "/fmt" for Fmt |
|||
var parseRange = Fn.new { |r| |
|||
if (r == "") return ["{}"] // rangeless, empty |
|||
var sp = r.split("..") |
|||
if (sp.count == 1) return ["{%(r)}"] // rangeless, random value |
|||
var sta = sp[0] |
|||
var end = sp[1] |
|||
var inc = (sp.count == 2) ? "1" : sp[2] |
|||
var n1 = Num.fromString(sta) |
|||
var n2 = Num.fromString(end) |
|||
var n3 = Num.fromString(inc) |
|||
if (!n3) return ["{%(r)}"] // increment isn't a number |
|||
var numeric = n1 && n2 |
|||
if (!numeric) { |
|||
if ((n1 && !n2) || (!n1 && n2)) return ["{%(r)}"] // mixed numeric/alpha not expanded |
|||
if (sta.count != 1 || end.count != 1) return ["{%(r)}"] // start/end are not both single alpha |
|||
n1 = sta.codePoints[0] |
|||
n2 = end.codePoints[0] |
|||
} |
|||
var width = 1 |
|||
if (numeric) width = (sta.count < end.count) ? end.count : sta.count |
|||
if (n3 == 0) return (numeric) ? [Fmt.dz(width, n1)] : [sta] // zero increment |
|||
var res = [] |
|||
var asc = n1 < n2 |
|||
if (n3 < 0) { |
|||
asc = !asc |
|||
var t = n1 |
|||
n1 = n2 |
|||
n2 = t |
|||
n3 = -n3 |
|||
} |
|||
var i = n1 |
|||
if (asc) { |
|||
while (i <= n2) { |
|||
res.add( (numeric) ? Fmt.dz(width, i) : String.fromCodePoint(i) ) |
|||
i = i + n3 |
|||
} |
|||
} else { |
|||
while (i >= n2) { |
|||
res.add(( numeric) ? Fmt.dz(width, i) : String.fromCodePoint(i) ) |
|||
i = i - n3 |
|||
} |
|||
} |
|||
return res |
|||
} |
|||
var rangeExpand = Fn.new { |s| |
|||
var res = [""] |
|||
var rng = "" |
|||
var inRng = false |
|||
for (c in s) { |
|||
if (c == "{" && !inRng) { |
|||
inRng = true |
|||
rng = "" |
|||
} else if (c == "}" && inRng) { |
|||
var rngRes = parseRange.call(rng) |
|||
var rngCount = rngRes.count |
|||
var res2 = [] |
|||
for (i in 0...res.count) { |
|||
for (j in 0...rngCount) res2.add(res[i] + rngRes[j]) |
|||
} |
|||
res = res2 |
|||
inRng = false |
|||
} else if (inRng) { |
|||
rng = rng + c |
|||
} else { |
|||
for (i in 0...res.count) res[i] = res[i] + c |
|||
} |
|||
} |
|||
if (inRng) for (i in 0...res.count) res[i] = res[i] + "{" + rng // unmatched braces |
|||
return res |
|||
} |
|||
var examples = [ |
|||
"simpleNumberRising{1..3}.txt", |
|||
"simpleAlphaDescending-{Z..X}.txt", |
|||
"steppedDownAndPadded-{10..00..5}.txt", |
|||
"minusSignFlipsSequence {030..20..-5}.txt", |
|||
"combined-{Q..P}{2..1}.txt", |
|||
"emoji{🌵..🌶}{🌽..🌾}etc", |
|||
"li{teral", |
|||
"rangeless{}empty", |
|||
"rangeless{random}string", |
|||
"mixedNumberAlpha{5..k}" |
|||
] |
|||
for (s in examples) { |
|||
System.write("%(s) ->\n ") |
|||
var res = rangeExpand.call(s) |
|||
System.print(res.join("\n ")) |
|||
System.print() |
|||
}</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 |
|||
emoji{🌵..🌶}{🌽..🌾}etc -> |
|||
emoji🌵🌽etc |
|||
emoji🌵🌾etc |
|||
emoji🌶🌽etc |
|||
emoji🌶🌾etc |
|||
li{teral -> |
|||
li{teral |
|||
rangeless{}empty -> |
|||
rangeless{}empty |
|||
rangeless{random}string -> |
|||
rangeless{random}string |
|||
mixedNumberAlpha{5..k} -> |
|||
mixedNumberAlpha{5..k} |
|||
</pre> |
</pre> |