通常のN桁のコンビネーションロックは、N個の回転ディスクで構成されています。各ディスクには数字の0から9が順番に刻まれており、それらを開くには正しいパスワードに変える必要があります。明らかに、パスワードがわからない場合は、ロックを解除する前に最大10 N回試行する必要があります。それは面白くない。
それでは、コンビネーションロックの変形を考えてみましょう。距離を明らかにするロックと名付けてください。
距離を明らかにするロックを開く試みが失敗するたびに、ロックを解除するための最小数の動きに応答します。
1つの動きは、1つの位置による回転として定義されます。たとえば、890
〜の1つの動き899
と〜の9つの動きが137
必要952
です。
チャレンジ
パスワードが不明な距離を明らかにするロックがある場合は、プログラムが長くなりすぎないようにしながら、最小限の試行回数(移動ではない)でロックを開こうとします。
ルールとスコアリング
- stdinから入力し、stdoutに出力する完全なプログラムを作成する必要があります。プログラムは次のように入出力を行う必要があります。
Start
Input an integer N (number of digits) from stdin
Do
Output a line containing decimal string of length N (your attempt) to stdout
Input an integer K (response of the lock) from stdin
While K not equal 0
End
プログラムは最大N = 200を処理し、どの入力でも5秒未満で実行する必要があります。
出力の先行ゼロは省略しないでください。
長さごとに5つのテストデータがあるため、テストデータの総数は1000です。テストデータはランダムに生成されます。
最終スコアは(すべてのテストデータの推測の合計数)* ln(バイト単位のコード長+ 50)になります。最低スコアが勝ちます。(lnは自然対数)
プログラムを採点します。プログラムの採点方法を知りたい場合、または自分でプログラムを採点する場合は、この投稿の以前の編集をご覧ください。
このチャレンジは2017/12/07 14:00 UTCに終了します。その後、ソリューションを投稿します。
実行例
で始まる行>
は入力を表し、他の行はプログラム出力を表します。
パスワードを頭の中に入れて、プログラムと対話してテストすることができます。
> 3 # 3-digit lock. The hidden password is 746
000 # 1st guess (by program)
> 11 # response to the 1st guess
555 # 2nd guess
> 4 # ...
755
> 2
735
> 2
744
> 2
746 # finally the correct answer! The program attempts 6 times.
> 0 # this is not necessary
サンプルプログラム
編集:たぶん、上記の入力/出力形式は明確ではありませんでした。Pythonのサンプルプログラムを次に示します。
Python、369バイト、試行の合計数= 1005973、スコア= 6073935
import sys
N = int(input()) # get the lock size
ans = ''
for i in range(N): # for each digit
lst = []
for j in range(10): # try all numbers
print('0' * i + str(j) + '0' * (N - i - 1)) # make a guess
result = int(input()) # receive the response
lst.append(result)
ans += str(lst.index(min(lst)))
print(ans) # output the final answer
課題を簡素化してくれたJonahに感謝します。
162751*ln(388+50)=989887
。