Jesteś uwięziony w tym labiryncie 5x5 - każdy pokój jest oznaczony od 1 do 25, a wyjście znajduje się w pokoju 1.
Otrzymujesz jako dane wejściowe pomieszczenie, w którym aktualnie się znajdujesz. Twoim zadaniem jest wygenerowanie najkrótszej sekwencji ruchów (północ, wschód, południe, zachód) potrzebnej do dotarcia do pokoju 1.
Ruchy mogą być generowane w dowolnym formacie (lista, łańcuch, tablica ...), o ile używasz znaków n,w,e,s
.
Oto wszystkie przypadki testowe:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
Najkrótsza odpowiedź w bajtach wygrywa!
code-golf
kolmogorov-complexity
Arnaud
źródło
źródło
Odpowiedzi:
Python 2 , 64 bajty
Wypróbuj online!
Funkcja drukująca jeden kierunek na linię, kończąca się błędem.
Stała
0x1211252b5375
koduje w podstawie 4 kierunek, wd
którym podróżujemy z każdego numeru pokoju, jako liczbę od 0 do 3. Cyfra ekstrakcyjna>>2*n-4&3
jest również zaprojektowana tak, aby dawała ujemny błąd przesunięcia podczasn=1
kończenia kodu. Aktualizujemy numer pokojun
za pomocą przesunięcia obliczanego od kierunkud
asd*3+d%2-5
, który odwzorowuje:źródło
try
/except
), aby móc kontynuować wykonywanie po wywołaniu tej funkcji.Python 2 ,
9593 bajtówWypróbuj online!
Mógłby się zgolić
32 bajty, jeśli dozwolone jest oznaczenie pokoju 0-indeksowane.źródło
05AB1E ,
3029 bajtów-1 bajt dzięki cudownej zbieżności z liczbami pierwszymi
Wypróbuj online!
źródło
1
dane wejściowe1
zamiast pustego ciągu (łatwym rozwiązaniem byłoby dodanie wiodącegoõ?
). Poza tym fajna odpowiedź!Rubin ,
7262 bajtyWypróbuj online!
W jaki sposób?
Sztuczka polega na tym, aby użyć 2 stałych, aby zbudować następny krok dla każdej komórki, a następnie rekurencyjnie rozwiązać problem.
Dwie stałe 18139004 i 4267088 są ciągami binarnymi, podającymi kierunek następnego ruchu, poprzez wyodrębnienie jednego bitu z obu dla każdej komórki, możemy uzyskać:
Łatwiej niż przesuwanie i maskowanie pojedynczej dużej liczby binarnej IMHO.
Kiedy otrzymujemy kierunek, wyodrębniamy odpowiednią literę z ciągu „en sw”:
I postępuj rekurencyjnie na komórce [n + x]
źródło
JavaScript (ES7),
6258 bajtówOdpowiedź portu Xnora .
Wypróbuj online!
źródło
Perl 5 (
-n
), 94 bajty-5 bajtów dzięki Grimy
TIO
źródło
Perl 5 , 79 bajtów
Wypróbuj online!
źródło
JavaScript,
807371 bajtówZaadaptowano z rozwiązania Pytona Chasa, więc też
+1
mu się podoba .Wypróbuj online!
1 bajt zapisany dzięki Arnauldowi .
źródło
Węgiel drzewny ,
4340 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Na podstawie odpowiedzi zarówno @ ChasBrown, jak i @ xnor. Wyjaśnienie:
Wprowadź pokój.
Ustaw zmienną pętli
i
na jedną mniejszą niż numer pokoju i powtarzaj, gdy jest ona różna od zera.Wyodrębnij kierunek ze skompresowanego łańcucha
0113130113220112010102010
. (Wiodący0
to tylko cyfra wypełniająca.)Wydrukuj kierunek.
Użyj wzoru @ xnor, aby obliczyć nowy numer pokoju.
źródło
Galaretka ,
3029 bajtówWypróbuj online!
Monadyczny link pobierający komórkę początkową i zwracający ciąg ze wskazówkami.
Uwielbiam fakt, że słownik Jelly ma słowo takie jak „Kennesaw” (miasto na północny zachód od Atlanty w stanie Georgia), użyte tutaj, ponieważ indeksuje się je za pomocą
[5, 1, -5, -1] + 1
dajenesw
!Wyjaśnienie
źródło
PHP , 110 bajtów
Rozwiązanie, które nie jest dobrą odpowiedzią Chasa Browna ani doskonałą odpowiedzią xnor . Wiem, że to dłużej, ale chciałem mieć inne rozwiązanie!
Wypróbuj online!
Utworzyłem ciąg mapujący, który ma 2 znaki dla każdej komórki na planszy. Pierwszym znakiem dla każdej komórki jest ruch (n / e / s / w) lub
0
a kod ASCII drugiego znaku mod 30 zwróci kolejny numer komórki, który powinniśmy śledzić jego ruch w trybie rekurencyjnym, dopóki nie wyjdziemy z komórki (cell < 2
).Na przykład dla wprowadzenia 8:
8
to:w%
w
i kontynuuj ruchy dla komórki%
%
to 37, którego mod 30 będzie 7, więc następną komórką jest7
.7
to:n
(ostatni znak to spacja, kod ASCII = 32)n
i kontynuuj ruchy dla komórki 32 mod 30, która jest2
.2
to:w<
(ostatni znak kod ASCII = 60)w
i kontynuuj ruchy dla komórki 60 mod 30, która jest0
.2
, pętla zatrzymuje się!wnw
PHP , 75 bajtów
Ta wersja jest napisana przez Grimy'ego , jest o 35 bajtów krótsza niż moja pierwotna odpowiedź, ponieważ on / ona jest mądrzejszy! Komentarz Grimy'ego: „4 * 25 <256, więc potrzebujesz tylko 1 bajtu na komórkę, a nie 2”
Wypróbuj online!
PHP , 71 bajtów
Ten port odpowiedzi Arnaulda, który jest portem odpowiedzi xnora , ale jako pętla zamiast funkcji rekurencyjnej, ponieważ okazuje się, że w PHP jest krótszy.
Wypróbuj online!
źródło
C (brzęk) , 81 bajtów
Wypróbuj online!
Dzięki sugestii @ Tommylee2k -8! + połączenie rekurencyjne
C (brzęk) , 90 bajtów
Wypróbuj online!
Podobne do wszystkich nieskompresowanych rozwiązań.
źródło
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 bajtówPort odpowiedzi @ChasBrown w Python 2 .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (wszystkie cztery sekcje), aby zrozumieć, dlaczego tak
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
jest"a wwswsnwwseenwwenwnwnenwn"
;Ž₁9
jest22449
;Ž₁9₂в
jest[1,7,5,11]
; i'€Ã
jest"news"
.źródło
western
jest lepszy. ; pBash , 120 bajtów
Wypróbuj online!
Przez chwilę bawiłem się, próbując spakować bit jako ciąg, ale dekodowanie wymagałoby więcej znaków niż zapisana liczba.
Jak to działa:
Łańcuch $ S zawiera pojedynczy znak (n, w, s, e) dla każdego pokoju, wskazujący kierunek, w którym należy przejść, aby przesunąć jeden pokój w kierunku wyjścia, pomijając pokoje 0 i 1.
Ciąg $ N ma deltę do dodawania / odejmowania od bieżącego numeru pokoju dla każdej zmiany kierunku (n: -5, w: -1, s: +5, e: +1)
Zacznij od $ i równego numerowi pokoju podanemu w wierszu poleceń (1 $). Przypisz znak o indeksie $ i w ciągu $ S do $ d. Odzyskaj wartość delty z $ N dla kierunku do następnego pokoju, przypisując ją do $ j.
Wydrukuj następny kierunek, aby wziąć $ d.
Dodaj / odejmij różnicę w $ j do / z $ i.
Pętlę aż do opuszczenia pokoju nr 2 (podczas gdy $ i> 1).
źródło
Stax , 31 bajtów
Uruchom i debuguj
źródło
Kotlin , 112 bajtów
Wypróbuj online!
źródło