最大n音節に対して(c)vパターンに一致する文字の組み合わせを見つけようとしているので、1つのecho {,p,t}{a,i}
音節に対するすべての可能性と同様に、最初に拡張を使用します(読みやすくするために2文字のみを使用)。より多くの音節を得るには、私が考えることができるのは、すべての音節に拡張するだけですecho {{,p,t}{a,i},{,p,t}{a,i}{,p,t}{a,i}}
(例:「すべての1音節の組み合わせの後にすべての2音節の組み合わせ」)。echo {,p,t}{a,i}*{1..3}
1、2、3音節拡張などをすべて入力できるようにn音節に拡張するより良い方法はありますか?
答え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
私達は延長する何もない(パラメータ拡張にはパラメータはありません。)l
eftパディング演算子を使用します。ここでは、文字列を$^c$^v
長さ12
(文字列の長さの2倍$^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
その単語にフラグを適用して結果を拡張できます。これを行うには、匿名関数を使用し、この単語を$@
別名$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 ...)