Ein gewöhnliches N-stelliges Zahlenschloss besteht aus N rotierenden Scheiben. Auf jeder Disc sind die Ziffern 0 bis 9 in der angegebenen Reihenfolge angegeben, und Sie müssen sie auf das richtige Kennwort einstellen, um sie zu öffnen. Wenn Sie das Passwort nicht kennen, müssen Sie es natürlich höchstens 10 N- mal versuchen, bevor Sie es entsperren. Das ist nicht interessant.
Betrachten wir also eine Variante des Zahlenschlosses, nennen wir es abstandsoffenbar.
Bei jedem erfolglosen Versuch, ein abstandsoffenlegendes Schloss zu öffnen, reagiert es auf die Mindestanzahl der zu entsperrenden Bewegungen.
Eine Bewegung ist als Drehung um eine Position definiert, zum Beispiel 1 Bewegung von 890
bis 899
und 9 Bewegungen von 137
bis 952
.
Die Herausforderung
Versuchen Sie bei einem entfernungsabhängigen Schloss mit unbekanntem Kennwort, das Schloss mit einer minimalen Anzahl von Versuchen (keine Bewegungen) zu öffnen , ohne dass das Programm zu lang wird.
Regeln & Scorings
- Sie sollten ein vollständiges Programm schreiben, das Eingaben von stdin und Ausgaben von stdout ausführt. Das Programm sollte die Ein- / Ausgabe wie folgt ausführen:
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
Ihr Programm sollte bis zu N = 200 verarbeiten und bei jeder Eingabe weniger als 5 Sekunden ausgeführt werden.
Führende Nullen in der Ausgabe sollten nicht ausgelassen werden.
Es gibt 5 Testdaten für jede Länge, sodass die Gesamtzahl der Testdaten 1000 beträgt. Die Testdaten werden zufällig generiert.
Das Endergebnis ist (Gesamtzahl der Vermutungen in allen Testdaten) * ln (Codelänge in Bytes + 50). Die niedrigste Punktzahl gewinnt. (ln ist natürlicher Baumstamm)
Ich werde das Programm für Sie bespielen. Wenn Sie wissen möchten, wie ich Ihr Programm bewerten werde, oder wenn Sie es selbst bewerten möchten, werfen Sie einen Blick auf frühere Änderungen in diesem Beitrag .
Diese Herausforderung endet am 2017/12/07 14:00 UTC. Ich werde dann meine Lösung posten.
Laufendes Beispiel
Zeilen, die mit " >
Eingabe" beginnen, und andere stehen für die Programmausgabe.
Sie können ein Passwort im Kopf haben und mit Ihrem Programm interagieren, um es zu testen.
> 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
Beispielprogramm
BEARBEITEN: Vielleicht war das Eingabe- / Ausgabeformat oben nicht klar. Hier ist ein Beispielprogramm in Python.
Python, 369 Bytes, Gesamtzahl der Versuche = 1005973, Punktzahl = 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
Vielen Dank an Jonah für die Vereinfachung der Herausforderung.
162751*ln(388+50)=989887
.