Un normale lucchetto a combinazione a N cifre è composto da N dischi rotanti. Ogni disco ha le cifre 0-9 inscritte in ordine e devi aprirle con la password corretta per aprirlo. Ovviamente, se non si conosce la password, è necessario provare al massimo 10 N volte prima di sbloccare esso. Questo non è interessante.
Quindi consideriamo una variante del lucchetto a combinazione, chiamiamola lucchetto rivelatore di distanza.
In ogni tentativo fallito di aprire un blocco rivelatore di distanza, risponderà al numero minimo di movimenti da sbloccare.
Un movimento è definito come una rotazione di una posizione, ad esempio ha bisogno di 1 movimento da 890
a 899
e 9 movimenti da 137
a 952
.
La sfida
Dato un blocco rivelatore di distanza con la sua password sconosciuta, prova ad aprire il blocco con un numero minimo di tentativi (non movimenti), evitando che il programma diventi troppo lungo.
Regole e punteggi
- Dovresti scrivere un programma completo che input da stdin e output a stdout. Il programma dovrebbe fare input / output come segue:
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
Il tuo programma dovrebbe gestire fino a N = 200 e dovrebbe funzionare per meno di 5 secondi su qualsiasi input.
Gli zeri iniziali nell'output non devono essere omessi.
Sono 5 dati di test per ogni lunghezza, quindi il numero totale di dati di test è 1000. I dati di test vengono generati casualmente.
Il punteggio finale sarà (numero totale di ipotesi in tutti i dati di test) * ln (lunghezza del codice in byte + 50). Il punteggio più basso vince. (ln è log naturale)
Segnerò il programma per te. Se vuoi sapere come segnerò il tuo programma, o se vuoi segnarlo da solo, dai un'occhiata alle modifiche precedenti su questo post .
Questa sfida terminerà alle 14:00 UTC 2017/12/07. Invierò quindi la mia soluzione.
Esempio in esecuzione
Le righe che iniziano con >
rappresentano l'input e altre rappresentano l'output del programma.
Puoi avere una password nella tua mente e interagire con il tuo programma per testarla.
> 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
Programma di esempio
EDIT: forse il formato di input / output sopra non era chiaro. Ecco un programma di esempio in Python.
Python, 369 byte, numero totale di tentativi = 1005973, punteggio = 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
Grazie a Giona per semplificare la sfida.
162751*ln(388+50)=989887
.