Fondo
Inspirado por la interpretación muy conveniente de Octave (y, por extensión, MATL) de las matrices de verdad / falsedad, Jelly obtuvo el átomo Ȧ (Octave- all all ).
Ȧ toma una matriz como entrada y devuelve 1 si la matriz no está vacía y no contiene el número 0 (entero, flotante o complejo) en ninguna parte de la estructura de árbol ; de lo contrario, devuelve 0 .
Por ejemplo, la matriz [[]] es verdadera porque no está vacía y no contiene ceros, pero [[0]] es falsa porque contiene un 0 en el nivel más interno.
Tarea
En el lenguaje de programación que elija, escriba un programa completo o una función que tome una matriz de enteros posiblemente vacía y posiblemente irregular como entrada e imprima o devuelva un valor verdadero o falso que indica si Ȧ devolvería 1 o 0 , respectivamente.
Su presentación debe cumplir con las siguientes reglas.
Los valores verdadero y falso deben ser consistentes para todas las entradas , es decir, todas las matrices para las cuales Ȧ devuelve 1 deben mapearse al mismo valor de verdad, y todas las matrices para las cuales Ȧ devuelve 0 deben mapearse al mismo valor de falsedad.
Dado que los programas completos solo pueden tomar representaciones de cadenas de matrices como entrada, esto está permitido. Sin embargo, debe utilizar la representación canocical de su idioma, tal como lo devuelve
repro similar.En particular, no puede suponer que el primer elemento de la matriz estará precedido por un espacio.
Si (y solo si) su lenguaje no puede representar matrices irregulares de forma nativa, puede tomar una representación en cadena de la entrada, utilizando la sintaxis canónica de cualquier lenguaje de programación preexistente.
Si su idioma tiene varias formas de representar matrices irregulares (por ejemplo, listas y tuplas), solo debe admitir una de ellas.
Si su idioma tiene incorporado un envío válido para este desafío, no puede usarlo en su respuesta . Todos los demás elementos integrados están permitidos.
Se le recomienda que publique respuestas utilizando tanto la manipulación de matrices como la de cadenas, incluso si una es significativamente más corta que la otra.
Se aplican todas las reglas estándar de código de golf .
¡Que gane el código más corto en bytes!
Casos de prueba de verdad
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Casos de prueba de falsa
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]

Object... mi favorito es Haskell, donde no lo es. Tampoco en C, al menos no de una manera que le permita mezclar matrices e ints de forma segura. Ambos lenguajes son perfectamente capaces de matrices irregulares, pero aún no pueden usarlos para este problema.Respuestas:
Jalea, 3 bytes
Faplana la lista de entrada.ṭse agrega a la lista de entrada original como un elemento, que es falso si y solo si está vacío.Ạluego comprueba si algún elemento en la lista aplanada, o la lista original en sí, es falso.(Respuesta original)
Gracias a Dennis por alentar a encontrar una solución que coincida con la suya.
FẠda 0 si la entrada contiene un valor falso a cualquier profundidad, de lo contrario 1. Esto es lo queȦhace, excepto las listas vacías.Ṇda 1 si la entrada es un valor falso, de lo contrario 0. La única lista falsa es la lista vacía.XOR-ing los dos da la respuesta.
Esto tiene el mismo espíritu que Dennis
F;LẠ, pero en lugar de usarLpara poner un cero en la lista cuando la lista está vacía, se usaWpara poner la lista vacía en sí misma (produciendo[[]]), haciendo que contenga un elemento falso.fuente
Retina , 10 bytes
Pruébalo en línea!
Primero eliminamos la entrada si contiene un cero. Intentamos hacer coincidir al menos tres caracteres desde el comienzo de la cadena (para asegurarnos de que la entrada no se haya eliminado en la etapa anterior, o que solo fuera
[]para comenzar).fuente
Rubí,
2524231816 bytesRequiere la
-nbandera en la línea de comando (+1 byte,-e->-ne).Pruébalo en línea!
Este es un programa completo que toma la entrada en formato de matriz canónica de Ruby en STDIN y salidas
trueofalseen STDOUT.Versión de función de 23 bytes :
Este es un proceso que toma un argumento, la matriz a probar.
¡Gracias a Martin Ender por un byte y a Ventero por dos bytes!
fuente
p$_!~/\D0|^..$/(op ! ~/\D0|^..$/, yay espacios en blanco significativos) junto con la-nbandera.Jalea , 4 bytes
Pruébalo en línea!
Ȧproduce0si la entrada está vacía o contiene un0, de lo contrario es1.FẠproduce0si la entrada aplanada contiene un0, dejando solo el caso de borde de una matriz vacía (ya que se garantiza que la entrada sea una matriz).Ṇes una no mónada lógica no vectorizadora y, por lo tanto, devuelve0para cualquier lista no vacía y1para la lista vacía. Como tal, esto simplemente se puede restar del resultado delFẠuso_.fuente
FẠạṆ, ¿verdad?05AB1E ,
98 bytes-1 bytes gracias a Emigna
Explicación:
Pruébalo en línea!
fuente
[[]].Mathematica, 17 bytes
FreeQhace el chequeo en contra0de nosotros, pero por supuesto volveríaTruepara la entrada{}, por lo que debemos verificar ese caso por separado.fuente
APL (Dyalog),
21127 bytesGolfó 5 bytes gracias a Adám utilizando horquillas
Pruébalo en línea!
Este es mi primer intento en Dyalog. ¡Los consejos de golf son bienvenidos!
Explicación
fuente
⍬∘≡es la prueba izquierda (conjunto vacío enlazado a idéntico a), y0∊∊es la prueba derecha (en sí misma una bifurcación; miembro cero de forma enlistada). Poner juntos:⍬∘≡⍱0∊∊. Pruébalo en línea!Lenguaje de script Operation Flashpoint ,
199188 bytesLlamar con:
o con:
Explicación:
En el lenguaje de programación del juego, se puede llamar a cualquier cadena que contenga código. Las llaves
{}indican el principio y el final de una cadena. (Las comillas trabajan también, pero que se complica cuando se anidan.) Por lo tanto,A={...}asigna una cadena a la variableA, y la variable a continuación, se puede llamar como una función con:<argument> call A. Básicamente, cualquier cadena se puede tratar como un bloque de código.Luego, dentro de la "función"
A, definimos otra funciónf.privatedeclara las dos variables_iy_rlocal para funcionarf. El nombre de una variable local tiene que comenzar con un guión bajo.while {} do {}es un bucle, donde la primera cadena (denotada por{}) contiene el código para la condición del bucle y la segunda para el cuerpo del bucle._thises el argumento que se pasó con lacallfunción_thispuede ser de cualquier tipo, pero aquí asumimos que es una matriz.En el bucle,
o=_this select _iaccede al elemento _i: th de la matriz y lo asigna a variableo.if (o in [o])Es un truco para determinar sioes otra matriz o no. Sioes un número (o cualquier otra cosa que no sea una matriz),o in [o]se evaluará atrue, porque lainfunción encuentra un valor que coincideocon la matriz[o]. Sioes una matriz, la expresión producefalse, porque elinniega a comparar matrices.Si
ono es una matriz, verificamos si es igual a cero, y si lo hace, estableceremos la variable_r, que usaremos como valor de retorno, en cero. De lo contrario, sioes una matriz, asignamos al_rvalor de retorno de la llamada recursiva afla nueva matrizocomo argumento.Después del ciclo, al final de la función
f, evaluamos la expresión_r, que produce el valor de_r, y como esta es la última expresión que se evaluará, esto es lo quefdevuelve la llamada a la función .Ahora que hemos definido
f(fno es necesario que esté dentroA, pero de esta manera podríamos haberlo declarado una variable / función local (realmente no hay diferencia)Asi no quisiéramos guardar algunos bytes), regresemosA.if (count _this == 0)comprueba siAla matriz de entrada está vacía y, si lo está,Adevuelve 0. De lo contrario,fse llama a la función y su valor de retorno seráAel valor de retorno.Uno podría notar que parece que faltaría un punto y coma en algunos lugares, pero este no es el caso, porque un punto y coma solo se necesita después de una declaración si otra declaración lo sigue dentro del mismo bloque de código (es decir, cadena).
fuente
Perl 5 , 15 bytes
Ahorró 2 bytes usando la misma técnica que la respuesta Ruby de Doorknob .
14 bytes de código +
-pbanderaPruébalo en línea!
/.../asegura que la matriz no esté vacía (coincidirá con cualquier matriz pero[]./\b0/solo coincidirá si hay una0en la matriz. (esto\basegura que0no sea parte de otro número sino de un número entero).fuente
Haskell , 48 bytes
Pruébalo en línea!
Gracias a Lynn por los casos de prueba y la
x<"[]"truco.La desigualdad externa requiere
(x<"[]")ser Verdadero (lista no vacía) yor[elem c"[,"|c:'0':_<-scanr(:)[]x]Falso (sin ceros).Los caracteres de
0se detectan siguiendo a,o[, a diferencia de un número como20. La expresiónscanr(:)[]xgenera todos los suficienteslyc:'0':_<-captura a aquellos cuyo segundo carácter es'0'. Luego,elem c"[,"comprueba si el primer carácter es,o[.Asumo aquí que las listas de estilo Haskell no tienen espacios, pero si es así
',', solo se pueden reemplazar por' '.Aquí hay un método más directo de 48 bytes, aunque produce
0's1' y 's que no son Truthy / Falsey en Haskell.fuente
Jalea , 4 bytes
Pruébalo en línea!
Cómo funciona
Tenga en cuenta que el átomo Ạ se comporta como el de Python
ally, por lo tanto, es bastante diferente del ban prohibido.fuente
L;FẠ. ¿Quién puede encontrar otro?JavaScript (ES6), 34 bytes
Casos de prueba
Mostrar fragmento de código
fuente
!!a[0]lugar dea.length. (No tiene que preocuparse pora[0]ser cero ya que el resultado debe ser falso en este caso de todos modos.)Julia, 45 bytes
Esto crea una función
gque indica si Ȧ sería 1 o 0 llamando a una función recursivaa. Para hacer un adecuadoa, utilizamos despacho múltiple:La función
alltoma un argumento de función, por lo que estamos llamandoaa cada elemento de la entrada. Luego simplemente definimos la función para el envío comoBásicamente solo necesitamos
apero con un cheque para manejar correctamente[].Pruébalo en línea!
fuente
a(x)og(x)como en su!xlugar?Suciedad ,
161411 bytesGracias a Zgarb por guardar 5 bytes.
Pruébalo en línea!
El
ele dice a Grime que intente hacer coincidir toda la entrada e imprimir0o1dependiendo de si eso es posible.El
|!es efectivamente un operador "ninguno", porquex|!yes la abreviatura de(x|y)!. Por lo tanto, nos aseguramos de que la entrada no contenga un cero precedido por un símbolo ni sea una cadena de solo dos caracteres ([]).Una nota sobre la segunda mitad:
P#coincide con un rectángulo que contiene al menos una coincidencia deP. Sin embargo, en nuestro casoPconsta de ambossy\0eso normalmente requeriría paréntesis:(s\0)#(porque la precedencia de#es demasiado alta). Pero Grime tiene una característica realmente ordenada donde puede modificar la precedencia de los operadores con^yv. Entonces, mediante el usov#, disminuimos#la precedencia para que sea más baja que la de cualquier otro operador (incluida la concatenación), lo que nos permite guardar un byte en los paréntesis.fuente
Pip , 12 bytes
Toma la matriz como un argumento de línea de comandos en la forma repr de Pip, como
[1;[2;3]]. Vuelve1por la verdad,0por falsey.Pruébalo en línea o verifique todos los casos de prueba .Explicación
Respuesta extra, 12 bytes
Aquí hay una función que toma una lista en su lugar:
TIO
fuente
Röda ,
5944 bytesPruébalo en línea!
ftoma la entrada de su flujo como una lista que puede contener otras listas y enteros. Regresa1siaes verdad y nada más. La función auxiliargcomprueba siacontiene ceros.Explicación:
Una solución que utiliza expresiones regulares podría muy probablemente ser más corta.
Esta respuesta podría haber sido más corta si se le permitiera devolver múltiples valores. Esto se ha discutido en una de mis respuestas anteriormente, y se concluyó que está permitido en las reglas predeterminadas devolver diferentes valores de verdad y falsedad para diferentes entradas, pero por alguna razón OP lo prohíbe aquí y allá. :(
fuente
Maravilla , 15 bytes
Uso:
Acoplar la entrada, obtener todas las apariciones de 0, NOT lógico, AND lógico con entrada.
fuente
Haskell , 62 bytes
Pruébalo en línea!
Esta es una función
String -> Bool. Las listas de Haskell son heterogéneas, por lo que no hay una forma integrada de representar listas como[0, [0]].fuente
,``.Python 2 ,
45 3938 bytesPruébalo en línea!
-6 gracias a @BenFrankel
versión anterior, sin convertir la lista a cadena repr, 68 bytes:
fuente
[]. Lo siguiente ahorra 6 bytes y tiene éxito en[]:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)MATLAB, 49 bytes
Como MATLAB (así como Octave) no permite este tipo de matrices anidadas, lo interpretamos como una cadena.
Primero reemplazamos todos los caracteres que no son dígitos con un espacio. Luego, lo usamos
str2numpara convertirlo en una matriz (1D), en la que podemos aplicarall(lo cual está permitido, ya que no resuelve completamente esta tarea por sí mismo).fuente
egrep, 7 + 3 = 10 bytes
+3 bytes para el requerido
-vindicador para invertir el resultado.Grep no tiene ningún concepto de matrices, por lo que utiliza una representación de cadena como se indica en la pregunta. Toma información en una línea desde stdin, regresa a través del código de salida (ignore stdout).
(Ahora usando una versión que no tiene en cuenta
01y similar, ya que la palabra de Dios es que está bien)Entrada original de bash / grep:
Encuentra
0s en cualquier lugar (usando las verificaciones de límites de palabras\<y\>para descartar cosas como10oa1), o una coincidencia de cadena completa[], luego invierte la coincidencia.Descompostura:
fuente
\<0\|^.]plus-vcontaría como una solución de 11 bytes.egreplugar degrepguardar un byte adicional; ¡el nombre del idioma no cuenta para el conteo de bytes!)Javascript ES6, 24 caracteres
Funciona con matriz, devoluciones
1o0:Prueba:
fuente
!!(aunque luego debe cambiar&a&&). Guarda un byte.&. En caso de que&&no!!se rompa la salida consistente:undefinedpara[],0para[0]y[0,1,2]yfalsepara otros.&&es que lo necesitarías si tomas mi primera sugerencia, desde entonces2 & 1 == 0.√ å ı ¥ ® Ï Ø ¿ ,
124 bytesExplicación
Si el resultado necesita ser emitido ...
Solución previa
Había publicado esto antes de darme cuenta de que los idiomas basados en la pila podrían dejar el valor en la pila como una forma de salida
Explicación
fuente
Haskell, 45
Como comentaron Lynn y xnor , Haskell no viene con un tipo de lista heterogéneamente anidada. Pero es fácil agregarlos como un tipo de datos personalizado y dejar que la función opere en ese tipo, y esto es mucho más preferible que operar en cadenas (¡urgh!) .
Para poder escribir tales listas como literales con
[1, [2]]sintaxis, también necesita un tipo de clase fu. Caso de prueba completo:Pruébalo en línea!
fuente
Vim, 23 bytes
Pruébalo en línea!
Emite una cadena vacía para falso o
1verdadero. Esto podría ser más corto si puedo generar una cadena vacía o[]para falso (los cuales son valores falsos en vim).fuente
Apilado , 20 bytes
Pruébalo en línea!
Alternativamente, usando una cadena:
Pruébalo en línea!
fuente
Lithp , 74 bytes
Pruébalo en línea!
Bueno, esto resultó más de lo que esperaba. El
[]caso me hizo tropezar y agregó algunos bytes. Simplemente aplana la lista y hace un doblez sobre ella, y si encuentra un 0, establece el acumulador en 0.fuente
Ruby ,
2422 bytesPruébalo en línea!
Sí, sé que hay una mejor solución en Ruby, pero quería encontrar una que tome la matriz en la entrada en lugar de una cadena.
fuente
tinylisp ,
7064 bytesLa última línea es una función lambda sin nombre que toma una lista y regresa
1para "truthy-under-Ȧ" y0para falsey. Pruébalo en línea!Sin golf
La función auxiliar recursiva
_Ȧhace la mayor parte del trabajo. Si su argumento es una lista, vamosmap_Ȧa sus elementos y regresamos si1sonallverdaderos,0si alguno es falso. (Convenientemente,allregresa1cuando se le da la lista vacía). De lo contrario, el argumento debe ser un número entero; lo devolvemos tal cual (0es falsey y todos los demás enteros son verdaderos en tinylisp).La función principal
Ȧverifica si la lista no está vacía. Si es así, llama_Ȧ; si no, vuelve0.La versión de golf aprovecha un comportamiento indefinido: en lugar de usar
(e(type X)List)para probar siXes un entero o una lista, lo hace(c()X), lo que intentacons(anteponer) la lista vacíaX. SiXes una lista, esto da como resultado una lista no vacía, que es verdadera. SiXes un número entero, tinylisp genera un mensaje de error y devuelve una lista vacía, que es falsey. Como se ignora stderr, este enfoque es válido.fuente
PHP,
6354 bytes9 bytes guardados por @ user63956
toma una matriz como entrada; devuelve
trueofalse: si$ano está vacío,verifique si la
print_rsalida contiene un0valor.solución de matriz, 83 bytes
la función recursiva devuelve
1o0.Descompostura
fuente
strpos(print_r($a,1)," 0")lugar depreg_match(...).print_rparámetro. ¡Excelente!