Présentation
Certains d'entre vous connaissent peut-être la séquence de Kolakoski ( A000002 ), une séquence autoréférentielle bien connue qui a la propriété suivante:
C'est une séquence contenant seulement 1 et 2, et pour chaque groupe de 1 et de deux, si vous additionnez la longueur des pistes, elle est égale à elle-même, seulement la moitié de la longueur. En d'autres termes, la séquence de Kolakoski décrit la longueur des séquences de la séquence elle-même. C'est la seule séquence qui fait cela, sauf pour la même séquence avec le 1 initial supprimé. (Cela n'est vrai que si vous vous limitez aux séquences composées de 1 et 2 - Martin Ender)
Le défi
Le défi est, étant donné une liste d'entiers:
- Sortie
-1
si la liste n'est PAS un préfixe de travail de la séquence de Kolakoski. - Affiche le nombre d'itérations avant que la séquence ne devienne
[2]
.
L'exemple élaboré
En utilisant l'image fournie comme exemple:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Par conséquent, le nombre résultant est 8
pour une entrée de [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
convient également si vous effectuez une indexation 1.
La suite de tests (vous pouvez également tester avec des sous-itérations)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Si vous êtes confus:
Truthy: Il atteindra finalement deux sans aucune étape intermédiaire ayant d'autres éléments que 1
et 2
. -Einkorn Enchanter 20 hours ago
Faux: la valeur de fin ne l'est pas [2]
. Les termes intermédiaires contiennent autre chose que quelque chose de l'ensemble [1,2]
. Quelques autres choses, voir des exemples.
C'est le code-golf , le nombre d'octets le plus bas sera le vainqueur.
-1
?[2]
lorsque j'ai vu le[2,2,1,1,2,1,2]
cas de test.1
et2
.[1]
comme cas de test.Réponses:
Haskell ,
12687797675 octets39 octets économisés grâce à Ørjan Johansen
Essayez-le en ligne!
Cette erreur sur une mauvaise entrée.
la source
f
(et par conséquent!
) peut être beaucoup raccourci en utilisant la production différée +span
/length
au lieu des accumulateurs. Essayez-le en ligne![1]
import Data.List;f l=length<$>group l
. (<$>
est un synonyme pourmap
ici.) De plus, au lieu d'avoir deux-1
cas différents , il est plus court d'utiliser un@(_:_:_)
modèle pour forcer le cas principal à ne correspondre qu'à la longueur> = 2 listes. Essayez-le en ligne!05AB1E , 22 octets
Essayez-le en ligne!
Explication
la source
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Caractères, 290 (282?) Octets
Ça m'a pris tellement de temps ... Mais j'ai enfin fini!
avec ce code:
Je ne sais pas si je dois compter le
var u=t
dans les octets, étant donné que je ne l'utilise past
pendant l'algorithme (la copie est juste pour obtenir un modifiablevar
au lieu du paramètret
considéré commeval
- merci ScaLa ). Veuillez me dire si je dois le compter.Assez dur. Essayez-le en ligne!
PS: je pensais le faire récursivement, mais je vais devoir passer un compteur comme paramètre de la vraie "sous-fonction" récursive; ce fait me fait déclarer deux fonctions, et ces caractères / octets ne sont que perdus.
EDIT: J'ai dû changer (?) Parce que nous ne sommes pas sûrs que nous devrions prendre en compte le
[1]
cas. Donc , voici le code modifié:Ce n'est pas optimisé (j'ai un "out" en double pour les mêmes conditions: quand j'arrive
[2]
et quand param est[2]
est traité séparément).NOUVEAU COÛT = 342 (je n'ai pas modifié le titre exprès)
la source
[1]
[2]
"[1]
n'atteint jamais[2]
et devrait donc retourner -1 .JavaScript,
146142 octetsPremier essai en code golf, il semble que le "retour" dans la fonction plus grande soit assez fastidieux ...
De plus, la vérification de b = 1 et b = 2 prend quelques octets ...
Voici le code:
Explication
Données de test (en utilisant les données de test fournies)
Édition 1: 146 -> 142: révoquer mon édition sur la réduction des octets, car cela affecte la sortie; et quelques modifications sur la dernière déclaration
la source
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
enregistre 5 octets (pour la boucle au lieu de while; virgules vs accolades; && vs si). Vous pouvez utiliser le compilateur de fermeture (de Google closure-compiler.appspot.com pour obtenir ces Optimisations fait pour vous)Gelée ,
2625222120 octetsEssayez-le en ligne!
Ce code ne fonctionnait pas correctement avant 20 octets et je n'ai même pas remarqué; il échouait sur le
[2,2]
cas de test. Devrait fonctionner parfaitement maintenant.la source
JavaScript (ES6),
1271269580 octets0 indexé. Jette
"ReferenceError: X is not defined"
et"InternalError: too much recursion"
sur une mauvaise entrée.Cas de test
Afficher l'extrait de code
la source
Clojure, 110 octets
Un basique
loop
avec un pré-contrôle des boîtiers de bord. Renvoienil
les entrées non valides. Je ne savais pas(= [2] '(2))
c'esttrue
: ola source
Python 2, 146 octets (fonction uniquement)
Renvoie 0 sur l'entrée falsifiée (ok car il est indexé 1). Utilisez-le simplement comme ceci:
la source
Mathematica, 82 octets
Function
qui remplace à plusieurs reprises{2}
par le symbole non définiT
, une liste de (un ou plusieurs)1
s et2
s avec l'itération suivante, et toute autre chose0
jusqu'à ce qu'un point fixe soit atteint, puis renvoieFirstPosition
le symboleT
dans leFixedPointList
moins résultant1
. La sortie est{n}
oùn
est le nombre (1
-indexé) d'itérations nécessaires pour atteindre{2}
le cas véridique et-1+Missing["NotFound"]
le cas falsifié.Si la sortie doit être
n
plutôt que{n}
, cela coûte trois octets de plus:la source
Python 2 ,
184163156octetsPython 2 , 156 octets
Essayez-le en ligne!
Explication:
la source
Gelée , 17 octets
Essayez-le en ligne!
la source
Python 2 , 122 octets
Essayez-le en ligne!
Python 3 , 120 octets
Essayez-le en ligne!
Explication
Une nouvelle séquence (w) est initialisée pour stocker la prochaine itération de la réduction. Un compteur (c) est initialisé pour garder une trace du nombre d'itérations.
Chaque élément de la ou des séquences d'origine est comparé à la valeur précédente. S'ils sont identiques, la valeur du dernier élément de (w) est augmentée de 1. S'ils sont différents, la séquence (w) est étendue avec [1].
Si w == [2], le compteur (c) est retourné. Sinon, si la ou les séquences d'origine contiennent d'autres éléments que 1 et 2, une valeur -1 est renvoyée. Si ce n'est pas le cas, la fonction est appelée récursivement avec la nouvelle séquence (w) as (s) et le compteur (c) augmenté de 1.
la source
def f(s,c=2,j=0,w=[1]):
, mais cela donne un résultat différent. Quelqu'un pourrait-il expliquer pourquoi?R, 122 octets
Réussit tous les cas de test. Lance une ou plusieurs erreurs sinon. Je déteste les contrôles de validité; ce code aurait pu être si golfé si les entrées étaient belles; il serait plus court même si l'entrée était une séquence de 1 et de 2, pas nécessairement un préfixe de la séquence de Kolakoski. Ici, nous devons vérifier à la fois le vecteur initial (sinon le cas de test
[-2,1]
) aurait réussi) et le vecteur résultant (sinon[1,1,1]
aurait réussi).la source
Rubis ,
8177 octetsEssayez-le en ligne!
Modifier: enregistré 4 octets en convertissant en lambda récursif.
Renvoie un nombre d'itérations indexé à 1 ou 0 comme falsey.
Utilise la méthode chunk de Ruby enumerable, qui fait exactement ce dont nous avons besoin - regrouper des séries consécutives de nombres identiques. Les longueurs des exécutions constituent le tableau pour la prochaine itération. Continue à itérer pendant que le tableau est plus long que 1 élément et qu'aucun nombre autre que 1 et 2 n'a été rencontré.
la source
Pyth , 45 octets
Essayez-le en ligne!
C'est probablement encore jouable au golf. Il est certainement jouable au golf si cela
.?
fonctionnait comme je l'espérais (étant unelse
pour la structure la plus intérieure au lieu de la plus extérieure)la source
Perl 5
-p
, 71 octetsEssayez-le en ligne!
1
-indexé. Sorties0
pour falsification.la source