Wprowadzenie
Załóżmy przez chwilę, że żmije i klif są tylko dwa kroki, a nie trzy.
o
---
Hsss! |
';;' ___ /_\ ___ _
|
Niestety jesteś uwięzionym sadystycznym oprawcą. Za każdym zakrętem musisz zrobić krok w lewo lub w prawo. Jeśli tego nie zrobisz, natychmiast zastrzelą cię. Możesz wcześniej zaplanować swoje kroki, ale kiedy zrobisz pierwszy krok, nie możesz zmienić swojego planu. (I nie ma sensu; zastrzelą cię.)
Nagle przychodzi na myśl jasny pomysł ...
Ach! Mogę tylko na przemian kroczyć w prawo i lewo! Krok w prawo, krok w lewo, krok w prawo, krok w lewo i tak dalej ...
Ah ah ah, nie tak szybko. Jak powiedziałem, oprawca jest sadystyczny. Mogą wybrać, czy podejmiesz każdy krok, czy co drugi krok, czy co trzeci krok i tak dalej. Więc jeśli naiwnie wybierzesz sekwencję RLRLRL...
, mogą zmusić cię do zrobienia co drugiego kroku, który zaczyna się od LL
. O o! Zostałeś ugryziony przez żmije! Ciemność otacza cię i wszystko inne znika ...
Właściwie nie, jeszcze nie jesteś martwy. Nadal musisz wymyślić swój plan. Po kilku minutach zastanowienia zdajesz sobie sprawę, że jesteś skazany. Nie ma możliwości zaplanowania szeregu kroków, które zagwarantują ci przetrwanie. Najlepsze, co możesz wymyślić, to RLLRLRRLLRR
. 1 Jedenaście bezpiecznych kroków i nie więcej. Jeśli dwunasty krok jest R
, to oprawca zmusi cię do zrobienia każdego kroku, a następnie trzy ostatnie kroki wyślą cię z klifu. Jeśli dwunasty krok jest L
, to oprawca zmusi cię do zrobienia co trzeciego kroku ( LRLL
), co wprawia cię w stan lęgowy żmii i ich śmiertelnych ugryzień.
Ty wybierasz R
jako dwunasty krok, mając nadzieję na jak najdłuższe opóźnienie śmierci. Gdy w uszach ryczy wiatr, zastanawiasz się ...
Co jeśli miałbym trzy kroki?
Alert spoilera!
Nadal byś umarł. Jak się okazuje, bez względu na to, ile kroków masz, będzie taki moment, w którym bez względu na dokonany przez ciebie wybór, oprawca może wykonać sekwencję kroków, aby upewnić się, że spotkasz swój śmiertelny los. 2 Jednakże, gdy żmije i klif znajdują się w odległości trzech kroków, możesz wykonać łącznie 1160 bezpiecznych kroków, a gdy są cztery kroki dalej, jest co najmniej 13 000 bezpiecznych kroków! 3)
Wyzwanie
Biorąc pod uwagę jedną liczbę całkowitą n < 13000
, wypisz sekwencję n
bezpiecznych kroków, zakładając, że klif i żmije znajdują się w odległości czterech kroków.
Zasady
- Może być pełnym programem lub funkcją.
- Dane wejściowe mogą być pobierane przez STDIN lub równoważne, lub jako argument funkcji.
- Wyjście musi mieć dwa różne znaki (które mogą być
+/-
,R/L
,1/0
, itd.). - Wszelkie białe znaki na wydruku nie mają znaczenia.
- Kodowanie rozwiązania jest niedozwolone. To by trywializowało to wyzwanie.
- Twój program powinien (teoretycznie) zakończyć się w przyzwoitym czasie. Jak w,
n=13000
może to potrwać miesiąc, ale nie powinno to zająć tysiąca lat lub więcej. Oznacza to, że nie ma brutalnej siły. (Cóż, przynajmniej spróbuj tego uniknąć). - Bonus życiowy: zapewnij szereg
2000
bezpiecznych kroków. Jeśli to zrobisz, oprawca będzie pod wrażeniem twojej wytrwałości, wytrwałości i przewidywania, że pozwolą ci żyć. Ten jeden raz. (Potraktuj tę sekwencję jako liczbę binarną i podaj dziesiętny ekwiwalent do weryfikacji. Ma to na celu nagradzanie odpowiedzi, które kończą się szybko, ponieważ odpowiedzi mogą trwać bardzo długo). - Wynik: bajty , chyba że kwalifikujesz się do premii - pomnóż przez 0,75 .
1 Istnieje dobre wyjaśnienie tego problemu i „rozwiązania” jednej z gwiazd Numberphile, Jamesa Grime'a, na jego kanale na YouTube: https://www.youtube.com/watch?v=pFHsrCNtJu4 .
2 Ta 80-letnia hipoteza, znana jako problem rozbieżności Erdosa, bardzo niedawno udowodnił Terence Tao. Oto bardzo fajny artykuł na temat magazynu Quanta na ten temat: https://www.quantamagazine.org/20151001-tao-erdos-discrepancy-problem/ .
3 Źródło: Atak SAT na hipotezę rozbieżności Erdosa , autorstwa Borisa Koneva i Aleksieja Lisicy. Źródło: http://arxiv.org/pdf/1402.2184v2.pdf .
źródło
n=13000
, czy pierwsze 2000 instrukcji wygra bonus? Wydaje się bezcelowe, więc prawdopodobnie miałeś na myśli coś innego?n=13000
w ciągu roku, może dziesięciu. Czy czekasz miesiącn=2000
? Prawdopodobnie nie. A jeśli tak , to i tak zasługujesz na bonus.Odpowiedzi:
Java, 915 * 0,75 = 686,25
Dane wejściowe są traktowane jako argument wiersza poleceń.
Wypróbowuje prawie wszystkie możliwości (jedynym ograniczeniem jest to, że pierwsze 8 kroków powinno iść tylko w zakresie -1..1), idąc krok po kroku, używając magicznej heurystyki voodoo, aby wybrać, który sposób spróbować najpierw.
Rozwiązuje 2000, a nawet 4000 w ciągu 1 sekundy na moim (dość szybkim) komputerze. Potrzebuje więcej pamięci RAM dla większych liczb; największe wejście, które rozwiązałem w obrębie 8 GB, to 5023 i zajęło to około 30 sekund.
Reprezentacja dziesiętna rozwiązania dla 2000 kroków, zgodnie z wymaganiem premii:
Dołącz
Yb
do niego w CJam, aby przekonwertować z powrotem na binarny.O heurystyce: po pierwsze, używam wzorca: co 9 kroków spróbuj powtórzyć pierwsze 9, z wyjątkiem tego, że każdy (9 * x) krok próbuje powtórzyć krok x. Jest to inspirowane rozwiązaniem, które pobrałem i użyłem (na stałe) w mojej odpowiedzi na python.
Śledzę, ile razy odbiegałem od wzoru, a także ile razy dotarłem do „krawędzi” (1 krok od śmierci). Funkcja heurystyczna jest w zasadzie ważoną kombinacją tych 2 liczb i liczby wykonanych do tej pory kroków.
Heurystykę można jeszcze bardziej ulepszyć, aby poprawić prędkość, i istnieje kilka sposobów dodania do niej czynnika losowego.
W rzeczywistości, właśnie przeczytałem o funkcjach multiplikatywnych w związku z tym problemem i wygląda na to, że może to zapewnić znaczną poprawę (TODO: zaimplementuj to później).
Nie golfił i skomentował:
źródło
Python 2, 236 bajtów
Jest to dość szybkie, jak na metodę brutalnej siły, zajmuje tylko kilka sekund dla n = 223, ale znacznie dłużej dla n> = 224.
Objaśnienie: Śledź listę par ciągów list (s, u), gdzie lista u jest taka, że u [i] jest bieżącą pozycją po każdym i-tym kroku w łańcuchu. Dla każdego ciągu na liście spróbuj dodać „L” lub „R”, a następnie zmień wartości na przecinającej się liście. (tzn. jeśli wynikowy ciąg ma długość 10, dodaj lub odejmij 1 od pozycji 1, 2, 5 i 10, zgodnie z kierunkami, które wykonałeś). Jeśli przekroczysz 3 lub -3, wyrzuć nową parę, w przeciwnym razie pozostaw ją na liście. Najdłuższe ciągi znaków są przechowywane na końcu. Po uzyskaniu ciągu o długości n zwróć go.
źródło
//
jest dostępny w Pythonie 2.Python 2, 729 bajtów
Myślę, że to również kwalifikuje się do premii, jeśli chodzi o „nagradzanie odpowiedzi, które szybko się kończą”.
Jest to jednak mocno zakodowana odpowiedź, która nie jest zgodna z duchem wyzwania (choć nie jest wyraźnie niedozwolona, gdy ją napisałem).
źródło