Permet de définir le processus d'écrasement d'un tableau de nombres. Dans un écrasement, nous lisons le tableau de gauche à droite. Si, à un moment donné, nous rencontrons deux du même élément d'affilée, nous supprimons le premier et doublons le second. Par exemple, voici le processus d'écrasement du tableau suivant
[5,2,2,3]
^
[5,2,2,3]
^
[5,2,2,3]
^
[5,4,3]
^
[5,4,3]
^
Le même élément peut être replié plusieurs fois, par exemple [1,1,2]
devient [4]
quand on les écrase.
Nous appellerons un tableau non écrasable lorsque le processus d'écrasement de ce tableau ne le modifie pas. Par exemple, [1,2,3]
est toujours [1,2,3]
après avoir été écrasé.
Votre tâche consiste à prendre un tableau et à déterminer le nombre d'écrasements nécessaires pour le rendre impossible à écraser. Vous avez uniquement besoin de prendre en charge des entiers compris entre 0 et 2 32 -1
Il s'agit de code-golf donc les réponses seront notées en octets avec moins d'octets étant meilleurs.
Cas de test
[1] -> 0
[1,1] -> 1
[2,1,1] -> 2
[4,2,1,1] -> 3
[2,2,2,1,1] -> 3
[0,0,0,0] -> 1
[4,0,0,0,4] -> 1
[4,0,0,0,0,4] -> 1
[] -> 0
la source
[1,1,2,4,8]
renvoyer 1 ou 4?0,0,0,0
était seulement1
. Ce pourrait être une idée de mentionner explicitement quelque part que nous comptons le nombre de fois que nous devons parcourir un tableau pour l'écraser complètement et non , comme je le pensais initialement, le nombre total de fois que nous écrasons 2 nombres ensemble.Réponses:
assemblage x86 (64 bits),
6665 octetsLes instructions de chaîne étaient utiles. Il n'était pas nécessaire de corriger les erreurs hors-un dans un environnement 64 bits.
Code source entièrement commenté:
Je peux essayer de le faire en 32 bits, ne serait-ce que pour le plaisir, car ces préfixes REX m'ont vraiment tué.
Edit: rasé d'un octet en remplaçant lodsq par add,% rdx par% rax et en réduisant deux cld en un.
la source
Pyth , 22 octets
Vérifiez tous les cas de test.
la source
Haskell , 66 octets
Essayez-le en ligne!
Explication
f
est une fonction qui écrase une liste. Il effectue le béguin comme décrit dans la question.g
est une fonction qui compte le nombre d'écrasements. Sif x==x
,g x=0
sinong x=1+g(f x)
.la source
g(f x)
àg$f x
+
a une priorité plus élevée que$
Paradoc (v0.2.10), 16 octets (CP-1252)
Essayez-le en ligne! / avec en-tête / pied de page qui vérifie tous les cas de test
Prend une liste sur la pile et donne un nombre sur la pile.
Mise en œuvre assez simple, pour être tout à fait honnête. Écrase une liste en commençant par une sentinelle -1, en parcourant la liste, en poussant chaque élément et en l'ajoutant à l'élément en dessous s'il est égal. À la fin, nous avons coupé le -1. Nous ne broyons que des nombres égaux ensemble et tous les nombres du problème ne sont pas négatifs, donc la sentinelle -1 n'affectera pas le processus de broyage. Avec l'écrasement implémenté, il suffit de compter les itérations jusqu'à son point fixe.
Explication:
Si nous pouvions supposer que l'entrée n'était pas vide, nous n'aurions pas besoin de la sentinelle et pourrions raser 2 octets:
{(\ε=k+x}]}IL(
Autre fait amusant: nous ne perdons que 2 octets si nous nous forçons à n'utiliser que ASCII:
{1m\{=k+x}e]1>}IL(
la source
JavaScript (ES6), 86 octets
Non golfé et expliqué
Les tests
Afficher l'extrait de code
la source
a.length>n
est le même quea[n]!=[]._
. Dans ce cas (puisque tous les éléments du tableau sont des nombres supérieurs à -1), c'est la même chose quea[n]>-1
. En outre,a[i]==a[++i]&&x
c'est la même chose quea[i]-a[++i]||x
.1/a[i]
fonctionne également pour enregistrer un autre octet.JavaScript, 67 octets
Essayez-le en ligne!
la source
Brain-Flak , 144 octets
Essayez-le en ligne!
Explication
La fonction d'écrasement évalue le nombre de paires d'éléments qui ont été écrasés ensemble:
la source
Java 8, 120 octets
Un lambda de
List<Long>
àInteger
. La liste d'entrée doit implémenterremove(int)
(par exempleArrayList
). Attribuer àFunction<List<Long>, Integer>
.Essayez-le en ligne
Lambda non golfé
c
compte le nombre d'écrasements jusqu'à présent,i
représente l'index dans la liste etf
indique s'il faut continuer d'écraser la liste à la fin d'une itération. À l'intérieur des boucles, chaque paire adjacente est comparée.i
est incrémenté sans condition, donc si un élément est supprimé par écrasement,i
est décrémenté en premier pour annuler l'incrément. L'ancien élément est supprimé de la liste.Remerciements
la source
valueOf
cache. Exemple:{128L, 128L}
. C'est à cause del.get(i)==l.get(i-1)
, qui devrait être remplacé parl.get(i).equals(l.get(i-1))
.l.get(i)-l.get(i-1)==0
marchera. Merci!Perl 5 , 96 octets
94 code, 2 pour
-pa
Essayez-le en ligne!
la source
JavaScript (ES6), 70 octets
Explication:
Cas de test:
Afficher l'extrait de code
la source
Python 2 ,
112110108107105100 octetsEdit: enregistré 2 octets en supprimant
or
dans l'instruction returnEdit: économisé 2 octets en ayant
i
comme index du deuxième des deux éléments à accéderEdit: sauvé 1 octet grâce à @ Mr.Xcoder
Edit: économisé 7 octets grâce à @jferard
Essayez-le en ligne!
la source
JavaScript (ES6), 83 octets
Explication: Les éléments sont extraits récursivement du tableau d'origine et des valeurs uniques sont ajoutées à
b
tandisc
qu'un indicateur indique si le tableau a été correctement écrasé.la source
J, 54 octets
Essayez-le en ligne!
Pas mon meilleur golf par tous les moyens. Il doit sûrement y avoir un meilleur moyen de convertir une liste avec un élément en un atome.
Explication
écraser
Cela écrase un tableau une fois. Il faut lui donner le tableau à l' envers car l'insert de J fonctionne de droite à gauche (quelque chose que j'ai appris aujourd'hui). Cela n'a pas d'importance particulière, car tout ce dont nous avons besoin pour la sortie est le nombre de fois que nous pouvons écraser le tableau.
fois
C'est assez simple: appliquez l'écrasement au tableau jusqu'à ce que notre résultat converge, mais il y a quelques problèmes que j'ai dû traiter avec ce résultat en beaucoup plus de code que prévu.
Premièrement, lorsque l'écrasement se réduit à un seul élément, cet élément se trouve en fait dans une liste à un élément (c'est-à-dire qu'il n'est pas atomique), de sorte que la fonction est à nouveau appliquée , ce qui entraîne un comptage excessif. Pour résoudre ce problème, j'ai utilisé un hack que j'ai trouvé pour réduire une seule liste d'éléments en un atome qui est
".@":
(convertir en chaîne puis évaluer).Deuxièmement, des
crush
erreurs sur la liste vide. Je pense que vous pouvez définir comment une fonction doit se comporter lors de la réception d'une entrée vide avec insert (/
), mais je n'ai rien trouvé après un aperçu rapide, donc j'utilise une autre solution. Cette solution consiste à ajouter_
(infini) à la liste car elle n'affectera jamais le nombre de fois où le tableau est écrasé (_ > 2^64
). Cependant , il en résulte une liste d'éléments unique consistant_
en étant donné la liste vide, donc nous avons besoin de se convertir à un atome de nouveau avant d' écraser.la source
Gelée , 21 octets
Essayez-le en ligne!
la source
R , 142 octets
Horrible, je suis sûr qu'il existe un moyen plus intelligent.
Les entiers R sont en fait tous au maximum
2^31-1
.Essayez-le en ligne!
la source