Wyobraź sobie podpalacza spacerującego po mieście i zbierającego ofiary według ściśle określonego wzoru (lub, alternatywnie, wyobraź sobie pszczołę latającą po ogrodzie i zbierającą kwiaty do zapylania według określonego wzoru ). Powiedzmy, że miasto jest macierzą N × N , gdzie N jest liczbą całkowitą większą lub równą 2 . Rozpocznie podpalacz z lewym górnym rogu i kolejno ustawia dom M plamy przed nimi (gdzie M oznacza liczbę domu w którym się obecnie), przy zmianie kierunku to poruszający się po każdym pożarze, w kolejności Wschód ⟶ Południe ⟶ Zachód ⟶ Północ ⟶ Wschód ⟶ Południe ... i tak dalej. kołysankapodpalacza to wartość M, która sprawia, że opuszczają miasto (tzn. ostatni dom, który odwiedzają przed zatrzymaniem obrzydliwości). Jest to o wiele łatwiejsze do zrozumienia na przykładzie. Weźmy na przykład następującą macierz:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Zaczynamy w lewym górnym rogu, więc M = 3 (
X
oznacza obecną i poprzednią pozycję podpalacza):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Zgodnie ze znaną kolejnością najpierw przechodzi na wschodnie M (3) miejsca i ląduje na 2, więc M odpowiednio się zmienia:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Potem idzie na południe o 2 miejsca, a M ma teraz 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Teraz przesuwa się o 1 miejsce na Zachód, a M staje się 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- Po przesunięciu 3 miejsc na północ opuszcza miasto! Dlatego 3 jest kołysanką tego podpalacza:
X X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Biorąc pod uwagę macierz N × N (opcjonalnie możesz też wziąć N jako dane wejściowe), znajdź kołysankę podpalacza. Napisałem program, dzięki któremu możesz wygenerować więcej przypadków testowych i wizualizować ścieżkę podpalacza: Wypróbuj online!
- Można założyć, że podpalacz nie mają kołysankę (to jest, może faktycznie wyjść z matrycy).
- Dla uproszczenia macierz będzie zawierać tylko dodatnie liczby całkowite mniejsze lub równe 9 (cyfry). Rozwiązania, które obsługują każdą dodatnią liczbę całkowitą są mile widziane.
- Zwróć uwagę, że podpalacz może wylądować w miejscu, które już spalił, na wypadek gdyby poruszenie się było inne niż za pierwszym razem. W takim scenariuszu po prostu weź wartość tego elementu i przejdź ponownie jak zwykle.
- Możesz konkurować w dowolnym języku programowania i możesz przyjmować dane wejściowe i generować dane wyjściowe za pomocą dowolnej standardowej metody , zwracając uwagę, że te luki są domyślnie zabronione. To jest golf golfowy , więc wygrywa najkrótsze przesłanie (w bajtach) dla każdego języka .
Przypadki testowe
------------- 9 2 3 1 7 2 8 7 6 Kołysanka: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Kołysanka: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Kołysanka: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Kołysanka: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Kołysanka: 3 -------------
Matryce w innym formacie:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 3, 1, 2], [ 3, 1, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
Piąty przypadek testowy jest bardzo interesujący do wizualizacji .
źródło
Odpowiedzi:
MATL , 32 bajty
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Jak to działa
Matryca wejściowa jest wypełniona ramką pięciu zer, więc na przykład
staje się
Ramka zer jest używana do wykrywania, kiedy
podpalaczopuści matrycę. Rozszerzenie z pięcioma zerami zapewnia, że modułowe przesunięcie długości9
w dowolnym kierunku od dowolnego z niezerowych wpisów poprawnie wyląduje w zera bez zawijania do jakiegoś niezerowego wpisu.We współrzędnych matrycy pszczoła zaczyna się przy wejściu
(6,6)
do matrycy rozszerzonej. Odczytuje ten wpis i aktualizuje współrzędne zgodnie z wymaganiami, stosując (modułowe) przesunięcie długości odczytu w odpowiednim kierunku. Jest to powtarzane w pętli, dopóki nie zostanie odczytana wartość0
. Wpis, który został przeczytany przed tym (tj. Ostatni niezerowy wpis) jest wyjściem.Współrzędne są faktycznie przechowywane jako liczba zespolona, więc na przykład
(6,6)
staje się6+6j
. W ten sposób cztery cykliczne kierunki mogą być realizowane jako moce urojonej jednostki. Odpowiednią moc (j
,1
,-j
i-1
) jest mnożona przez wejście odczytu w celu uzyskania złożonego przemieszczenia, która jest wykorzystywana do aktualizacji współrzędnych.Kolejno odczytywane wartości są przechowywane na stosie. Po wyjściu z pętli stos zawiera wszystkie niezerowe wartości odczytu w kolejności, następnie ostatnią odczytaną wartość
0
, a następnie ostatnie złożone współrzędne. Tak więc trzeci element jest wymaganym wyjściem.źródło
JavaScript (ES6),
7068 bajtówWypróbuj online!
Skomentował
Biorąc pod uwagę, że znakiem modulo w JS jest znak dywidendy, kierunek jest aktualizowany w następujący sposób:
źródło
Węgiel ,
2518 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wydrukuj ciąg wejściowy, ale nie zmieniaj pozycji drukowania.
Obróć oś obrotu w lewo, aby kierunek drukowania był teraz w górę.
Powtarzaj, gdy pod pozycją drukowania jest znak.
Zapisz znak w zmiennej.
Rzuć znak na liczbę i wydrukuj tyle nowych linii. Ponieważ kierunek drukowania jest teraz w górę, drukowanie kończy się w poziomie. Wynik jest taki, że przesunęliśmy pozycję drukowania w pożądanym kierunku o wartość podaną przez liczbę pod pozycją drukowania.
Obróć oś, aby następne znaki nowej linii przesunęły pozycję drukowania w następnym kierunku zgodnie z ruchem wskazówek zegara dla następnego przejścia pętli.
Niestety nadal mamy do czynienia z zaśmiecaniem naszego obszaru roboczego, a jeszcze bardziej niestety, jeśli wyczyścimy obszar roboczy, usuwamy również naszą zmienną. To trochę sztuczka: lista pustych ciągów znaków i zmiennej jest zapętlona. W pierwszym przejściu pętli zmienna pętli jest pusta, więc obszar roboczy i zmienna pętli oraz zmienna wynikowa są czyszczone. Ale pętla nie jest skończona! W drugim przejściu pętli nadal uzyskujemy dostęp do naszej zmiennej starannie zachowanej na naszej liście pętli. Pozostaje po prostu go wydrukować.Wyczyść płótno i wydrukuj zapisaną zmienną. (Dzięki @ ASCII-tylko za poprawkę na węgiel drzewny.)
źródło
Python 2 ,
8584 bajtówWypróbuj online!
Przechyl kapelusz do pana Xcodera za 1 bajt.
źródło
Węgiel ,
504946343326 bajtówWypróbuj online
Link jest do pełnej wersji kodu
Dane wejściowe muszą znajdować się na N we własnej linii, a następnie linie tablicy na osobnych liniach.
Wszelkie sposoby na odrzucenie bajtów są mile widziane i pożądane, ponieważ nie jestem dobrym golfistą w Charcoal!
-12 bajtów dzięki @Neil! -1 bajt dzięki tylko @ ASCII! -7 bajtów dzięki tylko @ ASCII (zmieniono błąd powodujący
Clear
resetowanie zmiennych)źródło
Czerwony , 145 bajtów
Wypróbuj online!
Bardziej czytelny:
źródło
Perl 6 , 62 bajtów
Wypróbuj online!
Traktuje macierz jako płaską listę i szerokość.
źródło
Czysty , 141 bajtów
Wypróbuj online!
Definiuje funkcję
? :: {#{#Int}} -> Int
, biorąc rozpakowaną tablicę rozpakowanych tablic liczb całkowitych i zwracając wynik.źródło
Java 8, 121 bajtów
Wypróbuj online.
Alternatywnie z taką samą liczbą bajtów 121 bajtów :
Używa try-wreszcie zamiast sprawdzania, czy
x,y
współrzędna jest nadal w granicach.Wypróbuj online.
Wyjaśnienie:
źródło
Perl 5 , 92 bajtów
Wypróbuj online!
W jaki sposób?
Zestaw zagnieżdżonych map i łączenie tworzą:
który jest następnie oceniany w celu ustalenia, czy pętla się kończy. Ponieważ wartość logiczna jest obliczana od lewej do prawej, wartość
$n
faktycznie zmienia się (maksymalnie) cztery razy podczas oceny. Ponieważ logiczne zwarcie logiczne w Perlu, wartością$n
jest kołysanka po wyjściu z pętli.źródło
Python 3 ,
8584 bajtówxcoder: -1 (nigdy nie pamiętam sztuczki + ~)
Wypróbuj online!
Zamiast poruszać się w różnych kierunkach (E, S, W, N), to rozwiązanie zawsze przesuwa się na wschód i po każdym ruchu obraca siatkę przeciwnie do ruchu wskazówek zegara. Po obróceniu ostatnia kolumna jest teraz pierwszym rzędem, więc jeśli indeks wiersza jest mniejszy od zera, oznacza to, że uciekliśmy z planszy.
źródło
-d-1
=>+~d
Retina , 161 bajtów
Wypróbuj online!
źródło