Gra wideo Minecraft polega na umieszczaniu i usuwaniu różnego rodzaju bloków w siatce liczb całkowitych 3D, która tworzy świat wirtualny. Każdy punkt sieci może zawierać dokładnie jeden blok lub być pusty ( oficjalnie blok „ powietrzny ”). W tym wyzwaniu zajmiemy się tylko jedną pionową płaszczyzną 2D świata 3D i jednym rodzajem bloku: obsydianem .
Gdy obsydian tworzy obrys pustego prostokąta w płaszczyźnie pionowej, można utworzyć portal w dolnej części . Pusty prostokąt może mieć dowolny rozmiar, od 2 jednostek szerokości przez 3 jednostki wysokości do 22 jednostek szerokości i 22 jednostki wysokości. Narożniki prostokąta nie muszą być otoczone obsydianem, tylko boki.
Załóżmy na przykład, że X
jest obsydianem i .
pustką: (Liczby służą wyłącznie do celów identyfikacyjnych i są również puste).
...................................
..XXXX....XXXX....XXXXXXXXX........
..X..X...X....X..X.........X..XXXX.
..X.1X...X.2..X..X...3...X.X..X....
..X..X...X....XXXX.........X..X.6X.
..XXXX....XXXX...XXXXXXXXXXX..X..X.
.............X.4.X....X.5.X...XXXX.
.............X...X....X...X........
..............XXX......XXX.........
...................................
Ta siatka zawiera 3 prawidłowe portale:
- Portal 1 ma 2 na 3 jednostki, jest całkowicie pusty i graniczy z obsydianem. Dlatego jest ważny.
- Portal 2 ma wymiary 4 na 3, jest całkowicie pusty i graniczy z obsydianem. Dlatego jest ważny.
- Portal 3 nie jest całkowicie pusty. Dlatego jest nieważny.
- Portal 4 ma wymiary 3 na 3, jest całkowicie pusty i graniczy z obsydianem. Dlatego jest ważny.
- Portal 5 to 3 na 2 jednostki, co jest zbyt małe. Dlatego jest nieważny.
- Portal 6 nie ma części granicy. Dlatego jest nieważny.
Wyzwanie
Napisz program lub funkcję, która pobiera te ciągi reprezentujące siatki obsydianu i pustki oraz wypisuje lub zwraca liczbę obecnych portali sieciowych.
- Dane wejściowe mogą pochodzić z argumentu stdin lub pliku lub funkcji.
Możesz założyć, że dane wejściowe są zawsze dobrze uformowane - tzn. Idealnie prostokątna siatka tekstu, o szerokości i wysokości co najmniej 1 znaku, zawierająca tylko
X
i.
. Opcjonalnie możesz założyć, że po ostatnim wierszu jest końcowy znak nowej linii.W razie potrzeby możesz użyć dowolnych dwóch różnych drukowalnych znaków ASCII zamiast
X
i.
.Obsidian może znajdować się na granicy siatki. Wszystko poza granicami jest uważane za puste.
Przykładowe dane wejściowe - dane wyjściowe powinny być 4
:
................................................................
...................................XXXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX....XXXXXXXXX........X.......................X....
..X..X...X....X..X.........X..XXXX.X.......................X....
..X..X...X....X..X.......X.X..X....X.......................X....
..X..X...X....XXXX.........X..X..X..XXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX...XXXXXXXXXXX..X..X.X......................X..XXX
.............X...X....X...X...XXXX.X......................X..X..
.............X...X....X...X........X......................X..X..
..............XXX......XXX........XXXXXXXXXXXXXXXXXXXXXXXX...X..
..................................XX.........................XXX
Punktacja
Zgłoszenie z najmniejszą liczbą bajtów wygrywa.
Odpowiedzi:
Perl, 81
86Używanie więcej niż jednego wyrażenia regularnego.
Wyrażenie regularne dla określonej szerokości portalu jest znacznie prostsze niż ogólne:
X{$m}..{$n}(X\.{$m}X.{$n}){3,22}.X{$m}
gdziem
jest szerokość portalu in
jesttotal width - 1 - m
. Wyrażenie regularne musi być wprowadzone w przód w twierdzeniu o zerowej szerokości,(?=...)
ponieważ dopasowania mogą się nakładać. Następnie powtarzam 21 razy to ustawienie wyrażenia regularnego$n
i$.
."@-"
ocenia pozycję początkową ostatniego dopasowania (/.\n/
), która ma całkowitą szerokość - 1.$.
jest używana jako druga zmienna, ponieważ jest inicjalizowana,1
gdy jest używana z-p0
.źródło
.
dla pustych komórek (więc nie musisz przed nim uciekać).Regex (smak .NET),
182181145132126114104100989796 bajtówRozpoznawanie wzorów 2D ASCII? Brzmi jak praca dla wyrażeń regularnych! (Nie ma.)
Wiem, że to znów spowoduje niekończące się dyskusje na temat tego, czy wysyłanie wyrażeń regularnych jest poprawnymi programami, ale wątpię, czy i tak pokona APL lub CJam, więc nie widzę żadnej szkody. (Powiedział, że oni zrobić przekazać nasz test zagorzałych dla „Czym jest język programowania?” ).
Pobiera to dane wejściowe jako ciąg znaków do dopasowania, a wynikiem jest liczba znalezionych dopasowań. Używa
_
zamiast.
, bo musiałbym uciec przed tym drugim. Wymaga również końca nowej linii.Możesz to przetestować na żywo w RegexHero lub RegexStorm ). Mecze będą górnymi obsydianowymi rzędami portali. Jeśli znajdziesz przypadek testowy, w którym się nie powiedzie, daj mi znać!
Co to za czary?
Poniższe objaśnienie zakłada podstawowe zrozumienie grup bilansujących .NET . Istotą jest to, że przechwytywania są stosami w wyrażeniu regularnym .NET - każde nowe przechwytywanie dla tej samej nazwy jest wypychane na stos, ale istnieje również składnia do przechwytywania przechwytywania z tych stosów, a także składnia przechwytywania przechwytywania z jednego stosu i przechwytywania przechwytywania na inny w tym samym czasie. Aby uzyskać pełniejszy obraz, możesz rzucić okiem na moją odpowiedź na temat Przepełnienia stosu, która powinna obejmować wszystkie szczegóły.
Podstawową ideą jest dopasowanie wzoru, takiego jak:
Gdzie
n
jest między 2 a 22 (włącznie). Najtrudniejszą rzeczą jest uzyskanie wszystkichn
s i wszystkiem
s być takie same. Ponieważ rzeczywiste postacie nie będą takie same, nie możemy po prostu użyć odwołania wstecznego.Zauważ, że regex musi osadzić nowe wiersze, które napiszę jak
\n
poniżej.C #, 185 bajtów
Oto pełna funkcja C #, aby ten wpis był prawidłowy. Czas napisać „interpretera” wiersza poleceń dla wyrażeń regularnych .NET ...
źródło
^
(lub dowolnej nieużywanej postaci) dla(?!)
.Python, 219 bajtów
Lepsze niż Java, ale chłopiec bolało pięciokrotnie zagnieżdżone pętle.
for/in
Może być nieznacznie ściśliwy stosując%s
podstawienie, ale nie byłoby zaoszczędzić dużo.Rozszerzony:
źródło
Java, 304 bajty
To znacznie dłużej niż wyrażenie regularne. Po prostu iteruje każdy możliwy kwadrat na wejściu. Jeśli jest to prawidłowy portal, zwiększa licznik o 1. Następnie zwraca licznik. Można to prawdopodobnie znacznie pograć w golfa. Wszelkie sugestie są mile widziane.
Zębaty:
Pełny program:
źródło