introduction
Supposons que vous ayez une règle avec des nombres de 0 à r-1 . Vous placez une fourmi entre deux des nombres et elle commence à ramper de manière erratique sur la règle. La règle est si étroite que la fourmi ne peut pas marcher d'une position à une autre sans marcher sur tous les chiffres entre les deux. Lorsque la fourmi découvre un numéro pour la première fois, vous l’enregistrez, ce qui vous donne une permutation des nombres r . Nous disons qu'une permutation est angoissante si elle peut être générée de cette manière par une fourmi. Alternativement, une permutation p est antsy si chaque entrée p [i] sauf la première est à une distance de 1 d'une entrée précédente.
Exemples
La permutation de longueur 6
4, 3, 5, 2, 1, 0
est antsé, parce que 3 est dans la distance 1 de 4 , 5 est dans la distance 1 de 4 , 2 est dans la distance 1 de 3 , 1 est dans la distance 1 de 2 , et 0 est dans la distance 1 de 1 . La permutation
3, 2, 5, 4, 1, 0
n'est pas nerveux, car 5 n'est pas à la distance 1 de 3 ou 2 ; la fourmi devrait passer par 4 pour arriver à 5 .
La tâche
Étant donné une permutation des nombres de 0 à r-1 pour quelque 1 ≤ r ≤ 100 dans un format raisonnable, donne une valeur de vérité si la permutation est antsy, et une valeur de fausseté sinon.
Cas de test
[0] -> True
[0, 1] -> True
[1, 0] -> True
[0, 1, 2] -> True
[0, 2, 1] -> False
[2, 1, 3, 0] -> True
[3, 1, 0, 2] -> False
[1, 2, 0, 3] -> True
[2, 3, 1, 4, 0] -> True
[2, 3, 0, 4, 1] -> False
[0, 5, 1, 3, 2, 4] -> False
[6, 5, 4, 7, 3, 8, 9, 2, 1, 0] -> True
[4, 3, 5, 6, 7, 2, 9, 1, 0, 8] -> False
[5, 2, 7, 9, 6, 8, 0, 4, 1, 3] -> False
[20, 13, 7, 0, 14, 16, 10, 24, 21, 1, 8, 23, 17, 18, 11, 2, 6, 22, 4, 5, 9, 12, 3, 15, 19] -> False
[34, 36, 99, 94, 77, 93, 31, 90, 21, 88, 30, 66, 92, 83, 42, 5, 86, 11, 15, 78, 40, 48, 22, 29, 95, 64, 97, 43, 14, 33, 69, 49, 50, 35, 74, 46, 26, 51, 75, 87, 23, 85, 41, 98, 82, 79, 59, 56, 37, 96, 45, 17, 32, 91, 62, 20, 4, 9, 2, 18, 27, 60, 63, 25, 61, 76, 1, 55, 16, 8, 6, 38, 54, 47, 73, 67, 53, 57, 7, 72, 84, 39, 52, 58, 0, 89, 12, 68, 70, 24, 80, 3, 44, 13, 28, 10, 71, 65, 81, 19] -> False
[47, 48, 46, 45, 44, 49, 43, 42, 41, 50, 40, 39, 38, 51, 37, 36, 52, 35, 34, 33, 32, 53, 54, 31, 30, 55, 56, 29, 28, 57, 58, 59, 60, 27, 26, 61, 25, 62, 63, 64, 65, 66, 67, 24, 23, 22, 21, 68, 69, 20, 19, 18, 17, 70, 71, 16, 15, 72, 73, 74, 75, 76, 14, 13, 12, 77, 11, 10, 9, 8, 78, 7, 79, 80, 6, 81, 5, 4, 3, 82, 2, 83, 84, 1, 85, 86, 87, 0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] -> True
Anecdote: pour r ≥ 1 , il existe exactement 2 r-1 permutations antsy de longueur r .
Réponses:
Pyth, 7 octets
Essayez-le en ligne. (Seuls les petits cas de test sont inclus en raison du temps d'exécution exponentiel.) Sorties 2 pour Truthy, 0 pour Falsey.
En d'autres termes,
où
subseq
sorties indique si les éléments de la première liste apparaissent dans l’ordre dans la deuxième liste, pas nécessairement adjacents. Lesubseq
est fait en Pyth en prenant tous les sous-ensembles de la deuxième liste, qui gardent l'ordre des éléments, et en comptant le nombre d'occurrences de la première liste. Cela prend du temps exponentiel.Pourquoi ça marche? Pour qu'une permutation soit angoissante, passer de 0 à n-1 doit consister à aller uniquement à gauche, puis à droite. En effet, les éléments supérieurs au premier élément doivent augmenter de gauche à droite et ceux inférieurs à celui-ci doivent diminuer de gauche à droite.
Si nous reflétons la liste en plaçant une copie inversée à sa gauche, cette marche ne va plus que vers la droite.
Inversement, toute droite de cette liste miroir correspond à une marche gauche puis droite de la liste d'origine. Ce vers la droite est juste une sous-séquence triée de 0 à n-1. Dans une liste antsy, cette sous-séquence triée est unique, à l'exception d'un choix arbitraire entre les deux copies adjacentes du premier élément d'origine.
la source
Haskell, 46 octets
Vérifie si la différence vectorielle des maxima et des minima est de [0,1,2,3 ...].
Zgarb a sauvegardé 2 octets avec
(%)=scanl1
.la source
(#)=scanl1
?JavaScript (ES6), 45
Je pensais que c'était trop simple pour avoir besoin d'explication, mais il y a une astuce, et juste au cas où, voici ma première version, pre-golf
Remarque: le code golfé
a
est utilisé à la place dek
, car je n'ai pas besoin de faire référence au tableau d'origine dans l'every
appel. J'évite donc de polluer l'espace de noms global en réutilisant le paramètreTester
la source
f=([q,...a],x=[])=>x&&(x[q]=!(x+x)|x[q+1]|x[q-1])&&(a+a?f(a,x):1)
Python 2, 49 octets
Vérifie si chaque préfixe de la liste contient tous les nombres compris entre min et max inclus. Pour ce faire, vérifiez si la différence entre max et min est inférieure à sa longueur.
54 octets:
Vérifie si le dernier élément est inférieur de un au minimum des autres éléments ou d'un de plus à leur maximum. Ensuite, supprime le dernier élément et revient. Sur une liste à un seul élément, renvoie True.
Cela peut également être vérifié via une liste amusante mais plus longue.
J'aimerais utiliser l'inégalité
min(l)-2<l.pop()<max(l)+2
, mais lespop
besoins doivent être d'abord. L'utilisation d'un programme pour générer un code d'erreur serait probablement plus courte.la source
Mathematica, 42 octets
Utilise la correspondance de modèle pour essayer de trouver un préfixe
a
dont la différence maximale par rapport à l'élément suivantb
est supérieure à1
(et inversant le résultat deMatchQ
).la source
Perl,
393835 octetsComprend +1 pour
-p
Donner séquence sur STDIN:
antsy.pl
:la source
MATL , 11 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Ceci calcule une matrice de toutes les différences absolues par paires et conserve la partie triangulaire supérieure. Le résultat est true dans la mesure où il existe au moins une valeur 1 dans toutes les colonnes, sauf la première.
la source
R,
726460 octetsUne permutation est angoissée si et seulement si toutes ses sous-permutations de gauche sont continues (c'est-à-dire qu'elles ont une différence lorsqu'elles sont triées).
S'il est garanti que l'entrée a plus d'une longueur, nous pouvons remplacer1:sum(1|v)
parseq(v)
, ce qui économise quatre octets.La
seq(v)
condition dans le si se comporte différemment lorsque l'entrée est de longueur un - elle génère la séquence à la1:v
place deseq_along(v)
. Cependant, heureusement, la sortie s'avère êtreTRUE
dans ce cas, ce qui est le comportement souhaité. Il en va de même pour les entrées de longueur nulle.Dans R,
T
une variable prédéfinie est égale àTRUE
(mais R vous permet de la redéfinir).TRUE
est également réputé être égal à1
.Merci à @Billywob pour certaines améliorations utiles apportées à la solution d'origine.
la source
scan
permettrait d’économiser deux octets. Dans ce cas, il s'agit exactement du même nombre d'octets que l'for
approche en boucle:v=scan();c=c();for(i in 1:sum(1|v))c=c(c,diff(sort(v[1:i])));all(c==1)
ce qui serait 2 octets plus court que votre approche vectorisée.T
. Va éditer.05AB1E , 7 octets
Essayez-le en ligne! ou en tant que suite de tests modifiée .
Explication
Utilise le processus décrit par xnor dans sa brillante réponse Pyth .
Renvoie 2 pour les instances de vérité et 0 pour la fausseté.
la source
Perl, 63 octets
Notez que @Gabriel Banamy a fourni une réponse plus courte (55 octets) . Mais je pense que cette solution est toujours intéressante, alors je la poste.
Le nombre d'octets comprend 62 octets de code et d'
-n
indicateur.Pour l'exécuter:
Brèves explications : convertit chaque nombre
k
en représentation unaire dek+1
(+1
nécessaire pour0
ne pas les ignorer). Ensuite, pour chaque numérok+1
(exprimé en unary as1(1*)
), nous regardons sik
($1
holdk
) ouk+2
(qui est alors11$1
) sont présents dans la chaîne précédente (référencée par$-backtick
). Si non, alors nous mettons$.
à zéro. À la fin, nous imprimons$.
ce qui sera1
si nous ne le fixons jamais à zéro, ou zéro sinon.la source
Brain-Flak
302 264256 octetsMerci à Wheat Wizard pour la sauvegarde de 46 octets
Le sommet de la pile sera 1 pour la vérité et 0 pour la fausseté.
Truthy: Essayez-le en ligne!
Falsy: essayez-le en ligne!
L'idée est de contenir les nombres minimum et maximum que la fourmi a visités dans la pile. Ensuite, comparez chaque nombre aux deux et mettez à jour le nombre approprié. Si le nombre suivant n'est pas inférieur au minimum ou inférieur de 1 au maximum, sortez de la boucle et renvoyez false.
Brève explication:
la source
([]){({}[()]<({}<>)<>>)}{}
avec([]){{}({}<>)<>([])}{}
pour enregistrer quelques octets supplémentairesGelée ,
987 octetsEssayez-le en ligne!
Une traduction en gelée de la réponse de xnor.
Anciennes solutions:
Essayez-le en ligne!
Fonctionne de manière très similaire à ma réponse Pyth ci-dessous:
la source
»\_«\⁼Ṣ
mais est beaucoup plus efficaceŒBŒPċṢ
et;\Ṣ€IỊȦ
devrait économiser un octet dans chaque approche.UŒBŒPċṢ
ce qui ne sauvegarde aucun octet. LeỊ
est bien, cependant; J'avais mal interprété cet atome pour sortir le NON logique de ce qu'il a réellement fait.U
(ou du@
maintenant que j'y pense). Si un tableau est perturbé, le tableau inversé l'est aussi.[2, 1, 3, 0]
est antsy mais[0, 3, 1, 2]
n'est pas.CJam (
21 à20 octets)Suite de tests en ligne
Dissection
Ceci utilise l'observation de xnor dans sa réponse de Haskell selon laquelle la différence entre le maximum et le minimum des premiers
n
éléments devrait êtren-1
.Approche alternative (également 20 octets)
Suite de tests en ligne
Ceci vérifie directement que chaque élément après le premier est à la distance 1 d'un élément précédent. Comme l'entrée est une permutation et ne répète donc pas les valeurs, il s'agit d'un test suffisant. Merci à Martin pour une économie de 1 octet.
Dissection
la source
{_{a+_)f-:z1&,*}*^!}
Java,
100987975 octetsAnciennement:
Sauvegardé 3 octets en remplaçant
true
etfalse
avec1>0
et0>1
.23 octets sauvés grâce aux excellentes suggestions de Peter Taylor!
Ungolfed:
Gardez une trace des valeurs les plus élevées et les plus basses observées jusqu'à présent
m
etn
; n'accepter une nouvelle valeur que si c'estm + 1
oun - 1
c'est-à-dire la prochaine valeur supérieure ou inférieure; initialisez la valeur hautem
, à un moins que le premier élément, de sorte qu'elle "corresponde" la première fois autour de la boucle. Remarque: il s'agit d'un algorithme en ligne à temps linéaire. Il ne nécessite que trois mots de mémoire, pour les valeurs actuelles, les plus élevées jusqu'à présent et les moins élevées jusqu'à présent, contrairement à beaucoup d'autres solutions.Si la valeur suivante omet les extrémités haute et basse de la plage, la valeur la plus basse jusqu'à présent est définie sur
-1
et l'extrémité inférieure ne peut jamais continuer et atteindre zéro. Nous détectons ensuite une séquence antsy en vérifiant si la valeur bassen
atteint zéro.(Malheureusement, cela est moins efficace car nous devons toujours regarder la séquence entière plutôt que de casser après le premier numéro erroné , mais il est difficile de discuter avec une économie de 23 octets (!) Lorsque d’autres solutions utilisent O (n ^ 2 ) et approches temporelles exponentielles.)
Usage:
Remarque: ceci peut également être écrit sans tirer parti de Java 8 lambdas:
Java 7, 89 octets
la source
int m,n;m=n=a[0];--m;
pourrait êtreint n=a[0],m=n-1;
, et le cherreturn
etelse
pourrait être réduit aveci==m+1?m++:n=(i==n-1)?i:-1;return n==0;
(ou quelque chose de similaire - je n'ai pas testé cela).m++
oum+=1
là-bas, j'ai donc toujours besoin d'unif
et d'unelse
, et il perd l'aspect de court-circuit sur la première mauvaise valeur, mais c'est une grosse amélioration. Merci!j
et lui attribuer le résultat, mais pensez qu'il y aurait une meilleure façon de le faire.g
, et je n'ai pas réussi à la faire fonctionner. (J'utilise Java 9-ea + 138, c'est peut-être une différence entre Java 8 et Java 9?) Je pourrais réessayer demain.n-=i==m+1?m-m++:i==n-1?1:n+1;
Pyth ( fourche ), 13 octets
Pas de lien Try It Online pour ce fork de Pyth. Le fork inclut la fonction deltas
.+
, qui ne fait pas partie de la bibliothèque Pyth standard.Explication:
la source
Perl,
6654 +1 = 55 octets+1 octet pour
-n
.Explication:
Imprime 0 si faux, 1 si vrai.
-11 octets grâce à @Dada
la source
perl -nE 's/\d+/$.&=!@a||1~~[map{abs$_-$&}@a];push@a,$&/eg;say$.'
:-n
au lieu de<>=~
ce qui vous permet de vous débarrasser du/r
modificateur. utiliser\d+
et puis$&
au lieu de(\d+)
et$1
.!@a
au lieu de0>$#a
.$.&=
au lieu de$.&&=
.push@a,$&
au lieu de@a=(@a,$&)
Brainfuck, 60 octets
La permutation est donnée sous forme d'octets sans séparateurs ni saut de ligne. Puisque
\x00
se produit dans l'entrée, ceci est conçu pour les implémentations avecEOF = -1
. La sortie est\x00
pour false et\x01
pour true.Si une permutation de
\x01
jusqu'àchr(r)
est autorisée, nous pouvons remplacer toutes les occurrences de,+
avec,
un score de 57 avec uneEOF = 0
implémentation.Essayez-le en ligne (version à 57 octets): l’entrée peut être donnée sous forme de permutation de toute plage d’octets contigus à l’exclusion
\x00
, et le résultat sera\x00
pour false et le minimum de l’étendue pour true.Nous gardons une trace des min et max vus jusqu'ici, et pour chaque caractère après le premier, vérifions s'il s'agit de min-1, max + 1 ou aucun. Dans le cas de ni l'un ni l'autre, déplacez le pointeur en dehors de l'espace de travail normal afin que les cellules locales deviennent zéro.
La disposition de la mémoire de l’espace de travail normal au début de la boucle principale est
c a b 0 0
où
c
est le caractère actuel,a
est min etb
max. (Pour la version à 60 octets, tout est traité avec un décalage de 1 à cause de,+
.)la source
Brachylog , 22 octets
Essayez-le en ligne!
Explication
Je n'ai pas trouvé de moyen concis de vérifier si une liste contient des entiers consécutifs ou non. Le plus court que j'ai trouvé est de générer une plage entre le premier et le dernier élément de cette liste et de vérifier que cette plage est la liste d'origine.
la source
1
. Je ne sais pas à quel point c'est facile dans Brachylog.Lot, 133 octets
Prend l'entrée en tant qu'argument de ligne de commande. Quitte avec le niveau d'erreur 0 en cas de succès, 1 en cas d'échec.
la source
J, 14 octets
Ceci est basé sur la méthode de @ xnor .
Explication
la source
Java, 170 octets
Array
x
a des valeurs allant de 0 au nombre maximum dans l'ordre (Python serait beaucoup mieux ici ...). La boucle revient en arrière en essayant de faire correspondre le nombre le plus bas (x[b]
) ou le plus élevé (x[e]
) non encore rencontré; si c'est le cas, ce nombre pourrait être atteint à cette étape.Code de test ici .
la source
Mathematica, 47 octets
Un peu plus long que la solution de Martin Ender (surprise surprise!). Mais c’est l’un de mes efforts les plus illisibles, alors c’est bien: D
Explication:
la source
Java 7,
170169 octetsUngolfed & code de test:
Essayez ici.
Sortie:
la source