Brace expansion using ranges: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Minor tidy) |
|||
Line 1,392: | Line 1,392: | ||
rangeless{random}string -> |
rangeless{random}string -> |
||
rangeless{random}string</pre> |
rangeless{random}string</pre> |
||
=={{header|jq}}== |
|||
'''Works with jq, the C implementation of jq''' |
|||
'''Works with gojq, the Go implementation of jq''' |
|||
This implementation relies on "reluctant" regex parsing. |
|||
Range expressions of the form {x..y}, where x and y are single |
|||
characters, are allowed, even if exactly one of them is a digit. |
|||
When expanding an expression with more than one range, the ordering |
|||
of the results will be based on expansion of the left-most range first. |
|||
<syntaxhighlight lang="jq"> |
|||
# Left-pad with 0s |
|||
def lpad($len): tostring | ($len - length) as $l | ("0" * $l) + .; |
|||
def expand: |
|||
# The key to success here is reluctance (".*?") |
|||
def cap: |
|||
capture("(?<head>^.*?)[{](?<from>[0-9]+|.)[.][.](?<to>[0-9]+|.)" |
|||
+ "([.][.](?<sign>-)?(?<increment>[0-9]))?[}](?<tail>.*)$"); |
|||
def ton: if . == null then . else tonumber end; |
|||
# Produce a stream of integers, handling implicit descent. |
|||
# $i and $j should be integers. |
|||
# If $i and $j are distinct, then expand($i;$j;null;null) will include both, |
|||
# otherwise just $i. |
|||
def expand($i; $j; $sign; $increment): |
|||
(if $increment == null then 1 else $increment end) as $inc |
|||
| if $sign == null |
|||
then if $i <= $j |
|||
then range($i; $j + 1; $inc) |
|||
else range($i; $j - 1; - $inc) |
|||
end |
|||
else [expand($i; $j; null; $increment)] | reverse[] |
|||
end ; |
|||
# Produce a stream of single characters, handling implicit descent |
|||
def explode($x; $y; $sign; $increment): |
|||
($x|explode[0]) as $x |
|||
| ($y|explode[0]) as $y |
|||
| expand($x; $y; $sign; $increment) |
|||
| [.] | implode; |
|||
# The number of leading 0s of the input string |
|||
def leadingZeros: match("^0*") | .string | length; |
|||
def padding($x; $y): |
|||
($x | leadingZeros) as $a |
|||
| ($y | leadingZeros) as $b |
|||
| [if $a > 0 then ($x|length) else 0 end, |
|||
if $b > 0 then ($y|length) else 0 end] |
|||
| max; |
|||
( cap as $c |
|||
| if ($c.from|test("[0-9]+")) and ($c.to|test("[0-9]+")) |
|||
then padding($c.from; $c.to) as $padding |
|||
| $c.head |
|||
+ ( expand($c.from|tonumber; |
|||
$c.to|tonumber; |
|||
$c.sign; |
|||
$c.increment | ton) | lpad($padding)) |
|||
+ ($c.tail | expand) |
|||
elif ($c.from|length == 1) and ($c.to|length == 1) |
|||
then $c.head + explode($c.from; $c.to; $c.sign; $c.increment|ton) |
|||
+ ($c.tail | expand) |
|||
else "" |
|||
end ) |
|||
// . ; |
|||
def examples: |
|||
"simpleNumberRising{1..3}.txt", |
|||
"simpleAlphaDescending-{Z..X}.txt", |
|||
"steppedDownAndPadded-{10..00..5}.txt", |
|||
"minusSignFlipsSequence {030..20..-5}.txt", |
|||
"reverseSteppedNumberRising{1..6..-2}.txt", |
|||
"combined-{Q..P}{2..1}.txt", |
|||
"emoji{🌵..🌶}{🌽..🌾}etc", |
|||
"li{teral", |
|||
"rangeless{}empty", |
|||
"rangeless{random}string", |
|||
"mixedNumberAlpha{5..k}", |
|||
"steppedAlphaRising{P..Z..2}.txt", |
|||
"stops after endpoint-{02..10..3}.txt", |
|||
"steppedNumberRising{1..6..2}.txt", |
|||
"steppedNumberDescending{20..9..2}", |
|||
"steppedAlphaDescending-{Z..M..2}.txt", |
|||
"reversedSteppedAlphaDescending-{Z..M..-2}.txt" |
|||
; |
|||
examples |
|||
| "\(.) ->", |
|||
" \(expand)", "" |
|||
</syntaxhighlight> |
|||
{{output}} |
|||
<pre style="height:20lh;overflow:auto> |
|||
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 |
|||
reverseSteppedNumberRising{1..6..-2}.txt -> |
|||
reverseSteppedNumberRising5.txt |
|||
reverseSteppedNumberRising3.txt |
|||
reverseSteppedNumberRising1.txt |
|||
combined-{Q..P}{2..1}.txt -> |
|||
combined-Q2.txt |
|||
combined-P2.txt |
|||
combined-Q1.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} -> |
|||
mixedNumberAlpha5 |
|||
mixedNumberAlpha6 |
|||
mixedNumberAlpha7 |
|||
mixedNumberAlpha8 |
|||
mixedNumberAlpha9 |
|||
mixedNumberAlpha: |
|||
mixedNumberAlpha; |
|||
mixedNumberAlpha< |
|||
mixedNumberAlpha= |
|||
mixedNumberAlpha> |
|||
mixedNumberAlpha? |
|||
mixedNumberAlpha@ |
|||
mixedNumberAlphaA |
|||
mixedNumberAlphaB |
|||
mixedNumberAlphaC |
|||
mixedNumberAlphaD |
|||
mixedNumberAlphaE |
|||
mixedNumberAlphaF |
|||
mixedNumberAlphaG |
|||
mixedNumberAlphaH |
|||
mixedNumberAlphaI |
|||
mixedNumberAlphaJ |
|||
mixedNumberAlphaK |
|||
mixedNumberAlphaL |
|||
mixedNumberAlphaM |
|||
mixedNumberAlphaN |
|||
mixedNumberAlphaO |
|||
mixedNumberAlphaP |
|||
mixedNumberAlphaQ |
|||
mixedNumberAlphaR |
|||
mixedNumberAlphaS |
|||
mixedNumberAlphaT |
|||
mixedNumberAlphaU |
|||
mixedNumberAlphaV |
|||
mixedNumberAlphaW |
|||
mixedNumberAlphaX |
|||
mixedNumberAlphaY |
|||
mixedNumberAlphaZ |
|||
mixedNumberAlpha[ |
|||
mixedNumberAlpha\ |
|||
mixedNumberAlpha] |
|||
mixedNumberAlpha^ |
|||
mixedNumberAlpha_ |
|||
mixedNumberAlpha` |
|||
mixedNumberAlphaa |
|||
mixedNumberAlphab |
|||
mixedNumberAlphac |
|||
mixedNumberAlphad |
|||
mixedNumberAlphae |
|||
mixedNumberAlphaf |
|||
mixedNumberAlphag |
|||
mixedNumberAlphah |
|||
mixedNumberAlphai |
|||
mixedNumberAlphaj |
|||
mixedNumberAlphak |
|||
steppedAlphaRising{P..Z..2}.txt -> |
|||
steppedAlphaRisingP.txt |
|||
steppedAlphaRisingR.txt |
|||
steppedAlphaRisingT.txt |
|||
steppedAlphaRisingV.txt |
|||
steppedAlphaRisingX.txt |
|||
steppedAlphaRisingZ.txt |
|||
stops after endpoint-{02..10..3}.txt -> |
|||
stops after endpoint-02.txt |
|||
stops after endpoint-05.txt |
|||
stops after endpoint-08.txt |
|||
steppedNumberRising{1..6..2}.txt -> |
|||
steppedNumberRising1.txt |
|||
steppedNumberRising3.txt |
|||
steppedNumberRising5.txt |
|||
steppedNumberDescending{20..9..2} -> |
|||
steppedNumberDescending20 |
|||
steppedNumberDescending18 |
|||
steppedNumberDescending16 |
|||
steppedNumberDescending14 |
|||
steppedNumberDescending12 |
|||
steppedNumberDescending10 |
|||
steppedAlphaDescending-{Z..M..2}.txt -> |
|||
steppedAlphaDescending-Z.txt |
|||
steppedAlphaDescending-X.txt |
|||
steppedAlphaDescending-V.txt |
|||
steppedAlphaDescending-T.txt |
|||
steppedAlphaDescending-R.txt |
|||
steppedAlphaDescending-P.txt |
|||
steppedAlphaDescending-N.txt |
|||
reversedSteppedAlphaDescending-{Z..M..-2}.txt -> |
|||
reversedSteppedAlphaDescending-N.txt |
|||
reversedSteppedAlphaDescending-P.txt |
|||
reversedSteppedAlphaDescending-R.txt |
|||
reversedSteppedAlphaDescending-T.txt |
|||
reversedSteppedAlphaDescending-V.txt |
|||
reversedSteppedAlphaDescending-X.txt |
|||
reversedSteppedAlphaDescending-Z.txt |
|||
</pre> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
<syntaxhighlight lang="julia">padzeros(str) = (len = length(str)) > 1 && str[1] == '0' ? len : 0 |
<syntaxhighlight lang="julia">padzeros(str) = (len = length(str)) > 1 && str[1] == '0' ? len : 0 |
||
Line 1,493: | Line 1,738: | ||
stops after endpoint-08.txt |
stops after endpoint-08.txt |
||
</pre> |
</pre> |
||
=={{header|Nim}}== |
=={{header|Nim}}== |
||
{{trans|Wren}} |
{{trans|Wren}} |