Una cerradura de combinación ordinaria de N dígitos consta de N discos giratorios. Cada disco tiene dígitos 0-9 inscritos en orden, y debe convertirlos a la contraseña correcta para abrirlo. Obviamente, si no conoce la contraseña, deberá intentarlo como máximo 10 N veces antes de desbloquearla. Eso no es interesante.
Así que consideremos una variante del bloqueo de combinación, llámelo bloqueo que revela la distancia.
En cada intento fallido de abrir una cerradura que revela la distancia, responderá la cantidad mínima de movimientos para desbloquear.
Un movimiento se define como una rotación de una posición, por ejemplo, necesita 1 movimiento de 890
a 899
y 9 movimientos de 137
a 952
.
El reto
Dado un bloqueo que revela la distancia con su contraseña desconocida, intente abrir el bloqueo con un número mínimo de intentos (no movimientos), mientras evita que el programa se alargue demasiado.
Reglas y calificaciones
- Debe escribir un programa completo que ingrese desde stdin y salga a stdout. El programa debe hacer entrada / salida de la siguiente manera:
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
Su programa debe manejar hasta N = 200, y debe ejecutar menos de 5 segundos en cualquier entrada.
Los ceros a la izquierda en la salida no deben omitirse.
Hay 5 datos de prueba para cada longitud, por lo que el número total de datos de prueba es 1000. Los datos de prueba se generan aleatoriamente.
La puntuación final será (número total de conjeturas en todos los datos de prueba) * ln (longitud del código en bytes + 50). La puntuación más baja gana. (ln es registro natural)
Marcaré el programa por ti. Si desea saber cómo calificaré su programa, o si desea calificarlo usted mismo, eche un vistazo a las ediciones anteriores en esta publicación .
Este desafío finalizará el 07/12/2017 a las 14:00 UTC. Publicaré mi solución entonces.
Ejecutando ejemplo
Las líneas que comienzan con >
representan la entrada y otras representan la salida del programa.
Puede tener una contraseña en mente e interactuar con su programa para probarla.
> 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
Programa de muestra
EDITAR: Tal vez el formato de entrada / salida anterior no estaba claro. Aquí hay un programa de muestra en Python.
Python, 369 bytes, número total de intentos = 1005973, puntaje = 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
Gracias a Jonás por simplificar el desafío.
162751*ln(388+50)=989887
.