重击, 165 字节

重击, 165 字节

我试图找到适合最多 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

你可以做这样的事情

重击, 165 字节

f(){
i=$1
exp=$2
con=$2
printf '{'
while [ "$i" -gt 0 ] ; do
  (( i-- ))
  printf '%s' "$con,"
  con+=$exp
done
printf '}'
echo
}

eval echo "$(f 6 '{,p,t}{a,i}')"

在线尝试一下!

答案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

我们扩展没有什么(参数扩展没有参数)使用left 填充运算符,这里用字符串填充$^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数组中可用。

答案3

充分利用您的代码/逻辑。

克什,95字节,没有什么坏处eval:)

n=4
for ((i=1; i<=n; i++)) {
    printf -v x '{,p,t}{a,i}%.0s' {1..$i}
    printf '%s\n' $x
}

如果您的ksh实现不支持printf -v x,请替换为x=$(printf ...)

在线尝试一下!

相关内容