Zwykły N-cyfrowy zamek szyfrowy składa się z N obracających się tarcz. Każda płyta ma kolejno wpisane cyfry 0–9, a aby ją otworzyć, należy ustawić odpowiednie hasło. Oczywiście, jeśli nie znasz hasła, musisz spróbować najwyżej 10 N razy przed jego odblokowaniem. To nie jest interesujące.
Rozważmy więc wariant zamka szyfrowego, nazwijmy go zamkiem ujawniającym odległość.
Przy każdej nieudanej próbie otwarcia zamka ujawniającego odległość reaguje na minimalną liczbę ruchów do odblokowania.
Jeden ruch jest definiowany jako obrót o jedną pozycję, na przykład wymaga 1 ruchu od 890
do 899
i 9 ruchów od 137
do952
.
Wyzwanie
Biorąc pod uwagę zamek ujawniający odległość z nieznanym hasłem, spróbuj otworzyć zamek przy minimalnej liczbie prób (nie ruchów), jednocześnie zapobiegając zbyt długiemu programowi.
Zasady i wyniki
- Powinieneś napisać pełny program, który wprowadza dane ze stdin i wypisuje na stdout. Program powinien wykonać wejście / wyjście w następujący sposób:
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
Twój program powinien obsłużyć do N = 200 i powinien działać mniej niż 5 sekund na dowolnym wejściu.
Zera wiodące w danych wyjściowych nie powinny być pomijane.
Jest 5 danych testowych dla każdej długości, więc całkowita liczba danych testowych wynosi 1000. Dane testowe są generowane losowo.
Ostateczny wynik to (całkowita liczba domysłów we wszystkich danych testowych) * ln (długość kodu w bajtach + 50). Najniższy wynik wygrywa. (ln jest logiem naturalnym)
Zdobędę dla ciebie program. Jeśli chcesz wiedzieć, jak zdobędę punkty w twoim programie lub chcesz go zdobyć samodzielnie, spójrz na poprzednie zmiany w tym poście .
To wyzwanie zakończy się o godzinie 2017.12.12 14:00 UTC. Wyślę wtedy moje rozwiązanie.
Przykład biegania
Linie zaczynające się od >
reprezentują dane wejściowe, a inne reprezentują dane wyjściowe programu.
Możesz mieć hasło w pamięci i wchodzić w interakcje z programem, aby je przetestować.
> 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
Przykładowy program
EDYCJA: Być może powyższy format wejścia / wyjścia nie był jasny. Oto przykładowy program w Pythonie.
Python, 369 bajtów, łączna liczba prób = 1005973, wynik = 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
Dzięki Jonaszowi za uproszczenie wyzwania.
162751*ln(388+50)=989887
.