バックグラウンド
それぞれが整数の長さを持つロッドの(閉じた)チェーンを考えてみましょう。特定のチェーンでいくつの穴のないポリオミノを形成できますか?または、言い換えれば、特定のチェーンを使用して、軸に沿った辺を持つ、いくつの異なる非自己交差ポリゴンを形成できますか?
例を見てみましょう。長さ1と2の8本の棒で構成される特定のチェーンを考えてみましょう[1, 1, 2, 2, 1, 1, 2, 2]
。回転と移動まで、可能なポリオミノは8つだけです(異なる反射をカウントします):
この最初の棒は濃い青色であり、それから反時計回りに多角形を横断します。
上記の例では、回転の感覚は結果に影響しません。しかし[3, 1, 1, 1, 2, 1, 1]
、次の3つのポリオミノを生成する別のチェーンを考えてみましょう。
時計回りのトラバースを必要とするため、最後のポリオミノのリフレクションが含まれていないことに注意してください。
同じ長さのより柔軟なチェーンがあれば[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
、実際には他のいくつかのポリオノイノの間で両方の反射を形成することができ、合計9になります。
チャレンジ
チェーンの説明を配列または類似のものとして、ロッドを順番に使用して反時計回りに周回しながら形成できる個別のポリオミノの数(回転と平行移動まで)を決定します。
完全なプログラムを作成し、コマンドラインからコードをコンパイルして(該当する場合)実行するコマンドを含めてください。ご使用の言語の無料のコンパイラ/通訳へのリンクも含めてください。
プログラムは、STDINからの入力を読み取る必要があります。最初の行には整数Mが含まれます。次のM行はテストケースで、各行はスペースで区切られたロッドの長さのリストです。プログラムは、M行をSTDOUTに出力する必要があります。各行は、単一の整数(形成可能な個別のポリオミノの数)で構成されます。
単一のスレッドのみを使用する必要があります。
プログラムは、常に1 GBを超えるメモリを使用しないでください。(これは完全に厳密な制限ではありませんが、実行可能ファイルのメモリ使用量を監視し、1 GBを常に使用するプロセス、またはそれを大幅に超えるプロセスを強制終了します。)
過剰な事前計算を防ぐために、コードは20,000バイトを超えてはならず、ファイルを読み取ってはなりません。
また、選択した特定のテストケースに向けて最適化しないでください(結果をハードコーディングするなど)。疑わしい場合は、新しいベンチマークセットを生成する権利を留保します。テストセットはランダムなので、それらのプログラムのパフォーマンスは、任意の入力でのパフォーマンスを代表するものでなければなりません。許可される唯一の仮定は、ロッドの長さの合計が偶数であるということです。
得点
N = 10、11、...、20ロッドのチェーンのベンチマークセットを提供しました。各テストセットには、長さが1〜4のランダムチェーンが50個含まれています。
プライマリスコアは、プログラムが5分以内にテストセット全体を完了する最大のNです(私のマシンでは、Windows 8で)。タイブレーカーは、そのテストセットでプログラムが実際にかかった時間です。
誰でも最大のテストセットに勝った場合、私はより大きなテストセットを追加し続けます。
テストケース
次のテストケースを使用して、実装の正確性を確認できます。
Input Output
1 1 0
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 1 1 9
1 1 1 1 1 1 1 1 1 1 1 1 36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 157
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 758
1 1 2 2 1 1 2 2 8
1 1 2 2 1 1 2 2 1 1 23
1 1 2 2 1 1 2 2 1 1 2 2 69
1 2 1 2 1 2 1 2 3
1 2 1 2 1 2 1 2 1 2 1 2 37
1 2 3 2 1 2 3 2 5
1 2 3 2 1 2 3 2 1 2 3 2 23
3 1 1 1 2 1 1 3
1 2 3 4 5 6 7 1
1 2 3 4 5 6 7 8 3
1 2 3 4 5 6 7 8 9 10 11 5
2 1 5 3 3 2 3 3 4
4 1 6 5 6 3 1 4 2
3 5 3 5 1 4 1 1 3 5
1 4 3 2 2 5 5 4 6 4
4 1 3 2 1 2 3 3 1 4 18
1 1 1 1 1 2 3 3 2 1 24
3 1 4 1 2 2 1 1 2 4 1 2 107
2 4 2 4 2 2 3 4 2 4 2 3 114
これらの入力ファイルはここにあります。
リーダーボード
User Language Max N Time taken (MM:SS:mmm)
1. feersum C++ 11 19 3:07:430
2. Sp3000 Python 3 18 2:30:181