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
repr
o 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
F
aplana 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 usarL
para poner un cero en la lista cuando la lista está vacía, se usaW
para 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
-n
bandera 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
true
ofalse
en 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-n
bandera.Jalea , 4 bytes
Pruébalo en línea!
Ȧ
produce0
si la entrada está vacía o contiene un0
, de lo contrario es1
.FẠ
produce0
si 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, devuelve0
para cualquier lista no vacía y1
para 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
FreeQ
hace el chequeo en contra0
de nosotros, pero por supuesto volveríaTrue
para 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
.private
declara las dos variables_i
y_r
local 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._this
es el argumento que se pasó con lacall
función_this
puede ser de cualquier tipo, pero aquí asumimos que es una matriz.En el bucle,
o=_this select _i
accede al elemento _i: th de la matriz y lo asigna a variableo
.if (o in [o])
Es un truco para determinar sio
es otra matriz o no. Sio
es un número (o cualquier otra cosa que no sea una matriz),o in [o]
se evaluará atrue
, porque lain
función encuentra un valor que coincideo
con la matriz[o]
. Sio
es una matriz, la expresión producefalse
, porque elin
niega a comparar matrices.Si
o
no 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, sio
es una matriz, asignamos al_r
valor de retorno de la llamada recursiva af
la nueva matrizo
como 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 quef
devuelve la llamada a la función .Ahora que hemos definido
f
(f
no es necesario que esté dentroA
, pero de esta manera podríamos haberlo declarado una variable / función local (realmente no hay diferencia)A
si no quisiéramos guardar algunos bytes), regresemosA
.if (count _this == 0)
comprueba siA
la matriz de entrada está vacía y, si lo está,A
devuelve 0. De lo contrario,f
se llama a la función y su valor de retorno seráA
el 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 +
-p
banderaPruébalo en línea!
/.../
asegura que la matriz no esté vacía (coincidirá con cualquier matriz pero[]
./\b0/
solo coincidirá si hay una0
en la matriz. (esto\b
asegura que0
no 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
0
se detectan siguiendo a,
o[
, a diferencia de un número como20
. La expresiónscanr(:)[]x
genera todos los suficientesl
yc:'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
all
y, 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
g
que indica si Ȧ sería 1 o 0 llamando a una función recursivaa
. Para hacer un adecuadoa
, utilizamos despacho múltiple:La función
all
toma un argumento de función, por lo que estamos llamandoa
a cada elemento de la entrada. Luego simplemente definimos la función para el envío comoBásicamente solo necesitamos
a
pero con un cheque para manejar correctamente[]
.Pruébalo en línea!
fuente
a(x)
og(x)
como en su!x
lugar?Suciedad ,
161411 bytesGracias a Zgarb por guardar 5 bytes.
Pruébalo en línea!
El
e
le dice a Grime que intente hacer coincidir toda la entrada e imprimir0
o1
dependiendo de si eso es posible.El
|!
es efectivamente un operador "ninguno", porquex|!y
es 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 casoP
consta de amboss
y\0
eso 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]]
. Vuelve1
por la verdad,0
por 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!
f
toma la entrada de su flujo como una lista que puede contener otras listas y enteros. Regresa1
sia
es verdad y nada más. La función auxiliarg
comprueba sia
contiene 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
str2num
para 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
-v
indicador 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
01
y similar, ya que la palabra de Dios es que está bien)Entrada original de bash / grep:
Encuentra
0
s en cualquier lugar (usando las verificaciones de límites de palabras\<
y\>
para descartar cosas como10
oa1
), o una coincidencia de cadena completa[]
, luego invierte la coincidencia.Descompostura:
fuente
\<0\|^.]
plus-v
contaría como una solución de 11 bytes.egrep
lugar degrep
guardar un byte adicional; ¡el nombre del idioma no cuenta para el conteo de bytes!)Javascript ES6, 24 caracteres
Funciona con matriz, devoluciones
1
o0
:Prueba:
fuente
!!
(aunque luego debe cambiar&
a&&
). Guarda un byte.&
. En caso de que&&
no!!
se rompa la salida consistente:undefined
para[]
,0
para[0]
y[0,1,2]
yfalse
para 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
1
verdadero. 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
1
para "truthy-under-Ȧ" y0
para 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 si1
sonall
verdaderos,0
si alguno es falso. (Convenientemente,all
regresa1
cuando se le da la lista vacía). De lo contrario, el argumento debe ser un número entero; lo devolvemos tal cual (0
es 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 siX
es un entero o una lista, lo hace(c()X)
, lo que intentacons
(anteponer) la lista vacíaX
. SiX
es una lista, esto da como resultado una lista no vacía, que es verdadera. SiX
es 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
true
ofalse
: si$a
no está vacío,verifique si la
print_r
salida contiene un0
valor.solución de matriz, 83 bytes
la función recursiva devuelve
1
o0
.Descompostura
fuente
strpos(print_r($a,1)," 0")
lugar depreg_match(...)
.print_r
parámetro. ¡Excelente!