Determinar si una matriz contiene algo distinto de 2

20

Tome una matriz que consta de números o matrices, salida si solo contiene 2s.

La salida debe ser un valor verdadero o falso (lo siento si esto destruye las respuestas)

Casos de prueba de la verdad

[2]
[2,2]
[[2],[2,2],2]
[]
[[],[]]

Casos de prueba de Falsey

[1]
[22]
[2,2,2,1]
[[1,2],2]

Las lagunas estándar están prohibidas.

Se aplican las reglas IO predeterminadas .

Code-golf, Fewest bytes gana!

Un taco
fuente
¿Podemos tomar una cadena que represente la matriz?
Wheat Wizard
¿Habrá objetos que no sean números y otras matrices en las matrices
Asistente de trigo
Solo habrá matrices y números, y una cadena que representa la matriz está bien.
ATaco
2
¿Qué tipo de números? Compex int, compex float, float int, int, no negativo?
RosLuP
1
FTR y en nombre del pensamiento matemático adecuado: la matriz [[2]]no no contiene un dos.
dejó de girar en contra

Respuestas:

8

MATL , 3 bytes

2=p

Pruébalo en línea!

Técnicamente, esto podría ser

2=

Dado que una matriz que contiene elementos cero es falsa, pero esto parece barato.

DJMcMayhem
fuente
¿Una lista que contiene 0 es falsa? Oh hombre.
Erik the Outgolfer
No creo que la versión de 2 bytes sea válida, ya que en los comentarios ATaco dijo que un par de salida único es válido.
Erik the Outgolfer
Creo que 2=falla para matrices vacías, o?
Stewie Griffin
@stewiegriffin Parece un caso marginal extraño que hay que manejar, pero convenientemente funciona: ¡ Pruébelo en línea!
DJMcMayhem
Si, 2=pfunciona bien. La versión más corta al final, 2=no. Además, "los casos extremos extraños" son dos de los casos de prueba. :-)
Stewie Griffin
15

Python 2 , 43 40 bytes

f=lambda l:l>=[]and all(map(f,l))or l==2

Pruébalo en línea!


Al momento de publicar esta respuesta, todavía se permitía que este meta consenso llegara a través de lanzar un error / no arrojar un error. Por lo tanto, esta respuesta a 26 bytes era válida:

f=lambda l:l==2or map(f,l)

Pruébalo en línea!

ovs
fuente
1
Esa es una buena manera de verificar si un elemento es una lista.
Adnan
Por eso no me gusta ese consenso. Realmente arruina el golf de pitón.
Wheat Wizard
Sin embargo, dado que va por el código de salida, no necesita el all, nada más que un error es verdadero.
Wheat Wizard
11

Prólogo (SWI) , 43 33 bytes

Huelo ... recursión .

¡Gracias a Emigna y Leaky Nun por guardar 10 bytes!

Código

a([]).
a([X|T]):-(X=2;a(X)),a(T).

Pruébalo en línea! o Verifique todos los casos de prueba!

Explicación:

Para los usuarios no-Prolog, una lista tiene el formato de la siguiente manera: [Head | Tail].

El Heades el primer elemento de la lista, y tail es la lista restante. ¡Pruébalo aquí! . Un caso importante aquí es que la cola de una lista con 1 elemento es igual a []. Puedes probar eso aquí .

% State that an empty array is truthy.
a([]).

% If the list is not empty (covered by the previous line), we need to check
% whether the Head is equal to 2 or whether the head is truthy.
% After that, we only need to check if the remaining list is truthy.
a([Head | Tail]) :- (Head = 2; a(Head)), a(Tail).
Adnan
fuente
9

Octava, 13 bytes

@(x)~any(x-2)

Verifique todos los casos de prueba.

Esta es una función anónima teniendo un argumento de entrada, x. Resta 2de todos los elementos, verifica si hay elementos distintos de cero. Niega la salida para obtener truecasos donde todos los valores son cero.

Esto funciona porque x-2funciona para matrices de todos los tamaños, incluyendo la matriz vacía, [].

x-2 sería suficiente si no pudiera haber matrices vacías en la entrada.

Stewie Griffin
fuente
6

05AB1E , 4 bytes

˜YQP

Pruébalo en línea!

Explicación

˜      # flatten list
 YQ    # check each element for equality to 2
   P   # product of list
Emigna
fuente
¿Por qué no 2funcionaría en lugar de Y?
Erik the Outgolfer
@EriktheOutgolfer: también 2funciona. Simplemente me gusta el hecho de que no hay números en él :)
Emigna
6

JavaScript (ES6), 22 19 23 22 bytes

a=>!/[^2,]|22/.test(a)

Pruébalo

f=
a=>!/[^2,]|22/.test(a)
console.log(" "+f([2])+": "+JSON.stringify([2]))
console.log(" "+f([2,2])+": "+JSON.stringify([2,2]))
console.log(" "+f([[2],[2,2],2])+": "+JSON.stringify([[2],[2,2],2]))
console.log(" "+f([])+": "+JSON.stringify([]))
console.log(" "+f([[],[]])+": "+JSON.stringify([[],[]]))
console.log(f([1])+": "+JSON.stringify([1]))
console.log(f([22])+": "+JSON.stringify([22]))
console.log(f([2,2,2,1])+": "+JSON.stringify([2,2,2,1]))
console.log(f([[1,2],2])+": "+JSON.stringify([[1,2],2]))

Lanudo
fuente
¡Buena esa! Me pregunto si podría acortarse un poco más, pero lo dudo.
Arnauld
Gracias, @Arnauld; Todavía no he encontrado una manera de mejorarlo.
Shaggy
4

Mathematica, 24 bytes

Cases[t=Flatten@#,2]==t&

Función pura que vuelve Trueo False. Después Flattende ingresar la matriz anidada y llamarla t, Cases[t,2]devuelve la lista de elementos que coinciden con el "patrón" 2y==t comprueba si esa es la lista completa.

Mathematica, 29 bytes

(#//.{2->{},{{}..}->{}})=={}&

No tan corto, pero más divertido. A partir de la entrada #, se aplican dos reglas de reemplazo hasta que el resultado deja de cambiar ( //.): primero, todas las 2s se reemplazan por {}s; y luego cualquier lista cuyas entradas son todos conjuntos vacíos ( {{}..}) son reemplazados (repetidamente) por conjuntos vacíos. Si el resto es un conjunto vacío ( =={}), ganamos.

Greg Martin
fuente
Outgolfed , pero todavía quiero saber qué se está haciendo aquí.
Pavel
4

Haskell , 36 bytes

Una función anónima, toma un Stringy devuelve unBool .

Usar como (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

all((==2).fst).(reads=<<).scanr(:)[]

Pruébalo en línea!

Cómo funciona

  • Haskell no tiene listas integradas de tipo mixto, por lo que tomamos una cadena como argumento.
  • scanr(:)[] genera una lista de todos los sufijos de la cadena.
  • (reads=<<)intenta analizar un número al comienzo de cada sufijo, combinando los éxitos en una lista de tuplas (n,restOfString).
  • all((==2).fst)comprueba si todos los números analizados son 2.
Ørjan Johansen
fuente
¿Qué tal solo not.all(`elem`"2,[]")?
zbw
@zbw Eso falla debido a números como 22.
Ørjan Johansen
4

Python 2 , 38 bytes

lambda l:l.strip('[],2')==l*('22'in l)

Pruébalo en línea!

Toma una cadena sin espacios, emite un bool.

Comprueba si eliminar todos los caracteres '[],2'de lda la cadena vacía. También verifica que 22no sea una subcadena: si lo es, la entrada lse usa en lugar de la cadena vacía para comparar con el resultado de la eliminación, y eso siempre falla.

xnor
fuente
4

Ruby, 28 23 22 bytes - 5 bytes guardados por GB

->x{x.flatten-[2]==[]}

A pesar de que "aplanar" es realmente largo, aún es más corto que las soluciones basadas en expresiones regulares o cosas recursivas que tienen que rescatar errores en el caso base. Sin embargo, la combinación de conjuntos y matrices incorporada de Ruby es increíblemente útil a veces.

ymbirtt
fuente
1
x.flatten.uniq == [2]
Nick M
1
@NickM: eso no funcionará en casos de prueba como []o [[],[]]. [2,*x].flatten.uniq==[2]es un poco más largo
ymbirtt
1
x.flatten | [2] == [2] sería más corto.
GB
@GB y x.flatten-[2]==[]aún es más corto. ¡Gracias por el consejo!
ymbirtt
1
Y sin embargo, regex gana: codegolf.stackexchange.com/a/120781/18535 :-)
GB
3

JavaScript (ES6), 26 bytes

f=a=>a.map?a.every(f):a==2

Casos de prueba

Arnauld
fuente
Necesita contar f=porque se refirió a él.
Leaky Nun
@LeakyNun De hecho. Fijo.
Arnauld
3

MATL , 4 bytes

2-a~

Pruébalo en línea!

Descompostura:

           % Implicit input
2-         % Push 2 to the stack, and subtract from input
  a        % Any non-zero elements?
    ~      % Negate to get true for cases where all elements are zero.

Bueno, outgolfed . Pero me quedo con esto, ya que estoy bastante feliz de haberlo logrado todo por mi cuenta (aunque la tarea es muy simple).

Stewie Griffin
fuente
3

R, 28 bytes

function(x)!any(unlist(x)-2)

unlist(x)convierte una lista (anidada) en un vector. Luego 2se resta de ese vector. anyconvierte (con una advertencia) numérico a lógico y comprueba si hay algún TRUEs. Esto se invierte con !y salida.

Esto funciona con listas anidadas porque, unlistde forma predeterminada, funciona de forma recursiva para eliminar todas las entradas de la lista inicial.

Esto también funciona con listas vacías, porque se unlist(list())convierte en numeric()un vector numérico vacío. La coacción por lo anyhace logical(), que se interpreta como FALSEpor any, y luego se invierte a TRUEpor !.

JAD
fuente
1
pryr::f(!any(unlist(x)-2))Guarda un par de bytes.
BLT
Esta es la misma longitud all(unlist(x)==2)también.
Giuseppe
o también podría decir any(unlist(x)-2)qué devuelve un valor coherente TRUEsi hay un valor no 2 en la matriz aplanada y un valor coherente FALSEsi todos los valores son 2...
Giuseppe
1
@Giuseppe No estoy seguro si TRUEcuenta como falsey: /
JAD
1
bueno, todavía no hay consenso sobre meta, pero codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe
2

Python 3 , 55 bytes

Sin trampas. Utiliza la lista anidada como entrada.

f=lambda a:all(type(x)!=int and f(x)for x in a if x!=2)

Pruébalo en línea!

Monja permeable
fuente
-1 byte:int!=type(x)and
Mego
2

Jalea , 4 bytes

F=2Ạ

Pruébalo en línea!

Ligeramente diferente al algoritmo de Leaky.

Explicación:

F=2Ạ
F    Flatten
 =2  Check if equal to 2 (vectorizes)
   Ạ Check if there isn't any falsey value
Erik el Outgolfer
fuente
2

Retina , 14 11 bytes

^(\W|2\b)+$

Pruébalo en línea!

Kritixi Lithos
fuente
\Wno parece un buen criterio: 2.2es un número que no lo es 2, pero supongo que coincidiría
Aaron
@ Aaron, acabo de preguntarle al OP si la matriz puede contener números decimales. Si afirman que los números de punto flotante estarán presentes en la matriz, cambiaré mi envío.
Kritixi Lithos
Sí, veo que RosLup hizo la misma pregunta ayer y aún no tiene una respuesta. ¡Espero que OP venga pronto para aclarar!
Aaron
2

JavaScript (ES6), 53 50 48 bytes

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

¡Guardado 5 bytes, gracias a @Shaggy!

Casos de prueba :

let f =

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

console.log(f([2]))
console.log(f([2,2]))
console.log(f([[2],[2,2],2]))
console.log(f([]))
console.log(f([[],[]]))

console.log(f([1]))
console.log(f([22]))
console.log(f([2,2,2,1]))
console.log(f([[1,2],2]))

Arjun
fuente
f([])y f([[],[]])debería ser sincero
Arnauld
@Arnauld ¿Es correcto ahora?
Arjun
Creo que sí. :-)
Arnauld
Cree que puede guardar un par de bytes con en !clugar de c=="".
Shaggy
@Arnauld Gracias por señalar eso. Este desafío fue publicado como un CMC en el decimonoveno byte. Ese CMC no tenía nada que decir con respecto a [[], []] etc. tipo de casos de prueba. Cuando el desafío se publicó en el sitio principal, rápidamente agregué mi solución (¡incluso me preguntó CAPTCHA!) ¡Sin mirar las reglas! ¡Gracias una vez más! :)
Arjun
2

Java 8, 126 55 27 bytes

s->s.matches("(\\W|2\\b)+")

Puerto de la sorprendente respuesta de Retina de @KritixiLithos , excluyendo el^...$ , ya que String#matchessiempre coincide con toda la cadena y agrega ^...$implícitamente.

-2 bytes gracias a @Jakob por recordarme ^...$ no es necesario String#matches.

Pruébalo aquí

Kevin Cruijssen
fuente
Odio anular todo su trabajo en la solución de la lista, pero ¿no podría forzar una cadena y usar la solución de cadena?
Jakob
@Jakob ¿Quieres decir en la explicación? Estoy usando una solución de cadena de expresión regular en este momento. Acabo de mantener mi respuesta original de List y su explicación, porque la solución String es un puerto. ¿Está solicitando simplemente eliminar la solución Lista? ¿O agregar una explicación para la solución String?
Kevin Cruijssen
Quiero decir que, siempre que tenga una solución de lista, podría acortarla utilizando la solución de cadena que contiene. Como boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}funcionaría, ¿verdad? Solo quería señalarlo en caso de que planeara seguir desarrollando la solución de la lista.
Jakob
1
Ah, y puede perder 2 bytes eliminando ^y $en la expresión regular, ya que String.matchessolo prueba contra toda la cadena.
Jakob
@Jakob eliminó la respuesta de la lista por completo, convirtió a Java 8 y eliminó el ^...$. Olvidé eso, a pesar de que lo he usado muchas veces en el pasado ...
Kevin Cruijssen
1

Python 2 , 44 43 42 bytes

Toma xcomo la representación de cadena de la lista. Esto también supone que, como en el ejemplo, las representaciones no tienen espacios.

lambda x:set(x)<=set("[],2"*0**("22"in x))

Pruébalo en línea!


Explicación

Ambos toman los caracteres en la representación de cadena de la entrada y determinan si hay otros caracteres que no [], 2estén en ella. Lo hacen al elegir un conjunto y compararlo con el conjunto de esos personajes. Sin embargo, esto falla si tenemos un número distinto de 2 que solo tiene dígitos de 2 (por ejemplo, 22 o 222), para parchear este caso multiplicamos la cadena utilizada para crear el conjunto por la negación de si xcontiene o no "22". Si lo contiene, este será el conjunto vacío, de lo contrario será el mismo que antes.

Asistente de trigo
fuente
Falla por[22]
Leaky Nun
@LeakyNun fijo
Wheat Wizard
@LeakyNun Tu sugerencia falla[]
Wheat Wizard
lambda x:set(x)<=set("[],2"*-~-("22"in x))para -1
ovs
1

Ohm, 6 bytes

∙e]Å2N

Utiliza CP-437codificación.

Explicación:

∙e]Å2E
∙e           ■Evaluate the input to form an array
   Å         ■any(              ,             )
  ]          ■    flatten(input)
    2N       ■                   lambda x:x!=2
             ■implict end of any and print
Roman Gräf
fuente
1

PHP, 46 bytes

<?=!preg_match('/:"(?!2")/',serialize($_GET));
usuario63956
fuente
@ JörgHülsermann ¿Podría dar un ejemplo? Todos los casos de prueba parecen funcionar. Si no lo prueba a través de un navegador, ¿pasa valores escalares $_GETcomo cadenas?
user63956
<?=!preg_match('/:"(?!2")/',$argn);y la entrada es una representación en cadena de la matriz serializada - 11 Bytes
Jörg Hülsermann
1

PHP <7.0, 29 bytes

Entrada como codificación JSON de matriz de cadenas

<?=!ereg("22|[013-9]",$argn);

PHP <7.0, 42 bytes

usar la función obsoleta ereg

<?=!ereg("22|[013-9]",json_encode($_GET));

PHP, 50 bytes

imprime 1 para verdadero y nada para falso

-1 Byte para otro sabio eliminar !

o + 1 Byte para verdadero 1, falso 0 agregar +antes!

<?=!preg_match('#22|[013-9]#',json_encode($_GET));

Pruébalo en línea!

Jörg Hülsermann
fuente
2
No es necesario la $rvariable de: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956
1

Pyth, 6 bytes

!-.nQ2

Muy similar a mi respuesta CJam. Todavía soy nuevo en Pyth, así que dígame si hay algo que pueda jugar al golf.

Explicación:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Fruta Esolanging
fuente