Mam licznik. To małe urządzenie, które wygląda tak:
Wyświetlacz przechodzi od 0000
do 9999
. Ma mały przycisk u góry, który zwiększa liczbę o 1, i małe pokrętło po prawej stronie, którego celem jest zresetowanie licznika z powrotem do 0.
Rzecz w tym małym pokrętle polega na tym, że jeśli przekręcisz go do tyłu, możesz zwiększyć dowolną cyfrę, gdy ponownie przekręcisz do przodu. Więc jeśli naciśniesz przycisk licznika 10 razy, aby wyświetlał się licznik 0010
, mogę następnie przekręcić pokrętło do tyłu, aż usłyszę małe kliknięcie, a następnie przekręcić je ponownie do przodu i sprawić, aby od razu jechało 0090
.
Ale pokrętło zawsze zwiększa wszystkie wystąpienia tej samej cyfry o 1 za każdym razem, gdy popycha liczby do przodu. Więc jeśli licznik pokazuje 6060
, możesz tylko zwiększyć go do 7070
, a nie do 6070
lub 7060
. Ponadto pokrętło przewróci 9
się do położenia 0
bez przenoszenia, więc 0990
przejdzie do 0000
zamiast 1000
lub 1100
.
Chcę poznać najbardziej efektywny sposób ustawienia licznika na określoną liczbę. Twoim zadaniem jest napisanie programu lub funkcji, która określi najkrótszą sekwencję naciśnięć przycisków i postępów pokrętła wymaganych do tego.
Twój program pobierze jako 4-cyfrową liczbę od 0000
do 9999
i zwróci serię kroków w następującym formacie:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Gdzie C
oznacza „naciśnij przycisk licznika” i dowolna cyfra D
od 0 do 9 oznacza „użyj pokrętła, aby przesunąć wszystkie wystąpienia o D
1”.
Twój program musi wygenerować prawidłową sekwencję kroków dla wszystkich możliwych kombinacji czterocyfrowych i zostanie oceniony przez całkowitą liczbę kroków wymaganych dla wszystkich 10 000 przypadków. W przypadku remisu (najprawdopodobniej po znalezieniu optymalnego algorytmu) wygrywa krótszy kod.
źródło
0010
się0020
w tym przypadku? Czy możesz obrócić pokrętło tylko do tyłu? A także, czy każde „D” liczy się jako „D” liczba postępów pokrętła (na przykład, czy1234567
oznacza to obrócenie pokrętła 1 raz, potem 2 razy, a następnie 3 razy, itd.)? Czy może oznacza to po prostu każdy obrót pokrętła (na przykład, oznacza to1234567
po prostu obrócenie pokrętła 7 razy)?Odpowiedzi:
Lua, 327763 kroki (optymalne, 276 bajtów)
Wersja golfowa:
Ulepszona wersja omawianych przykładów (tylko
1000
ulepszona):Wersja bez golfa:
źródło
Mathematica, wynik 512710
Naprawia błąd z
StringRepeat
(zachowuje się niepoprawnie dlaStringRepeat[x_String,0]
)źródło
StringRepeat[x_String, 0]:=""
?Pyth, 327763 kroki (optymalne, 130 bajtów)
Ponieważ kompilator online jest nieudolna w kontaktach z tak ogromnym zadaniem, dałem mu mniej pracy, tak, że tylko generuje
0
,1
oraz1111
. Jednak teoretycznie może rozwiązać problem, ponieważ używa tego samego algorytmu, co Lua u góry.Wypróbuj online!
Jak to działa:
źródło
JavaScript (ES6), 327763 kroki (optymalne, 184 bajty)
Szerokie pierwsze wyszukiwanie, nie tak mądre i nie tak szybkie.
Mniej golfa
Test
źródło