前書き
この課題は、2Dパターンマッチング言語であるGrimeに触発されました。基本的に、文字の2次元グリッドを記述する「グラマー」が与えられ、あなたの仕事はグラマーに従ってグリッドを生成することです。さらに、グリッドは特定の弱い意味で可能な限り小さくする必要があります。
入力
入力は、小文字のASCII文字と記号|およびを含む文字列-です。簡単にするために、入力には繰り返し小文字が含まれていません。文字列は、文字の長方形グリッドのクラスの仕様であり、次のようにスタックを使用して左から右に解析されます。
- 小文字の文字を考えると
c、スタックにプッシュしm×nた文字のグリッドをc任意のため、m, n ≥ 1。 - パイプが与えられたら、
|2つのグリッドAをポップBし、スタックから(B一番上にありました)、AB連結Bして得られたグリッドをの右側にプッシュしAます。これには、AそれBが必要で、同じ高さがあります。 - ハイフンを指定すると
-、2つのグリッドAをBスタックから(上にBあった)ポップし、A/B連結Bして得られたグリッドをの一番下にプッシュしAます。これは、ことが必要AとB等しい幅を持っています。
解析プロセス(文字ごとに異なる場合があります)の一部の選択mおよびn作成中に、入力仕様がスタックの最後に残っている長方形を正しく記述することが保証されます。
出力
出力は、入力で指定された文字の長方形のグリッドです。行または列を削除するとグリッドが無効になるという意味で、グリッドは最小限でなければなりません。改行で区切られた文字列(末尾の改行の有無にかかわらず)、2Dの文字配列、または文字列の配列のうち、最も便利な形式を返すことができます。
上記のとおりに入力を処理する必要はありません。唯一重要なことは、出力が正しいことです。
例
仕様を検討する
par-s||e-
まず、プッシュすることを選択した1×2の矩形をp、と1×1の長方形aとr(この理由は、後に明らかであろう)。その後、我々はポップaやr長方形を、その垂直連結を押します
a
r
次に、の1×2長方形をプッシュし、sそれと上の長方形をポップし、それらの水平連結をプッシュします
as
rs
次に、その四角形と四角形をポップしp、それらの連結をプッシュします
pas
prs
最後に、の3×1長方形をプッシュし、eそれと上の長方形をポップし、垂直連結をプッシュします
pas
prs
eee
これは、プログラムの出力、または少なくとも1つの可能性です。ただし、
ppas
ppas
pprs
eeee
また、仕様によって生成されます。多くの行と列を削除できるため、有効な出力ではありません。
より微妙な例として、考慮してください
co|m|p|il|e|r|-
この仕様は長方形を生成します
comp
iler
これは有効な出力です。ただし、それはまた生成します
commp
iiler
無効にすることなく単一の行または列を削除することはできないため、これも有効です。
ルール
完全なプログラムまたは機能を提供できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。
追加のテストケース
これらを使用してプログラムをテストできます。
Input:
a
Output:
a
Input:
co|mp|l|-ex|i|f|-y|
Example output:
cccoy
mplly
exify
Input:
ja-r|g-o|ni-|ze|d-|
Example output:
jronze
arondd
ggoidd
Input:
un|co|p-yr|i|gh-t-ab|-|le-||-
Example output:
unnnnnnn
coyriggl
ppyrihhe
ppyritte
ppyriabe
nとmは非決定的に選択されます。それらに適した値が存在することは保証されていますが、それらを見つけるのはプログラムの仕事です。
un|co|p-|yr|i|gh--t-ab|-|le-||-有効にすることは不可能です。最後-のアリティは2ですが、スタックには要素が1つしかありません。