Verifikasi lasagna saya

15

Skenario

Saya sering memasak lasagna, tetapi saya juga memiliki beberapa kesalahan. Karena saya sering mengulangi kesalahan ini, saya pikir saya mungkin bisa melakukan program yang memeriksa jika saya melakukan semuanya dengan benar.

Lasagna yang benar

Lasagna yang valid adalah

  • Lebar minimal 5 kolom
  • Setidaknya 4 lapisan
    • Tidak termasuk keju ekstra
  • Lapisan atas adalah keju (diwakili oleh ,)
  • Lapisan kedua adalah saus (diwakili oleh salah satu @atau #)
  • Setelah itu lapisan-lapisan tersebut berganti (1 lapis saus, 1 lapis mie (diwakili oleh salah satu ~atau -))
  • Setiap kolom dapat memiliki satu atau dua lapis keju

Program

Sebaiknya

  • mengambil string lasagna sebagai input
    • string multiline
    • array string
    • string hanya berisi karakter ,@#~-
    • Persegi panjang
    • Empuk dengan ruang jika perlu
  • Keluarkan apakah itu lasagna yang valid
    • Segala hal yang dahsyat dalam bahasa Anda jika valid
    • Tidak ada atau apa pun yang salah dalam bahasa Anda
  • menjadi baik
    • program lengkap
    • sebuah fungsi
    • yang hanya menggunakan fungsionalitas yang diterapkan sebelum 14/12/2016

Uji kasus

,, ,
,,,,,,
@@@###
~~~~~-
@##@@#

--> truthy


@@@#
----
@@##
----
@###

--> falsy (cause of cheese and width (You don't have to print the stuff in the brackets))


,,,,,
-----
@####
-----
@@@@@

--> falsy (have the sauce as last layer)

Kriteria menang

Itu

pengiriman menang.

Roman Gräf
sumber
13
Harap tutup tanda kurung itu.
Quentin
Pertanyaan: Apakah harus persegi panjang horizontal? yaitu bagaimana jika tingginya 10 baris dan lebar 9 kolom?
Ruslan
Spec mengatakan hanya bisa ,@#~-dengan pengecualian spasi sebagai padding, tetapi test case pertama berisi spasi di tengah garis.
feersum
@feersum "Padded dengan spasi jika perlu"
UKMonkey

Jawaban:

11

Retina , 38 34 byte

Terima kasih kepada Grimy karena telah menghemat 4 byte.

Miliki regex dengan lasagna Anda.

Hitungan byte mengasumsikan penyandian ISO 8859-1.

^([, ]+¶)?,{5,}(¶[@#]+¶[-~]*){2,}$

Diasumsikan bahwa input diakhiri dengan linefeed tambahan. Mencetak 1(cocok) untuk lasagn yang valid dan 0(tidak cocok) untuk lasagn yang tidak valid.

Cobalah online!

Penjelasan

Ini hanya sebuah standar .NET regex yang cocok dengan input, kecuali bahwa Retina menyediakan alias untuk linefeeds atau \n.

Karena input dijamin persegi panjang, kita hanya perlu memeriksa lebar lasagna di salah satu baris.

^           # Anchor the regex to the beginning of the input.
([, ]+¶)?   # Match an optional first line of only commas an spaces.
,{5,}       # Match at least 5 commas.
(           # Match this at least twice to ensure at least two layers of sauce.
  ¶[@#]+    #   Match a line of sauce.
  ¶[-~]*    #   Match a line of pasta. This line may be empty (which would
            #   indicate the end of the input.
){2,}
$           # Make sure we've indeed reached the end. Note that `$` can
            # match either at the very end of the input, or in front of
            # the trailing linefeed.
Martin Ender
sumber
Jika kami boleh berasumsi bahwa ada umpan baris terakhir setelah baris terakhir (yang terdengar masuk akal), Anda dapat menggunakan ¶[-~]*alih-alih (¶[-~]+|$), menghemat 4 byte.
Grimmy
@Grimy Ah tangkapan yang bagus, terima kasih!
Martin Ender
5

Grime , 43 byte

e`[ \,]+/?/(\,/[#@]^/[\-~]/+/[#@]/?)+{5-,4-

Cobalah online! Mencetak 1untuk pertandingan dan 0tanpa pertandingan.

Penjelasan

Grime dirancang untuk mencocokkan pola dua dimensi, yang dibangun sepotong demi sepotong dari pola yang lebih kecil. Saya mendefinisikan lapisan atas opsional pertama, kemudian lapisan lainnya dengan mengulangi garis vertikal.

e`                                           Match entire input against pattern:
        /?                                   Optionally
  [ \,]+                                     a row of spaces and commas,
          /                                  below that
           (                       )         this pattern
                                    +        repeated horizontally
                                     {5-,4-  having size at least 5x4. 
                                             The brace is closed implicitly.
                                             "This pattern" is a vertical stripe containing
            \,                               a comma,
              /                              below that
               [#@]^/[\-~]                   a sauce character on top of a noodle character
                                             (the ^/ is like / but with higher precedence)
                          /+                 repeated vertically,
                            /                below that
                                 /?          optionally
                             [#@]            a sauce character.
Zgarb
sumber