Um bloqueio comum de combinação de dígitos N consiste em N discos rotativos. Cada disco tem dígitos de 0 a 9 inscritos em ordem e é necessário transformá-los na senha correta para abri-lo. Obviamente, se você não souber a senha, precisará tentar no máximo 10 N vezes antes de desbloqueá-la. Isso não é interessante.
Então, vamos considerar uma variante do bloqueio de combinação, nomeá-lo como bloqueio revelador de distância.
Em todas as tentativas frustradas de abrir um bloqueio revelador de distância, ele responderá ao número mínimo de movimentos a serem desbloqueados.
Um movimento é definido como uma rotação por uma posição; por exemplo, ele precisa de 1 movimento de 890
para 899
e 9 movimentos de 137
para 952
.
O desafio
Dado um bloqueio revelador de distância com sua senha desconhecida, tente abri-lo com um número mínimo de tentativas (não movimentos), mantendo o programa muito longo.
Regras e Pontuações
- Você deve escrever um programa completo com entradas de stdin e saídas para stdout. O programa deve fazer entrada / saída da seguinte maneira:
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
Seu programa deve processar até N = 200 e deve executar menos de 5 segundos em qualquer entrada.
Zeros à esquerda na saída não devem ser omitidos.
São 5 dados de teste para cada comprimento, portanto, o número total de dados de teste é 1000. Os dados de teste são gerados aleatoriamente.
A pontuação final será (número total de tentativas em todos os dados do teste) * ln (comprimento do código em bytes + 50). Menor pontuação ganha. (ln é log natural)
Vou marcar o programa para você. Se você deseja saber como eu classificarei seu programa, ou se você deseja classificá-lo, verifique as edições anteriores deste post .
Este desafio será encerrado em 07/12/2017 às 14:00 UTC. Vou postar minha solução então.
Exemplo de execução
Linhas começando com >
representam entrada e outras representam saída do programa.
Você pode ter uma senha em mente e interagir com seu programa para testá-la.
> 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 amostra
EDIT: Talvez o formato de entrada / saída acima não esteja claro. Aqui está um exemplo de programa em Python.
Python, 369 bytes, número total de tentativas = 1005973, pontuação = 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
Agradecemos a Jonah por simplificar o desafio.
162751*ln(388+50)=989887
.