Nombres numériques

20

Un nombre triangulaire est un nombre qui peut être exprimé comme la somme d'entiers positifs consécutifs, à partir de 1. Ils peuvent également être exprimés avec la formule n(n + 1) / 2, où nest un entier positif.

La contrepartie numérique d'un nombre est calculée de la manière suivante:

  1. Divisez un nombre en un tableau de ses chiffres, par exemple 613 => [6 1 3]
  2. Pour chaque nombre du tableau, calculez le nnombre triangulaire;[6 1 3] => [21 1 6]
  3. Additionnez le tableau résultant; [21 1 6] => 28

Votre tâche consiste, compte tenu d'un nombre entier n, à calculer nde façon répétée l'équivalent numérique de jusqu'à ce que le résultat soit égal à 1, puis à sortir toutes les valeurs qui ont été calculées. Vous pouvez afficher les valeurs dans n'importe quel ordre et avec une inclusion facultative du numéro d'origine au début du tableau. C'est un donc le code le plus court l'emporte.

Cas de test

23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1
caird coinheringaahing
la source
1
Pouvons-nous inclure le numéro d'origine comme premier dans le tableau résultant?
Uriel
1
Comment savons-nous qu'il descend toujours à 1?
Simply Beautiful Art
5
Supposons qu'un nombre soit supérieur à 141et comporte des nchiffres. La valeur maximale que son homologue numérique peut avoir est 45n, donc digi-△(x) ≤ 45n < 45(1+log_10(x)), et pour x > 141, nous avons 45(1+log_10(x)) < x, donc digi-△(x) ≤ x-1pour x > 141, et une fois que nous avons dépassé la 141limite, eh bien, nous prouvons la force brute via des programmes.
Simply Beautiful Art
1
Puis-je avoir des 1 à la fin de ma sortie?
Simply Beautiful Art
1
Connexes: nombres numériques , à la recherche de preuves alternatives que cette séquence passe finalement à 1.
Simply Beautiful Art

Réponses:

10

Husk , 6 octets

U¡(ṁΣd

Essayez-le en ligne!

Explication

U¡(ṁΣd
 ¡(       Iterate the following function on the input:
     d       Split the number into digits
   ṁΣ        Map each digit to its triangular number, then sum the results
U         Take the results of iteration until before the first repeated one
Leo
la source
7

05AB1E , 6 5 octets

Δ=SLO

Essayez-le en ligne! Edit: 1 octet enregistré grâce à @Emigna. Explication:

Δ       Repeat until value doesn't change
 =      Print current value
  S     Split into characters
   L    Turn each character into range from 1 to N
    O   Sum
Neil
la source
Si vous remplacez par S, vous pouvez en ignorer un O.
Emigna
@Emigna ... pourquoi Lse comporte- t-il même de cette façon?
Neil
Si je me souviens bien, c'était un bug qui s'est avéré utile et a pu rester en tant que fonctionnalité. Je pense que c'était l'une des premières méthodes à vectoriser.
Emigna
4

J, 20 19 octets

(1#.2!1+,.&.":)^:a:

Essayez-le en ligne!

Émet également le numéro d'origine.

Explication

(1#.2!1+,.&.":)^:a:
               ^:a:  Apply until input converges, storing all results in an array
(1#.2!1+,.&.":)      Digitangular sum
        ,.&.":         Split to digits
          &.":           Convert to string, apply left function, then undo conversion
        ,.               Ravel items (make array of singleton arrays of items)
                         This ensures that when cast back to integers, the digits are split.
      1+               Add 1 to each
    2!                 Compute (n choose 2) on each (nth triangular number)
 1#.                   Sum (debase 1)
cole
la source
1
[:+/-> 1#.miaou!
FrownyFrog
@FrownyFrog n'est pas une astuce originale, bien que j'en fasse certainement beaucoup usage quand je m'en souviens.
cole
4

APL (Dyalog) , 23 20 17 octets

3 octets enregistrés grâce à @ngn

{⍵∪⍨+/∊⍳¨⍎¨⍕⊃⍵}⍣≡

Essayez-le en ligne!

Comment?

⍵∪⍨ - ajouter le tableau actuel au

+/ - somme de

- aplati

⍳¨ - plages de chacun

⍎¨⍕ - chiffre du

⊃⍵ - valeur précédente

⍣≡jusqu'à la convergence. L'utilisation de (union) garantit qu'une fois le premier 1 joint, le suivant sera exclu en raison de l'unicité définie et le tableau convergera.

Uriel
la source
Par curiosité, combien de temps cela prendrait-il si vous n'étiez pas autorisé à afficher également la valeur d'origine?
caird coinheringaahing
@cairdcoinheringaahing 2 octets - 1↓(déposer en premier)
Uriel
@Uriel Ici, la limite de puissance (⍣≡) donne une solution plus courte que la récursivité: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ mais c'est dommage APL n'a pas un moyen concis de collecter toutes les itérations de une fonction jusqu'à la convergence: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn
@ngn merci! J'ai essayé d'utiliser l'opérateur de puissance, mais je n'ai pas pensé au fait qu'il converge après 1. Mettra à jour bientôt
Uriel
@ngn une idée sur la façon d'utiliser {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡sans obtenir le dernier 1 imprimé?
Uriel
3

Haskell, 51 47 46 octets

f 1=[1]
f x=x:f(sum$do d<-show x;[1..read[d]])

Essayez-le en ligne!

f 1=[1]                     -- if x == 1, return the singleton list [1]
f x=                        -- else
         do d<-show x       --  for each char 'd' in the string representation of x
                            --    (using the list monad)
           [1..read[d]]     --  make a list of [1..d]
                            --    (the list monad concatenates all those lists into a single list)
        sum                 --  sum those numbers
      f                     --  call f on it
    x:                      --  and put x in front of it 

Modifier: @ H.PWiz a enregistré un octet. Merci!

nimi
la source
2

Python 2 , 62 octets

f=lambda x:x<2and[1]or[x]+f(sum(-~int(i)*int(i)/2for i in`x`))

Essayez-le en ligne!

totalement humain
la source
2

Wolfram Language (Mathematica) , 43 41 octets

Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&

Essayez-le en ligne!

Comment ça fonctionne

L'expression #.(#+1)/2&@IntegerDigits@#donne la contrepartie numérique de #. Nous saisissons Echol'entrée, utilisons une évaluation de court-circuit avec &&pour arrêter si nous avons atteint 1, et sinon récursions sur l'homologue numérique.


-2 octets merci à Martin Ender pour l' .astuce: nous n'avons pas à utiliser Trpour additionner les chiffres si nous remplaçons la multiplication #(#+1)/2par le produit scalaire #.(#+1)/2.

Misha Lavrov
la source
2
Je viens de voir votre réponse maintenant. Vous pouvez battre le mien en utilisant l'astuce du produit scalaire pour éviter Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender
@MartinEnder Merci, c'est une astuce intéressante. Je me demande s'il existe des façons encore plus golfiques de faire "imprimer toutes les itérations de cette fonction sur le chemin vers un point fixe" (essentiellement, la réimplémentation FixedPointListsauf comment cela imprime le point fixe deux fois). Il semble que cela aurait dû arriver auparavant.
Misha Lavrov
2

Wolfram Language (Mathematica) , 49 42 39 octets

Merci à Misha Lavrov pour avoir économisé 3 octets.

#//.x_:>(y=IntegerDigits@Echo@x).++y/2&

Essayez-le en ligne! (TIO a besoin de parenthèses autour du++y pour une raison quelconque. Dans mon installation Mathematica locale, il fonctionne sans eux, comme il se doit.)

Imprime chaque valeur sur sa propre ligne, précédée de >>et inclut le numéro de départ.

Martin Ender
la source
Vous pouvez recommencer à battre ma réponse avec #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... peut-être. Pour une raison quelconque, TIO n'aime pas ça, mais Mathematica va bien avec ça?)
Misha Lavrov
Eh bien, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&est de 41 octets et fonctionne dans TIO. Mais ma copie de Mathematica ne pense pas que les parenthèses soient nécessaires.
Misha Lavrov
@MishaLavrov Merci. Oui, je ne sais pas pourquoi TIO a besoin des parenthèses, mais la syntaxe dans les fichiers de script est parfois un peu chancelante.
Martin Ender
1

Ohm v2 ,  9  7 octets

·Ω}#ΣΣu

Essayez-le en ligne!

Explication

          Implicit input as a string
·Ω        Evaluate until the result has already been seen, pushing intermediate results
  }       Split digits
   #      Range from 0 to N
    ΣΣ    Sum
      u   Convert to string
Cinaski
la source
N'est-ce pas uinutile?
Nick Clifford
C'est nécessaire sinon }ne divisera pas les chiffres
Cinaski
Hm. Cela pourrait être un bug. Je vérifierai.
Nick Clifford
1

Rétine , 21 octets

;{:G`
.
$*1¶
1
$%`1
1

Essayez-le en ligne! (Les sorties des cas individuels ne sont pas bien séparées, mais chaque sortie se termine par un 1.)

Imprime chaque numéro sur sa propre ligne, dans l'ordre, y compris le numéro de départ.

Explication

;{:G`

Ceci est juste une configuration du programme. {fait en sorte que le programme boucle jusqu'à ce qu'il ne change pas le résultat (ce qui arrive une fois que nous y sommes 1), :imprime le numéro avant chaque itération et ;empêche le résultat final d'être imprimé deux fois à la fin du programme. C'est Gjuste ma façon habituelle de créer une scène sans op.

.
$*1¶

Convertissez chaque chiffre en unaire et placez-le sur sa propre ligne.

1
$%`1

Calculez le nombre triangulaire sur chaque ligne, en remplaçant chacune 1par son préfixe. Nous pourrions également utiliser M!&`1+ici, ce qui nous donne tous les suffixes de chaque ligne.

1

Comptez tous les 1s, qui résume tous les nombres triangulaires et reconvertit le résultat en décimal.

Martin Ender
la source
La rétine est-elle un langage complet?
@ThePirateBay oui.
Martin Ender
1

Rubis, 60 47 42 octets

-13 octets par @JustinMariner

-5 octets par @GB

->x{p x=x.digits.sum{|k|k*-~k/2}while x>1}

Essayez-le en ligne!

Art tout simplement magnifique
la source
Vous pouvez supprimer le tableau et splat ( [*...]) et passer (k+1)à -~kpour enregistrer un total de 5 octets: Essayez-le en ligne! De plus, vous pouvez économiser 8 de plus en passant à une fonction lambda anonyme: essayez-la en ligne!
Justin Mariner
Hm, aucune idée pourquoi je pensais .mapne pas pouvoir prendre de tableaux.
Simply Beautiful Art
Vous pouvez utiliser "sum {...}" au lieu de "map {...}. Sum", puis supprimer l'espace avant "while"
GB
1

Befunge-93 , 51 octets

p&>>:25*%:1+*2/v
  |:/*52p00+g00<
00<vp000_@#-1.::g

Essayez-le en ligne!

James Holderness a intelligemment remodelé mon programme en une forme de 51 octets. Merci!

Lynn
la source
1

Pushy , 24 22 21 17 octets

[sL:R{;Svc^#&1=?i

Essayez-le en ligne!

Explication

[sL:R{;Svc^#&1=?i

[           &1=?i   \ Loop until result == 1:
 s                  \   Split last result into digits
  L:  ;             \   For each digit n:
    R{              \       Push the range (1, n) inclusive
       S            \   Sum the ranges
        vc^         \   Delete all stack items, except the sum
           #        \   Print result
FlipTack
la source
1

Japt , 19 17 octets

Prend l'entrée comme un tableau à élément unique.

_Ì¥1}a@pUÌì mò xx

Essayez-le

Hirsute
la source
0

R , 70 octets

f=function(n)"if"(n-1,c(n,f((d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2)),n)

Essayez-le en ligne!

Renvoie également la valeur d'origine.

R , 80 octets

function(n){o={}
while(n-1){n=(d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2
o=c(o,n)}
o}

Essayez-le en ligne!

Ne renvoie pas la valeur d'origine.

Giuseppe
la source
0

Lua , 91 octets

function f(n)x=0 for d in((0|n)..""):gmatch"."do x=x+d*(d+1)/2 end print(x)c=x==1or f(x)end

Essayez-le en ligne!

Jonathan S.
la source
0

05AB1E , 20 12 octets

Économisé 2 octets grâce à caird coinheringaahing

ΔD,þ€iLO}O}}

Essayez-le en ligne!

Explication

(ancienne version)

Δþ€iD>*;}OD1›iD,}}1,  Main program
Δ                }    Repeat until there is no changes
 þ                    Push digits of the input number
  €i    }             Apply for each digit
    D>*;              Calculate the triangular number for given digit
         O            Sum all numbers
          D1›iD,}     Print if greater than 1
                  1,  Print 1 at the end

la source
0

JavaScript, 61 57 octets

f=a=>a-1?([...a+[]].map(b=>a+=b++*b/2,a=0),a)+' '+f(a):''

Essayez-le en ligne!


la source
0

Fusain , 18 octets

W⊖Iθ«≔IΣ⭆θΣ…·0κθθ⸿

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

   θ                Input
  I                 Cast to integer
 ⊖                  Decrement
W   «               Loop while not zero
         θ          Current value
        ⭆           Map over characters and concatenate
             0      Literal character 0
              κ     Current character
           …·       Inclusive range
          Σ         Concatenate
       Σ            Sum of digits
      I             Cast to string
     ≔         θ    Assign back to value
                θ   Output latest value
                 ⸿  Move to start of next line
Neil
la source
0

k , 19 octets

{+/(+/1+!"I"$)'$x}\

Sans surprise, fonctionne de manière similaire aux solutions APL et J déjà publiées

               $x    cast x (implicit var of lambda) to string
   (         )'      apply composition (function train) to each character of string
    +/1+!"I"$        cast character to number, create list from 1 to n, sum it
 +/                  sum triangular numbers
{                }\  iterate lambda until result converges, appending each result
ostewart
la source
0

Gelée , 7 octets

DRFSµÐĿ

Essayez-le en ligne!

  • DRFSµÐĿ: Programme complet / lien monadique.

  • ÐĿ: Boucle jusqu'à ce que les résultats ne soient plus uniques (si quelque chose d'autre que 1 se produisait deux fois, alors l'entrée donnée n'a pas de résultat défini, car elle n'atteindrait jamais 1).

  • D: Convertit d'un entier en décimal.

  • R: Plage (indexé 1). Vectorise.

  • F: Aplatir et S: Somme ( µcrée simplement une nouvelle chaîne monadique)

M. Xcoder
la source
0

dc, 31 octets

[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx

La fonction m calcule la fonction digitangulaire de son entrée;frépète jusqu'à ce que le résultat atteigne 1.

Notez que nous utilisons le radix d'entrée pour extraire les chiffres - cela signifie qu'il fonctionnera dans n'importe quel système de base, pas seulement décimal.

Démo

for i in 23 72 55 78 613 8392 11111 8592025 999999999
    do echo $i '=>' $(dc -e $i'[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx')
done
23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1
Toby Speight
la source
0

Neim , 8 octets

ͻ𝐂t𝕕𝐬D÷D

Explication:

ͻ             Start infinite loop
 𝐂            Split top of stack into each of its characters
  t           Push infinite list of triangular numbers
   𝕕          For each of the characters, get the nth element in the above list.
    𝐬          Sum.
     D         Duplicate.
      ÷        If top of stack is equal to 1, break.
       D       Duplicate.
               Implicitly print all elements in the stack, concatenated.

Essayez-le en ligne!

Sortie formatée

Okx
la source
0

D , 140 octets

import std.algorithm,std.range,std.conv,std.stdio;void f(T)(T n){n=n.text.map!(u=>u.to!T-48+(u.to!T-48).iota.sum).sum;n.writeln;if(n-1)n.f;}

Essayez-le en ligne!

Zacharý
la source
0

PHP, 71 + 1 octets

for(;1<$n="$s"?:$argn;print$s._)for($i=$s=0;$p--||~$p=$n[$i++];)$s+=$p;

Exécuter en tant que pipe avec -nRou l' essayer en ligne . (nécessite PHP 5.3 ou version ultérieure pour l'opérateur Elvis)

Titus
la source
Qu'est-ce que l'opérateur Elvis?
caird coinheringaahing
@cairdcoinheringaahing A?:B: si A est véridique alors A autre B
Titus
0

Ajouter ++ , 32 octets

D,f,@,EDBFEREss
+?
y:1
W!,$f>x,O

Essayez-le en ligne!

Ne produit pas la première valeur

Comment ça fonctionne

D,f,@,   - Create a monadic function, f.
         - Example argument: [613]
      ED - Digits;   STACK = [[6 1 3]]
      BF - Flatten;  STACK = [6 1 3]
      ER - Range;    STACK = [[1 2 3 4 5 6] [1] [1 2 3]]
      Es - Sum each; STACK = [21 1 6]
      s  - Sum;      STACK = [28]

           f calculates n's digitangular counterpart

+?       - Take input;     x = 613; y = 0
y:1      - Set y to 1;     x = 613; y = 1
W!,      - While x != y...
   $f>x, -   Call f;       x =  28; y = 1
   O     -   Print x;
caird coinheringaahing
la source