Odprawa
Jesteś botem w siatce 2D, która rozciąga się nieskończenie we wszystkich czterech kierunkach, na północ, południe, wschód i zachód. Gdy otrzymasz numer, musisz przenieść bota, aby dostać się do numeru docelowego.
Oto jak działa siatka:
Możesz poruszać się w 4 kierunkach: północ, południe, wschód lub zachód. Po opuszczeniu komórki nie możesz wrócić do tej komórki (tak skutecznie została usunięta z mapy).
Jest „przeciw”, który idzie 1234567890
(tak to idzie z 1
do 2
... całą drogę do 9
, a następnie 0
, po czym z powrotem 1
znowu), która zmienia się przy każdym ruchu.
Masz również „wartość”, która zaczyna się od 0.
Po przejściu w dowolnym kierunku następuje operacja matematyczna, w zależności od kierunku, w którym się poruszasz:
- Północ: Twoja wartość jest zwiększana przez counter (
value += counter
). - Wschód: Twoja wartość jest zmniejszana przez counter (
value -= counter
). - Południe: Twoja wartość jest mnożona przez counter (
value *= counter
). - Zachód: Twoja wartość jest dzielona przez counter (
value /= counter
).- Podział to podział na liczby całkowite, więc
5/2 -> 2
. - Nie możesz się dzielić
0
.
- Podział to podział na liczby całkowite, więc
Przykład:
Jeśli bot ruszy na północ 3 razy:
- Pierwszy ruch „na północ” zwiększa licznik
1
i dodaje go do wartości (która jest teraz1
). - Drugi ruch „na północ” zwiększa licznik
2
i dodaje go do wartości (która jest teraz3
). - Trzeci ruch „na północ” zwiększa licznik
3
i dodaje go do wartości (która jest teraz6
).
Ostateczna wartość to 6
.
Idź na północ, a następnie na południe:
- Pierwszy ruch „na północ” zwiększa licznik
1
i dodaje go do wartości (która jest teraz1
). - Błędy drugiego „południowego” ruchu, ponieważ komórka, którą bot próbuje przejść dalej, jest usuwana (z pierwszego ruchu).
Nie ma wartości końcowej, ponieważ bot się pomylił.
Wyzwanie
Twoim wyzwaniem jest napisanie programu, gdy podając liczbę, podasz odpowiednie wskazówki dla bota, aby ostateczna wartość bota była równa tej liczbie.
Więc jeśli liczba jest 6
, poprawnym rozwiązaniem byłoby:
nnn
(Bot porusza się na północ 3 razy z rzędu).
Twoje wartości testowe to:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Jest to 50 liczb losowych od 1 do 1 miliarda).
Twój wynik to łączna liczba ruchów wykonanych dla wszystkich 50 liczb - im mniej ruchów, tym lepiej. W przypadku remisu wygrywa osoba, która wcześniej przesłała kod.
Okular
- Masz gwarancję otrzymania dodatniej liczby całkowitej do wprowadzenia.
- Twoja
value
zmienna nie może przekraczać2^31-1
ani podnosić się-2^31
w żadnym punkcie wygenerowanych ścieżek. - Twój końcowy program musi mieścić się w odpowiedzi (czyli
< 30,000
bajtach). - Możesz zakodować tylko 10 cyfr.
- Twój program musi zostać uruchomiony w ciągu 5 minut na rozsądnym laptopie dla każdego przypadku testowego.
- Wyniki MUSZĄ być takie same przy każdym uruchomieniu programu dla każdej liczby.
źródło
value
, tak? Przynajmniej dla mnie brzmi to jak ograniczenie nałożone na implementację, a nie faktyczny algorytm.Odpowiedzi:
C ++: wynik = 453,324,048
OK, potrzebowałem trochę czasu, aby to przerobić, ale oto jak to rozwiązałem.
Po przestudiowaniu przestrzeni rozwiązań zdecydowałem, że moją strategią będzie:
Oto mój wynik: łączny wynik to 453324048
I ścieżki:
Jestem pewien, że istnieje sposób, aby to poprawić, wykonując pewne ruchy „południe / zachód” (dzielenie przez 4 i mnożenie przez 5; na przykład); ale kodowanie go i upewnienie się, że nie przekroczysz okrążenia lub nie zostaniesz uwięziony, jest trudne.
Inną ścieżką rozwiązania może być próba powrotu z celu do „rozsądnej” liczby, a następnie po prostu odnalezienia ścieżki do tej mniejszej liczby; ale musisz „celować” w odpowiedni sposób, aby numer kroku pasował. trudne, ale może być najlepszym sposobem na rozwiązanie tego.
Tak czy inaczej, oto mój kod:
źródło
Python, wynik = 56068747912
Po prostu drukuje
nenenenenenenen...
dla każdej liczby.Wyjaśni później.
źródło
nen
jest 2Rdza , wynik = 1758 (optymalna wśród ścieżek bez zachodu)
Działa w ciągu około 7 sekund dla 50 liczb, przy użyciu wyszukiwania dwukierunkowego .
Wypróbuj online!
Wynik
źródło
ns
,sn
,ew
iwe
to natychmiast nielegalne oprócz wszelkich pętli w ścieżcew
,ns
isn
, który pozostawia tylko legalne ścieżki kosztem ignorowania legalnych ścieżek za pomocąw
.PHP, wynik = 1391462099
Szybka próba, nigdy nie idzie na zachód, aby uprościć sprawdzanie ścieżki i ma kilka zasad decydujących o kierunku na każdym kroku.
źródło