Envisagez de prendre un nombre entier non négatif tel que 8675309 et de calculer les valeurs absolues des différences entre toutes les paires de chiffres voisins.
Pour que 8675309
nous obtenons |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Corder ces résultats donne en même temps une autre, plus petit entier non négatif: 212239
. La répétition du processus donne 11016
donc 0115
ce qui, par la convention que les zéros non majuscules ne sont pas écrits, simplifie 115
ce qui devient , ce qui devient 04
ou 4
ne peut pas être réduit davantage. En résumé, nous obtenons toutes ces valeurs 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Définissons la somme des différences de chiffres (ou DDS) comme cette opération consistant à prendre de manière répétée les différences de chiffres d'un nombre pour former un nouveau nombre, puis à ajouter tous les nombres résultants à l'original.
Voici les 20 premières valeurs de la séquence DDS correspondante:
N DDS(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 11
11 11
12 13
13 15
14 17
15 19
16 21
17 23
18 25
19 27
Voici les 10000 premières valeurs , dont le graphique est assez curieux:
D'autant plus que son aspect est identique lorsque vous le tracez à 1000 voire à 100:
(J'appellerais ça l' escalier du dentiste ...)
Défi
Ecrivez un programme ou une fonction qui prend un entier non négatif et affiche ou renvoie sa valeur DDS. Par exemple, si l'entrée était 8675309
, la sortie devrait l'être 8898683
.
Le code le plus court en octets gagne.
la source
Réponses:
Pyth, 17
Essayez-le ici ou lancez la suite de tests
Explication:
la source
Python 2, 73
Heureusement, j'ai réussi à éviter toute opération de chaîne.
g
est la fonction qui calcule la réponse.la source
(n-n/10)%10
fonctionnerait le même quen%10-n/10%10
? Ou peut-être même(9*n/10)%10
?%
est un véritable opérateur de module, pas un reste, ce qui ne fonctionnerait pas.Matlab, 101 à
105octetsMerci beaucoup à @beaker pour sa suggestion d'utiliser
polyval
plutôt sibase2dec
. Cela m'a permis deCode:
Exemple:
Bonus: base arbitraire
Une petite généralisation permet d'utiliser une base de nombres arbitraires, pas nécessairement décimale:
Base arbitraire de 2 à 10,
108104 octetsLa raison pour laquelle cela ne fonctionne que pour la base jusqu'à
10
est que Matlabdec2base
fonction utilise les chiffres0
,1
...,9
,A
,B
, ..., et il y a un saut dans les codes de caractères (ASCII) de9
deA
.Base arbitraire de 2 à 36, 124
146octetsLe saut de
9
àA
mentionné ci-dessus nécessite un traitement spécial. La base maximale correspond36
à ladec2base
fonction de Matlab .Voici comment les escaliers du dentiste recherchent différentes bases:
la source
CJam,
2221 octetsNotez que ce programme se ferme avec une erreur, qui est autorisée par défaut .
Avec l'interpréteur Java, vous pouvez supprimer les erreurs en fermant STDERR. Si vous essayez ce code en ligne dans l' interpréteur CJam , ignorez toutes les sorties avant la dernière ligne.
Merci à @ Sp3000 d'avoir signalé une erreur dans la révision d'origine.
Merci à @ MartinBüttner pour le golf d'un octet.
Exemple d'exécution
Comment ça marche
A sera toujours la vérité quand vérifié par
h
. Cependant, une fois que I est un entier à un chiffre,2ew
échouera avec une erreur après avoir consommé le tableau sur lequel il était appelé. Cela ne laisse que le résultat souhaité sur la pile, qui est imprimée avant de quitter.la source
Labyrinthe ,
1761341271191039788 8882797672 octetsMerci à Sp3000 d’avoir économisé 1 octet et ouvert la voie à 2 autres.
Cela pourrait probablement encore être raccourci, mais bon, ça bat
JavaMatlabPython ...Essayez-le en ligne.
Cela se termine par une erreur mais le message d'erreur est écrit dans STDERR (c'est pourquoi vous ne le voyez pas dans TIO).
La mise en œuvre est assez simple. Nous ajoutons la valeur actuelle à un total cumulé. Si la valeur actuelle était supérieure à
9
, nous calculons ses chiffres en base 10 (via répétition de div-mod) et formons un nouveau nombre à partir des différences absolues. Si nous arrivons à9
ou moins, nous imprimons le total cumulé.Les chiffres du numéro actuel sont collectés sur la pile auxiliaire avec le chiffre le plus significatif en haut.
Eh bien, la mise en œuvre sophistiquée
abs(...)
que j'avais ici s'est révélée ridiculement compliquée par rapport à la nouvelle solution ... J'ajouterai une explication mise à jour lorsque j'aurai fini de jouer au golf plus loin.la source
Java - 300 octets
Version Golfée
Ungolfed / version complète
la source
static
s après avoir tiré. les en 3)(a+"")
est généralement identique àa.toString()
, mais plus court 4) Vous n'avez pas besoin d'un scanner si ce n'est qu'une fonction, prenez simplement un long comme entrée.long f(long t){long a=t;char[]c;while((c=(a+"").toCharArray()).length>1){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);t+=a=new Long(s);}return t;}
Julia,
8160 octetsUngolfed:
Essayez-le en ligne
Sauvé 21 octets grâce à Feersum et Glen O!
la source
ndigits(n)>1
différenten>9
?int(join(abs(diff(["$n"...]))))
enregistre 9 octets. Basculez surn>9
comme suggéré par feersum pour 9 octets supplémentaires enregistrés. Économisez trois octets supplémentaires en effectuant les deux tâches de la boucle while en une seule étape (et en supprimant le point-virgule supplémentaire devenu inutile):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
OK ,
37322423 octetsEn action:
K5 a quelques fonctionnalités bien adaptées à cela - "encoder" et "décoder" peuvent effectuer une conversion de base, chaque paire (
':
) couple des éléments séquentiels dans une liste et un balayage en point fixe (\
) peut produire la séquence itérée jusqu'à ce qu'elle s'arrête en changeant. L'absence d'un primitifabs()
conduit à un certain volume disgracieux sous la forme de{(x;-x)x<0}'
, cependant.Modifier:
Au lieu de
{(x;-x)x<0}'
, je peux (un peu gaspillage) prendre la racine carrée du carré de la séquence ({%x*x}
en économisant 5 octets.Edit 2:
Inspiré par la solution APL de @maurinus, je peux remplacer le "décodage" (
((#$x)#10)\x
) en évaluant chaque caractère de la représentation sous forme de chaîne du nombre-.:'$x
! Cela me permet également d'utiliser une forme tacite de l'expression entière, en enregistrant des caractères supplémentaires.la source
Python 2, 87 octets
Ajoute récursivement le nombre actuel et prend les différences de chiffres. Beaucoup de conversion entre les nombres et les chaînes. Peut probablement être amélioré.
la source
Julia,
5548 octetsUngolfed:
Cela revient essentiellement au niveau à un chiffre (où aucune différence de chiffre ne peut être effectuée), puis la somme est rétablie à la sortie de la récursion, niveau par niveau.
la source
Haskell, 140 octets
d
Fait le travail.Est-ce que quelqu'un sait comment éviter d'importer les fonctions de conversion longues?
la source
intToDigit
esttoEnum.(+48)
etdigitToInt
est(\i->fromEnum i-48)
. Vous pouvez également tourners
vers une version avec Pointfree=<<
dans le contexte de la liste:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Enfin,(==0)
c’est(<1)
parce que nous travaillons avec des entiers non négatifs.s
c'est sans point, il n'y a pas besoin de lui donner un nom. Appelez-le directement:iterate(snd.span ... tail))
=<<
est utilisé dans un contexte de fonction, pas dans un contexte de liste, désolé.NoMonomorphismRestriction
va me laisser avoird
pointfree, aussi.chr
etord
sont tous les deuxData.Char
, vous ne pouvez donc pas omettre leimport
. Les drapeaux du compilateur sont également comptés en octets, ce quiNoMonomorphismRestriction
augmente votre score de 25.K5, 50 octets
la source
APL (22)
Explication:
⍵≤9:⍵
: si ⍵ ≤ 9, retourne inchangé.⍎¨⍕⍵
: convertir en chaîne, puis évaluer chaque caractère2-/
: soustrayez tous les deux nombres adjacents|
: prendre les valeurs absolues10⊥
: transformer le tableau en un nombre base 10⍵+∇
: appelle la fonction récursivement avec cette nouvelle valeur et ajoute le résultat à l'entréela source
Mathematica,
726965 octetsJe suis ouvert aux suggestions ici.
la source
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 octets
Cela ne va pas être plus court: / Je vais essayer plus d'approches mais c'est la plus courte jusqu'à présent
la source
t
il est toujours valide et vous fait économiser 2 octets.JavaScript (ES6), 69
Testez l’exécution de l’extrait de code ci-dessous dans un navigateur compatible EcmaScript 6 (mais pas avec Chrome, car il ne prend toujours pas en charge l’opérateur de diffusion
...
). MS Edge peut-être?Alternative, utilisant une compréhension de matrice qui est maintenant ciblée EcmaScript 2016 (ES7), 67 octets:
la source
Python 3, 125 octets
J'aimais la brièveté de regex jusqu'à ce que j'essaye de l'utiliser pour ce défi ...
re.findall('\d\d',s,overlapped=True)
n'est pas allumé;)Salutations @Todd :)
la source
J, 70 octets
la source
C 162 octets
joué au golf:
ungolfed:
la source
R, 134 octets
Code
Testez-le en ligne .
Ungolfed
Voici le graphique de la différence de la série "Somme de différence de nombre d'un nombre" de f (1) à f (1m). Juste parce que j'adore les diff.
Code de parcelle
la source
MATLAB
(141)(137)Le programme additionne les chiffres de la même ligne avant les chiffres en ligne, cela signifie qu'il a utilisé la division entière "n / 10" log_10 (n) fois uniquement, la complexité est O (N).
Si
n= a b c d
Mon programme calcule:
Usage:
a =
1
la source
,end
de lafunction
déclaration.Prolog, 143 octets
Code:
A expliqué:
q effectue les calculs qui convertissent un nombre en différence de chiffres.
r appelle q de manière récursive et récapitule les résultats pour trouver la somme des différences numériques.
p est le point d'entrée. Prend un numéro, appelle r et imprime la réponse.
Exemple:
Essayez-le en ligne ici .
la source
PHP - 198 octets
Ungolfed
la source
Perl 6 , 56 octets
usage:
la source