Weryfikacja poziomego węża zwierzaka ASCII

22

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 0jest „połączony” z nim 0przed i po nim (w pionie tylko 0 lub 1 linia)

Końcowe wyjście może być truelub 1jeśli wąż jest prawidłowy, falselub 0jeś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.

Mirror318
źródło
4
Cześć i witamy w PPCG :) To dobre wyzwanie dla pierwszego postu, ale prawdopodobnie chcesz dodać więcej przypadków testowych, które łapią wyjątkowe węże. Prawdopodobnie będziesz chciał zdecydować, czy wąż musi być reprezentowany przez zera, czy może być jakąkolwiek postacią. W przyszłości rozważ skorzystanie z piaskownicy . Powodzenia :)
FryAmTheEggman
5
Czy to jest uważane za żądło? Czy może być wprowadzony jako tablica 2D?
JSchiff
6
Czy gwarantujemy, że dane wejściowe składają się z zer i spacji? Czy każda linia ma długość 30? Że jest 5 linii?
xnor
9
Ponieważ jest to problem decyzyjny, truthy/falseya może true/false?
Jonathan Allan
3
@JSchiff Jestem pewien, że bajt węża?
MarioDS

Odpowiedzi:

14

JavaScript (ES2018), 62 54 bajty

s=>!/0(.{30}|.{60,62}(.{31})*)0|( .{30}){4} /s.test(s)

Dane wejściowe to pojedynczy ciąg:

  • bez końca nowej linii
  • zawierają tylko spację, „0” i „\ n”
  • 30 znaków w każdej linii, 5 linii, łącznie 154 znaki

Flaga soznacza 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:

  • Brak kolumny bez 0:
    • nie pasuje /( .{30}){4} /
  • Brak dwóch 0s w jednej kolumnie:
    • nie pasuje /0.{30}(.{31})*0/
  • Nie, 0nie łącz się z sąsiadami:
    • nie pasują /0.{60}(.{31})*0/,/0.{62}(.{31})*0/

Scal wszystkie te wyrażenia regularne, a w końcu dostaniesz ten.

Dzięki Martin Ender zwróć uwagę, że jeden !operator może zaoszczędzić 8 bajtów.

tsh
źródło
8

SnakeEx , 51 bajtów

Jest to oczywiście właściwy język dla zadania. : ^ D

s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$

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 si c.

Zaczniemy od, cbo to jest prostsze. Jego definicja to 0 *$, co powinno być dość czytelne, jeśli znasz regex: match 0, 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żyjemy czarówno węża w górę, jak i w dół, aby sprawdzić, czy 0w 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żdego 0w wężu. Jak na razie dobrze. Co znajduje się w nawiasach?

{c<L>}

Odradza się nowy cwąż, 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). Te ckontrole snake że bieżąca komórka jest siatka 0i że każda komórka nad nią jest przestrzeń. Jeśli się nie powiedzie, całe dopasowanie się nie powiedzie. Jeśli się powiedzie, kontynuujemy

{c<R>}

któ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, 0a reszta kolumny zawiera tylko spacje, musimy faktycznie dopasować0 :

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:

(<R> <L>)

Skręć w prawo, dopasuj spację i ponownie skręć w lewo (kąty węża w dół).

(<L> <R>)

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ć 0na następną kolumnę, gotowy do ponownego dopasowania wyrażenia w nawiasach.

DLosc
źródło
2

CJam , 35 34 bajtów

{z_{'0e=1=}%:*\'0f#2ew::-[W0X]-!*}

Wypróbuj online! Dane wejściowe to prostokątna tablica tablic znaków. Zakłada, że ​​dane wejściowe zawierają tylko i 0.

Wyjaśnienie:

{z_{'0e=1=}%:*\'0f#2ew::-[W0X]-!*}   Function taking a character matrix:
 z                                      Transpose.
   {      }%                            Consider whether each row
      e=                                  contains
        1=                                exactly one
    '0                                    of the character '0'.
            :*                            This must be true for every row.
                  #                     Next, find the position
               '0                         of the character '0'
                 f                        at every row
  _           \                           in the original input.
                       :-               Find the differences between
                      :                   each
                   2                      pair
                    ew                    of adjacent elements (in other words, compute
                                            the increments).
                                        For the snake to be valid, this array of increments
                                            must only contain {0, 1, -1}, so
                              -         Remove from this list
                         [   ]            the elements
                          W                 -1,
                           0                0,
                            X               and 1,
                               !          and then check whether the array is empty.
                                *       The previous code tested two different properties
                                          of the matrix; they both must be true for a
                                          valid snake.
Esolanging Fruit
źródło
2

05AB1E , 18 bajtów

ζDε0k}¥Ä2‹sεþg}ìPΘ

Wypróbuj online!

Wyjaśnienie

ζ                    # transpose
 D                   # duplicate
  ε  }               # for each row in the first copy (column of input)
   0k                # get the index of the first 0
      ¥Ä             # calculate absolute delta's
        2‹           # check that each is less than 2
          sε  }      # for each row in the second copy (column of input)
            þg       # calculate the length of the string with non-digits removed
               ì     # concatenate the lists
                P    # calculate product
                 Θ   # truthify (turn false values to 0)
Emigna
źródło
2

Łuska , 12 bajtów

W zależności od objaśnień reguł może mieć 11 bajtów lub 13 bajtów .

±Λ=;1Ẋ×≈mηfT

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

±Λ=;1Ẋ×≈mηfT  Implicit input: a list of lines.
           T  Transpose into list of columns.
        m     For each column,
         ηf   get list of indices of truthy elements.
              In Husk, whitespace characters are falsy and other are truthy,
              so this gets us the indices of 0s on each column.
     Ẋ        For each adjacent pair of these index lists,
      ×       for all pairs drawn from the two lists,
       ≈      give 1 if they differ by at most 1, otherwise 0.
              For each adjacent pair, this produces a list of 1s and 0s.
 Λ            Do all of these lists
  =;1         equal [1]? Return either 0 or 30 (length of the outer list + 1).
±             Signum; convert to 0 or 1.

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ściowe

0  0  0 
 000 0  
  00   0

Najpierw mηfTprzekształca go w listę list indeksowych

[[1],[2],[2,3],[1,2,3],[],[2],[1],[3]]

Potem Ẋ×≈daje

[[1],[1,1],[1,1,0,1,1,1],[],[],[1],[0]]

Każdy 1odpowiada parze wskaźników, które różnią się co najwyżej o 1, a każdy 0odpowiada 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.

Zgarb
źródło
2

Python 2 , 71 bajtów

f=lambda s:s[1]<' 'or'0'in s[::31]in' %s '%s[1::31]in'%6s'%0*2*f(s[1:])

Wypróbuj online!

Pobiera dane wejściowe jako ciąg multilinii. Testuje skrzynkę Bubblera .

Pierwsza kolumna jest wyodrębniana jako, s[::31]a druga jako s[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 zapewnia 0przesunięcie pozycji co najwyżej jednej spacji
  • ' %s '%s[1::31]in'%6s'%0*2sprawdza, czy druga kolumna zawiera co najwyżej jedną 0.

Zakończenie *f(s[1:])również wymusza prawdziwość przypadku rekurencyjnego.

xnor
źródło
Teraz, gdy o tym myślę, Python jest niesamowitym językiem dla tych „wężowych” wyzwań. : P
MustacheMoses
2

C (gcc) ,246 245 232 215 212 bajtów

#define F)exit(1);
#define L for(i=l=0;i<30;i++)
#define X b[7][i]
char b[8][31];k,j,l;main(i){for(;j++<5;){gets(b);L{if(i[*b]>47){if(X++F memset(b[j+1]+i-1,l=1,3);}else if(!X&b[j][i]F}k+=!!l;}if(k<5 F L if(!X F}

Wypró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:

char b[8][31];l,j,k;                           //Declares a buffer to work in, initialized all to 0; l j and k default to int and as globals are init to 0
main(i) {                                      //This is run no-args, so argc is 1 and the undeclared type defaults to int.
  for (; j++ < 5;) {                           //Iterating over each row, 1-indexed for convenience accessing the buffer
    gets(b);                                   //Reads into b[0] because of stack array decl layout
    for (i = l = 0; i < 30; i++) {             //j and l both init each time we begin this overall loop
      if (i[*b] > 47) {                        //Did we read a zero?
        if(b[7][i]++) exit(1);                 //If the snake already had a zero in this column, fail out
        memset(b[j+1] + i-1, l = 1, 3);        //Expect them on the next row in the columns left and right of this one (also set l)
      } else if (!b[7][i] & b[j][i]) exit(1);  //If we didn't read a zero, and we had reason to expect one this row, and there wasn't already a zero in this column, fail out
    }
    k+=!!l;                                    //Adds 1 to k iff l is nonzero 
  } if (k < 5) exit(1);                        //If less than 5 rows had zeroes in them, fail out
  for(i = l = 0 ; i < 30; i++) {               //l isn't relevant in this loop but saves some bytes when sharing a macro with the other horizontal loop
    if(!b[7][i]) exit(1);                      //If any columns didn't have zeroes, fail out
  }                                            //Else, snake is valid. main default returns 0.
}

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 kiw lnim można sparować lub zastąpić mniejszą liczbą bajtów kodu.

Podziękowania dla użytkownika202729 za ok. 26 bajtów zapisanych.

SevenStarConstellation
źródło
Możesz pominąć spację między #define Fi )dla -1 bajtu.
user202729,
Ponadto, ponieważ dane wejściowe mają tylko \n(10), <space>(32) i 0(48), możesz to sprawdzić za ==48pomocą >47(-1 bajtu). / Możesz usunąć ={0}inicjalizację, bjeśli zmienna jest globalna. Podobnie uczyń parametr kglobalny i parametr i(bez typu -> int) parametru main(zamiast argcktórego 1).
user202729,
Dziękuję Ci! Edytowane zanim zobaczyłem te ostatnie sugestie; Będę zaznaczyć moją drogę przez nich (czyli ijak argcto 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.
SevenStarConstellation
Postanowiłem zrobić k, ji lwszystkie globale, aby zaoszczędzić na osobnych intdeklaracjach, a potem zdałem sobie sprawę, że wartości domyślne pozwolą mi całkowicie zrezygnować z tego typu. Dzięki jeszcze raz!
SevenStarConstellation
1

MATL , 18 17 bajtów

32>&fun30=wd|2<vA

Dane wejściowe to tablica znaków 2D. Dla węża można użyć dowolnej spacji.

Wypróbuj online!

Wyjaśnienie

32>      % Implicit input. Transform non-space into 1, space into 0
&f       % Push vector of row indices and vector of column indices of nonzeros
u        % Unique: vector of deduplicated entries
n        % Length
30=      % Does it equal 30? (*)
w        % Swap. Moves vector of row indices to top
d|       % Absolute consecutive differences
2<       % Is each value less than 2? (**)
v        % Concatenate results (*) and (**) vertically
A        % All: true if all entries are nonzero. Implicit display
Luis Mendo
źródło
1
Specyfikacja wskazuje, że długość linii wynosząca 30 jest gwarantowana, więc myślę, że możesz zaoszczędzić kilka.
Jonathan Allan
@JonathanAllan Thanks! Używam 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 jak
Luis Mendo
1

Galareta , 19 bajtów

Zn⁶T€L€=1$$;FIỊ$$$Ạ

Wypróbuj online!

-2 bajty dzięki Mr. Xcoder

Wyjaśnienie

Zn⁶T€L€=1$$;FIỊ$$$Ạ  Main Link
Z                    Transpose the matrix of characters
                         (string -> list of chars in Jelly)
 n⁶                  != " " (vectorizing)
   T€                For each column, get (row) indices of snake parts
     L€=1$$          For each index list, is its length 1? (that is, exactly one snake part per column)
           ;     $   Append (helper part)
            FIỊ$$    helper part:
            F        flatten index list
             I       get increments/forward differences
              Ị      are the values insignificant? (|z| <= 1)
                  Ạ  Are these all true?

Dane wejściowe są w postaci listy ciągów

HyperNeutrino
źródło
@ Mr.Xcoder Huh nie powiodło się, problemy z reprezentacją ciągu galaretki lol. naprawione przez odznaczenie 1 bajtu
HyperNeutrino
1

Galaretka , (14? *) 13 bajtów

Zn⁶T€z-IỊ0-¦Ȧ

Łą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. 0S), 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?

Zn⁶T€z-IỊ0-¦Ȧ - Link: list of lists of characters, Lines
Z             - transpose the lines -> columns
  ⁶           - literal space character
 n            - not equal? -> 0 where there were spaces and 1 where there were "0"s
   T€         - truthy indices for each -> e.g. [0,0,1,0,0] -> [3] or [0,1,1,0,0] -> [2,3]
              -                           note: [0,0,0,0,0] -> []
      -       - literal minus one
     z        - transpose with filler (-1) -> {valid: a single list of heights {top:1,...,bottom:5}
              -                              invalid: list of >1 lists, some of which contain -1
              -                                       ...OR an empty list (no 0s in the input at all)}
       I      - differences -> {up:-1; down:1; flat:0; invalid:-6,-5,...,-2,2,...4}
        Ị     - insignificant (abs(z)<=1) -? {up/down/flat:1; invalid:0}
           ¦  - sparse application///
         0    - ...action: literal zero
          -   - ...to indices: [-1] -> make penultimate list into a zero (when one exists)
            Ȧ - any & all -> when flattened:{empty or contains a 0:0; otherwise:1}
Jonathan Allan
źródło
Ach, myślałem, że wypróbowałem wszystkie skrzynie, dzięki za heads-up; będę musiał się później zająć.
Jonathan Allan
@LuisMendo heh i naprawiam, że uratowałem trzy, więc jeszcze raz dziękuję!
Jonathan Allan
... ale wprowadziłem inny. Naprawiono na kolejne 3 :(
Jonathan Allan
Niezła liczba bajtów :-)
Luis Mendo
1

Stax , 20 bajtów CP437

Å┴m▐◘5)ît╢V¼≥+╝╜►º½ê

24 bajty po rozpakowaniu,

LM{'0|Ic%vChm:-{Jh!f%29=

Uruchom i debuguj online!

Może nie jest najlepszy w golfa, ale myślę, że metoda jest nowatorska i interesująca.

Wyjaśnienie

LM                          Load the input string as a 2d array of characters, and transpose it

  {         m               Map array with block
   '0|I                     Get all indices of substring "0"
       c%vC                 Map to nothing if the indices are not unique
           h                Otherwise map to the unique index

             :-             Take pairwise difference

               {   f        Filter array with block
                Jh!         Only keep 0, 1 and -1

                    %29=    Check whether the final array has exactly 29 elements
Weijun Zhou
źródło
1

J , 38, 37 30 bajtów

-8 bajtów dzięki FrownyFrog

[:($e.~[:(-:*)2-/\])@:I.'0'=|:

Wypróbuj online!

Galen Iwanow
źródło
1
A może [:(-:*)2-/\sprawdzisz, czy wszystkie różnice wynoszą -1, 0 lub 1.
FrownyFrog
@FrownyFrog Tak, to dużo lepsze! Dziękuję Ci!
Galen Iwanow
@ FrownyFrog Hmm, nie zdawałem sobie z tego sprawy. Spróbuję to naprawić. Dziękuję za zwrócenie na to uwagi.
Galen Iwanow
1
[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog
1
Och, to też działa[:($e.~[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog,
1

Galaretka , 16 bajtów

Zµi€”0IỊ;ċ€⁶=4ƊẠ

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

Zµi€”0IỊ;ċ€⁶=4ƊẠ | Monadic full program.
Z                | Transpose.
 µ               | Start a new monadic chain.
  i€”0           | Retrieve the first index of 0 in each column.
      IỊ         | Check whether their increments are insignificant (element-wise).
        ;     Ɗ  | Append the result of the following:
         ċ€⁶     | In each list of characters, count the occurrences of a space.
            =4   | Check whether they equal 4 (returns a boolean array).
               Ạ | All. Check whether all the elements are truthy.
Pan Xcoder
źródło
0

Python 2 , 141 bajtów

lambda g:(lambda a:all(map(len,a)+[-2<x-y<2 for b in[sum(a,[])]for x,y in zip(b,b[1:])]))([[i for i in range(5)if"0"==r[i]]for r in zip(*g)])

Wypróbuj online!

Dane wejściowe to siatka znaków.

HyperNeutrino
źródło
0

Python 2 i Python 3 , 122 120 119 bajtów

lambda s:s.count('0')<31and all(s[i-31*(i>30):31*(i<124)-~i:31].strip(' ')for i,x in enumerate(s,1)if' '<x)and' '<s[62]

Wypróbuj online!

Format wejściowy to jeden ciąg długości 154 (5 x 30 znaków, 4 znaki nowej linii):

'''
            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   '''[1:] # to exclude starting newline

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 , 124 123 bajty

lambda s:s.count('0')<31and all(s[i-31*(i>30):31*(i<124)-~i:31].strip(' ')for i,x in enumerate(s,1)if' '<x)and'0'in s[::31]

Wypróbuj online!


Edytować:

  • Zmniejszono 2 bajty poprzez zmianę równości (== ) na nierówności dla każdego kodu.
  • Znaleziono błędy w mniej ograniczającej wersji i poprawiłem ją. (Na szczęście nie jest to zbyt straszne, więc mogłem zachować wszystkie wersje o podobnej długości.) Możesz zobaczyć dodatkowe przypadki testowe w dwóch ostatnich linkach TIO.
  • Znaleziono zwisający bajt w rozwiązaniach Py2, dzięki czemu all()sztuczka nie ma znaczenia w Py3, więc połączyła obie wersje.
Bubbler
źródło
0

Excel (VBA), 68 bajtów

Używanie natychmiastowego okna Cell[A6]jako danych wyjściowych.

[A1:AD5]="=CHOOSE(ROUND(RAND()+1,),0,"""")":[A6]="=COUNT(A1:AD5)=30"
remoel
źródło
0

Grime , 30 26 23 bajtów

Dziękujemy Zgarbowi za uratowanie 7 bajtów i wskazanie błędu.

e`" 0/0 "oO|#29ddv&d#1+

Wypróbuj online!

Martin Ender
źródło
0

Ruby , 93 bajty

->x{x.transpose.map{|x|x.count(?0)<2&&x.index(?0)}.each_cons(2).all?{|x,y|x&&y&&(x-y).abs<2}}

Wypróbuj online!

Unihedron
źródło
0

JavaScript (Node.js) , 128 126 bajtów

Edytowane po wyjaśnieniu danych wejściowych, stwierdzając, że dane wejściowe to „ciąg znaków”.

F=(a,l=29,r=0,t=/^( *)0 *$/.exec(a.split`
`.map(p=>p[l]).join``),q=t&&~t[1].length)=>q&&(s=q-(r=r||q))>-2&s<2?l?F(a,l-1,q):1:0

Wypróbuj online!

Shieru Asakoto
źródło
0

Python 3 , 197 185 bajtów

W wierszu polecenia do verify.py<snake.txtlub w bash do cat snake.txt | python verify.py. Gdzie snake.txtjest 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.

import sys
s=sys.stdin.read().split("\n")
x=0
exec('t,y="",0\nwhile y<5:t+=s[y][x];y+=1\ns+=[t];x+=1;'*30)
s=list(map(lambda l:len(l.rstrip()),s))
while y<35:"ee"[abs(s[y]-s[y+1])];y+=2
MustacheMoses
źródło
Och, nie zauważyłem, że moje wyniki muszą być albo prawdziwe, albo fałszywe. Czy zwracany kod błędu się liczy?
MustacheMoses
Gra w golfa 12 bajtów.
MustacheMoses