Determinar se uma matriz contém algo diferente de 2

20

Pegue uma matriz que consiste em números ou matrizes, produza se ela contiver apenas 2s.

A saída deve ser um valor verdadeiro ou falso (desculpe se isso destrói as respostas)

Casos de teste de verdade

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

Casos de Teste Falsey

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

As brechas padrão são proibidas.

Regras de E / S padrão se aplicam.

Código de golfe, menos bytes ganha!

ATaco
fonte
Podemos pegar uma string representando a matriz?
Wheat Wizard
Haverá diferentes de números e outras matrizes objetos nas matrizes
Assistente de trigo
Só haverá matrizes e números, e uma string que representa a matriz está correta.
ATaco 13/05
2
Que tipo de números? Compex int, compex float, float int, int, não negativo?
RosLuP
1
FTR e em nome do pensamento matemático adequada: a matriz [[2]]que não contêm um dois.
deixou de girar no sentido anti-horário

Respostas:

8

MATL , 3 bytes

2=p

Experimente online!

Tecnicamente, isso poderia ser apenas

2=

Como uma matriz que contém quaisquer elementos zero é falsa, mas isso parece barato.

DJMcMayhem
fonte
Uma lista contendo 0 é falsa? Oh cara.
Erik the Outgolfer
Não acho que a versão de 2 bytes seja válida, pois nos comentários a ATaco disse que um par de saída único é válido.
Erik the Outgolfer
Eu acredito que 2=falha para matrizes vazias, ou?
Stewie Griffin
@stewiegriffin Parece um caso estranho de se lidar, mas convenientemente funciona: Experimente on-line!
DJMcMayhem
Sim, 2=pfunciona bem. A versão mais curta no final, 2=não. Além disso, "os casos extremos de borda" são dois dos casos de teste. :-)
Stewie Griffin
15

Python 2 , 43 40 bytes

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

Experimente online!


No momento da publicação desta resposta, ainda era permitido, por esse meta consenso, gerar um erro / não um erro. Portanto, esta resposta em 26 bytes era válida:

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

Experimente online!

ovs
fonte
1
Essa é uma maneira elegante de verificar se um elemento é uma lista.
Adnan
É por isso que não gosto desse consenso. Realmente arruina o golfe de python.
Wheat Wizard
No entanto, como você está usando o código de saída, não precisa do código all, nada além de um erro é verdadeiro.
Wheat Wizard
11

Prolog (SWI) , 43 33 bytes

Eu cheiro... recursão .

Graças a Emigna e Leaky Nun por salvar 10 bytes!

Código

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

Experimente online!ou Verifique todos os casos de teste!

Explicação:

Para usuários não-Prolog, uma lista é formatado da seguinte maneira: [Head | Tail].

O Headé o primeiro elemento da lista e tail é a lista restante. Teste aqui! . Um caso importante aqui é que a cauda de uma lista com 1 elemento é igual a []. Você pode testar isso aqui .

% 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
fonte
10

Gelatina , 4 bytes

F;2E

Experimente online!

Como funciona

F;2E
F    flatten
 ;2  append 2
   E all elements are equal
Freira Furada
fonte
9

Oitava, 13 bytes

@(x)~any(x-2)

Verifique todos os casos de teste.

Esta é uma função anônima que recebe um argumento de entrada x,. Ele subtrai 2de todos os elementos, verifica se existem elementos diferentes de zero. Ele anula a saída truepara casos onde todos os valores são zero.

Isso funciona porque x-2funciona para matrizes de todos os tamanhos, incluindo a matriz vazia [],.

x-2 seria suficiente se não pudesse haver matrizes vazias na entrada.

Stewie Griffin
fonte
7

Matemática , 28 bytes

Select[Flatten@#,#!=2&]=={}&

Experimente online!

Pavel
fonte
Eu acho que a entrada {0}é permitida; isso resultaria em um falso positivo.
Greg Martin
6

05AB1E , 4 bytes

˜YQP

Experimente online!

Explicação

˜      # flatten list
 YQ    # check each element for equality to 2
   P   # product of list
Emigna
fonte
Por que não 2funcionaria em vez de Y?
Erik the Outgolfer
@EriktheOutgolfer: 2funciona também. Eu apenas gosto do fato de que não há números nele :)
Emigna
6

JavaScript (ES6), 22 19 23 22 bytes

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

Teste-o

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]))

Shaggy
fonte
Agradável! Gostaria de saber se poderia ser encurtado um pouco mais, mas duvido.
Arnauld
Obrigado, @Arnauld; ainda não descobriram uma maneira de melhorar isso.
Shaggy
5

Mathematica, 15 bytes

FreeQ[x_/;x!=2]

Também funciona em matemática. Experimente online!

alefalpha
fonte
4

APL (Dyalog) , 5 bytes

∧/2=∊

Experimente online!

Explicação

∧/                         Only
  2=                       2s are equal to
                          any of the elements in the enlisted form of the right argument
Kritixi Lithos
fonte
4

Mathematica, 24 bytes

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

Função pura retornando Trueou False. Após Flattendigitar a matriz aninhada e chamá-la t, Cases[t,2]retorna a lista de elementos que correspondem ao "padrão" 2e ==tverifica se essa é a lista inteira.

Mathematica, 29 bytes

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

Não é tão curto, mas mais divertido. A partir da entrada #, duas regras de substituição são aplicadas até que o resultado pare de mudar ( //.): primeiro, todos os 2s são substituídos por {}s; e qualquer lista cujas entradas sejam todos conjuntos vazios ( {{}..}) será substituída (repetidamente) por conjuntos vazios. Se o resto for um conjunto vazio ( =={}), vencemos.

Greg Martin
fonte
Outgolfed , mas eu realmente quero saber o que está sendo feito aqui.
Pavel
4

Haskell , 36 bytes

Uma função anônima, pega a Stringe retorna a Bool.

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

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

Experimente online!

Como funciona

  • Haskell não possui listas de tipos mistos embutidas, então usamos uma string como argumento.
  • scanr(:)[] gera uma lista de todos os sufixos da sequência.
  • (reads=<<)tenta analisar um número no início de cada sufixo, combinando os sucessos em uma lista de tuplas (n,restOfString).
  • all((==2).fst)verifica se todos os números analisados ​​são 2.
Ørjan Johansen
fonte
Que tal apenas not.all(`elem`"2,[]")?
Zbw 14/05
@zbw Isso falha por causa de números como 22.
Ørjan Johansen
4

Python 2 , 38 bytes

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

Experimente online!

Pega uma string sem espaços, gera um bool.

Verifica se a remoção de todos os caracteres '[],2'de lfornece a sequência vazia. Também verifica que 22não é uma substring - se for, a entrada lé usada no lugar da cadeia vazia para comparar com o resultado da remoção e que sempre falha.

xnor
fonte
4

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

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

Apesar de o "achatamento" ser muito longo, ainda é mais curto que as soluções baseadas em regex ou coisas recursivas que precisam resgatar erros no caso base. A combinação embutida de conjuntos e matrizes de Ruby, no entanto, às vezes é incrivelmente útil.

ymbirtt
fonte
1
x.flatten.uniq==[2]
Nick M
1
@NickM - that won't work on test cases like [] or [[],[]]. [2,*x].flatten.uniq==[2] is slightly longer
ymbirtt
1
x.flatten|[2]==[2] would be shorter.
G B
@GB and x.flatten-[2]==[] is shorter still. Thanks for the tip!
ymbirtt
1
And yet regex wins: codegolf.stackexchange.com/a/120781/18535 :-)
G B
3

JavaScript (ES6), 26 bytes

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

Test cases

Arnauld
fonte
You need to count f= because you referred to it.
Leaky Nun
@LeakyNun Indeed. Fixed.
Arnauld
3

MATL, 4 bytes

2-a~

Try it online!

Breakdown:

           % 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.

Well, outgolfed. But I'm keeping this, since I'm quite happy I managed this all on my own (even though the task is super simple).

Stewie Griffin
fonte
3

R, 28 bytes

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

unlist(x) turns a (nested) list into a vector. Then 2 is subtracted from that vector. any converts (with a warning) numeric to logical and checks if there are any TRUEs. This is inverted with ! and output.

This works with nested lists because unlist by default works recursively to unlist all list entries of the initial list.

This also works with empty lists, because unlist(list()) becomes numeric(), an empty numerical vector. Coercion by any makes it logical(), which is interpreted as FALSE by any, and then reversed to TRUE by !.

JAD
fonte
1
pryr::f(!any(unlist(x)-2)) saves a couple of bytes.
BLT
this is the same length as all(unlist(x)==2) as well.
Giuseppe
or you could also say any(unlist(x)-2) which returns a consistent TRUE if there is a non-2 value in the flattened array and a consistent FALSE if all the values are 2...
Giuseppe
1
@Giuseppe Not sure if TRUE counts as falsey though :/
JAD
1
well, there's still not a consensus on meta, but codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe
2

Python 3, 55 bytes

No cheating. Uses nested list as input.

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

Try it online!

Leaky Nun
fonte
-1 byte: int!=type(x)and
Mego
2

Jelly, 4 bytes

F=2Ạ

Try it online!

Slightly different than Leaky's algorithm.

Explanation:

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

Retina, 14 11 bytes

^(\W|2\b)+$

Try it online!

Kritixi Lithos
fonte
\W doesn't seem such a good criteria : 2.2 is a number that isn't 2, yet I suppose it would match
Aaron
@Aaron I have just asked the OP on whether the array can containing decimal numbers. If they state that floating-point numbers will be present in the array, I will change my submission.
Kritixi Lithos
Yeah, I see RosLup asked the same question yesterday and hasn't got an answer yet. I hope OP will come soon to clarify !
Aaron
2

JavaScript (ES6), 53 50 48 bytes

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

Saved 5 bytes, thanks to @Shaggy!

Test Cases :

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
fonte
f([]) and f([[],[]]) should be truthy
Arnauld
@Arnauld Is it correct now?
Arjun
I think so. :-)
Arnauld
Think you can save a couple of bytes with !c instead of c=="".
Shaggy
@Arnauld Thanks for pointing that out. This challenge was actually posted as a CMC in the Nineteenth byte. That CMC did not have anything to say regarding [[],[]] etc kind of test cases. When the challenge got posted on the main site, I quickly added my solution (It even asked me CAPTCHA!) without looking at rules! Thanks once again! :)
Arjun
2

Java 8, 126 55 27 bytes

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

Port of @KritixiLithos's amazing Retina answer, excluding the ^...$, since String#matches always matches the entire String and adds the ^...$ implicitly.

-2 bytes thanks to @Jakob for reminding me of ^...$ isn't necessary for String#matches.

Try it here.

Kevin Cruijssen
fonte
I hate to nullify all your work on the list solution, but couldn't you coerce to a string and use the string solution?
Jakob
@Jakob You mean in the explanation? I am using a regex String solution at the moment. I've just kept my original List answer and it's explanation, because the String solution is a port. Are you asking to just remove the List solution? Or add an explanation for the String solution?
Kevin Cruijssen
I mean that as long as you have a list solution you might as well shorten it by using the string solution in it. Like boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");} would work, right? Just wanted to point that out in case you were planning to further golf the list solution.
Jakob
1
Oh and you can lose 2 bytes by removing ^ and $ in the regex, since String.matches only tests against the whole string.
Jakob
@Jakob Removed the List answer entirely, converted to Java 8, and removed the ^...$. Forgot about that, even though I've used it quite a lot of times in the past..
Kevin Cruijssen
1

Python 2, 44 43 42 bytes

Takes x as the string representation of the list. This also assumes like in the example the representations have no spaces.

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

Try it online!


Explanation

Both of these take the characters in the string representation of the input and determine if any characters other than [], 2 are in it. They do this by casting to a set and comparing to the set of just those characters. However this fails if we have a number other than 2 which has only digits of 2 (e.g. 22 or 222), in order to patch this case we multiply the string used to create the set by the negation of whether or not x contains "22". If it contains it this will be the empty set, otherwise it will be the same as before.

Wheat Wizard
fonte
Fails for [22]
Leaky Nun
@LeakyNun Fixed
Wheat Wizard
@LeakyNun Your suggestion fails for []
Wheat Wizard
lambda x:set(x)<=set("[],2"*-~-("22"in x)) for -1
ovs
1

Ohm, 6 bytes

∙e]Å2N

Uses CP-437 encoding.

Explanation:

∙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
fonte
1

PHP, 46 bytes

<?=!preg_match('/:"(?!2")/',serialize($_GET));
user63956
fonte
@JörgHülsermann Could you please give an example? All the test cases seem to work. If you test it not through a browser, do you pass scalar values of $_GET as strings?
user63956
<?=!preg_match('/:"(?!2")/',$argn); and input is a string representation of the serialized array - 11 Bytes
Jörg Hülsermann
1

PHP<7.0, 29 Bytes

Input as as string array JSON encoded

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

PHP<7.0, 42 Bytes

use the deprecated function ereg

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

PHP, 50 Bytes

prints 1 for true and nothing for false

-1 Byte for other wise remove !

or + 1 Byte for true 1, false 0 add + before !

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

Try it online!

Jörg Hülsermann
fonte
2
You don't need the $r variable: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956
1

Pyth, 6 bytes

!-.nQ2

Very similar to my CJam answer. I'm still new to Pyth, so please tell me if there's anything I can golf off.

Explanation:

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