正の整数のリストを受け取るプログラムまたは関数を作成します。これらの整数はそれぞれ、2D平面上の正方形の辺の長さを表します。各正方形は、平面内の任意の整数座標に移動できますが、回転することはできず、他の正方形と重なることはできません。
空白ごとに異なる印刷可能なASCII文字を使用して(空に使用されるスペースを除く)、プログラム/関数は、反射対称の水平線または垂直線を持つ正方形の単一配列を印刷する必要があります。そのような配置が存在しない場合は、何も印刷しないでください。
四角は区別できるように異なる文字です。すべての正方形の結合によって作成された形状のみが対称である必要があります。リストには94を超える要素は含まれないと想定できます(94文字があるため)。
たとえば、入力がの[2, 1, 2, 2, 2]
場合、可能な出力は次のとおりです。
DD--
DD--
Z
FFPP
FFPP
この形状には、反射対称の水平線があります。その上半分と下半分は鏡像です。他にもいくつかの可能性があります:(正方形に触れる必要はなく、同じ文字で2つの正方形が作られていない限り、任意の文字を使用できます。)
55
55
%%
%%
@
HH
HH
((
((
G
11 33
11 33
22 44
22 44
対称線は、文字間の境界でもあります。例[2, 4]
:
!!!!
!!!! ++
!!!! ++
!!!!
いくつかの正方形のセットは、対称的に配置することは不可能[1, 2, 3]
です。
AAA BB C
AAA BB (these can't be vertically or horizontally symmetric => no output)
AAA
また、正方形の境界が対称ではない場合でも、全体の形状が対称になる場合があることに注意してください。たとえば、有効な出力[2, 1, 1, 1, 1, 4]
は次のとおりです。
AA----
AA----
BC----
DE----
同様に、有効な出力[1, 1, 2, 3, 5]
は次のとおりです。
44444
44444
44444
44444
44444
33301
33322
33322
ノート
- 入力リストには常に1〜94個の要素があります。
- 標準入力、コマンドライン、テキストファイル、関数引数など、合理的な方法で入力を行います。
{1, 2, 3, 4}
またはなど、ニーズに合わせてわずかにフォーマットできます[1 2 3 4]
。 - stdoutなどへの出力。結果の形状に対称線がある限り、任意の量の先頭/末尾のスペースまたは改行は問題ありません。
- 対称の対角線はカウントされません(そうでなければ、これは非常に簡単です)。また、回転対称または遷移対称ではなく、反射対称でなければなりません。
- このタスクが計算上どれほど難しいかは正直わかりません。問題の一部のサブセットを解決する部分的な回答を投稿できます(特に巧妙なアルゴリズムを披露したい場合)。これらは勝つ資格がありません。
- たとえば、入力には常に少なくとも1つの対称配列があると仮定することができます(したがって、リスト
[1, 2, 3]
は入力されません)。 - または、たとえば、正方形の境界と全体の形状が対称である配置のみを考慮することができます。この場合、
[1, 1, 2, 3, 5]
出力はありません。 - 夢中になりたい場合は、アイデアを長方形やポリオミノにまで拡張できます。
- たとえば、入力には常に少なくとも1つの対称配列があると仮定することができます(したがって、リスト
得点
スコアは、プログラムのバイト単位のサイズです。最も低いスコアが勝ちます。Tiebreakerは、最初に投稿された回答に進みます。
[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]
、質問がより多くの自由を与えるので、おそらく他の解決策があります。