Vérifier mes lasagnes

15

Scénario

Je cuisine souvent des lasagnes, mais j'ai aussi quelques erreurs. Comme je répète ces défauts si souvent, j'ai pensé que je pourrais peut-être faire un programme qui vérifie si j'ai tout fait correctement.

Lasagne valable

Une lasagne valide est

  • Au moins 5 colonnes de large
  • Au moins 4 couches de haut
    • À l'exclusion du fromage supplémentaire
  • La couche supérieure est le fromage (représenté par ,)
  • La deuxième couche est la sauce (représentée par ou @ou #)
  • Après cela, les couches alternent (1 couche de sauce, 1 couche de nouilles (représentées par l'un ~ou l' autre -))
  • Chaque colonne peut avoir une ou deux couches de fromage

Le programme

Devrait

  • prendre une chaîne de lasagnes en entrée
    • chaîne multiligne
    • tableau de chaînes
    • la chaîne ne contient que les caractères ,@#~-
    • Rectangulaire
    • Rembourré avec des espaces si nécessaire
  • Sortie, que ce soit une lasagne valide
    • Tout ce qui est authentique dans votre langue s'il est valide
    • Rien ou quoi que ce soit qui soit faux dans votre langue
  • être soit
    • un programme complet
    • une fonction
    • qui utilise uniquement des fonctionnalités qui ont été implémentées avant le 14.12.2016

Cas de test

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

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

Critères gagnants

le

  • le plus court
  • fonctionnel

la soumission gagne.

Roman Gräf
la source
13
Veuillez fermer cette parenthèse.
Quentin
Question: Doit-il être horizontalement rectangulaire? c'est-à-dire si elle est de 10 lignes de haut et 9 colonnes de large?
Ruslan
La spécification indique qu'elle ne peut l'être qu'à ,@#~-l'exception des espaces comme remplissage, mais le premier cas de test contient des espaces au milieu d'une ligne.
feersum
@feersum "Rembourré avec des espaces si nécessaire"
UKMonkey

Réponses:

11

Rétine , 38 34 octets

Merci à Grimy d'avoir économisé 4 octets.

Ayez une expression régulière avec vos lasagnes.

Le nombre d'octets suppose un codage ISO 8859-1.

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

Suppose que l'entrée se termine par un saut de ligne de fin. Imprime 1(correspondance) pour les lasagnes valides et 0(aucune correspondance) pour les lasagnes invalides.

Essayez-le en ligne!

Explication

Il s'agit simplement d'une expression régulière .NET standard comparée à l'entrée, sauf que Retina fournit l'alias pour les sauts de ligne ou \n.

L'entrée étant garantie rectangulaire, il suffit de vérifier la largeur des lasagnes sur l'une des rangées.

^           # 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
la source
Si nous sommes autorisés à supposer qu'il y a un saut de ligne final après la dernière ligne (ce qui semble raisonnable), vous pouvez utiliser à la ¶[-~]*place de (¶[-~]+|$), en économisant 4 octets.
Grimmy
@Grimy Ah bonne prise, merci!
Martin Ender
5

Grime , 43 octets

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

Essayez-le en ligne! Imprime 1pour correspondance et 0pour aucune correspondance.

Explication

La crasse est conçue pour faire correspondre des motifs bidimensionnels, qui sont construits pièce par pièce à partir de motifs plus petits. Je définis d'abord la couche supérieure facultative, puis les autres couches en répétant une bande verticale.

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
la source