Une serrure à combinaison ordinaire à N chiffres se compose de N disques rotatifs. Chaque disque a les chiffres 0-9 inscrits dans l'ordre, et vous devez les transformer en mot de passe correct pour l'ouvrir. Évidemment, si vous ne connaissez pas le mot de passe, vous devrez essayer au plus 10 N fois avant de le déverrouiller. Ce n'est pas intéressant.
Considérons donc une variante du verrou à combinaison, nommez-le verrou révélateur de distance.
À chaque tentative infructueuse d'ouvrir un verrou révélateur de distance, il répondra au nombre minimum de mouvements à déverrouiller.
Un mouvement est défini comme une rotation d'une position, par exemple, il faut 1 mouvement de 890
à 899
et 9 mouvements de 137
à 952
.
Le défi
Étant donné un verrou révélateur de distance avec son mot de passe inconnu, essayez d'ouvrir le verrou avec un nombre minimal de tentatives (pas de mouvements), tout en empêchant le programme de devenir trop long.
Règles et scores
- Vous devez écrire un programme complet qui entre depuis stdin et sort vers stdout. Le programme doit faire des entrées / sorties comme suit:
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
Votre programme doit gérer jusqu'à N = 200 et doit s'exécuter moins de 5 secondes sur n'importe quelle entrée.
Les zéros non significatifs en sortie ne doivent pas être omis.
Il y a 5 données de test pour chaque longueur, donc le nombre total de données de test est de 1000. Les données de test sont générées de manière aléatoire.
Le score final sera (nombre total de suppositions dans toutes les données de test) * ln (longueur de code en octets + 50). Le score le plus bas l'emporte. (ln est logarithme naturel)
Je vais marquer le programme pour vous. Si vous voulez savoir comment je vais marquer votre programme, ou si vous voulez le noter par vous-même, jetez un œil aux éditions précédentes de ce post .
Ce défi se terminera le 07/12/2017 à 14h00 UTC. Je posterai alors ma solution.
Exemple d'exécution
Les lignes commençant par >
représentent l'entrée et les autres représentent la sortie du programme.
Vous pouvez avoir un mot de passe en tête et interagir avec votre programme pour le tester.
> 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
Exemple de programme
EDIT: Peut-être que le format d'entrée / sortie ci-dessus n'était pas clair. Voici un exemple de programme en Python.
Python, 369 octets, nombre total de tentatives = 1005973, score = 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
Merci à Jonah d' avoir simplifié le défi.
162751*ln(388+50)=989887
.