Ostatnio pojawiło się kilka wyzwań ASCII dla zwierząt domowych (np. Tutaj )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Wyzwanie polega na wzięciu losowo generowanego poziomego węża zwierzaka (wysokość pięciu linii, długość 30) i sprawdzenie, czy:
- Każda kolumna ma tylko jedną
0
- Każdy
0
jest „połączony” z nim0
przed i po nim (w pionie tylko 0 lub 1 linia)
Końcowe wyjście może być true
lub 1
jeśli wąż jest prawidłowy, false
lub 0
jeśli wąż jest nieprawidłowy
Edytuj - Wyjaśnienie
Załóżmy, że dane wejściowe:
- Jest sznurkiem
- Zawiera tylko „”, „0” i „\ n”
- Ma dokładnie 30 znaków w każdej linii
- Ma dokładnie 5 linii
Tzn. Sprawdź, czy wąż jest połączony i czy nie ma żadnych zbłąkanych znaków. Nie ma potrzeby sprawdzania poprawności „płótna”, na którym wąż jest drukowany.
code-golf
ascii-art
decision-problem
Mirror318
źródło
źródło
truthy/falsey
a możetrue/false
?Odpowiedzi:
JavaScript (ES2018),
6254 bajtyDane wejściowe to pojedynczy ciąg:
Flaga
s
oznacza kropkę pasującą do dowolnego elementu (w tym „\ n”). Ta funkcja jest obecnie obsługiwana przez Chrome 63+, Opera 50+, Safari 11.1+, w oparciu o tabelę zgodności . Możesz przetestować tę funkcję za pomocą obsługiwanych przeglądarek. Otrzymasz wyjątek podczas ładowania strony, jeśli Twoja przeglądarka nie obsługuje tej funkcji.Jak to działa:
0
:/( .{30}){4} /
0
s w jednej kolumnie:/0.{30}(.{31})*0/
0
nie łącz się z sąsiadami:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Scal wszystkie te wyrażenia regularne, a w końcu dostaniesz ten.
Pokaż fragment kodu
Dzięki Martin Ender zwróć uwagę, że jeden
!
operator może zaoszczędzić 8 bajtów.źródło
SnakeEx , 51 bajtów
Jest to oczywiście właściwy język dla zadania. : ^ D
Dopasowuje całe dane wejściowe, jeśli jest to prawidłowy wąż; nie pasuje, jeśli tak nie jest. Wypróbuj tutaj!
Wyjaśnienie
SnakeEx to język dopasowywania wzorców 2D . Program składa się z listy definicji „węży”, które pełzają wokół pasujących znaków, zmieniają kierunki i spawnują inne węże. W naszym programie definiujemy dwa węże
s
ic
.Zaczniemy od,
c
bo to jest prostsze. Jego definicja to0 *$
, co powinno być dość czytelne, jeśli znasz regex: match0
, po którym następuje zero lub więcej spacji, a następnie krawędź siatki. Główny haczyk: dopasowanie może przebiegać w dowolnym kierunku. Użyjemyc
zarówno węża w górę, jak i w dół, aby sprawdzić, czy0
w każdej kolumnie nie ma dodatkowych s.Teraz do głównego węża
s
. Przybiera formę(...)%{30}
, co oznacza „dopasuj treść nawiasów 30 razy” - raz dla każdego0
w wężu. Jak na razie dobrze. Co znajduje się w nawiasach?Odradza się nowy
c
wąż, skręcony w lewo o 90 stopni. Kierunek odnosi się dos
węża, więc nowy wąż przesuwa się w kierunku szczytu siatki (główny wąż przesuwa się w prawo). Tec
kontrole snake że bieżąca komórka jest siatka0
i że każda komórka nad nią jest przestrzeń. Jeśli się nie powiedzie, całe dopasowanie się nie powiedzie. Jeśli się powiedzie, kontynuujemyktóry robi to samo, tylko skręcił w prawo (w kierunku dolnej części siatki).
Zauważ, że te spawny nie wpływają na pozycję wskaźnika dopasowania w głównym wężu. W wyrażeniach regularnych są trochę jak „lookaheads”. (Może tutaj moglibyśmy nazwać je „lookbesides”?) Więc po sprawdzeniu, że wskazujemy na a,
0
a reszta kolumny zawiera tylko spacje, musimy faktycznie dopasować0
:Teraz wskaźnik dopasowania znajduje się na znaku po prawej stronie
0
. Musimy sprawdzić trzy różne opcje: wąż ustawia się pod kątem, wąż ustawia się pod kątem lub wąż idzie prosto. W tym celu możemy użyć wyrażenia OR:W naszej sali operacyjnej mamy trzy możliwości:
Skręć w prawo, dopasuj spację i ponownie skręć w lewo (kąty węża w dół).
Skręć w lewo, dopasuj spację i ponownie skręć w prawo (kąty węża w górę).
Dopasuj zero lub jeden znak podkreślenia. Ponieważ na wejściu nie ma podkreślników, zawsze będzie to puste dopasowanie (wąż idzie prosto).
Po dopasowaniu jednej z powyższych trzech opcji wskaźnik dopasowania powinien wskazywać
0
na następną kolumnę, gotowy do ponownego dopasowania wyrażenia w nawiasach.źródło
CJam ,
3534 bajtówWypróbuj online! Dane wejściowe to prostokątna tablica tablic znaków. Zakłada, że dane wejściowe zawierają tylko
i
0
.Wyjaśnienie:
źródło
05AB1E , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Łuska , 12 bajtów
W zależności od objaśnień reguł może mieć 11 bajtów lub 13 bajtów .
Wypróbuj online!
Dane wejściowe to lista wierszy zawierających tylko spacje i zera; jeśli wymagany jest pojedynczy ciąg znaków, dołącz
¶
do programu, aby podzielić na wiersze. Link TIO już to robi dla jasności. Wyjście wynosi 0 lub 1; jeśli jakiekolwiek fałszowanie i prawdziwe wartości są w porządku,±
można je usunąć.Wyjaśnienie
Chodzi o to, aby
×≈
zagwarantować, że (a) wszystkie kolumny zawierają dokładnie jedno 0, oraz (b) ich pozycje różnią się co najwyżej o jeden. Jako przykład rozważ 8-kolumnowe dane wejścioweNajpierw
mηfT
przekształca go w listę list indeksowychPotem
Ẋ×≈
dajeKażdy
1
odpowiada parze wskaźników, które różnią się co najwyżej o 1, a każdy0
odpowiada parze, która nie. Każdy wynik jest[1]
dokładnie taki, gdy obie listy mają jeden indeks, a wskaźniki różnią się co najwyżej o 1.źródło
Python 2 , 71 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako ciąg multilinii. Testuje skrzynkę Bubblera .
Pierwsza kolumna jest wyodrębniana jako,
s[::31]
a druga jakos[1::31]
i są sprawdzane pod kątem ważności. Wracamys
usunięciu pierwszego znaku, powodując sprawdzenie kolejnych par kolumn.Sprawdzanie dwóch kolumn wykorzystuje łańcuch porównawczy Pythona do
in
łączenia wielu sprawdzeń:'0'in s[::31]
sprawdza, czy pierwsza kolumna ma co najmniej jedną0
s[::31]in' %s '%s[1::31]
sprawdza, czy pierwsza kolumna jest podciągiem kanapek drugiej kolumny między dwiema spacjami, co zapewnia0
przesunięcie pozycji co najwyżej jednej spacji' %s '%s[1::31]in'%6s'%0*2
sprawdza, czy druga kolumna zawiera co najwyżej jedną0
.Zakończenie
*f(s[1:])
również wymusza prawdziwość przypadku rekurencyjnego.źródło
C (gcc) ,
246245232215212 bajtówWypróbuj online!
Pomyślałem, że wezmę do tego mój ulubiony język (chociaż, jak widzę z wielu innych, mniejszych wpisów, prawdopodobnie nie jest on idealny do tego rodzaju wyzwań) i C, czym mógłbym zarządzać. Podejście programu do problemu jest stosunkowo proste, z dużą ilością szczypania bajtów; pobiera węża na standardowe wejście i podaje wynik w postaci wartości zwracanej przez main (stąd kod wyjścia;
zgodnie z żądaniem w problemie 0 oznacza nieprawidłowego węża, a 1 ważny, chociaż dla kodu wyjścia, który jest dziwnytypowe dla kodów wyjścia 0 to prawidłowy wąż, a 1 to nieprawidłowy wąż). Z rozwiniętymi makrami i ładnymi białymi znakami wygląda to następująco:Linie wejściowe są odczytywane w pierwszym rzędzie bufora, następne pięć służy do śledzenia, jakie miejsca mają (czytaj: musi) mieć zera po każdym bieżącym, a ostatnie do śledzenia, czy zero już ma zostały odczytane w danej kolumnie, w dowolnym wierszu. Program kolejno przetwarza każdy wiersz.
To wcale nie jest solidne (
gets()
to tylko początek), a dane wejściowe muszą zawierać wszystkie odpowiednie spacje (na przykład bez pozostawionych spacji), a gcc wyrzuca ostrzeżenia i uwagi na temat funkcji stdlib pozostawionych niejawnie zadeklarowanych itd., Ale C życie.Zakłada również, że głowa węża nie musi znajdować się w środkowym rzędzie i że prawidłowy wąż musi mieć co najmniej jedno zero w każdym rzędzie (tj. Nie ma wierszy ze wszystkimi spacjami w 5 rzędach wejściowych). Jeśli ten ostatni nie jest wymagany, można go nieco skrócić - wszystko, co ma związek z programem
k
iwl
nim można sparować lub zastąpić mniejszą liczbą bajtów kodu.Podziękowania dla użytkownika202729 za ok. 26 bajtów zapisanych.
źródło
#define F
i)
dla -1 bajtu.\n
(10),<space>
(32) i0
(48), możesz to sprawdzić za==48
pomocą>47
(-1 bajtu). / Możesz usunąć={0}
inicjalizację,b
jeśli zmienna jest globalna. Podobnie uczyń parametrk
globalny i parametri
(bez typu ->int
) parametrumain
(zamiastargc
którego1
).i
jakargc
to geniusz). Pierwsze szkice miały ponad 400 bajtów; zajęło mi wystarczająco dużo czasu, aby przeciągnąć go do moich osobistych celów 300, a następnie 256, więc może być więcej sposobów na zmniejszenie tego, co przegapiłem.k
,j
il
wszystkie globale, aby zaoszczędzić na osobnychint
deklaracjach, a potem zdałem sobie sprawę, że wartości domyślne pozwolą mi całkowicie zrezygnować z tego typu. Dzięki jeszcze raz!MATL ,
1817 bajtówDane wejściowe to tablica znaków 2D. Dla węża można użyć dowolnej spacji.
Wypróbuj online!
Wyjaśnienie
źródło
un30=
do sprawdzenia, czy wszystkie indeksy kolumn są różne i żadna z 30 kolumn nie jest pusta. Może mogę to przetestować bardziej bezpośrednio, ale nie wiem jakPoślizg , 28 bajtów
Sprawdź to tutaj.
źródło
Galareta , 19 bajtów
Wypróbuj online!
-2 bajty dzięki Mr. Xcoder
Wyjaśnienie
Dane wejściowe są w postaci listy ciągów
źródło
Galaretka , (14? *) 13 bajtów
Łącze monadyczne pobierające listę pięciu ciągów *, każdy o długości 30, składających się ze spacji i dowolnych innych znaków (np.
0
S), i zwracające liczbę całkowitą (1, jeśli zdefiniowano węża, w przeciwnym razie 0)* Jeśli dane wejściowe muszą być pojedynczym ciągiem (listą znaków), należy poprzedzić znak a,
Ỵ
aby podzielić ciąg znaków przy znakach wiersza.Wypróbuj online!
W jaki sposób?
źródło
Stax , 20 bajtów CP437
24 bajty po rozpakowaniu,
Uruchom i debuguj online!
Może nie jest najlepszy w golfa, ale myślę, że metoda jest nowatorska i interesująca.
Wyjaśnienie
źródło
J ,
38, 3730 bajtów-8 bajtów dzięki FrownyFrog
Wypróbuj online!
źródło
[:(-:*)2-/\
sprawdzisz, czy wszystkie różnice wynoszą -1, 0 lub 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Galaretka , 16 bajtów
Wypróbuj online!
Zakłada, że ciąg wejściowy zawsze będzie zawierał tylko spacje i zera. Pobiera dane wejściowe jako listę ciągów znaków (każdy reprezentuje linię), i zwraca 1, jeśli to prawda, 0 w przeciwnym razie.
Wyjaśnienie
źródło
Python 2 , 141 bajtów
Wypróbuj online!
Dane wejściowe to siatka znaków.
źródło
Python 2 i Python 3 ,
122120119 bajtówWypróbuj online!
Format wejściowy to jeden ciąg długości 154 (5 x 30 znaków, 4 znaki nowej linii):
Jeśli głowa nie musi być środkowym rzędem
Wymaganie od środkowego rzędu było w pierwotnym wyzwaniu, ale stwierdziłem, że tak nie jest (przynajmniej nie zostało to wyraźnie wymienione).
Python 2 i Python 3 ,
124123 bajtyWypróbuj online!
Edytować:
==
) na nierówności dla każdego kodu.all()
sztuczka nie ma znaczenia w Py3, więc połączyła obie wersje.źródło
Excel (VBA), 68 bajtów
Używanie natychmiastowego okna
Cell[A6]
jako danych wyjściowych.źródło
Ślimaki , 18 bajtów
Wypróbuj online!
źródło
Grime ,
302623 bajtówDziękujemy Zgarbowi za uratowanie 7 bajtów i wskazanie błędu.
Wypróbuj online!
źródło
Ruby , 93 bajty
Wypróbuj online!
źródło
JavaScript (Node.js) ,
128126 bajtówEdytowane po wyjaśnieniu danych wejściowych, stwierdzając, że dane wejściowe to „ciąg znaków”.
Wypróbuj online!
źródło
Python 3 ,
197185 bajtówW wierszu polecenia do
verify.py<snake.txt
lub w bash docat snake.txt | python verify.py
. Gdziesnake.txt
jest plik zawierający węża do weryfikacji.Jeśli wąż jest poprawny, nic nie zostanie wyprowadzone. Jeśli nie jest poprawny, Python zgłosi błąd indeksu.
źródło