Brace expansion: Difference between revisions

m
{{header|PHP}} moved to right place alphabetically
m ({{header|PHP}} moved to right place alphabetically)
Line 2,041:
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
 
</pre>
 
=={{header|Phix}}==
Fairly straightforward recursive solution
<lang Phix>--
-- demo\rosetta\Brace_expansion.exw
-- ================================
--
function pair(sequence stems, sequence brest)
sequence res = {}
for i=1 to length(stems) do
for j=1 to length(brest) do
res = append(res,stems[i]&brest[j])
end for
end for
return res
end function
 
function brarse(string s)
integer idx = 1
while idx<=length(s) do
integer ch = s[idx]
if ch='{' then
sequence alts = {idx}
idx += 1
integer l0 = idx
bool nest = false
integer level = 1
while idx<=length(s) do
switch s[idx] do
case '{': level += 1
nest = true
case '}': level -= 1
if level=0 then exit end if
case ',': if level=1 then
alts = append(alts,idx)
end if
case '\\': idx += 1
end switch
idx += 1
end while
if length(alts)>1 and level=0 then
alts &= idx
sequence stems = {}
string stem = s[1..alts[1]-1]
for i=2 to length(alts) do
string rest = s[alts[i-1]+1..alts[i]-1]
if nest then
sequence inners = brarse(rest)
for j=1 to length(inners) do
stems = append(stems,stem&inners[j])
end for
else
stems = append(stems,stem&rest)
end if
end for
return pair(stems,brarse(s[idx+1..$]))
elsif nest then
return pair({s[1..l0-1]},brarse(s[l0..$]))
end if
end if
idx += 1
end while
return {s}
end function
 
-- (since ? and pp() add their own backslash escapes:)
procedure edump(sequence x)
for i=1 to length(x) do
printf(1,"%s\n",{x[i]})
end for
end procedure
 
edump(brarse("~/{Downloads,Pictures}/*.{jpg,gif,png}"))
edump(brarse("It{{em,alic}iz,erat}e{d,}, please."))
edump(brarse(`{,{,gotta have{ ,\, again\, }}more }cowbell!`))
edump(brarse(`{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}`))</lang>
{{Out}}
<pre>
~/Downloads/*.jpg
~/Downloads/*.gif
~/Downloads/*.png
~/Pictures/*.jpg
~/Pictures/*.gif
~/Pictures/*.png
Itemized, please.
Itemize, please.
Italicized, please.
Italicize, please.
Iterated, please.
Iterate, please.
cowbell!
more cowbell!
gotta have more cowbell!
gotta have\, again\, more cowbell!
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
=={{header|PHP}}==
Ported from {{trans|Python solution.}}
<lang php>function getitem($s,$depth=0) {
function getitem($s,$depth=0) {
$out = [''];
while ($s) {
Line 2,119 ⟶ 2,215:
printf(" %s\n", $expansion);
}
}</lang>
}
</lang>
 
{{out}}
<pre>
Line 2,149 ⟶ 2,243:
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
=={{header|Phix}}==
Fairly straightforward recursive solution
<lang Phix>--
-- demo\rosetta\Brace_expansion.exw
-- ================================
--
function pair(sequence stems, sequence brest)
sequence res = {}
for i=1 to length(stems) do
for j=1 to length(brest) do
res = append(res,stems[i]&brest[j])
end for
end for
return res
end function
 
function brarse(string s)
integer idx = 1
while idx<=length(s) do
integer ch = s[idx]
if ch='{' then
sequence alts = {idx}
idx += 1
integer l0 = idx
bool nest = false
integer level = 1
while idx<=length(s) do
switch s[idx] do
case '{': level += 1
nest = true
case '}': level -= 1
if level=0 then exit end if
case ',': if level=1 then
alts = append(alts,idx)
end if
case '\\': idx += 1
end switch
idx += 1
end while
if length(alts)>1 and level=0 then
alts &= idx
sequence stems = {}
string stem = s[1..alts[1]-1]
for i=2 to length(alts) do
string rest = s[alts[i-1]+1..alts[i]-1]
if nest then
sequence inners = brarse(rest)
for j=1 to length(inners) do
stems = append(stems,stem&inners[j])
end for
else
stems = append(stems,stem&rest)
end if
end for
return pair(stems,brarse(s[idx+1..$]))
elsif nest then
return pair({s[1..l0-1]},brarse(s[l0..$]))
end if
end if
idx += 1
end while
return {s}
end function
 
-- (since ? and pp() add their own backslash escapes:)
procedure edump(sequence x)
for i=1 to length(x) do
printf(1,"%s\n",{x[i]})
end for
end procedure
 
edump(brarse("~/{Downloads,Pictures}/*.{jpg,gif,png}"))
edump(brarse("It{{em,alic}iz,erat}e{d,}, please."))
edump(brarse(`{,{,gotta have{ ,\, again\, }}more }cowbell!`))
edump(brarse(`{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}`))</lang>
{{Out}}
<pre>
~/Downloads/*.jpg
~/Downloads/*.gif
~/Downloads/*.png
~/Pictures/*.jpg
~/Pictures/*.gif
~/Pictures/*.png
Itemized, please.
Itemize, please.
Italicized, please.
Italicize, please.
Iterated, please.
Iterate, please.
cowbell!
more cowbell!
gotta have more cowbell!
gotta have\, again\, more cowbell!
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
7,804

edits