このタスクは、最初の定期的なプレミアプログラミングパズルプッシュの一部です。
次の形式でアイテムの階層を取得します。
2
Hat
1
Gloves
次のようにボックスに入れる必要があります:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
入力形式では、数字は指定された数のアイテムでボックスを開始します。最初のボックスには2つのアイテム(帽子とグローブが入ったボックス)があり、2番目のボックスには1つのアイテム(グローブ)しか入っていません。
ご覧のように、ボックスもボックス内に配置できます。そして、それらは常に丸みを帯びています...ある種(とがった角は傷の危険であり、私たちはそれを望まないでしょう)。
以下に、仕様が提供するあらゆる小さな余地を活用したい人のための厄介な詳細があります。仕様を読んでいないことは、間違った解決策を提出する言い訳にはなりません。最後にテストスクリプトといくつかのテストケースがあります。
仕様
ボックスは、次の文字で構成されています。
|
(U + 007C)は、垂直エッジを構成するために使用されます。-
(U + 002D)は、水平エッジを構成するために使用されます。'
(U + 0027)は丸い下隅です。.
(U + 002E)は丸い上部の角です。
したがって、ボックスは次のようになります。
.--. | | '--'
Unicodeには丸い角と適切なボックス描画文字もありますが、このタスクはASCIIのみであることに注意してください。ユニコードが大好きなのと同様に、過去10年から10年ではまったく到達しなかった言語や環境が存在することを認識しています。
ボックスには、テキストまたは他のアイテムである一連のアイテムを含めることができます。ボックス内の個々のアイテムは上から下にレンダリングされます。したがって、シーケンスA、B、Cは次のようにレンダリングされます。
.---. | A | | B | | C | '---'
これはもちろん、ネストされたボックスにも適用されます。ネストされたボックスは、テキストのようなアイテムです。したがって、シーケンスA、B、Box(C、Box(D、E))、Fは次のようにレンダリングされます。
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
ボックスはコンテンツに合わせてサイズを調整し、ネストされたボックスは常に親のサイズまで拡張されます。コンテンツの前後には常にスペースがあり、テキストもネストされたボックスも外側のボックスの端に近すぎません。要するに、次は間違っています。
.---. |Box| '---'
そして、以下が正しいです:
.-----. | Box | '-----'
見た目も良くなりました:-)
テキスト項目(以下の入力を参照)は正確に再現する必要があります。
常に1つのトップレベルボックスがあります(XMLを参照)。ただし、1つのボックスに複数の他のボックスを含めることができます。
入力
入力は標準入力で行われます。テストを簡単にするために、ファイルからリダイレクトされる可能性があります。
入力は行単位で与えられ、各行は現在のボックスに入れるテキスト項目または新しいボックスを開くことを表します。
すべての行は改行で終了します。
テキスト項目は、数字で構成されていない行でマークされています(以下を参照)。テキストは、アルファベット文字、スペース、および句読点(
.,-'"?!()
)を使用します。テキストはスペースで開始または終了することはなく、常に少なくとも1文字が含まれます。ボックスは、数字の入った1行で始まります。数値は、ボックスのサイズ、つまり、ボックスに入れられる次のアイテムの数を示します。
2 A B
2つのテキストアイテムを含むボックスを生成します。
.---. | A | | B | '---'
ボックスには常に少なくとも1つのアイテムが含まれます。
ボックスの終わりは明示的に線でマークされていません。代わりに、指定された数のアイテムがボックスに入れられた後、ボックスは暗黙的に閉じられます。
ボックスは、その中にいくつのアイテムがあるかに関係なく、常に単一のアイテムです。例えば
3 A 4 a b c d B
3つのアイテムを持つボックスが生成され、2番目のアイテムは4つのアイテムを持つ別のボックスになります。
ネストは、ボックスが単一のアイテムであるという事実にも影響しません。
制限
最大のネストレベルは5です。つまり、最大で5つのボックスが互いに内部にあります。これには最も外側のものが含まれます。
1箱につき最大10個のアイテムがあります。
テキストアイテムの最大長は100文字です。
出力
- 出力は、上記のルールに従って、すべての包含およびネストされたアイテムを含むレンダリングされたボックスです。
- 出力は標準出力で提供される必要があり、正確に一致する必要があります。先頭または末尾の空白は許可されません。
- 各行は、最後を含む改行で終了する必要があります。
勝利条件
- 最短のコードが優先されます(つまり、受け入れられた答えを取得します)。
サンプル入力1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
サンプル出力1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
サンプル入力2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
サンプル出力2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
サンプル入力3
1
1
1
1
1
Extreme nesting Part Two
サンプル出力3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
サンプル入力4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
サンプル出力4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
テストスクリプト
詳細を正確に把握するのは困難な場合があるため、私たち(Venteroと私)はテストスクリプトを準備しており、ソリューションを実行してそれが正しいかどうかを確認できます。PowerShellスクリプトとbashスクリプトの両方として利用できます。呼び出しは次のとおり<test-script> <program invocation>
です。
更新: テストスクリプトが更新されました。定義した制限を守らないテストケースがいくつかありました。PowerShellテストスクリプトは、結果の確認に大文字と小文字を区別する比較を使用しませんでした。私はすべてが今うまくいくことを望みます。テストケースの数は156に減りましたが、最後のテストケースはかなり大きくなりました。
更新2: テストケースジェネレーターをアップロードしました。.NET 2ランタイムを対象としたC#で記述されています。Monoで実行されます。実装をテストするのに役立つ場合があります。タスクの制限を考慮すると、最終的な最悪のケースとして、次を試すことができます。
nb.exe 1 10 10 5 100 100 | my invocation
これにより、最も内側のレベルまでのボックスのみが生成され、ボックスあたりのアイテムの最大数とテキストアイテムの最大長の両方が使用されます。ただし、このテストケースは非常に大きく、出力がさらに大きくなるため、このテストケースをテストスクリプトに含めませんでした。
更新3: PowerShellのテストスクリプトを更新しました。スクリプトの行末がどのようになっているか、およびソリューションがどの行末を印刷したかによってエラーをスローする傾向がありました。これで両方にとらわれないはずです。混乱して申し訳ありません。