我试图找到适合最多 n 个音节的 (c)v 模式的字符组合,因此首先使用扩展,就像echo {,p,t}{a,i}
一个音节的所有可能性一样(仅使用 2 个字母以提高可读性)。为了获得更多音节,我所能想到的就是将其扩展为每个音节echo {{,p,t}{a,i},{,p,t}{a,i}{,p,t}{a,i}}
(即“所有单音节组合然后所有两个音节组合”)。有没有更好的方法将其扩展到 n 个音节,以便我可以输入类似echo {,p,t}{a,i}*{1..3}
所有 1、2 和 3 音节扩展(等等)的内容?
答案1
答案2
兹什, 73 字节
c=('' p t) v=(a i) r=({1..4})
(){echo ${(e)@}} '${(el['$^r'*6][$^c$^v])}'
展开它:
$ c=( '' p t ) v=( a i ) r=( {1..4} )
$ echo $c$v
p ta i
$ echo $^c$^v
a i pa pi ta ti
使用$^c
而不是$c
,数组的扩展有点像大括号扩展。
$ echo ${(l[12][$^c$^v])}
$^c$^v$^c$^v
我们扩展没有什么(参数扩展没有参数)使用l
eft 填充运算符,这里用字符串填充$^c$^v
到长度12
(字符串长度的两倍$^c$^v
)。
$ echo ${(el[12][$^c$^v])}
aa ai apa api ata ati ia ii ipa ipi ita iti paa pai papa papi pata pati pia pii pipa pipi pita piti taa tai tapa tapi tata tati tia tii tipa tipi tita titi
如果我们添加e
参数扩展标志,结果中的扩展将被e
评估/e
扩展。
所以我们需要做的就是生成 6, 12, ... n*6 的填充。
$ echo '${(el['$^r'*6][$^c$^v])}'
${(el[1*6][$^c$^v])} ${(el[2*6][$^c$^v])} ${(el[3*6][$^c$^v])} ${(el[4*6][$^c$^v])}
如果我们可以将这些单词放入数组中,我们可以e
对其应用标志来扩展结果。为此,我们使用匿名函数,并将这些单词作为参数传递,它们将在其中的$@
aka$argv
数组中可用。