Déterminer si un tableau contient autre chose que 2


20

Prenez un tableau composé de nombres ou de tableaux, sortez s'il ne contient que 2s.

La sortie doit être une valeur true ou falsey (Désolé si cela détruit les réponses)

Cas de test authentiques

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

Cas de test Falsey

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

Les échappatoires standard sont interdites.

Les règles d' E / S par défaut s'appliquent.

Code-golf, le moins d'octets gagne!


Pouvons-nous prendre une chaîne représentant le tableau?
Wheat Wizard

Y aura-t-il des objets autres que des nombres et d'autres tableaux dans les tableaux
Wheat Wizard

Il n'y aura que des tableaux et des nombres, et une chaîne représentant le tableau est très bien.
ATaco

2
Quel genre de chiffres? Compex int, compex float, float int, int, pas négatif?
RosLuP

1
FTR et au nom de la pensée mathématique appropriée: le tableau [[2]]ne contient pas de deux.
cessé de tourner dans

Réponses:


8

MATL , 3 octets

2=p

Essayez-le en ligne!

Techniquement, cela pourrait simplement être

2=

Puisqu'un tableau contenant des éléments nuls est faux, mais cela semble bon marché.


Une liste contenant 0 est fausse? Oh mec.
Erik the Outgolfer

Je ne pense pas que la version à 2 octets soit valide, car dans les commentaires ATaco a déclaré qu'une paire de sortie unique est valide.
Erik the Outgolfer

Je crois qu'il 2=échoue pour les matrices vides, ou?
Stewie Griffin

@stewiegriffin Cela semble être un cas étrange à gérer, mais cela fonctionne bien: essayez-le en ligne!
DJMcMayhem

Oui, ça 2=pmarche bien. La version courte à la fin, 2=non. En outre, "les cas de bord étranges" sont deux des cas de test. :-)
Stewie Griffin

15

Python 2 , 43 40 octets

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

Essayez-le en ligne!


Au moment de publier cette réponse, il était toujours autorisé par ce méta-consensus de produire via le lancement d'une erreur / le non-lancement d'une erreur. Par conséquent, cette réponse à 26 octets était valide:

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

Essayez-le en ligne!


1
C'est une bonne façon de vérifier si un élément est une liste.
Adnan

C'est pourquoi je n'aime pas ce consensus. Cela ruine vraiment le golf en python.
Wheat Wizard

Cependant, puisque vous utilisez le code de sortie, vous n'avez pas besoin de la all, rien d'autre qu'une erreur est véridique.
Wheat Wizard

11

Prolog (SWI) , 43 33 octets

Je sens ... la récursivité .

Merci à Emigna et Leaky Nun pour avoir économisé 10 octets!

Code

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

Essayez-le en ligne! ou Vérifiez tous les cas de test!

Explication:

Pour les utilisateurs non-Prolog, une liste est formatée de la manière suivante: [Head | Tail].

Le Headest le premier élément de la liste et la queue est la liste restante. Testez-le ici! . Un cas important ici est que la queue d'une liste avec 1 élément est égale à []. Vous pouvez le tester ici .

% 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

Octave, 13 octets

@(x)~any(x-2)

Vérifiez tous les cas de test.

Ceci est une fonction anonyme avec un argument d'entrée, x. Il soustrait 2de tous les éléments, vérifie s'il y a des éléments non nuls. Il annule la sortie pour obtenir truedes cas où toutes les valeurs sont nulles.

Cela fonctionne parce que les x-2travaux pour les matrices de toutes tailles, y compris la matrice vide, [].

x-2 serait suffisant s'il ne pouvait pas y avoir de matrices vides dans l'entrée.




6

05AB1E , 4 octets

˜YQP

Essayez-le en ligne!

Explication

˜      # flatten list
 YQ    # check each element for equality to 2
   P   # product of list

Pourquoi ne 2fonctionnerait pas à la place de Y?
Erik the Outgolfer

@EriktheOutgolfer: 2fonctionne également. J'aime juste le fait qu'il n'y ait pas de chiffres dedans :)
Emigna

6

JavaScript (ES6), 22 19 23 22 octets

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

Essaye-le

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


Joli! Je me demande si cela pourrait être encore raccourci, mais j'en doute.
Arnauld

Merci, @Arnauld; n'ont toujours pas trouvé un moyen de l'améliorer.
Shaggy



4

Mathematica, 24 octets

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

Fonction pure retournant Trueou False. Après avoir Flattening le tableau imbriqué et l'avoir appelé t, Cases[t,2]retourne la liste des éléments qui correspondent au "modèle" 2et ==tvérifie s'il s'agit de la liste entière.

Mathematica, 29 octets

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

Pas aussi court, mais plus amusant. À partir de l'entrée #, deux règles de remplacement sont appliquées jusqu'à ce que le résultat cesse de changer ( //.): tout d'abord, tous les 2s sont remplacés par des {}s; puis toute liste dont les entrées sont toutes des ensembles vides ( {{}..}) est remplacée (à plusieurs reprises) par des ensembles vides. Si le reste est un ensemble vide ( =={}), nous gagnons.


Hors - golf , mais je veux toujours vraiment savoir ce qui se fait ici.
Pavel

4

Haskell , 36 octets

Une fonction anonyme, prend a Stringet retourne a Bool.

Utilisé comme (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

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

Essayez-le en ligne!

Comment ça fonctionne

  • Haskell n'a pas de listes intégrées de type mixte, nous prenons donc une chaîne comme argument.
  • scanr(:)[] génère une liste de tous les suffixes de la chaîne.
  • (reads=<<)essaie d'analyser un nombre au début de chaque suffixe, en combinant les succès dans une liste de tuples (n,restOfString).
  • all((==2).fst)vérifie si tous les nombres analysés le sont 2.

Et juste not.all(`elem`"2,[]")?
zbw

@zbw Cela échoue à cause de nombres comme 22.
Ørjan Johansen

4

Python 2 , 38 octets

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

Essayez-le en ligne!

Prend une chaîne sans espaces, génère un booléen.

Vérifie si la suppression de tous les caractères '[],2'de ldonne la chaîne vide. Vérifie également qu'il 22ne s'agit pas d'une sous-chaîne - si c'est le cas, l'entrée lest utilisée à la place de la chaîne vide pour se comparer au résultat de la suppression, et cela échoue toujours.


4

Ruby, 28 23 22 octets - 5 octets économisés par Go

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

Bien que "aplatir" soit vraiment long, il est toujours plus court que les solutions basées sur l'expression régulière ou les trucs récursifs qui doivent sauver les erreurs dans le cas de base. Cependant, la fusion intégrée de Ruby des ensembles et des tableaux est parfois incroyablement utile.


1
x.flatten.uniq == [2]
Nick M

1
@NickM - cela ne fonctionnera pas sur les cas de test comme []ou [[],[]]. [2,*x].flatten.uniq==[2]est légèrement plus long
ymbirtt

1
x.flatten | [2] == [2] serait plus court.
GB

@GB et x.flatten-[2]==[]est encore plus court. Merci pour le conseil!
ymbirtt

1
Et pourtant regex gagne: codegolf.stackexchange.com/a/120781/18535 :-)
GB

3

JavaScript (ES6), 26 octets

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

Cas de test


Vous devez compter f=parce que vous y avez fait référence.
Leaky Nun

@LeakyNun Effectivement. Fixé.
Arnauld

3

MATL , 4 octets

2-a~

Essayez-le en ligne!

Panne:

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

Eh bien, hors - golf . Mais je garde ça, car je suis assez content d'avoir tout fait par moi-même (même si la tâche est super simple).


3

R, 28 octets

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

unlist(x)transforme une liste (imbriquée) en vecteur. 2Est ensuite soustrait de ce vecteur. anyconvertit (avec un avertissement) numérique en logique et vérifie s'il y a des TRUEs. Ceci est inversé avec !et en sortie.

Cela fonctionne avec les listes imbriquées car, unlistpar défaut, fonctionne de manière récursive pour annuler la liste de toutes les entrées de liste de la liste initiale.

Cela fonctionne également avec des listes vides, car unlist(list())devient numeric(), un vecteur numérique vide. La contrainte par le anyfait logical(), ce qui est interprété comme FALSEpar any, puis inversé en TRUEpar !.


1
pryr::f(!any(unlist(x)-2))enregistre quelques octets.
BLT

c'est également la même longueur all(unlist(x)==2).
Giuseppe

ou vous pouvez également dire any(unlist(x)-2)qui renvoie une constante TRUEs'il y a une valeur non-2 dans le tableau aplati et une cohérente FALSEsi toutes les valeurs sont 2...
Giuseppe

1
@Giuseppe Je ne sais pas si TRUEça compte comme Falsey: /
JAD

1
eh bien, il n'y a toujours pas de consensus sur la méta, mais codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe



2

Rétine , 14 11 octets

^(\W|2\b)+$

Essayez-le en ligne!


\Wne semble pas un si bon critère: 2.2est un nombre qui ne l'est pas 2, mais je suppose qu'il correspondrait
Aaron

@Aaron Je viens de demander à l'OP si le tableau peut contenir des nombres décimaux. S'ils déclarent que des nombres à virgule flottante seront présents dans le tableau, je changerai ma soumission.
Kritixi Lithos

Ouais, je vois que RosLup a posé la même question hier et n'a pas encore de réponse. J'espère que OP viendra bientôt pour clarifier!
Aaron


2

JavaScript (ES6), 53 50 48 octets

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

5 octets enregistrés grâce à @Shaggy!

Cas de test:

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([])et f([[],[]])devrait être véridique
Arnauld

@Arnauld Est-ce correct maintenant?
Arjun

Je le pense. :-)
Arnauld

Pensez que vous pouvez enregistrer quelques octets avec !cau lieu de c=="".
Shaggy

@Arnauld Merci de l'avoir signalé. Ce défi a en fait été affiché en tant que CMC dans le dix-neuvième octet. Ce CMC n'avait rien à dire sur [[], []] etc. types de cas de test. Lorsque le challenge a été posté sur le site principal, j'ai rapidement ajouté ma solution (il m'a même demandé CAPTCHA!) Sans regarder les règles! Encore merci! :)
Arjun


2

Java 8, 126 55 27 octets

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

Port de @KritixiLithos 's étonnante réponse Retina , excluant le ^...$, car String#matchescorrespond toujours à la chaîne entière et ajoute ^...$implicitement.

-2 octets merci à @Jakob de me le rappeler ^...$n'est pas nécessaire pour String#matches.

Essayez-le ici.


Je déteste annuler tout votre travail sur la solution de liste, mais ne pourriez-vous pas contraindre à une chaîne et utiliser la solution de chaîne?
Jakob

@Jakob Vous voulez dire dans l'explication? J'utilise actuellement une solution de regex String. Je viens de garder ma réponse List d'origine et son explication, car la solution String est un port. Souhaitez-vous simplement supprimer la solution List? Ou ajouter une explication pour la solution String?
Kevin Cruijssen

Je veux dire que tant que vous avez une solution de liste, vous pouvez aussi bien la raccourcir en utilisant la solution de chaîne qu'elle contient. Comme boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}ça marcherait, non? Je voulais juste le signaler au cas où vous envisagiez de continuer à jouer au golf avec la solution de liste.
Jakob

1
Oh et vous pouvez perdre 2 octets en supprimant ^et $dans l'expression régulière, car String.matchesseuls les tests par rapport à la chaîne entière.
Jakob

@Jakob Suppression complète de la réponse Liste, conversion en Java 8 et suppression de la ^...$. J'ai oublié ça, même si je l'ai utilisé beaucoup de fois dans le passé ..
Kevin Cruijssen

1

Python 2 , 44 43 42 octets

Prend xcomme représentation sous forme de chaîne de la liste. Cela suppose également que dans l'exemple les représentations n'ont pas d'espaces.

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

Essayez-le en ligne!


Explication

Les deux prennent les caractères dans la représentation sous forme de chaîne de l'entrée et déterminent s'il [], 2existe des caractères autres que ceux -ci. Ils le font en lançant un ensemble et en le comparant à l'ensemble de ces personnages uniquement. Cependant, cela échoue si nous avons un nombre autre que 2 qui n'a que des chiffres de 2 (par exemple 22 ou 222), afin de corriger ce cas, nous multiplions la chaîne utilisée pour créer l'ensemble par la négation de s'il xcontient ou non "22". S'il le contient, ce sera l'ensemble vide, sinon ce sera le même qu'avant.



Échoue pour[22]
Leaky Nun

@LeakyNun Fixed
Wheat Wizard

@LeakyNun Votre suggestion échoue pour[]
Wheat Wizard

lambda x:set(x)<=set("[],2"*-~-("22"in x))pour -1
ovs

1

Ohm, 6 octets

∙e]Å2N

Les usages CP-437 encodage.

Explication:

∙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 octets

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

@ JörgHülsermann Pourriez-vous donner un exemple? Tous les cas de test semblent fonctionner. Si vous ne le testez pas via un navigateur, passez-vous des valeurs scalaires en $_GETtant que chaînes?
user63956

<?=!preg_match('/:"(?!2")/',$argn);et l'entrée est une représentation sous forme de chaîne du tableau sérialisé - 11 octets
Jörg Hülsermann

1

PHP <7,0, 29 octets

Entrée sous forme de tableau de chaînes codé JSON

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

PHP <7,0, 42 octets

utiliser la fonction obsolète ereg

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

PHP, 50 octets

imprime 1 pour vrai et rien pour faux

-1 octet pour les autres suppressions !

ou + 1 octet pour vrai 1, faux 0 ajouter +avant!

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

Essayez-le en ligne!


2
Vous n'avez pas besoin de la $rvariable: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 octets

!-.nQ2

Très similaire à ma réponse CJam. Je suis encore nouveau sur Pyth, alors dites-moi s'il y a quelque chose que je peux jouer au golf.

Explication:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.