定義されたレンガと安定性
この質問では、レンガの構造と安定性の定義をレンガの構造と同じですか?
石積みのレンガを[__]
表現してみましょう
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
レンガの構造で通常行われているように、これらのレンガの任意の配置または構造を表します。構造はいつまでも右に拡張できますが、文字列表現は常に、幅が4で割り切れる(必要に応じて末尾にスペースがある)完全に長方形のテキストブロックになります。
BRK?
構造内のそれぞれは、レンガ([__]
)または空のスペース(4つのスペース)のいずれかです。
たとえば、1つの可能な(不安定-読み取り)構造は次のとおりです。
[__] [__] [__]
[__] [__]
[__][__] [__]
構造の安定性は重要です。構造が安定しているのは、そのレンガのすべてのレンガが安定している場合のみです。
個々のレンガが安定する方法は3つあります。
- 地面にあるレンガ(レンガの最下列)は安定しています。
すぐ下に2つのレンガがあるレンガは安定しています。
[__] <- this brick is stable [__][__] <- because these bricks hold it up
同じ側にその上と下の両方にレンガがあるレンガは安定しています:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
(はい、私はこれらのルールが物理的に正確でないことを知っています。)
最後の課題は決定する程度であった場合には構造が安定していました。これはそうでないものを安定させることです。
チャレンジ
レンガの配置が不安定になる可能性があるプログラムを作成し、新しいレンガを空のレンガスペースに追加してすべてを安定させ、結果を印刷します。これは、入力テキストブロックの全体的なサイズを増やすことなく実行されます。
目標は、できるだけ少ないレンガを追加することで構造を安定させるアルゴリズムを作成することです。
このJSFiddle(ソース)を使用すると、プログラムのテスト中に使用するレンガのランダムな配置を生成できます。(代わりにスニペットを積み重ねることができればと思います。)Width
は、ベースレイヤーHeight
のレンガの数、レンガレイヤーDensity
の数、塗りつぶされたレンガスペースの割合です。
たとえばWidth = 5, Height = 3, Density = 0.6
、可能な出力は
....[__]....[__]....
..[__]....[__]......
[__]............[__]
これを4つの新しいレンガで安定させる方法は
....[__]....[__]....
..[__][__][__][__]..
[__][__]....[__][__]
プログラムは、JSFiddleが生成できるブリック構造を安定させることができる必要があります。
- これには空の文字列が含まれます(これは安定と見なされます)。
- レンガは常にになります
[__]
。ピリオド(.
)は、明確にするためにのみ使用されています。プログラムでは、空のスペースにピリオドまたはスペースを使用できます。 - 構造はすでに安定している場合があります。その場合、(印刷する以外に)何もする必要はありません。
- JSFiddleは常に安定化できる構造を生成します(
Width = 1
上部のコーナーを避けてブロックすることにより)。これは信頼できます。(上隅以外のすべてを埋めると確実に安定しますが、これは明らかに最適ではありません。) - 無効な入力がないと仮定します。好きなように文字列として入力してください。安定化された構造をstdoutなどに印刷します。
- テキストブロックのサイズは変更しないでください。
- 既存のレンガを移動または削除することはできません。新しいレンガの配置は、オフセットが1行おきのグリッドパターンに従う必要があります。すべてのレンガは完全に境界内にある必要があります。
- 既存のブリックをの
[XX]
代わりに印刷することをお勧めします(必須ではありません)[__]
。そうすることで、ソリューションがどのように機能するかを人々にわかりやすく表示できます。
得点
JSFiddleの下部には、 8つの事前定義された不安定なレンガ配置があります。(それらを使用して[__]
おり.
、[XX]
そして/または代わりに使用していない限り、その方法を維持する必要があります。)ランダムなものもあれば、自分で作成したものもあります。スコアを計算するには、それぞれのプログラムを順番に実行し、それぞれに追加された新しいレンガの数を合計します。
追加した新しいレンガが少ないほど良いです。最もスコアの低い提出物が優先されます。同点の場合は、最も古い回答が優先されます。
問題が発生した場合は、事前定義されたケースをさらにいくつか追加し、それらに基づいて勝者を判断します。