Contexte
Inspirée par l'interprétation très pratique d'Octave (et, par extension, de MATL) des matrices véridiques / fausses, Jelly a obtenu l' atome Ȧ ( tout style Octave ).
Ȧ prend un tableau en entrée et renvoie 1 si le tableau n'est pas vide et ne contient le numéro 0 (entier, flottant ou complexe) nulle part dans la structure arborescente ; sinon, il renvoie 0 .
Par exemple, le tableau [[]] est véridique car il n'est pas vide et ne contient pas de zéros, mais [[0]] est faux car il contient un 0 au niveau le plus intérieur.
Tâche
Dans un langage de programmation de votre choix, écrivez un programme complet ou une fonction qui prend en entrée un tableau d' entiers éventuellement vide, peut-être dentelé, et imprime ou retourne une valeur vraie ou fausse qui indique si Ȧ retournerait 1 ou 0 , respectivement.
Votre soumission doit respecter les règles suivantes.
Les valeurs véridiques et fausses doivent être cohérentes pour toutes les entrées , c'est-à-dire que tous les tableaux pour lesquels Ȧ renvoie 1 doivent correspondre à la même valeur véridique, et tous les tableaux pour lesquels Ȧ renvoie 0 doivent correspondre à la même valeur falsifiée.
Étant donné que les programmes complets ne peuvent prendre que des représentations de chaînes de tableaux en entrée, cela est autorisé. Cependant, vous devez utiliser la représentation canocale de votre langue, telle que renvoyée par
repr
ou similaire.En particulier, vous ne pouvez pas supposer que le premier élément du tableau sera précédé d'un espace.
Si (et seulement si) votre langage ne peut pas représenter nativement des tableaux irréguliers, vous pouvez prendre une représentation sous forme de chaîne de l'entrée, en utilisant la syntaxe canonique de tout langage de programmation préexistant.
Si votre langue a plusieurs façons de représenter des tableaux irréguliers (par exemple, des listes et des tuples), vous n'avez qu'à prendre en charge l'un d'eux.
Si votre langue a une fonction intégrée qui est elle-même une soumission valide à ce défi, vous ne pouvez pas l'utiliser dans votre réponse . Tous les autres éléments intégrés sont autorisés.
Nous vous encourageons à publier des réponses en utilisant à la fois la manipulation de tableaux et de chaînes, même si l'une est beaucoup plus courte que l'autre.
Toutes les règles de code-golf standard s'appliquent.
Que le code le plus court en octets gagne!
Cas de test authentiques
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Cas de test de falsification
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]
Object
... mon préféré est Haskell, où il ne l'est pas. Ni en C, du moins pas d'une manière qui vous permette de mélanger les tableaux et les entiers en toute sécurité. Ces deux langues sont parfaitement capables de tableaux irréguliers, mais ne peuvent toujours pas les utiliser pour ce problème.Réponses:
Gelée, 3 octets
F
aplatit la liste d'entrée.ṭ
punaises sur la liste d'entrée d'origine en tant qu'élément, ce qui est faux si et seulement s'il est vide.Ạ
vérifie ensuite si un élément de la liste aplatie, ou la liste d'origine elle-même, est faux.(Réponse originale)
Merci à Dennis d'avoir encouragé la recherche d'une solution correspondant à la sienne.
FẠ
donne 0 si l'entrée contient une valeur falsifiée à n'importe quelle profondeur, sinon 1. C'est ce queȦ
fait, sauf pour les listes vides.Ṇ
donne 1 si l'entrée est une valeur falsifiée, sinon 0. La seule liste falsifiée est la liste vide.XOR-ing les deux donne la réponse.
C'est beaucoup dans le même esprit que Dennis
F;LẠ
, mais au lieu d'utiliserL
pour mettre un zéro dans la liste lorsque la liste est vide, il utiliseW
pour mettre la liste vide en elle-même (production[[]]
), en la faisant contenir un élément falsifié.la source
Retina , 10 octets
Essayez-le en ligne!
Nous supprimons d'abord l'entrée si elle contient un zéro. Nous essayons de faire correspondre au moins trois caractères depuis le début de la chaîne (pour garantir que l'entrée n'a pas été éliminée à l'étape précédente, ou ne devait que
[]
commencer).la source
Rubis,
2524231816 octetsNécessite le
-n
drapeau sur la ligne de commande (+1 octet,-e
->-ne
).Essayez-le en ligne!
Il s'agit d'un programme complet qui prend les entrées au format de tableau canonique de Ruby sur STDIN et les sorties
true
oufalse
sur STDOUT.Version de la fonction 23 octets :
Il s'agit d'un proc qui prend un argument, le tableau à tester.
Merci à Martin Ender pour un octet et à Ventero pour deux octets!
la source
p$_!~/\D0|^..$/
(oup ! ~/\D0|^..$/
, yay, des espaces importants) avec l'-n
indicateur.Gelée , 4 octets
Essayez-le en ligne!
Ȧ
donne0
si l'entrée est vide ou contient un0
, sinon c'est le cas1
.FẠ
donne0
si l'entrée aplatie contient un0
, ne laissant que le cas de bord d'un tableau vide (puisque l'entrée est garantie d'être un tableau).Ṇ
est une logique non vectorisante non monade, et retourne donc0
pour toute liste non vide et1
pour la liste vide. En tant que tel, cela peut simplement être retracé du résultat de l'FẠ
utilisation_
.la source
FẠạṆ
vrai, non?05AB1E ,
98 octets-1 octets grâce à Emigna
Explication:
Essayez-le en ligne!
la source
[[]]
.Mathematica, 17 octets
FreeQ
vérifie0
pour nous, mais bien sûr, il reviendraitTrue
pour entrée{}
, nous devons donc vérifier ce cas séparément.la source
APL (Dyalog),
21127 octetsGolfé 5 octets grâce à Adám en utilisant des fourches
Essayez-le en ligne!
Ceci est mon premier essai chez Dyalog. Les conseils de golf sont les bienvenus!
Explication
la source
⍬∘≡
est le test de gauche (ensemble vide lié à identique à), et0∊∊
est le test de droite (lui-même un fork; zéro membre de forme enrôlée). Mettez ensemble:⍬∘≡⍱0∊∊
. Essayez-le en ligne!Langage de script Operation Flashpoint ,
199188 octetsAppeler avec:
ou avec:
Explication:
Dans le langage de script du jeu, n'importe quelle chaîne contenant du code peut être appelée. Les accolades
{}
représentent le début et la fin d'une chaîne. (Les guillemets fonctionnent aussi, mais cela devient compliqué lorsqu'ils sont imbriqués.) Donc,A={...}
affecte une chaîne à la variableA
, et la variable peut ensuite être appelée comme une fonction avec:<argument> call A
. Fondamentalement, n'importe quelle chaîne peut être traitée comme un bloc de code.Ensuite, à l'intérieur de la "fonction"
A
, nous définissons une autre fonctionf
.private
déclare les deux variables_i
et_r
local pour fonctionnerf
. Le nom d'une variable locale doit commencer par un trait de soulignement.while {} do {}
est une boucle, où la première chaîne (notée par{}
) contient le code de la condition de boucle et la seconde du corps de la boucle._this
est l'argument transmis avec lacall
fonction._this
peut être de tout type, mais ici nous supposons qu'il s'agit d'un tableau.Dans la boucle,
o=_this select _i
accède à l'élément _i: th du tableau et l'affecte à la variableo
.if (o in [o])
est une astuce pour déterminer s'ilo
s'agit d'un autre tableau ou non. Sio
est un nombre (ou autre chose qu'un tableau),o in [o]
sera évalué àtrue
, car lain
fonction trouve une valeur correspondanto
au tableau[o]
. Sio
est un tableau, l'expression donnefalse
, car lein
refuse de comparer les tableaux.Si
o
n'est pas un tableau, nous vérifions s'il est égal à zéro, et si c'est le cas, nous définirons la variable_r
, que nous utiliserons comme valeur de retour, à zéro. Sinon, sio
est un tableau, nous attribuons à_r
la valeur de retour de l'appel récursiff
avec le nouveau tableauo
comme argument.Après la boucle, à la fin de la fonction
f
, nous évaluons l'expression_r
, qui donne la valeur de_r
, et comme c'est la dernière expression à évaluer, c'est ce que l'appel à la fonctionf
renvoie .Maintenant que nous avons défini
f
(f
pas besoin d'être à l'intérieurA
, mais de cette façon, nous aurions pu le déclarer variable / fonction locale (pas de différence vraiment)A
si nous ne voulions pas enregistrer quelques octets), revenonsA
.if (count _this == 0)
vérifie siA
le tableau d'entrée est vide et s'il l'est,A
retourne 0. Sinon, la fonctionf
est appelée et sa valeur de retour seraA
la valeur de retour de.On pourrait remarquer qu'il semble qu'un point-virgule serait absent de quelques endroits, mais ce n'est pas le cas, car un point-virgule n'est nécessaire qu'après une instruction si une autre instruction le suit à l'intérieur du même bloc de code (c'est-à-dire une chaîne).
la source
Perl 5 , 15 octets
Enregistré 2 octets en utilisant la même technique que la réponse Ruby de Doorknob .
14 octets de code +
-p
indicateurEssayez-le en ligne!
/.../
garantit que le tableau n'est pas vide (il correspondra à n'importe quel tableau mais[]
./\b0/
ne correspondra que s'il y a un0
dans le tableau. (le\b
garantit qu'il0
ne fait pas partie d'un autre numéro mais d'un nombre entier).la source
Haskell , 48 octets
Essayez-le en ligne!
Merci à Lynn pour les cas de test et les
x<"[]"
astuce.L'inégalité externe doit
(x<"[]")
être True (liste non vide) etor[elem c"[,"|c:'0':_<-scanr(:)[]x]
False (pas de zéros).Les caractères de
0
sont détectés comme suivant un,
ou[
, par opposition à un nombre comme20
. L'expressionscanr(:)[]x
génère tous les suffixes del
etc:'0':_<-
capture ceux dont le deuxième caractère est'0'
. Ensuite,elem c"[,"
vérifie si le premier caractère est,
ou[
.Je suppose ici que les listes de style Haskell n'ont pas d'espaces, mais si c'est le cas, elles
','
peuvent simplement être remplacées par' '
.Voici une méthode plus directe de 48 octets, bien qu'elle produise des
0
«et1
» qui ne sont pas Truthy / Falsey dans Haskell.la source
Gelée , 4 octets
Essayez-le en ligne!
Comment ça marche
Notez que l'atome Ạ se comporte comme Python
all
et est donc assez différent du anned interdit.la source
L;FẠ
. Qui peut en trouver un autre?JavaScript (ES6), 34 octets
Cas de test
Afficher l'extrait de code
la source
!!a[0]
place dea.length
. (Vous n'avez pas à vous soucier d'a[0]
être zéro car le résultat doit être faux dans ce cas de toute façon.)Julia, 45 octets
Cela crée une fonction
g
qui indique si Ȧ serait 1 ou 0 en appelant une fonction récursivea
. Pour faire un convenablea
, nous utilisons l'envoi multiple:La fonction
all
prend un argument de fonction, nous appelons donca
chaque élément de l'entrée. Ensuite, nous définissons simplement la fonction pour la soumission commeFondamentalement, nous avons juste besoin
a
mais avec un chèque pour gérer correctement[]
.Essayez-le en ligne!
la source
a(x)
oug(x)
comme à la!x
place?Grime ,
161411 octetsMerci à Zgarb d'avoir économisé 5 octets.
Essayez-le en ligne!
Le
e
dit à Grime d'essayer de faire correspondre la totalité de l'entrée et d'imprimer0
ou1
selon que cela est possible.L'
|!
opérateur est en fait un "ni", car ilx|!y
est un raccourci pour(x|y)!
. Nous nous assurons donc que l'entrée ne contient ni zéro précédé d'un symbole ni une chaîne de deux caractères seulement ([]
).Une note sur la seconde moitié:
P#
correspond à un rectangle qui contient au moins une correspondance deP
. Cependant, dans notre cas seP
compose des deuxs
et\0
donc cela nécessiterait normalement des parenthèses:(s\0)#
(car la priorité de#
est trop élevée). Mais Grime a une fonctionnalité vraiment intéressante où vous pouvez modifier la priorité des opérateurs avec^
etv
. Donc, en utilisantv#
nous réduisons#
la priorité de sorte qu'elle soit inférieure à celle de tout autre opérateur (y compris la concaténation), ce qui nous permet de sauvegarder un octet sur les parenthèses.la source
Pip , 12 octets
Prend le tableau comme argument de ligne de commande dans la forme de repr de Pip, comme
[1;[2;3]]
. Retourne1
pour véridique,0
pour falsey. Essayez-le en ligne ou vérifiez tous les cas de test .Explication
Réponse bonus, 12 octets
Voici une fonction qui prend une liste à la place:
TIO
la source
Röda ,
5944 octetsEssayez-le en ligne!
f
prend l'entrée de son flux comme une liste qui peut contenir d'autres listes et entiers. Il revient1
sia
est véridique et rien d'autre. La fonction d'assistanceg
vérifie sia
contient des zéros.Explication:
Une solution qui utilise des expressions rationnelles pourrait très probablement être plus courte.
Cette réponse aurait pu être plus courte si elle avait été autorisée à renvoyer plusieurs valeurs. Cela a été discuté dans l' une de mes réponses auparavant, et il a été conclu qu'il est autorisé dans les règles par défaut de renvoyer différentes valeurs de vérité et de fausse pour différentes entrées, mais pour une raison quelconque, OP l'interdit ici et là. :(
la source
Wonder , 15 octets
Usage:
Aplatissez l'entrée, obtenez toutes les occurrences de 0, NON logique, ET logique avec entrée.
la source
Haskell , 62 octets
Essayez-le en ligne!
Ceci est une fonction
String -> Bool
. Les listes de Haskell sont hétérogènes, il n'y a donc aucun moyen intégré de représenter des listes comme[0, [0]]
.la source
,
pour ``.Python 2 ,
45 3938 octetsEssayez-le en ligne!
-6 grâce à @BenFrankel
version précédente, sans convertir la liste en chaîne repr, 68 octets:
la source
[]
. Ce qui suit enregistre 6 octets et réussit[]
:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
MATLAB, 49 octets
Comme MATLAB (ainsi qu'Octave) n'autorise pas ce type de tableaux imbriqués, nous l'interprétons comme une chaîne.
Tout d'abord, nous remplaçons tous les caractères non numériques par un espace. Ensuite, nous utilisons
str2num
pour le convertir en un tableau (1D), sur lequel nous pouvons appliquerall
(ce qui est autorisé, car il ne résout pas complètement cette tâche par lui-même.)la source
egrep, 7 + 3 = 10 octets
+3 octets pour le requis
-v
indicateur pour inverser le résultat.Grep n'a pas de concept de tableaux, donc cela utilise une représentation sous forme de chaîne comme indiqué dans la question. Prend l'entrée sur une ligne de stdin, retourne via le code de sortie (ignore stdout).
(Maintenant, en utilisant une version qui ne tient pas compte
01
et similaire, car la parole de Dieu est que c'est OK)Entrée bash / grep d'origine:
Trouve
0
s n'importe où (en utilisant le mot vérification des limites\<
et\>
pour actualiser des choses comme10
oua1
), ou une correspondance de chaîne entière[]
, puis inverse la correspondance.Panne:
la source
\<0\|^.]
plus-v
compterait comme une solution de 11 octets.egrep
plutôt quegrep
de sauvegarder un octet supplémentaire; le nom de la langue ne compte pas dans le décompte d'octets!)Javascript ES6, 24 caractères
Fonctionne avec tableau, renvoie
1
ou0
:Tester:
la source
!!
(though then you must change&
to&&
). Saves one byte.&
. In case of&&
without!!
consistent output will be broken:undefined
for[]
,0
for[0]
and[0,1,2]
andfalse
for others.&&
is that you would need to if you take my first suggestion, since2 & 1 == 0
.√ å ı ¥ ® Ï Ø ¿ ,
124 bytesExplanation
If result needs to be outputted ...
Previous solution
I had posted this before realising that stack based languages could leave the value on the stack as a form of output
Explanation
la source
Haskell, 45
As Lynn and xnor remarked, Haskell does not come with a heterogeneously-nested list type. But it's easy to add them as a custom data type and let the function operate on that type, and this is much preferrable to operating on (urgh!) strings.
To actually be able to write out such lists as literals with
[1, [2]]
syntax, you also need some typeclass fu. Full test case:Try it online!
la source
Vim, 23 bytes
Try it online!
Outputs an empty string for false, or
1
for true. This could be shorter if I can output an empty string or[]
for false (both of which are falsy values in vim).la source
Stacked, 20 bytes
Try it online!
Alternatively, using a string:
Try it online!
la source
Lithp, 74 bytes
Try it online!
Well, this turned out longer than I'd hoped. The
[]
case tripped me up and added a few bytes. It simply flattens the list and does a fold left over it, and if it finds a 0 it sets the accumulator to 0.la source
Ruby,
2422 bytesTry it online!
Yes I know there's a better solution in Ruby but I wanted to find one taking the array in input instead of a string.
la source
tinylisp,
7064 bytesThe last line is an unnamed lambda function that takes a list and returns
1
for "truthy-under-Ȧ" and0
for falsey. Try it online!Ungolfed
The recursive helper function
_Ȧ
does most of the work. If its argument is a list, wemap
_Ȧ
to its elements and return1
if they areall
truthy,0
if any are falsey. (Conveniently,all
returns1
when given the empty list.) Otherwise, the argument must be an integer; we return it as-is (0
is falsey and all other integers are truthy in tinylisp).The main function
Ȧ
checks if the list is nonempty. If so, it calls_Ȧ
; if not, it returns0
.The golfed version takes advantage of some undefined behavior: rather than using
(e(type X)List)
to test whetherX
is an integer or a list, it does(c()X)
, which attempts tocons
(prepend) the empty list ontoX
. IfX
is a list, this results in a nonempty list, which is truthy. IfX
is an integer, tinylisp outputs an error message and returns an empty list, which is falsey. Since stderr is ignored, this approach is valid.la source
PHP,
6354 bytes9 bytes saved by @user63956
takes an array as input; returns
true
orfalse
: If$a
is not empty,check if
print_r
output contains a0
value.array solution, 83 bytes
recursive function returns
1
or0
.breakdown
la source
strpos(print_r($a,1)," 0")
instead ofpreg_match(...)
.print_r
parameter. Great!