Memverifikasi ular peliharaan ASCII horizontal

22

Baru-baru ini ada beberapa tantangan ular peliharaan ASCII (mis. Sini )

            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   

Tantangan ini adalah mengambil ular peliharaan horizontal yang dihasilkan secara acak (tinggi lima garis, panjang 30), dan memverifikasi bahwa:

  • Setiap kolom hanya memiliki satu 0
  • Masing 0- masing "terhubung" ke 0sebelum dan sesudahnya (diberi jarak hanya 0 atau 1 baris secara vertikal)

Hasil akhir dapat berupa trueatau 1jika ular itu valid, atau falseatau 0jika ular itu tidak valid

Edit — Klarifikasi

Asumsikan input:

  • Apakah sebuah string
  • Hanya mengandung '', '0', dan '\ n'
  • Memiliki tepat 30 karakter setiap baris
  • Memiliki persis 5 baris

Yaitu memverifikasi apakah ular terhubung, dan bahwa tidak ada karakter liar. Tidak perlu memvalidasi "kanvas" tempat ular itu dicetak.

Mirror318
sumber
4
Hai dan selamat datang di PPCG :) Ini adalah tantangan yang bagus untuk posting pertama, tetapi Anda mungkin ingin menambahkan beberapa test case lagi yang menangkap ular luar biasa. Anda juga mungkin ingin memutuskan apakah ular harus diwakili oleh nol atau dapat berupa karakter apa pun. Di masa depan, harap pertimbangkan menggunakan kotak pasir . Semoga berhasil :)
FryAmTheEggman
5
Apakah ini dianggap sebagai Sengatan? Atau dapatkah input sebagai array 2d?
JSchiff
6
Apakah kami dijamin bahwa input terdiri dari 0 dan spasi? Bahwa setiap baris memiliki panjang 30? Itu ada 5 baris?
xnor
9
Karena ini adalah masalah keputusan, bagaimana kalau truthy/falseybukan true/false?
Jonathan Allan
3
@ JSiff Saya yakin byte ular?
MarioDS

Jawaban:

14

JavaScript (ES2018), 62 54 byte

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

Input adalah string tunggal:

  • tanpa membuntuti baris baru
  • hanya berisi ruang, '0', dan '\ n'
  • 30 karakter setiap baris, 5 baris, total 154 karakter

Bendera sberarti titik yang cocok dengan apa pun (termasuk '\ n'). Fitur ini saat ini didukung oleh Chrome 63+, Opera 50+, Safari 11.1+, berdasarkan tabel kompatibel . Anda dapat menguji fungsi ini dengan browser yang didukung ini. Anda akan mendapatkan pengecualian saat memuat halaman jika browser Anda tidak mendukung fitur ini.

Bagaimana itu bekerja:

  • Tanpa kolom tanpa 0:
    • tidak cocok /( .{30}){4} /
  • Tidak ada dua 0dalam satu kolom:
    • tidak cocok /0.{30}(.{31})*0/
  • Tidak 0tidak terhubung ke tetangganya:
    • tidak cocok /0.{60}(.{31})*0/,/0.{62}(.{31})*0/

Gabungkan semua regex ini, dan Anda akhirnya akan mendapatkan yang ini.

Berkat Martin Ender menunjukkan bahwa melakukan satu !operator dapat menghemat 8 byte.

tsh
sumber
8

SnakeEx , 51 byte

Ini jelas bahasa yang tepat untuk tugas itu. : ^ D

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

Cocokkan seluruh input jika itu adalah ular yang valid; gagal mencocokkan jika tidak. Coba di sini!

Penjelasan

SnakeEx adalah bahasa pencocokan pola 2-D . Suatu program terdiri dari daftar definisi untuk "ular," yang merangkak di sekitar karakter pencocokan input, mengubah arah, dan memunculkan ular lain. Dalam program kami, kami mendefinisikan dua ular, sdan c.

Kami akan mulai dengan ckarena lebih sederhana. Definisinya adalah 0 *$, yang seharusnya cukup mudah dibaca jika Anda tahu regex: match 0, diikuti oleh nol atau lebih banyak ruang, diikuti oleh tepi grid. Tangkapan utama di sini: pencocokan ini dapat dilanjutkan ke segala arah. Kita akan menggunakan cke atas dan ke bawah dari ular, untuk memverifikasi bahwa tidak ada tambahan 0di setiap kolom.

Sekarang untuk ular utama s,. Itu mengambil bentuk (...)%{30}, yang berarti "cocokkan dengan isi kurung 30 kali" - satu kali untuk masing-masing 0ular. Sejauh ini baik. Apa yang ada di dalam tanda kurung?

{c<L>}

Ini memunculkan cular baru , belok kiri 90 derajat. Arahnya relatif terhadap arah sular, sehingga ular baru itu bergerak ke arah atas kotak (ular utama bergerak ke arah kanan). The ccek ular bahwa sel grid saat ini adalah 0dan bahwa setiap sel di atas itu adalah spasi. Jika gagal, seluruh pertandingan gagal. Jika berhasil, kami melanjutkan

{c<R>}

yang melakukan hal yang sama, hanya berbelok ke kanan (menuju bagian bawah kotak).

Perhatikan bahwa spawn ini tidak mempengaruhi posisi pointer pertandingan di ular utama. Mereka agak mirip lookaheads di regex. (Mungkin di sini kita dapat memanggil mereka "lookbesides"?) Jadi setelah memverifikasi bahwa kita menunjuk ke 0dan kolom lainnya hanya berisi spasi, kita harus benar-benar mencocokkan 0:

0

Sekarang pointer pertandingan ada pada karakter di sebelah kanan 0. Kita perlu memeriksa tiga opsi berbeda: sudut ular turun, sudut ular naik, atau ular lurus. Untuk ini, kita dapat menggunakan ekspresi ATAU:

[...]

Di dalam OR kami, kami memiliki tiga kemungkinan:

(<R> <L>)

Belok kanan, cocok dengan spasi, dan belok kiri lagi (sudut ular turun).

(<L> <R>)

Belok kiri, cocokkan spasi, dan belok kanan lagi (sudut ular naik).

_?

Cocokkan dengan nol atau satu garis bawah. Karena tidak ada garis bawah pada input, ini akan selalu menjadi pertandingan kosong (ular lurus).

Setelah mencocokkan salah satu dari tiga opsi di atas, pointer pencocokan harus menunjuk ke 0dalam kolom berikutnya, siap untuk mencocokkan lagi dengan tanda kurung.

DLosc
sumber
2

CJam , 35 34 byte

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

Cobalah online! Input adalah array array karakter persegi panjang. Asumsikan input hanya berisi dan 0.

Penjelasan:

{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.
Buah Esolanging
sumber
2

05AB1E , 18 byte

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

Cobalah online!

Penjelasan

ζ                    # 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
sumber
2

Sekam , 12 byte

Bergantung pada klarifikasi aturan, mungkin 11 byte atau 13 byte .

±Λ=;1Ẋ×≈mηfT

Cobalah online!

Input adalah daftar baris yang hanya berisi spasi dan 0s; jika satu string diperlukan, tambahkan dulu ke program untuk dipecah menjadi beberapa baris. TIO Link sudah melakukan ini untuk kejelasan. Output adalah 0 atau 1; jika ada nilai-nilai palsu dan kebenaran baik-baik saja, itu ±bisa dihilangkan.

Penjelasan

±Λ=;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.

Idenya adalah untuk menggunakan ×≈untuk menjamin bahwa (a) semua kolom mengandung tepat satu 0, dan (b) posisi mereka berbeda paling banyak satu. Sebagai contoh, perhatikan input 8-kolom

0  0  0 
 000 0  
  00   0

Pertama, mηfTmengubahnya menjadi daftar daftar indeks

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

Lalu Ẋ×≈berikan

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

Masing 1- masing sesuai dengan sepasang indeks yang berbeda paling banyak 1, dan masing 0- masing sesuai dengan pasangan yang tidak. Setiap hasil sama dengan [1]tepat ketika kedua daftar memiliki satu indeks, dan indeks berbeda paling banyak 1.

Zgarb
sumber
2

Python 2 , 71 byte

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

Cobalah online!

Mengambil input sebagai string multiline. Test case dari Bubbler .

Kolom pertama diekstraksi sebagai s[::31]dan yang kedua sebagai s[1::31], dan mereka diperiksa validitasnya. Kami berulang smenghapus karakter pertama, menyebabkan pasangan kolom berturut-turut diperiksa.

Cek untuk dua kolom menggunakan perbandingan rantai Python untuk inmenggabungkan beberapa pemeriksaan:

  • '0'in s[::31] memeriksa apakah kolom pertama memiliki paling tidak satu 0
  • s[::31]in' %s '%s[1::31]memeriksa apakah kolom pertama adalah substring dari sandwich kolom kedua di antara dua spasi, yang memastikan posisi 0telah bergeser paling banyak satu ruang
  • ' %s '%s[1::31]in'%6s'%0*2memeriksa apakah kolom kedua berisi paling banyak satu 0.

Penutupan *f(s[1:])juga memaksa kasus rekursif menjadi benar.

Tidak
sumber
Sekarang saya berpikir tentang hal itu, Python adalah bahasa yang luar biasa untuk tantangan "ular" ini. : P
MustacheMoses
2

C (gcc) ,246 245 232 215 212 byte

#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}

Cobalah online!

Saya pikir saya akan menggunakan bahasa favorit saya untuk ini (meskipun seperti yang saya lihat dari banyak entri lain yang lebih kecil, mungkin jauh dari ideal untuk tantangan semacam ini) dan C apa yang bisa saya kelola. Pendekatan program terhadap masalah ini relatif mudah, hanya dengan banyak byte penny-pinching; ia mengambil ular pada stdin dan memberikan hasilnya dalam nilai pengembalian main (dengan demikian kode keluar;seperti yang diminta dalam masalah 0 menunjukkan ular tidak valid dan 1 valid meskipun untuk kode keluar itu anehsebagai tipikal untuk kode keluar 0 adalah ular yang valid dan 1 adalah ular yang tidak valid). Dengan makro yang diperluas dan beberapa ruang kosong yang bagus, tampilannya lebih mirip sebagai berikut:

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.
}

Baris input dibaca ke baris pertama buffer, lima berikutnya untuk melacak tempat yang diharapkan (baca: harus) memiliki nol di baris setelah setiap baris saat ini, dan yang terakhir adalah untuk melacak apakah nol telah memiliki telah dibaca di kolom yang diberikan, di setiap baris. Program memproses setiap baris secara bergantian.

Ini sama sekali tidak kuat ( gets()hanya permulaan) dan input harus berisi semua ruang yang relevan (tidak ada spasi spasi kiri misalnya), dan gcc memuntahkan peringatan dan catatan tentang fungsionalitas stdlib kiri secara implisit dinyatakan dan seterusnya, tetapi, C la vie.

Ini juga mengasumsikan bahwa kepala ular tidak harus berada di baris tengah, dan bahwa ular yang valid harus memiliki setidaknya satu nol di setiap baris (yaitu tidak ada baris semua spasi di 5 baris input). Jika yang terakhir itu bukan persyaratan, itu bisa dibuat sedikit lebih pendek - semuanya harus dilakukan kdan ldalam program ini dapat dihapus atau diganti dengan lebih sedikit byte kode dalam kasus itu.

Terima kasih kepada user202729 untuk kira-kira. 26 byte disimpan.

SevenStarConstellation
sumber
Anda dapat meninggalkan ruang antara #define Fdan )untuk -1 byte.
user202729
Juga, karena input hanya memiliki \n(10), <space>(32) dan 0(48) Anda dapat memeriksa ==48dengan >47(-1 byte). / Anda dapat menghapus ={0}kapan menginisialisasi bjika variabel global. Demikian pula membuat kglobal dan i(untyped -> int) parameter main(di tempat argcyang mana 1).
user202729
Terima kasih! Diedit sebelum saya melihat saran yang terakhir; Saya akan menandai jalan saya melalui mereka ( iseperti argcjenius). Draf pertama ini lebih dari 400 byte; Butuh waktu cukup lama hanya untuk menyeretnya ke tujuan pribadi saya 300 dan kemudian 256 sehingga mungkin ada lebih banyak cara untuk melangsingkannya yang telah saya lewatkan.
SevenStarConstellation
Memutuskan untuk membuat k,, jdan lsemua global untuk menghemat memiliki intdeklarasi terpisah , kemudian menyadari default akan membiarkan saya pergi dengan meninggalkan jenis sepenuhnya. Terima kasih lagi!
SevenStarConstellation
1

MATL , 18 17 byte

32>&fun30=wd|2<vA

Input adalah array char 2D. Karakter non-spasi dapat digunakan untuk ular.

Cobalah online!

Penjelasan

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
sumber
1
Spesifikasi ini menyiratkan panjang garis yang dijamin 30, jadi saya pikir Anda bisa menghemat beberapa.
Jonathan Allan
@Jonathan Allan Terima kasih! Saya menggunakan un30=untuk memeriksa bahwa semua indeks kolom berbeda, dan tidak satu pun dari 30 kolom kosong. Mungkin saya bisa mengujinya lebih langsung, tetapi saya tidak tahu caranya
Luis Mendo
1

Jelly , 19 byte

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

Cobalah online!

-2 byte terima kasih kepada Tn. Xcoder

Penjelasan

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?

Input adalah sebagai daftar string

HyperNeutrino
sumber
@ Mr.Xcoder Huh gagal, masalah representasi string Jelly lol. diperbaiki dengan ungolfing 1 byte
HyperNeutrino
1

Jelly , (14? *) 13 byte

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

Tautan monadik yang mengambil daftar lima string *, masing-masing dengan panjang 30 terdiri dari spasi dan karakter lain (mis. 0S), dan mengembalikan integer (1 jika ular seperti yang didefinisikan, 0 sebaliknya)

* Jika input harus berupa string tunggal (daftar karakter) maka tambahkan a untuk memisahkan string pada umpan baris.

Cobalah online!

Bagaimana?

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
sumber
Ah kupikir aku sudah mencoba semua kasing tepi, terima kasih untuk head-up; harus alamat nanti.
Jonathan Allan
@LuisMendo heh dan dalam memperbaiki itu saya menyimpan tiga, jadi terima kasih lagi!
Jonathan Allan
... eh, tapi saya memperkenalkan yang lain. Diperbaiki untuk 3 lainnya :(
Jonathan Allan
Bukan hitungan byte yang buruk :-)
Luis Mendo
1

Stax , 20 byte CP437

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

24 byte saat dibuka

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

Jalankan dan debug online!

Mungkin bukan yang golf terbaik tapi saya pikir metode ini baru dan menarik.

Penjelasan

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
sumber
1

J , 38, 37 30 byte

-8 Bytes berkat FrownyFrog

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

Cobalah online!

Galen Ivanov
sumber
1
Bagaimana [:(-:*)2-/\, periksa apakah semua perbedaan adalah ,1, 0 atau 1.
FrownyFrog
@FrownyFrog Ya, lebih betet! Terima kasih!
Galen Ivanov
@ FrownyFrog Hmm, saya tidak menyadarinya. Saya akan mencoba memperbaikinya. Terima kasih telah menunjukkannya.
Galen Ivanov
1
[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog
1
Oh, ini juga berfungsi[:($e.~[:(-:*)2-/\])@:I.'0'=|:
FrownyFrog
1

Jelly , 16 byte

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

Cobalah online!

Mengasumsikan bahwa string input akan selalu hanya berisi spasi dan nol saja. Mengambil input sebagai daftar string (masing-masing mewakili garis), dan menghasilkan 1 jika benar, 0 sebaliknya.

Penjelasan

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.
Tuan Xcoder
sumber
0

Python 2 , 141 byte

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)])

Cobalah online!

Input adalah kotak karakter.

HyperNeutrino
sumber
0

Python 2 dan Python 3 , 122 120 119 byte

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]

Cobalah online!

Format input adalah satu string dengan panjang 154 (5 x 30 karakter, 4 baris baru):

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

Jika kepala tidak harus menjadi baris tengah

Persyaratan tengah-baris-kepala berada di tantangan asli, tetapi saya menemukan bahwa itu tidak terjadi di sini (setidaknya tidak disebutkan secara eksplisit).

Python 2 dan Python 3 , 124 123 byte

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]

Cobalah online!


Edit:

  • Mengurangi 2 byte dengan mengubah equals ( ==) menjadi ketidaksetaraan untuk setiap kode.
  • Menemukan kesalahan dalam versi yang tidak terlalu membatasi, dan merevisinya. (Untungnya itu tidak terlalu buruk, jadi saya bisa menjaga panjang semua versi serupa.) Anda dapat melihat kasus uji tambahan di dua tautan TIO terakhir.
  • Menemukan byte yang menggantung dalam solusi Py2, membuat all()trik menjadi tidak berarti di Py3, sehingga menggabungkan kedua versi.
Bubbler
sumber
0

Excel (VBA), 68 byte

Menggunakan Jendela Segera, Cell[A6]sebagai output.

[A1:AD5]="=CHOOSE(ROUND(RAND()+1,),0,"""")":[A6]="=COUNT(A1:AD5)=30"
remoel
sumber
0

Grime , 30 26 23 byte

Terima kasih kepada Zgarb karena telah menyimpan 7 byte dan menunjukkan bug.

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

Cobalah online!

Martin Ender
sumber
0

Ruby , 93 byte

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

Cobalah online!

Unihedron
sumber
0

JavaScript (Node.js) , 128 126 byte

Diedit setelah klarifikasi input yang menyatakan bahwa input adalah "string".

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

Cobalah online!

Shieru Asakoto
sumber
0

Python 3 , 197 185 byte

Pada command prompt do verify.py<snake.txtatau bash do cat snake.txt | python verify.py. Dimanasnake.txt file berisi ular untuk diverifikasi.

Jika ular itu benar, tidak akan ada output. Jika tidak benar, Python akan meningkatkan kesalahan indeks.

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
MoustacheMoses
sumber
Oh, tidak memperhatikan bahwa output saya harus benar atau salah. Apakah kode kesalahan yang dikembalikan penting?
MoustacheMoses
Golf 12 byte.
MoustacheMoses