主に歴史的な理由から、bashは構文とプログラミングのパラダイムの寄せ集めです。これにより、ゴルフが厄介になり、時にはイライラすることがあります。言語。これらの1つはブレースの拡張です。
ブレースの展開には2つの基本的なタイプがあります。
- リストの中括弧には、コンマで区切られた任意の文字列のリストを含めることができます(重複や空の文字列を含む)。たとえば、
{a,b,c,,pp,cg,pp,}
展開されますa b c pp cg pp
(空の文字列の周りのスペースに注意してください)。 - シーケンスブレースには、で区切られたシーケンスエンドポイントが含まれる場合があります
..
。必要に応じて..
、次のステップサイズが続きます。シーケンスのエンドポイントは、整数または文字のいずれかです。シーケンスは、どちらのエンドポイントが大きいかによって自動的に上昇または下降します。例えば:{0..15}
に展開されます0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
に展開されます-10 -9 -8 -7 -6 -5
{3..-6..2}
に展開されます3 1 -1 -3 -5
{a..f}
に展開されますa b c d e f
{Z..P..3}
に展開されますZ W T Q
さらに、シーケンスとリストの中括弧がリストの中括弧と共に存在する場合があります。
{a,b,{f..k},p}
に展開されますa b f g h i j k p
{a,{b,c}}
に展開されますa b c
中括弧は、その両側に空白以外の文字列で展開します。例えば:
c{a,o,ha,}t
に展開されますcat cot chat ct
これは、連結された複数の中括弧に対しても機能します。
{ab,fg}{1..3}
に展開されますab1 ab2 ab3 fg1 fg2 fg3
これは非常に複雑になる可能性があります。例えば:
{A..C}{x,{ab,fg}{1..3},y,}
に展開されますAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
ただし、展開の間に空白がある場合、それらは単に別々の展開として展開します。例えば:
{a..c} {1..5}
に展開されますa b c 1 2 3 4 5
順序が常に保持されることに注意してください。
このチャレンジのエントリは、上記のようにbash brace展開を展開します。特に:
- eval by
bash
(または同様の展開を行う他のシェル)は許可されていません - シーケンス中括弧は常に、数字と数字、小文字と小文字、または大文字と大文字で、ミキシングされません。数値は、32ビットの符号付き範囲の整数になります。指定した場合、オプションのステップサイズは常に正の整数になります。 (bashも
{A..z}
同様に拡張することに注意してください。ただし、これはこのチャレンジでは無視される場合があります) - リスト中括弧内の個々の項目は、常に大文字と小文字の英数字のみで構成されます(空の文字列が含まれます)
- リストの中括弧には、他の中括弧展開の任意の入れ子が含まれる場合があります
- 中括弧は、任意の回数連結できます。これは言語のメモリによって制限されるため、理論上は任意の数の連結を行うことができますが、メモリ不足になった場合はカウントされません。
上記のテキストの例は、テストケースとして機能します。要約すると、入力の各行は出力の同じ行に対応しており、次のとおりです。
入力
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
出力
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r