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!


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.


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!


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


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.





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


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



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.


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.

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.


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.


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
G B

3

JavaScript (ES6), 26 bytes

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

Test cases


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


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


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

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

2

Retina, 14 11 bytes

^(\W|2\b)+$

Try it online!


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


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.


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.



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

1

PHP, 46 bytes

<?=!preg_match('/:"(?!2")/',serialize($_GET));

@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!


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.