Po katastrofalnej przejażdżce kajakiem spadłeś z wodospadu na końcu rzeki. Twoje kajak eksplodowało, ale udało ci się przetrwać eksplozję. Jednak twoja podróż po rzece zbiegła całkowicie z mapy - teraz zagubiłeś się w środku lasu. Na szczęście nadal masz umiejętności programistyczne, więc zdecydujesz się wyrzeźbić program na boku drzewa, aby pomóc ci znaleźć drogę przez las. Jednak na drzewie nie ma zbyt dużej powierzchni, więc program musi być możliwie jak najkrótszy.
W lesie można opisać jako n
o n
( n > 5
) kwadratu znaków, które składają się wyłącznie z małych liter a-z
. Przykładowy las:
anehcienwlndm
baneiryeivown
bnabncmxlriru
anhahirrnrauc
riwuafuvocvnc
riwnbaueibnxz
hyirorairener
ruwiiwuauawoe
qnnvcizdaiehr
iefyioeorauvi
quoeuroenraib
cuivoaisdfuae
efoiebnxmcsua
Być może zauważyłeś, że w tym lesie a
biegnie przez niego przekątna znaków od lewego górnego rogu do prawego dolnego rogu. Jest to „ścieżka” prowadząca przez las, która poprowadzi cię gdzieś, jeśli będziesz podążać. Twoim zadaniem jest napisanie programu, który znajdzie pojedynczą ścieżkę. Teraz bardziej szczegółowo opiszę, co oznacza „ścieżkę” w tym wyzwaniu.
„Ścieżka” w tym wyzwaniu jest definiowana jako linia podobna do linii, która mogła zostać wygenerowana za pomocą algorytmu Bresenham , ale z dodatkowymi wymaganiami, które:
- Linia musi mieć co najmniej 6 znaków
- Każda współliniowa (całkowicie przylegająca) grupa znaków w linii musi mieć tę samą długość .
- Zacznie się na jednym skraju lasu, a skończy na przeciwległym brzegu (patrz mój komentarz tutaj w celu opracowania)
Aby jaśniej wyjaśnić drugie wymaganie, rozważ następującą linię:
aaa
aaa
aaa
aaa
aaa
Ta linia składa się z kolinearnych „segmentów” znaków, z których każdy ma dokładnie trzy znaki. To kwalifikuje się jako ścieżka. Teraz rozważ tę linię:
a
aa
a
aa
a
aa
Ta linia składa się z kolinearnych „segmentów”, które nie są dokładnie tej samej długości znaków (niektóre z nich mają długość 1 znaku, a niektóre 2). Zatem ten nie kwalifikuje się jako ścieżka.
Twój program, mając mapę lasu, identyfikuje znaki użyte na ścieżce. Dane wejściowe są do wszystkiego, co jest dogodne (np. Argument wiersza poleceń, STDIN prompt()
itp.). Nie można go wstępnie zainicjować w zmienną. Pierwsza część danych wejściowych to pojedyncza liczba całkowita n
reprezentująca rozmiar lasu (las jest zawsze kwadratem). Potem jest spacja, a potem cały las jako pojedynczy ciąg. Na przykład przykładowy las zostałby przedstawiony jako dane wejściowe w następujący sposób:
13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua
Dane wyjściowe dla tego będą:
a
ponieważ ścieżka jest tworzona za pomocą litery a
. W lesie będzie tylko jedna ścieżka. To jest kod golfowy, więc wygrywa najmniejsza liczba znaków. Jeśli masz pytania, zapytaj w komentarzach.
Odpowiedzi:
APL (Dyalog 14) (70)
Wyjaśnienie:
⎕ML←3
: ustawionyML
na3
, co oznacza, że⊂
ma znaczenie APL2.I←⍞
: przeczytaj wiersz z klawiatury i zapisz goI
I⊂⍨' '≠I
: podziałI
na spacje{
...}/
: zastosuj tę funkcję do dwóch wynikowych ciągów:2/⍎⍺
: oceń lewy argument i powtórz go dwukrotnie, podając rozmiar matrycy⍵⍴⍨
: sformatuj odpowiedni argument, używając tego rozmiaruF←⊃
: rozpakuj i zapiszF
.{(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F
: pobierz przekątne: z każdego wiersza zarówno ( jakF
i⌽F
lustrzane odbicieF
), pobierz wartość w kolumnie X, gdzie X jest numerem wiersza(↓⍉F),(↓F),
: pobierz wiersze i kolumnyF
Z←∪¨
: znajdź unikalne wartości w każdym rzędzie, kolumnie i przekątnej i zapisz jeZ
.Ponieważ „las” jest prostokątny, jeśli istnieje poprawna ścieżka, oznacza to, że jeden z nich będzie składał się tylko z jednego znaku, którym jest znak ścieżki, więc:
Z/⍨1=≢¨Z
: weź te podwarstwy,Z
które mają tylko jeden element.Spowoduje to wyświetlenie znaków dla wszystkich prawidłowych ścieżek, ale ponieważ powinien być tylko jeden, który nie ma znaczenia.
źródło
Lua -
506380 - bajtówCzułem się trochę źle, że nie otrzymałeś żadnego poddania się za dobrze przemyślane wyzwanie, więc rzuciłem to razem. Całkiem fajnie było wnioskować, jakie minimalne właściwości dające się wyróżnić na podstawie podanych informacji. Mam nadzieję, że dobrze to zrozumiałem ... I poprawnie go zaimplementowałem.
Można to przetestować za pomocą:
Jeśli pojawi się dziki pretendent, sprawdzę, czy mój kod jest wart swojej ceny.Aktualizacja : gra w golfa na cześć tych, którzy wzniosą się ponad nami. W tym czasie musiałem naprawić mój kod, aby rozpoznawał ścieżkę przechodzącą od prawej do lewej. Ups
źródło
MATLAB - 270 znaków
Poniżej zdefiniowano funkcję,
x
która akceptuje ciąg znaków lasu jako argument i zwraca znak reprezentujący prawidłową „ścieżkę” przez las zgodnie z podanymi regułami.Wersja niezminimalizowana to
Podstawowym założeniem jest zbudowanie maski logicznej dla każdej możliwej prawidłowej ścieżki i zwrócenie dowolnego znaku, którego funkcja indeksu w macierzy obejmuje dowolną maskę. Aby to osiągnąć, tworzone są tylko pionowe lub od góry do dołu maski w kształcie ukośnika, ale matryca lasu jest porównywana we wszystkich czterech orientacjach: tożsamość, odwrócony, obrócony o 90 °, odwrócony obrócony o 90 °.
Funkcja działa dla każdego
n
. Przykładem wywołania go w wierszu poleceń jestźródło
Python -
384325275Ten algorytm zasadniczo sprawdza pierwszy i ostatni wiersz macierzy pod kątem pasujących znaków, a następnie oblicza długość każdego segmentu linii
W powyższym przykładzie:
V w pierwszym rzędzie ma indeks 2, V w ostatnim rzędzie ma indeks 4.
Zatem długość każdego segmentu linii wynosiłaby n / (4-2) +1 = 2 przy n = 6 .
Następnie sprawdza, czy linia jest poprawna.
Aby znaleźć ścieżkę od lewej do prawej, zamienia wiersze z kolumnami i robi to samo ponownie.
Edycja: Nie mogę dostać się do 270 (Cholera, Python i twoje cholerne wcięcie !!)
źródło