Una ventana es un cuadrado de arte ASCII con una longitud lateral impar de al menos 3, con un borde de un solo carácter alrededor del borde, así como trazos verticales y horizontales en el medio:
#######
# # #
# # #
#######
# # #
# # #
#######
Una ventana de MS es una ventana donde el borde está hecho solo de los caracteres M
y S
. Su tarea es escribir un programa (o función) que tome una cadena y genere un valor verdadero si la entrada es una ventana de MS válida, y un valor falso si no lo es.
Presupuesto
- Puede tomar la entrada como una cadena separada por una nueva línea o una matriz de cadenas que representan cada línea.
- El borde de una ventana de MS puede contener una mezcla de caracteres M y S, pero el interior siempre estará compuesto de espacios.
- Puede elegir detectar solo ventanas con nuevas líneas finales, o solo ventanas sin nuevas líneas finales, pero no ambas.
Casos de prueba
Verdad:
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
Fruta Esolanging
fuente
fuente
Respuestas:
Pyke,
3431 bytesPruébalo aquí!
fuente
Retina ,
6867 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
fuente
Grime ,
3938 bytesGracias a Zgarb por guardar 1 byte.
Pruébalo en línea!
No estoy seguro de si hay una forma más simple de aplicar la relación de aspecto cuadrado de los componentes de la ventana individual que usar un terminal no recursivo, pero parece estar funcionando bastante bien.
Explicación
Es mejor leer el programa de abajo hacia arriba.
Esto simplemente define un no terminal (que se puede considerar como una subrutina que coincide con un rectángulo)
W
que coincide con anM
o anS
(hay un implícito]
al final de la línea).Esto define un no terminal
B
que coincide con aproximadamente una cuarta parte de la salida, es decir, un panel de ventana con el borde izquierdo y superior. Algo como esto:Para garantizar que este panel de ventana sea cuadrado, definimos
B
recursivamente. Es un personaje de ventanaW
o es elB/W\ * W/\ /*
que agrega una capa a la derecha y al fondo. Para ver cómo hace esto, eliminemos un poco de azúcar sintáctica:Esto es lo mismo, porque la concatenación horizontal puede escribirse
AB
o bienA B
, pero la última tiene una precedencia menor que la concatenación vertical,/
mientras que la primera tiene mayor. EntoncesB/W[ ]*
es unB
con un carácter de ventana y una fila de espacios a continuación. Y luego agregamos horizontalmenteW/[ ]/*
que es un carácter de ventana con una columna de espacios.Finalmente, ensamblamos estos no terminales en la forma final de la ventana:
Son cuatro paneles de ventana
B
seguidos de una fila de caracteres de ventana y una columna de caracteres de ventana. Tenga en cuenta que no hacemos ninguna afirmación explícita de que los cuatro paneles de ventana son del mismo tamaño, pero si no lo son, es imposible concatenarlos en un rectángulo.Finalmente,
e`
al principio es simplemente una configuración que le dice a Grime que verifique que toda la entrada pueda coincidir con este patrón (e imprime0
o en1
consecuencia).fuente
JavaScript (ES6),
115113 bytesToma la entrada como una matriz de matrices de caracteres (agrega 5 bytes para una matriz de cadenas) y devuelve
1
o0
. Después de verificar que la altura es impar, se verifica cada fila para garantizar que la matriz sea cuadrada, y se verifica que cada carácter sea uno de los caracteres que esperamos en esa posición en particular. Editar: Guardado 2 bytes gracias a @PatrickRoberts.fuente
(...).includes(c)
para~(...).search(c)
guardar 1 byte(...?/ /:/[MS]/).test(c)
para ahorrar 2 bytes en lugar de solo 1.Perl
124123119959384El siguiente script de Perl lee una ventana MS candidata desde la entrada estándar. Luego sale con un estado de salida cero si el candidato es una ventana de MS y con un estado de salida distinto de cero si no lo es.
Funciona generando dos expresiones regulares, una para la línea superior, media e inferior y otra para cada línea, y verificando la entrada contra ellas.
Gracias, @Dada. Y otra vez.
fuente
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
al final para evitar el uso de dos veces$.-1
(sobre todo desde la primera vez que era($.-1)/2
lo que necesitaba un poco de paréntesis extra), por lo que el$m
en$m${m}{$.}
que no es un error. Además, me acabo de dar cuenta ahora, pero las expresiones regulares deben estar rodeadas de^...$
(por lo que el carácter adicional al final o al principio los hace fallar), o más cortos: usar enne
lugar de!~
.ne
lugar de!~
(¡no debería escribir mensajes cuando he estado despierto por solo 15 minutos!). Así que^...$
me temo que tendrás que usar en ambas expresiones regulares.Mathematica, 166 bytes
Función sin nombre que toma una lista de listas de caracteres como entrada y regresa
True
oFalse
. Aquí hay una versión menos golfista:La primera línea define la función
t
, que separa una lista de longitudd
en dos partes, la primera de las cuales es la primera, intermedia y última entrada de la lista, y la segunda es el resto. La segunda línea verifica si la entrada es una matriz cuadrada en primer lugar. La cuarta línea usat
dos veces, una en la entrada en sí y otra en todas * las cadenas en la entrada, para separar los caracteres que se supone que son"M"
o"S"
de los caracteres que se supone que son espacios; luego las líneas quinta y séptima verifican si realmente son lo que se supone que deben ser.fuente
Javascript (ES6),
108106 bytesEntrada: conjunto de cadenas / Salida:
0
o1
Casos de prueba
Mostrar fragmento de código
fuente
JavaScript (ES6),
140138141140 bytesSé que este no es un conteo de bytes ganador (aunque gracias a Patrick Roberts por -3, y me di cuenta de que arrojó falsos positivos para 1 en lugar de M / S: +3), pero lo hice de una manera ligeramente diferente, yo ' Soy nuevo en esto, y fue divertido ...
Acepta una serie de cadenas, una para cada línea y devuelve verdadero o falso. Nueva línea agregada para mayor claridad (no incluida en el recuento de bytes).
En lugar de verificar la entrada contra un patrón generalizado, construyo una ventana 'M' del mismo tamaño, reemplazo S con M en la entrada y comparo las dos.
Sin golf
Casos de prueba
fuente
f=
no es necesario incluirla en el recuento de bytes, por lo que en realidad se trata de un envío de 138 bytes.z=-1+s/2|0
conz=(s-3)/2
para guardar 1 bytee.replace(/S/g,'M')==...
cone.split`S`.join`M`==...
para guardar otro bytez=-1+s/2|0
está ahí para devolver un entero positivo para s == 1 e incluso s, es decir, la función devuelve falso sin que Array () lo bloquee. De lo contrario, la lógica necesaria lo hizo más largo. Gran consejo sobre split / join, graciass=1
caso, ya que mi expresión regular no válida simplemente falla en silencio.JavaScript (ES6),
10910710610599 bytesEditar : Whoa, Arnauld me ahorró 6 bytes al cambiar
s.split`\n`.length
as.search`\n`
! ¡Gracias!Esto toma una sola cadena multilínea y construye una
RegExp
validación basada en la longitud de la cadena de entrada. Devolucionestrue
ofalse
. Asume una ventana válidatieneno tiene un salto de línea final.Manifestación
fuente
r=s.search('\n')
lugar desplit / length
?s=>!s.split`S`.join`M`.search([...])
se pueden eliminar sin causar errores de sintaxis.RegExp