Überprüfen Sie meine Lasagne

15

Szenario

Ich koche oft Lasagne, habe aber auch ein paar Fehler. Da ich diese Fehler so oft wiederhole, dachte ich, ich könnte vielleicht ein Programm machen, das prüft, ob ich alles richtig gemacht habe.

Gültige Lasagne

Eine gültige Lasagne ist

  • Mindestens 5 Spalten breit
  • Mindestens 4 Lagen hoch
    • Ohne zusätzlichen Käse
  • Die oberste Schicht ist Käse (dargestellt durch ,)
  • Die zweite Schicht ist Sauce (dargestellt durch entweder @oder #)
  • Danach wechseln sich die Schichten ab (1 Schicht Sauce, 1 Schicht Nudeln (dargestellt durch entweder ~oder -))
  • Jede Säule kann entweder eine oder zwei Käseschichten haben

Das Programm

Sollte

  • Nehmen Sie eine Lasagne-Zeichenfolge als Eingabe
    • mehrzeilige Zeichenfolge
    • String-Array
    • Die Zeichenfolge enthält nur die Zeichen ,@#~-
    • Rechteckig
    • Bei Bedarf mit Leerzeichen aufgefüllt
  • Gibt aus, ob es sich um eine gültige Lasagne handelt
    • Alles, was in Ihrer Sprache zutreffend ist, wenn es gültig ist
    • Nichts oder nichts, was in deiner Sprache falsch ist
  • sei entweder
    • ein volles Programm
    • eine Funktion
    • Das nutzt nur Funktionen, die vor dem 14.12.2016 implementiert wurden

Testfälle

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

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

Gewinnkriterien

Das

Einreichung gewinnt.

Roman Gräf
quelle
13
Bitte schließen Sie diese Klammer.
Quentin
Frage: Muss es horizontal rechteckig sein? dh was ist, wenn es 10 Zeilen hoch und 9 Spalten breit ist?
Ruslan
Die Spezifikation besagt, dass dies nur ,@#~-mit Ausnahme von Leerzeichen als Auffüllung möglich ist, der erste Testfall jedoch Leerzeichen in der Mitte einer Zeile enthält.
Feersum
@feersum "Bei Bedarf mit Leerzeichen
aufgefüllt

Antworten:

11

Retina , 38 34 Bytes

Vielen Dank an Grimy für das Speichern von 4 Bytes.

Haben Sie eine Regex mit Ihrer Lasagne.

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Es wird davon ausgegangen, dass die Eingabe mit einem Zeilenumbruch endet. Druck 1(Spiel) für gültig lasagnes und0 (keine Übereinstimmung) für ungültig diejenigen.

Probieren Sie es online!

Erläuterung

Dies ist nur eine reguläre .NET-Regex, die mit der Eingabe übereinstimmt, mit der Ausnahme, dass Retina den Alias für Linefeeds oder liefert \n.

Da die Eingabe garantiert rechteckig ist, müssen wir nur die Breite der Lasagne in einer der Zeilen überprüfen.

^           # 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
quelle
Wenn wir davon ausgehen dürfen, dass es nach der letzten Zeile einen letzten Zeilenumbruch gibt (was vernünftig klingt), können Sie ¶[-~]*stattdessen (¶[-~]+|$)4 Bytes einsparen.
Grimmy
@ Grimy Ah guten Fang, danke!
Martin Ender
5

Schmutz , 43 Bytes

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

Probieren Sie es online! Druckt 1für Übereinstimmung und 0für keine Übereinstimmung.

Erläuterung

Grime wurde entwickelt, um zweidimensionale Muster abzugleichen, die Stück für Stück aus kleineren Mustern aufgebaut werden. Ich definiere zuerst die optionale oberste Ebene und dann die anderen Ebenen, indem ich einen vertikalen Streifen wiederhole.

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
quelle