Uma Janela é um quadrado de arte ASCII com comprimento de lado ímpar de pelo menos 3, com uma borda de caractere único ao redor da borda e traços verticais e horizontais no meio:
#######
# # #
# # #
#######
# # #
# # #
#######
Uma janela do MS é uma janela em que a borda é feita apenas dos caracteres M
e S
. Sua tarefa é escrever um programa (ou função) que pega uma string e gera um valor verdadeiro se a entrada for uma janela MS válida e um valor falsey se não for.
Especificações
- Você pode considerar a entrada como uma sequência separada por nova linha ou uma matriz de sequências representando cada linha.
- A borda de uma janela do MS pode conter uma mistura de caracteres M e S, mas o interior sempre será composto de espaços.
- Você pode optar por detectar apenas janelas com novas linhas à direita, ou apenas janelas sem novas linhas, mas não as duas.
Casos de teste
Verdade:
MMM
MMM
MMM
SMSMS
M M S
SMSMM
S S M
SMSMS
MMMMMMM
M S M
M S M
MSSSSSM
M S M
M S M
MMMMMMM
Falsey:
Hello, World!
MMMM
MSSM
MS M
MMMM
MMSMM
M S.M
sSSSS
M S M
MMSMM
MMMMMMM
M M M
MMMMMMM
M M M
MMMMMMM
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
MMSSMSSMM
M M M
S S S
S S S
MMSSMSSMM
S S S
S S S
M M M
MMSSMSSMM
code-golf
string
ascii-art
decision-problem
Esolanging Fruit
fonte
fonte
Respostas:
Pyke,
3431 bytesExperimente aqui!
fonte
Retina ,
6867 bytesA contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
fonte
Grime ,
3938 bytesAgradecemos ao Zgarb por economizar 1 byte.
Experimente online!
Não tenho certeza se existe uma maneira mais simples de aplicar a proporção quadrada dos componentes individuais da janela do que usar um não terminal recursivo, mas isso parece estar funcionando muito bem.
Explicação
É melhor ler o programa de baixo para cima.
Isso simplesmente define um não-terminal (que você pode considerar uma sub-rotina que corresponde a um retângulo)
W
que corresponde a umM
ou aS
(existe um implícito]
no final da linha).Isso define um não terminal
B
que corresponde a cerca de um quarto da saída, ou seja, um painel de janela com as bordas esquerda e superior. Algo assim:Para garantir que esse painel da janela seja quadrado, definimos
B
recursivamente. É um caractere de janelaW
ouB/W\ * W/\ /*
adiciona uma camada à direita e na parte inferior. Para ver como isso acontece, vamos remover um pouco de açúcar sintático:É o mesmo, porque a concatenação horizontal pode ser escrita um
AB
ou outroA B
, mas o último tem precedência menor do que a concatenação vertical,/
enquanto o primeiro tem maior. O mesmoB/W[ ]*
ocorreB
com um caractere de janela e uma linha de espaços abaixo. E então acrescentamos horizontalmenteW/[ ]/*
um caractere de janela com uma coluna de espaços.Por fim, reunimos esses não-terminais na forma final da janela:
São quatro painéis de janela
B
seguidos por uma linha de caracteres da janela e uma coluna de caracteres da janela. Observe que não fazemos nenhuma afirmação explícita de que os quatro painéis da janela são do mesmo tamanho, mas se não forem, é impossível concatená-los em retângulo.Finalmente
e`
, o início é simplesmente uma configuração que diz ao Grime para verificar se toda a entrada pode ser correspondida por esse padrão (e é impressa0
ou de1
acordo).fonte
JavaScript (ES6),
115113 bytesRecebe a entrada como uma matriz de matrizes de caracteres (adicione 5 bytes para uma matriz de seqüências de caracteres) e retorna
1
ou0
. Após verificar se a altura é ímpar, todas as linhas são verificadas para garantir que a matriz seja quadrada e cada caractere é verificado como sendo um dos caracteres que esperamos nessa posição específica. Editar: salvou 2 bytes graças a @PatrickRoberts.fonte
(...).includes(c)
para~(...).search(c)
salvar 1 byte(...?/ /:/[MS]/).test(c)
salvar 2 bytes em vez de apenas 1.Perl,
124123119959384O script Perl a seguir lê uma janela MS candidata a partir da entrada padrão. Em seguida, ele sai com um status de saída zero, se o candidato for uma janela do MS e com um status de saída diferente de zero, se não for.
Ele funciona gerando duas expressões regulares, uma para as linhas superior, média e inferior e uma para todas as outras linhas e verificando a entrada com elas.
Obrigado, @Dada. E de novo.
fonte
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
no final para evitar o uso duas vezes$.-1
(especialmente desde a primeira vez em que foi($.-1)/2
necessário um parêntese extra), para que o$m
in$m${m}{$.}
não seja um erro. Além disso, acabei de perceber agora, mas os regexs devem estar cercados por^...$
(para que caracteres extras no final ou no início os façam falhar) ou mais curtos: use emne
vez de!~
.ne
vez de!~
(I não deve escrever mensagens quando eu fui acordado por apenas 15 minutos!). Então, você terá que usar^...$
em ambas as expressões regulares.Mathematica, 166 bytes
Função sem nome, tendo uma lista de listas de caracteres como entrada e retorno
True
ouFalse
. Aqui está uma versão menos golfe:A primeira linha define a função
t
, que separa uma lista de comprimentod
em duas partes, a primeira das quais são as primeiras, médias e últimas entradas da lista, e a segunda das demais é o restante. A segunda linha verifica se a entrada é uma matriz quadrada em primeiro lugar. A quarta linha usat
duas vezes, uma vez na entrada em si e uma vez em todas as seqüências de caracteres na entrada, para separar os caracteres que deveriam ser"M"
ou"S"
dos caracteres que deveriam ser espaços; as quinta e sétima linhas verificam se elas realmente são o que deveriam ser.fonte
JavaScript (ES6),
108106 bytesEntrada: matriz de seqüências de caracteres / Saída:
0
ou1
Casos de teste
Mostrar snippet de código
fonte
JavaScript (ES6),
140138141140 bytesSei que essa não é uma contagem de bytes vencedora (embora graças a Patrick Roberts por -3 e percebi que ela gerava falsos positivos para 1 em vez de M / S: +3), mas fiz de uma maneira um pouco diferente, sou novo nisso, e foi divertido ...
Aceita uma matriz de seqüências de caracteres, uma para cada linha e retorna verdadeiro ou falso. Nova linha adicionada para maior clareza (não incluída na contagem de bytes).
Em vez de verificar a entrada contra um padrão generalizado, construo uma janela 'M' do mesmo tamanho, substituo S por M na entrada e comparo as duas.
Ungolfed
Casos de teste
fonte
f=
não precise ser incluída na contagem de bytes, portanto, na verdade, é um envio de 138 bytes.z=-1+s/2|0
porz=(s-3)/2
para salvar 1 bytee.replace(/S/g,'M')==...
come.split`S`.join`M`==...
para salvar outro bytez=-1+s/2|0
existe para retornar um número inteiro positivo para s == 1 e até s, ou seja, a função retorna false sem que Array () a interrompa. Caso contrário, a lógica necessária a tornaria mais longa. Grande dica sobre divisão / associar-se, graçass=1
caso, pois meu regex inválido falha silenciosamente.JavaScript (ES6),
10910710610599 bytesEdit : Uau, Arnauld me salvou 6 bytes mudando
s.split`\n`.length
paras.search`\n`
! Obrigado!Isso
RegExp
utiliza uma única cadeia de linhas múltiplas e constrói uma validação baseada em usando o comprimento da cadeia de entrada. Retornatrue
oufalse
. Assume uma janela válidatemnão tem uma nova linha final.Demo
fonte
r=s.search('\n')
vez desplit / length
?s=>!s.split`S`.join`M`.search([...])
podem ser removidos, sem causar erros de sintaxe.RegExp