Verifique minha lasanha


15

Cenário

Costumo cozinhar lasanha, mas também tenho alguns erros. Como repito essas falhas com tanta frequência, pensei que talvez pudesse fazer um programa que verifica se fiz tudo certo.

Lasanha válida

Uma lasanha válida é

  • Pelo menos 5 colunas de largura
  • Pelo menos 4 camadas de altura
    • Excluindo queijo extra
  • A camada superior é queijo (representada por ,)
  • A segunda camada é molho (representado por um @ou #)
  • Depois disso, as camadas se alternam (molho de 1 camada, macarrão de 1 camada (representado por um ~ou -))
  • Cada coluna pode ter uma ou duas camadas de queijo

O programa

Devemos

  • pegue uma corda de lasanha como entrada
    • sequência multilinha
    • matriz de string
    • a cadeia contém apenas os caracteres ,@#~-
    • Retangular
    • Acolchoado com espaços, se necessário
  • Saída, seja uma lasanha válida
    • Qualquer coisa válida no seu idioma, se válida
    • Nada ou nada que seja falso no seu idioma
  • seja
    • um programa completo
    • uma função
    • que usa apenas a funcionalidade implementada antes de 14.12.2016

Casos de teste

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

--> 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érios de vitória

o

submissão ganha.


13
Por favor, feche esse parêntese.
Quentin

Pergunta: Precisa ser horizontalmente retangular? ou seja, e se tiver 10 linhas de altura e 9 colunas de largura?
Ruslan

A especificação diz que pode apenas ,@#~-com exceção de espaços como preenchimento, mas o primeiro caso de teste contém espaços no meio de uma linha.
feersum

@feersum "Acolchoado com espaços, se necessário"
UKMonkey 15/12/16

Respostas:


11

Retina , 38 34 bytes

Agradecimentos ao Grimy por salvar 4 bytes.

Tenha um regex com sua lasanha.

A contagem de bytes assume a codificação ISO 8859-1.

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

Supõe que a entrada termine com um avanço de linha à direita. Imprime 1(corresponde) a lasanhas válidas e 0(sem correspondência) a inválidas.

Experimente online!

Explicação

Este é apenas um regex .NET padrão correspondente à entrada, exceto que o Retina fornece o alias para feeds de linha ou \n.

Como a entrada é garantida como retangular, precisamos verificar apenas a largura da lasanha em uma das linhas.

^           # 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.

Se for permitido assumir que existe um avanço de linha final após a última linha (o que parece razoável), você pode usar em ¶[-~]*vez de (¶[-~]+|$)salvar 4 bytes.
Grimmy

@ Grimy Ah boa captura, obrigado!
Martin Ender

5

Grime , 43 bytes

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

Experimente online! Imprime 1para correspondência e 0sem correspondência.

Explicação

O Grime foi projetado para combinar padrões bidimensionais, que são construídos peça por peça a partir de padrões menores. Defino primeiro a camada superior opcional, depois as outras camadas, repetindo uma faixa 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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.