Recientemente ha habido un par de desafíos de serpientes mascotas ASCII (por ejemplo, aquí )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Este desafío es tomar una serpiente mascota horizontal generada aleatoriamente (altura de cinco líneas, longitud de 30) y verificar que:
- Cada columna tiene solo uno
0
- Cada uno
0
está "conectado" al0
antes y al después (separados verticalmente por 0 o 1 línea solamente)
El resultado final puede ser true
o 1
si la serpiente es válida, false
o 0
si la serpiente no es válida
Editar — Aclaración
Asumir la entrada:
- Es una cuerda
- Contiene solo '', '0' y '\ n'
- Tiene exactamente 30 caracteres en cada línea.
- Tiene exactamente 5 líneas
Es decir, verificar si la serpiente está conectada y que no hay caracteres extraviados. No es necesario validar el "lienzo" en el que se imprime la serpiente.
code-golf
ascii-art
decision-problem
Espejo318
fuente
fuente
truthy/falsey
lugar de hacerlotrue/false
?Respuestas:
JavaScript (ES2018),
6254 bytesLa entrada es una sola cadena:
Indicador
s
significa que un punto coincide con cualquier cosa (incluyendo '\ n'). Esta característica actualmente es compatible con Chrome 63+, Opera 50+, Safari 11.1+, basada en la tabla de compatibilidad . Puede probar esta función con estos navegadores compatibles. Obtendrá una excepción al cargar la página si su navegador no admite esta función.Cómo funciona:
0
:/( .{30}){4} /
0
s en una columna:/0.{30}(.{31})*0/
0
no se conecta a sus vecinos:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Combina todas estas expresiones regulares, y finalmente obtendrás esta.
Mostrar fragmento de código
Gracias a Martin Ender señalar que hacer un solo
!
operador puede ahorrar 8 bytes.fuente
SnakeEx , 51 bytes
Este es obviamente el lenguaje correcto para la tarea. : ^ D
Coincide con la entrada completa si es una serpiente válida; no coincide si no es así. Pruébalo aquí!
Explicación
SnakeEx es un lenguaje de coincidencia de patrones 2D . Un programa consiste en una lista de definiciones para "serpientes", que se arrastran alrededor de los caracteres coincidentes de entrada, cambian de dirección y generan otras serpientes. En nuestro programa, definimos dos serpientes,
s
yc
.Comenzaremos
c
porque es más simple. Su definición es0 *$
, que debería ser bastante legible si conoce regex: match0
, seguido de cero o más espacios, seguido del borde de la cuadrícula. El problema principal aquí: esta coincidencia puede proceder en cualquier dirección. Vamos a usarc
tanto hacia arriba como hacia abajo desde la serpiente, para verificar que no haya0
s adicionales en cada columna.Ya por la serpiente principal
s
. Toma la forma(...)%{30}
, que significa "hacer coincidir el contenido de los paréntesis 30 veces", una vez para cada uno0
en la serpiente. Hasta aquí todo bien. ¿Qué va dentro de los paréntesis?Esto genera una nueva
c
serpiente, giró a la izquierda 90 grados. La dirección es relativa a las
dirección de la serpiente, por lo que la nueva serpiente se mueve hacia la parte superior de la cuadrícula (la serpiente principal se mueve hacia la derecha). Lac
serpiente comprueba que la celda de la cuadrícula actual es una0
y que cada celda de arriba es un espacio. Si falla, toda la partida falla. Si tiene éxito, continuamos conque hace lo mismo, solo giró a la derecha (hacia la parte inferior de la cuadrícula).
Tenga en cuenta que estos engendros no afectan la posición del puntero de coincidencia en la serpiente principal. Son un poco como lookaheads en regex. (¿Tal vez aquí podríamos llamarlos "lookbesides"?) Entonces, después de verificar que estamos apuntando a a
0
y que el resto de la columna contiene solo espacios, necesitamos hacer coincidir0
:Ahora el puntero de coincidencia está en el carácter a la derecha de
0
. Necesitamos verificar tres opciones diferentes: la serpiente se inclina hacia abajo, la serpiente se inclina hacia arriba o la serpiente se endereza. Para esto, podemos usar una expresión OR:Dentro de nuestro quirófano, tenemos tres posibilidades:
Gire a la derecha, haga coincidir un espacio y gire a la izquierda nuevamente (ángulos de serpiente hacia abajo).
Gire a la izquierda, combine un espacio y gire a la derecha nuevamente (la serpiente se inclina hacia arriba).
Haga coincidir cero o uno con guiones bajos. Como no hay guiones bajos en la entrada, esta siempre será una coincidencia vacía (la serpiente va en línea recta).
Después de hacer coincidir una de las tres opciones anteriores, el puntero de coincidencia debe apuntar a la
0
en la siguiente columna, listo para coincidir nuevamente con la expresión entre paréntesis.fuente
CJam ,
3534 bytesPruébalo en línea! La entrada es una matriz rectangular de matrices de caracteres. Asume que la entrada solo contiene
y
0
.Explicación:
fuente
05AB1E , 18 bytes
Pruébalo en línea!
Explicación
fuente
Cáscara , 12 bytes
Dependiendo de las aclaraciones de las reglas, puede tener 11 bytes o 13 bytes .
Pruébalo en línea!
La entrada es una lista de líneas que contienen solo espacios y ceros; Si se requiere una sola cadena, anteponga
¶
al programa para dividir en líneas. El enlace TIO ya lo hace para mayor claridad. La salida es 0 o 1; Si cualquier valor falso y verdadero está bien, el±
se puede eliminar.Explicación
La idea es usar
×≈
para garantizar que (a) todas las columnas contengan exactamente un 0, y (b) sus posiciones difieran en como máximo uno. Como ejemplo, considere la entrada de 8 columnasPrimero, lo
mηfT
transforma en la lista de listas de índiceLuego
Ẋ×≈
daCada uno
1
corresponde a un par de índices que difieren en a lo sumo 1, y cada uno0
corresponde a un par que no. Cada resultado es[1]
exactamente igual cuando ambas listas tienen un índice, y los índices difieren en a lo sumo 1.fuente
Python 2 , 71 bytes
Pruébalo en línea!
Toma la entrada como una cadena multilínea. Caso de pruebas de Bubbler .
La primera columna se extrae como
s[::31]
y la segunda comos[1::31]
, y se verifica su validez. Recurrimos als
eliminar el primer carácter, haciendo que se verifiquen pares sucesivos de columnas.La verificación de dos columnas utiliza el encadenamiento de comparación de Python para
in
combinar múltiples verificaciones:'0'in s[::31]
comprueba que la primera columna tiene al menos uno0
s[::31]in' %s '%s[1::31]
comprueba que la primera columna es una subcadena de los emparedados de la segunda columna entre dos espacios, lo que garantiza que la posición de la columna0
haya cambiado como máximo un espacio' %s '%s[1::31]in'%6s'%0*2
comprueba que la segunda columna contiene como máximo una0
.El final
*f(s[1:])
también obliga a que el caso recursivo sea verdadero.fuente
C (gcc) ,
246245232215212 bytesPruébalo en línea!
Pensé que tomaría mi lenguaje favorito para esto (aunque, como puedo ver en las muchas otras entradas más pequeñas, probablemente no sea lo ideal para este tipo de desafío) y C lo que podría manejar. El enfoque del programa para el problema es relativamente sencillo, solo que con una gran cantidad de byte. toma la serpiente en stdin y da su resultado en el valor de retorno de main (por lo tanto, el código de salida;
según lo solicitado en el problema 0 indica una serpiente inválida y 1 válido aunque para un código de salida que es extrañocomo es típico para los códigos de salida 0 es una serpiente válida y 1 es una serpiente no válida). Con las macros expandidas y un bonito espacio en blanco, se parece más a lo siguiente:Las líneas de entrada se leen en la primera fila del búfer, las siguientes cinco son para rastrear qué lugares se espera (leer: debe) tener ceros en la fila después de cada uno actual, y la última es para rastrear si un cero ya ha sido leído en una columna dada, en cualquier fila. El programa procesa cada fila a su vez.
No es nada robusto (
gets()
es solo el comienzo) y la entrada debe contener todos los espacios relevantes (sin espacios en blanco finales, por ejemplo), y gcc arroja advertencias y notas sobre la funcionalidad stdlib que se deja implícitamente declarada y así sucesivamente, pero, C la vida.También se supone que la cabeza de la serpiente no necesita estar en la fila central, y que una serpiente válida debe tener al menos un cero en cada fila (es decir, no hay filas de todos los espacios en las 5 filas de entrada). Si este último no es un requisito, se puede acortar un poco; en ese caso , todo lo que tenga que ver con
k
yl
en el programa se puede reducir o reemplazar con menos bytes de código.Gracias al usuario202729 por aprox. 26 bytes guardados.
fuente
#define F
y)
por -1 byte.\n
(10),<space>
(32) y0
(48), puede verificar==48
con>47
(-1 byte). / Puede eliminar={0}
cuando inicialiceb
si la variable es global. Del mismo modo, haga un parámetrok
global yi
un (sin tipo ->int
) demain
(en lugar deargc
cuál es1
).i
comoargc
es genio). Los primeros borradores de este eran más de 400 bytes; Me tomó el tiempo suficiente para arrastrarlo a mis objetivos personales de 300 y luego 256, por lo que es muy posible que haya más formas de reducirlo.k
,j
yl
todos los globales para ahorrar en tenerint
declaraciones separadas , luego me di cuenta de que los valores predeterminados me permitirían dejar el tipo completamente. ¡Gracias de nuevo!MATL ,
1817 bytesLa entrada es una matriz de caracteres 2D. Cualquier personaje no espacial puede ser usado para la serpiente.
Pruébalo en línea!
Explicación
fuente
un30=
para verificar que todos los índices de columna son diferentes, y ninguna de las 30 columnas está vacía. Tal vez pueda probar eso más directamente, pero no veo cómoSlip , 28 bytes
Pruébalo aquí.
fuente
Jalea , 19 bytes
Pruébalo en línea!
-2 bytes gracias al Sr. Xcoder
Explicación
La entrada es como una lista de cadenas
fuente
Jalea , (14? *) 13 bytes
Un enlace monádico que toma una lista de cinco cadenas *, cada una de longitud 30 que consiste en espacios y cualquier otro carácter (p. Ej.
0
S), y devuelve un número entero (1 si una serpiente se define, 0 de lo contrario)* Si la entrada debe ser una sola cadena (lista de caracteres), añada a
Ỵ
para dividir la cadena en los avances de línea.Pruébalo en línea!
¿Cómo?
fuente
Stax , 20 bytes CP437
24 bytes cuando está desempaquetado,
¡Ejecute y depure en línea!
Puede que no sea el mejor golfizado, pero creo que el método es novedoso e interesante.
Explicación
fuente
J ,
38, 3730 bytes-8 bytes gracias a FrownyFrog
Pruébalo en línea!
fuente
[:(-:*)2-/\
, verifique si todas las diferencias son −1, 0 o 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Jalea , 16 bytes
Pruébalo en línea!
Asume que la cadena de entrada siempre contendrá solo espacios y ceros. Toma la entrada como una lista de cadenas (cada una representa una línea) y genera 1 si es verdadero, 0 de lo contrario.
Explicación
fuente
Python 2 , 141 bytes
Pruébalo en línea!
La entrada es una cuadrícula de caracteres.
fuente
Python 2 y Python 3 ,
122120119 bytesPruébalo en línea!
El formato de entrada es una cadena de longitud 154 (5 x 30 caracteres, 4 líneas nuevas):
Si la cabeza no tiene que ser la fila central
El requisito de la cabeza de la fila central estaba en el desafío original, pero descubrí que no es el caso aquí (al menos no se menciona explícitamente).
Python 2 y Python 3 ,
124123 bytesPruébalo en línea!
Editar:
==
) en desigualdades para cada código.all()
truco no tuviera sentido en Py3, por lo que fusionó ambas versiones.fuente
Excel (VBA), 68 bytes
Usando la ventana Inmediato,
Cell[A6]
como salida.fuente
Caracoles , 18 bytes
Pruébalo en línea!
fuente
Grime ,
302623 bytesGracias a Zgarb por guardar 7 bytes y señalar un error.
Pruébalo en línea!
fuente
Rubí , 93 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
128126 bytesEditado después de la aclaración de entrada que indica que la entrada es "una cadena".
Pruébalo en línea!
fuente
Pitón 3 ,
197bytesEn el símbolo del sistema do
verify.py<snake.txt
o en bash docat snake.txt | python verify.py
. Dóndesnake.txt
está un archivo que contiene una serpiente para verificar?Si la serpiente es correcta, no se generará nada. Si no es correcto, Python generará un error de índice.
fuente