W tym wyzwaniu obliczysz, jak wspaniała jest twoja ziemia.
Napisz program lub funkcję, która oblicza rozmiar twojej ziemi, biorąc pod uwagę ścianę, którą zbudowałeś. Otrzymujesz niepusty ciąg wejściowy zawierający zestaw 4 różnych wybranych znaków, które reprezentują cztery kierunki „góra”, „dół”, „lewo” i „prawo” (użyję ^ v < >
w tym wyzwaniu). Nie można wykonać obrotu o 180 stopni ( <>
lub ^v
), ale możesz przekroczyć mur.
Sposób, w jaki „chwytasz” ziemię, otacza ją ścianą. Sama ściana jest również uważana za część twojej ziemi. Kilka przykładów wyjaśni to bardziej. Wykorzystam o
ziemię otoczoną murem, x
samą ścianę i S
punkt początkowy ściany, aby zilustrować budowę muru. Wyjście powinno być całkowity rozmiar waszej ziemi (liczby o
, x
a S
w przypadkach testowych poniżej).
Input: >>>>
Land: Sxxxx
Output: 5
Input: <<<^^^>>>vv
Land:
xxxx
xoox
xoox
xxxS
Output: 16
Input: <<<^^^>>>v
Land:
xxxx
x x
x
xxxS
Output: 11
Input: <
Land: xS
Output: 2
Input: >>>>>>vvvvvvvvv<<<<<^^^^>>>>>>>>vvvvvvvvvv<<<<<<<<<<<<<<<^^^^^^^^^>>>vvvvvv<<<<<
Land:
Sxxxxxx
x
x
x
x
xxxxxxxxx
xxxx xoooox x
xoox xoooox x
xoox xoooox x
xoox xxxxxx x
xoox x
xoox x
xxxxxx x
x x
x x
xxxxxxxxxxxxxxxx
Output: 101
Input: >>vvvv>>^^<<<<^
Land:
Sxx
xox
xxxxx
xox
xxx
Output: 17
Input: <<^^^>>>vv
Land:
xxxx
x x
x x
xxS
Output: 11 <- Note, diagonal edges do not close the "loop"
Wyjaśnienia:
- Nie musisz rysować ściany, wyjście powinno być tylko liczbą całkowitą
- Format wejściowy jest opcjonalny. Możesz wziąć ciąg znaków
<>^v
, listę cyfr,(1, -1, i, -i)
listę znakówABCD
itp.
To jest golf golfowy, więc wygrywa najkrótszy kod w każdym języku . Pamiętaj, że wyjaśnienia są ważne, nawet w „zwykłych” językach!
Odpowiedzi:
Python 2 ,
385345332 bajtówWypróbuj online! lub Wypróbuj wszystkie przypadki testowe
Dane wejściowe są numeryczne, 0 ~ 3, indeks 0 symboli tutaj:
>v<^
Oto wynikowa macierz:
źródło
Oktawa,
83858379 bajtówWypróbuj w Octave Online!
Funkcja, która przyjmuje jako dane wejściowe wektor kolumny zawierający
(1, -1, i, -i)
Wykorzystując podejście matematyki @ lanlock4, dodając długość danych wejściowych do współrzędnych, aby uniknąć nie dodatnich współrzędnych, zamiast odejmować od nich min. Współrzędnych. Zapisano 4 bajty.
Poprzednia odpowiedź:
Wypróbuj w Octave Online!
Zmieniono dla lepszej wizualizacji.
Wyjaśnienie:
źródło
Haskell,
579530 bajtówm
to główna funkcja, która przejmuje ciąg znakówv^<>
i zwraca odpowiednią liczbę całkowitą.Nie golfowany:
źródło
Mathematica, 124 bajty
Prawdopodobnie nie będziesz zaskoczony, gdy dowiesz się, że Mathematica ma wbudowaną funkcję pomiaru obszaru otoczonego ścianą. Niestety jest dość bajkowo:
ComponentMeasurements[..., "FilledCount", CornerNeighbors -> False]
.Mając to na uwadze, oto moja pełna odpowiedź. Jest to funkcja, która pobiera listę 1, i, -1 lub -i:
Wyjaśnienie:
FoldList[#+#2&,2(1+I)Length@#,#]
buduje ścianę, zaczynając od współrzędnej 2 (1 + i) (długość ściany) i sukcesywnie dodając elementy listy wejściowej. (Musimy zacząć od absurdalnie dużej współrzędnej 2 (1 + i) (długość ściany), aby upewnić się, że współrzędne ściany pozostaną dodatnie, w przeciwnym razie wszystko się zepsuje.)SparseArray[{Re@#,Im@#}&/@...->1]
zamienia te współrzędne z liczb zespolonych na pary liczb całkowitych i tworzy tablicę z 1s w miejscu ściany i 0 w innym miejscu.1/.ComponentMeasurements[...,"FilledCount",CornerNeighbors->1<0]&
wykorzystuje wbudowaną magię Mathematica do pomiaru obszaru zamkniętego przez ścianę.źródło
PHP> = 5.6.2, 888 bajtów
Wersja online
źródło