Digitangular Numbers

20

Eine Dreieckszahl ist eine Zahl, die als Summe aufeinanderfolgender positiver Ganzzahlen ab 1 ausgedrückt werden kann. Sie kann auch mit der Formel ausgedrückt werden n(n + 1) / 2, bei der nes sich um eine positive Ganzzahl handelt.

Das digitale Gegenstück einer Zahl wird folgendermaßen berechnet:

  1. Teilen Sie eine Zahl in ein Array von Ziffern, z 613 => [6 1 3]
  2. Berechnen Sie für jede Zahl im Array die ndritte Dreieckszahl.[6 1 3] => [21 1 6]
  3. Summiere das resultierende Array; [21 1 6] => 28

Ihre Aufgabe ist es, mit einer Ganzzahl das digitale Gegenstück zu nberechnen n, bis das Ergebnis gleich 1 ist, und dann alle berechneten Werte auszugeben. Sie können die Werte in beliebiger Reihenfolge und optional mit der ursprünglichen Nummer am Anfang des Arrays ausgeben. Dies ist ein also gewinnt der kürzeste Code.

Testfälle

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
quelle
1
Dürfen wir die ursprüngliche Nummer als erste in das resultierende Array aufnehmen?
Uriel
1
Woher wissen wir, dass es immer auf 1 geht?
Einfach schön Art
5
Angenommen, eine Zahl ist größer als 141und hat nZiffern. Der maximale Wert, den sein digitales Gegenstück haben kann, ist 45nalso digi-△(x) ≤ 45n < 45(1+log_10(x)), und für x > 141, wir haben 45(1+log_10(x)) < x, daher digi-△(x) ≤ x-1für x > 141, und sobald wir die 141Grenze überschreiten, beweisen wir brachiale Gewalt durch Programme.
Simply Beautiful Art
1
Kann ich am Ende meiner Ausgabe nachgestellte Einsen haben?
Simply Beautiful Art
1
Related: Digitangular numbers , die alternative Beweise dafür suchen, dass diese Sequenz schließlich zu 1 wird.
Simply Beautiful Art

Antworten:

10

Schale , 6 Bytes

U¡(ṁΣd

Probieren Sie es online!

Erläuterung

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
Löwe
quelle
7

05AB1E , 6 5 Bytes

Δ=SLO

Probieren Sie es online! Bearbeiten: 1 Byte dank @Emigna gespeichert. Erläuterung:

Δ       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
quelle
Wenn Sie ersetzen mit S, können Sie überspringen O.
Emigna
@Emigna ... warum verhält Lsich das überhaupt so?
Neil
Wenn ich mich richtig erinnere, war es ein Fehler, der sich als nützlich herausstellte und als Feature erhalten bleiben musste. Ich denke, es war eine der ersten Methoden, die vektorisierten.
Emigna
4

J, 20 bis 19 Bytes

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

Probieren Sie es online!

Gibt auch die ursprüngliche Nummer aus.

Erläuterung

(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
quelle
1
[:+/-> 1#.miau!
FrownyFrog
@FrownyFrog ist kein origineller Trick, obwohl ich ihn sicherlich ausgiebig benutze, wenn ich daran denke.
Cole
4

APL (Dyalog) , 23 20 17 Byte

3 Bytes gespart dank @ngn

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

Probieren Sie es online!

Wie?

⍵∪⍨ - Das aktuelle Array dem voranstellen

+/ - die Summe von

- abgeflacht

⍳¨ - Bereiche von jedem

⍎¨⍕ - Ziffer der

⊃⍵ - vorheriger Wert

⍣≡bis zur Konvergenz. Die Verwendung von (union) stellt sicher, dass nach dem Verbinden der ersten 1 die nächste aufgrund der festgelegten Eindeutigkeit ausgeschlossen wird und das Array konvergiert.

Uriel
quelle
Wie lange würde es aus Neugier dauern, wenn Sie nicht auch den ursprünglichen Wert ausgeben könnten?
Caird Coinheringaahing
@cairdcoinheringaahing 2 Bytes - 1↓(zuerst fallen lassen)
Uriel
@Uriel Hier bietet Power Limit (⍣≡) eine kürzere Lösung als Rekursion: {⍵∪⍨ + / ∊⍳¨∊⍳¨⍎} ⍣≡, aber es ist eine Schande, dass APL nicht alle Iterationen von sammelt eine Funktion bis zur Konvergenz: ⍵ (f⍵) (f⍣2⍣) (f⍣3⍣) ...
ngn
@ngn danke! Ich habe versucht, den Netzbetreiber zu verwenden, aber ich habe nicht darüber nachgedacht, dass er nach 1 konvergiert. Wird bald aktualisiert
Uriel
@ngn irgendeine Idee, wie man es benutzt, {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡ohne die letzte 1 gedruckt zu bekommen?
Uriel
3

Haskell, 51 47 46 Bytes

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

Probieren Sie es online!

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 

Edit: @ H.PWiz hat ein Byte gespeichert. Vielen Dank!

nimi
quelle
2

Wolfram Language (Mathematica) , 43 41 Bytes

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

Probieren Sie es online!

Wie es funktioniert

Der Ausdruck #.(#+1)/2&@IntegerDigits@#gibt das digitale Gegenstück von an #. Wir geben Echodas ein, verwenden die Kurzschlussauswertung mit, &&um anzuhalten, wenn wir es erreicht haben 1, und greifen ansonsten auf das digital-rechteckige Gegenstück zurück.


-2 Bytes danke an Martin Ender für den .Trick: Wir müssen Trdie Ziffern nicht addieren, wenn wir die Multiplikation #(#+1)/2durch das Skalarprodukt ersetzen #.(#+1)/2.

Mischa Lawrow
quelle
2
Hab gerade deine Antwort gesehen. Sie können meinen mit dem Skalarprodukt-Trick schlagen, um Folgendes zu vermeiden Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender
@MartinEnder Danke, das ist ein ordentlicher Trick. Ich frage mich, ob es noch bessere Möglichkeiten gibt, um "alle Iterationen dieser Funktion auf dem Weg zu einem festen Punkt zu drucken" (im Wesentlichen Neuimplementierung, FixedPointListaußer wie der feste Punkt zweimal gedruckt wird). Es scheint, als hätte das schon früher kommen sollen.
Mischa Lawrow
2

Wolfram Language (Mathematica) , 49 42 39 Bytes

Vielen Dank an Misha Lavrov für das Speichern von 3 Bytes.

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

Probieren Sie es online! (TIO benötigt ++yaus irgendeinem Grund Klammern um die . In meiner lokalen Mathematica-Installation funktioniert es ohne sie, wie es sollte.)

Gibt jeden Wert in einer eigenen Zeile aus, >>der die Startnummer vorausgeht und die Startnummer enthält.

Martin Ender
quelle
You can go back to beating my answer with #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (...maybe. For some reason, TIO doesn't like this, but Mathematica's fine with it?)
Misha Lavrov
Well, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2& is 41 bytes and works in TIO. But my copy of Mathematica doesn't think the parentheses are necessary.
Misha Lavrov
@MishaLavrov Thanks. Yeah, no clue why TIO needs the parentheses, but syntax in script files is sometimes a bit wonky.
Martin Ender
1

Ohm v2,  9  7 bytes

·Ω}#ΣΣu

Try it online!

Explanation

          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
quelle
Isn't u unnecessary?
Nick Clifford
It's necessary otherwise } won't split the digits
Cinaski
Hm. That might be a bug. I'll check it out.
Nick Clifford
1

Retina, 21 bytes

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

Try it online! (The outputs of the individual cases aren't well separated, but each output ends with a 1.)

Prints each number on its own line, in order, including the starting number.

Explanation

;{:G`

This is just some configuration of the program. { makes the program loop until it fails to change the result (which happens once we get to 1), : prints number before each iteration, and ; prevents the final result from being printed twice at the end of the program. The G is just my usual way of creating a no-op stage.

.
$*1¶

Convert each digit to unary and put it on its own line.

1
$%`1

Compute the triangular number on each line, by replacing each 1 with its prefix. We could also use M!&`1+ here, which gives us all suffixes of each line.

1

Count all 1s, which sums up all the triangular numbers and converts the result back to decimal.

Martin Ender
quelle
Is Retina a turing complete language?
@ThePirateBay yes.
Martin Ender
1

Ruby, 60 47 42 bytes

-13 bytes by @JustinMariner

-5 bytes by @GB

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

Try it online!

Simply Beautiful Art
quelle
You can drop the array and splat ([*...]) and change (k+1) to -~k to save a total of 5 bytes: Try it online! Additionally, you can save 8 more by switching to an anonymous lambda function: Try it online!
Justin Mariner
Hm, no idea why I thought .map couldn't take arrays.
Simply Beautiful Art
Sie können "sum {...}" anstelle von "map {...}. Sum" verwenden und dann das Leerzeichen vor "while" entfernen
GB
1

Befunge-93 , 51 Bytes

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

Probieren Sie es online!

James Holderness hat mein Programm geschickt in eine 51-Byte-Form umgewandelt. Vielen Dank!

Lynn
quelle
1

Aufdringlich , 24 22 21 17 Bytes

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

Probieren Sie es online!

Erläuterung

[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
quelle
1

Japt , 19 17 Bytes

Übernimmt die Eingabe als einzelnes Elementarray.

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

Versuch es

Zottelig
quelle
0

R , 70 Bytes

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

Probieren Sie es online!

Gibt auch den ursprünglichen Wert zurück.

R , 80 Bytes

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

Probieren Sie es online!

Gibt den ursprünglichen Wert nicht zurück.

Giuseppe
quelle
0

Lua , 91 Bytes

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

Probieren Sie es online!

Jonathan S.
quelle
0

05AB1E , 20 12 Bytes

2 Bytes gespart dank Caird Coinheringaahing

ΔD,þ€iLO}O}}

Probieren Sie es online!

Erläuterung

(alte 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

quelle
0

JavaScript, 61-57 Bytes

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

Probieren Sie es online!


quelle
0

Kohle , 18 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

   θ                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
quelle
0

k , 19 Bytes

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

Es ist nicht überraschend, dass es ähnlich zu den bereits veröffentlichten APL- und J-Lösungen funktioniert

               $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
quelle
0

Gelee , 7 Bytes

DRFSµÐĿ

Probieren Sie es online!

  • DRFSµÐĿ: Vollständiges Programm / monadischer Link.

  • ÐĿ: Schleife, bis Ergebnisse nicht mehr eindeutig sind (wenn etwas anderes als 1 zweimal auftreten würde, hat die angegebene Eingabe kein definiertes Ergebnis, da sie niemals 1 erreichen würde).

  • D: Konvertiert von Integer zu Dezimal.

  • R: Bereich (1-indiziert). Vektorisiert.

  • F: Flatten und S: Sum ( µerstellt nur eine neue monadische Kette)

Mr. Xcoder
quelle
0

Gleichstrom, 31 Bytes

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

Die Funktion mberechnet die Digitangularfunktion ihrer Eingabe. fWiederholt dies, bis das Ergebnis 1 erreicht.

Beachten Sie, dass wir den Eingaberadix verwenden, um Ziffern zu extrahieren - dies bedeutet, dass es in jedem Basissystem funktioniert, nicht nur in Dezimalzahlen.

Demo

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
quelle
0

Neim , 8 Bytes

ͻ𝐂t𝕕𝐬D÷D

Erläuterung:

ͻ             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.

Probieren Sie es online!

Formatierte Ausgabe

Okx
quelle
0

D , 140 Bytes

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;}

Probieren Sie es online!

Zacharý
quelle
0

PHP, 71 + 1 Bytes

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

Laufen Sie als Pipe mit -nRoder versuchen Sie es online . (benötigt PHP 5.3 oder neuer für den Elvis-Operator)

Titus
quelle
Was ist der Elvis-Operator?
Caird Coinheringaahing
@cairdcoinheringaahing A?:B: Wenn A wahr ist, dann A else B
Titus
0

Add ++ , 32 Bytes

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

Probieren Sie es online!

Gibt den ersten Wert nicht aus

Wie es funktioniert

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
quelle