Imaginez que vous ayez un tableau d'entiers, dont les valeurs non négatives sont des pointeurs vers d'autres positions dans le même tableau, seulement que ces valeurs représentent des tunnels, donc si la valeur en position A est positive et pointe vers la position B, alors la valeur en position B doit également être positif et pointer vers la position A pour représenter les deux extrémités du tunnel. Donc:
Défi
- Étant donné un tableau d'entiers, vérifiez si le tableau est conforme à la restriction d'être un tableau de tunnellisation et renvoyez deux valeurs distinctes et cohérentes pour truey et falsey.
- Les valeurs dans le tableau seront inférieures à zéro pour les positions non tunnel et à zéro ou supérieures pour les positions tunnel. Si votre tableau est indexé sur 1, la valeur zéro représente une position non tunnel. Les valeurs non tunnel n'ont pas besoin d'être vérifiées.
- Si une valeur positive dans une cellule pointe vers elle-même, c'est une falsey. Si A pointe vers B, B vers C et C vers A, c'est une falsey. Si une valeur positive pointe au-delà des limites du tableau, c'est une falsey.
Exemples
Les exemples suivants sont indexés 0:
[-1, -1, -1, 6, -1, -1, 3, -1, -1] Truthy (position 3 points to position 6 and vice versa)
[1, 0] Truthy (position 0 points to position 1 and vice versa)
[0, 1] Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1] Truthy
[2, 3, 0, 1] Truthy
[1, 2, 0] Falsey (no circular tunnels allowed)
[-1, 2, -1] Falsey (tunnel without end)
[] Truthy (no tunnels, that's OK)
[-1, -2, -3] Truthy (no tunnels, that's OK)
[1, 0, 3] Falsey (tunnel goes beyond limits)
[1] Falsey (tunnel goes beyond limits)
[1, 0, 3, 7] Falsey (tunnel goes beyond limits)
C'est du code-golf , alors le code le plus court pour chaque langue peut gagner!
[0]
?[0,1]
et[0,-1,2]
donner?[0,1]
est dans les exemples. "Si une valeur positive dans une cellule pointe vers elle-même, c'est une falsey"[2,3,0,1]
Réponses:
R , 47 octets
Essayez-le en ligne!
Code déroulé et explication:
la source
Python 2 ,
666160 octetsEssayez-le en ligne!
la source
APL (Dyalog Unicode) ,
1924 octetsEssayez-le en ligne!
Préfixe lambda anonyme, renvoyant 1 pour la vérité et 0 pour la fausse. Le lien TIO contient une version "prettified" de la sortie pour les cas de test.
Shoutouts à @ngn et @ Adám pour avoir économisé environ un milliard d'octets.
Un remerciement supplémentaire à @ngn pour l'aide à fixer la réponse pour certains cas de test et à en faire un train.
La réponse mise à jour utilise
⎕IO←0
, définissant le I ndex O rigin à 0.Comment:
la source
0<
→×
Je penseJavaScript (ES6), 35 octets
1 octet enregistré grâce à @Shaggy
Essayez-le en ligne!
Commenté
la source
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 octets
Essayez-le en ligne!
la source
Gelée , 16 octets
Essayez-le en ligne!
1 indexé.
la source
Perl 6 , 36 octets
Essayez-le en ligne!
L'idée de base est de vérifier si l'ensemble
{ i, a[i], a[a[i]] }
contient exactement deux éléments distincts pour chaque indexi
aveca[i] >= 0
. Si un élément pointe vers lui-même, l'ensemble ne contient qu'un seul élément distinct. Si l'autre extrémité ne pointe pas versi
, l'ensemble contient trois éléments distincts. Sia[i] < 0
lexx
facteur est nul ou négatif, l'ensemble l'est{ i, a[i] }
aussi, avec deux éléments distincts.la source
MATL ,
1918 octets-1 octet grâce à Luis
Essayez-le en ligne! , pour le premier seulement, car je ne sais pas comment les faire tous!
Donne
0
si véridique, un entier non nul si falsey, par exemple. pour le cas de test 6 donne4
.N'oubliez pas que, comme MATLAB, MATL est indexé 1, donc 1 doit être ajouté aux cas de test!
Jamais joué au golf dans un Esolang auparavant, donc les conseils ont été grandement reçus!
Expliqué:
la source
05AB1E ,
161514 octets-1 octet grâce à @Dorian .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
ε
avecy
. Donc pas besoin de©
, et chacun®
remplacé pary
Japt
-e
, 11 octetsEssayez-le
Original (sans indicateur),
1413 octetsEssayez-le ou exécutez tous les cas de test
la source
Python,
112979686 octetsEssayez-le en ligne!
Retour
True
ouFalse
.-10 octets grâce à @Rod et @TFeld.
la source
K (ngn / k) , 33 octets
Essayez-le en ligne!
la source
Haskell , 48 octets
Vérifiez tous les cas de test!
Explication
Détruisons d'abord un peu le code. Comme
f =<< g
c'est le même que\x -> f (g x) x
, le code est équivalent àce qui est un peu plus clair.
Cette solution est basée sur une observation simple:
a
soit le tableau d'entrée, etu
la liste des paires(i, a[i])
où sei
trouve un index. Ensuitea
est un tableau valide si et seulement si pour tout(x, y)
dansu
avecy >= 0
, la paire(y, x)
appartientu
aussi.la source
Java (JDK) , 89 octets
Essayez-le en ligne!
Crédits
la source
r
et sortir de la boucle comme iciFusain , 22 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Sorties
-
pour la vérité et rien pour la fausse. Remarque: Saisie d'un tableau vide semble planter du charbon de bois, mais pour l'instant, vous pouvez entrer un espace à la place, qui est assez proche. Explication:la source
Pascal (FPC) ,
165155153 octetsEssayez-le en ligne!
Fait fonctionner cette fois parce que l'entrée est un tableau. Retourne
1
pour véridique et0
pour falsey.la source
Nettoyer , 60 octets
Essayez-le en ligne!
Nettoyer , 142 octets
Version monstre extrêmement compliquée:
Essayez-le en ligne!
Expliqué:
la source
Rubis , 44 octets
Essayez-le en ligne!
la source
Pyth ,
1716 octetsEssayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
Edit: réalisé que le k de fin était également inutile
la source
Groovy , 52 octets
Essayez-le en ligne!
la source
Perl 5 , 54 octets
Essayez-le en ligne!
la source
C (gcc) , 95 octets
Essayez-le en ligne!
la source
Mathematica, 42 octets
Fonction pure. Prend une liste de nombres indexés 1 comme entrée et retourne
True
ouFalse
comme sortie. Suit juste les tunnels, s'assurant que les0
cartes0
ne correspondent à aucun cycle 1 et que tous les cycles sont à 2 cycles. (Je ne suis pas tout à fait sûr que cela échoue dans les cas de bord, mais cela donne les résultats corrects pour les exemples.)la source
Cette réponse ne fonctionne pas. Ici à des fins d'illustration uniquement.
Cette réponse passe tous les cas de test (actuellement) publiés. Cependant, il échoue (déclenche une erreur) sur une autre entrée valide, telle que
[1, 2]
ou[1, 0, 3, 7]
.Comment pourrait-il passer
[1, 0, 3]
et échouer[1, 0, 3, 7]
? Eh bien, il passe par la liste, comme vous vous en doutez. Lorsqu'il lit un élémentx
de la listea
, il vérifie d'abord s'ilx
est inférieur àlen(a)
, et retourne immédiatementFalse
, si c'est le cas. Donc , il retourne correctementFalse
sur[1, 0, 3]
, parce que3
n'est pas moinslen(a)
.Mais en supposant que
x
cette vérification soit réussie, le code continuera ensuite à faire d'autres vérifications, et à un certain moment, il se trouvera à évaluera[a[x]]
. Nous avons déjà garanti que l'évaluationa[x]
sera OK ... mais pasa[a[x]]
, ce qui résouta[7]
quandx
est3
dans l'[1, 0, 3, 7]
exemple. À ce stade, Python soulève unIndexError
, plutôt que de revenirFalse
.Pour être complet, voici la réponse.
Python 2 , 59 octets
Essayez-le en ligne!
Je voulais le faire
x<len(a)and-1<a[x]...
, mais bien sûr,len(a)
c'est toujours le cas>-1
, donc ce qui précède est équivalent. Ce contrôle est un total de 5 relations (enchaînées<
,>
,<
,!=
et==
), plus un chèque séparé-1<x
dans laif
condition.Python court-circuite (commodément) les relations enchaînées comme celle-ci, donc par exemple si
x>=len(a)
le chèque revientFalse
avant d'arriver àa[x]
(ce qui autrement déclencherait unIndexError
).la source