Verifica mi lasaña

15

Guión

A menudo cocino lasaña, pero también tengo algunos errores. Como repito estas fallas tan a menudo, pensé que tal vez podría hacer un programa que verifique si hice todo bien.

Lasaña válida

Una lasaña válida es

  • Al menos 5 columnas de ancho
  • Al menos 4 capas de altura
    • Excluyendo queso extra
  • La capa superior es queso (representada por , )
  • La segunda capa es salsa (representada por @o #)
  • Después de eso, las capas se alternan (salsa de 1 capa, fideos de 1 capa (representados por uno ~o -))
  • Cada columna puede tener una o dos capas de queso

El programa

Debería

  • tomar una cadena de lasaña como entrada
    • cuerda multilínea
    • conjunto de cadenas
    • la cadena solo contiene los caracteres ,@#~-
    • Rectangular
    • Acolchado con espacios si es necesario
  • Salida ya sea una lasaña válida
    • Cualquier cosa que sea verdad en tu idioma si es válida
    • Nada ni nada que sea falso en tu idioma
  • ser tanto
    • un programa completo
    • Una función
    • que solo utiliza la funcionalidad que se implementó antes del 14.12.2016

Casos de prueba

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

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

Criterios ganadores

los

la sumisión gana.

Roman Gräf
fuente
13
Por favor cierra ese paréntesis.
Quentin
Pregunta: ¿Tiene que ser horizontalmente rectangular? es decir, ¿qué pasa si tiene 10 filas de alto y 9 columnas de ancho?
Ruslan
La especificación dice que solo puede ,@#~-con la excepción de espacios como relleno, pero el primer caso de prueba contiene espacios en el medio de una línea.
feersum
@feersum "Relleno de espacios si es necesario"
UKMonkey

Respuestas:

11

Retina , 38 34 bytes

Gracias a Grimy por guardar 4 bytes.

Toma una expresión regular con tu lasaña.

El recuento de bytes asume la codificación ISO 8859-1.

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

Asume que la entrada termina con un salto de línea final. Impresiones 1(partido) para lasañas válidas y0 (no coincide) para las inválidas.

Pruébalo en línea!

Explicación

Esta es solo una expresión regular .NET estándar combinada con la entrada, excepto que Retina proporciona el alias para avances de línea o \n.

Como se garantiza que la entrada será rectangular, solo necesitamos verificar el ancho de la lasaña en una de las filas.

^           # 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
fuente
Si se nos permite suponer que hay un salto de línea final después de la última línea (lo cual suena razonable), puede usar en ¶[-~]*lugar de (¶[-~]+|$)guardar 4 bytes.
Grimmy
@ Grimy Ah buena captura, gracias!
Martin Ender
5

Grime , 43 bytes

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

Pruébalo en línea! Imprime 1por partido y 0sin partido.

Explicación

Grime está diseñado para combinar patrones bidimensionales, que se construyen pieza por pieza a partir de patrones más pequeños. Primero defino la capa superior opcional, luego las otras capas repitiendo una franja vertical.

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
fuente