Numeri Digitangolari


20

Un numero triangolare è un numero che può essere espresso come la somma di numeri interi positivi consecutivi, a partire da 1. Possono anche essere espressi con la formula n(n + 1) / 2, dove nè un numero intero positivo.

La controparte digitangolare di un numero viene calcolata nel modo seguente:

  1. Dividi un numero in un array di cifre ad es 613 => [6 1 3]
  2. Per ogni numero nell'array, calcolare il nnumero triangolare th;[6 1 3] => [21 1 6]
  3. Somma l'array risultante; [21 1 6] => 28

Il tuo compito, dato un numero intero n, calcola ripetutamente nla controparte digitangolare, fino a quando il risultato è uguale a 1, quindi emetti tutti i valori che sono stati calcolati. È possibile generare i valori in qualsiasi ordine e con un'inclusione facoltativa del numero originale all'inizio dell'array. Questo è un quindi vince il codice più corto.

Casi 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

1
Possiamo includere il numero originale come primo nella matrice risultante?
Uriel,

1
Come facciamo a sapere che scende sempre a 1?
Arte semplicemente

5
Supponiamo che un numero sia più grande di 141e abbia ncifre. Il valore massimo che può avere la sua controparte digitangolare è 45n, quindi digi-△(x) ≤ 45n < 45(1+log_10(x)), e per x > 141, abbiamo 45(1+log_10(x)) < x, quindi digi-△(x) ≤ x-1per x > 141, e una volta superato il 141limite, beh, la forza bruta si dimostra attraverso i programmi.
Arte semplicemente

1
Posso avere 1 finali alla fine del mio output?
Arte semplicemente

1
Correlati: numeri digitangolari , alla ricerca di prove alternative che questa sequenza raggiunga 1 alla fine.
Arte semplicemente

Risposte:


10

Buccia , 6 byte

U¡(ṁΣd

Provalo online!

Spiegazione

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

7

05AB1E , 6 5 byte

Δ=SLO

Provalo online! Modifica: salvato 1 byte grazie a @Emigna. Spiegazione:

Δ       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

Se lo sostituisci con S, puoi saltarne uno O.
Emigna,

@Emigna ... perché si Lcomporta in quel modo?
Neil,

Se ricordo bene era un bug che si rivelò utile e rimase una caratteristica. Penso che sia stato uno dei primi metodi a vettorializzare.
Emigna,

4

J, 20 19 byte

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

Provalo online!

Emette anche il numero originale.

Spiegazione

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

1
[:+/-> 1#.miao!
FrownyFrog,

@FrownyFrog non è un trucco originale, anche se sicuramente me ne servirò ampiamente quando mi ricordo di.
Cole

4

APL (Dyalog) , 23 20 17 byte

3 byte salvati grazie a @ngn

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

Provalo online!

Come?

⍵∪⍨ - anteporre l'array corrente a

+/ - somma di

- appiattito

⍳¨ - intervalli di ciascuno

⍎¨⍕ - cifra del

⊃⍵ - valore precedente

⍣≡fino alla convergenza. L'utilizzo di (unione) si assicura dopo l'unione del primo 1, il successivo verrà escluso a causa dell'impostazione dell'unicità e l'array convergerà.


Per curiosità, quanto tempo sarebbe se non ti fosse permesso di produrre anche il valore originale?
caird coinheringaahing del

@cairdcoinheringaahing 2 byte - 1↓(rilascia prima)
Uriel

@Uriel Qui il limite di potenza (⍣≡) offre una soluzione più breve della ricorsione: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ ma è un peccato che APL non abbia un modo conciso di raccogliere tutte le iterazioni di una funzione fino alla convergenza: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn grazie! Ho provato a utilizzare l'operatore di potenza, ma non ho pensato al fatto che converge dopo 1. Si aggiornerà presto
Uriel

Hai qualche idea su come usare {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡senza ottenere gli ultimi 1 stampati?
Uriel,

3

Haskell, 51 47 46 byte

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

Provalo 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 

Modifica: @ H.PWiz ha salvato un byte. Grazie!



2

Wolfram Language (Mathematica) , 43 41 byte

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

Provalo online!

Come funziona

L'espressione #.(#+1)/2&@IntegerDigits@#dà la controparte digitangolare di #. Noi Echoinput, utilizziamo la valutazione del cortocircuito con &&per interrompere se abbiamo raggiunto 1, e altrimenti ricorrere alla controparte digitangolare.


-2 byte grazie a Martin Ender per il .trucco: non dobbiamo usare Trper sommare le cifre se sostituiamo la moltiplicazione #(#+1)/2per il prodotto punto #.(#+1)/2.


2
Ho appena visto la tua risposta ora. Puoi battere il mio usando il trucco scalare del prodotto per evitare Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender il

@MartinEnder Grazie, è un bel trucco. Mi chiedo se ci siano modi ancora più golfisti di "stampare tutte le iterazioni di questa funzione sulla strada per un punto fisso" (essenzialmente, reimplementazione FixedPointListtranne per il modo in cui stampa il punto fisso due volte). Sembra che avrebbe dovuto emergere prima.
Misha Lavrov,

2

Wolfram Language (Mathematica) , 49 42 39 byte

Grazie a Misha Lavrov per aver salvato 3 byte.

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

Provalo online! (TIO ha bisogno di parentesi attorno a++y per qualche motivo. Nella mia installazione locale di Mathematica funziona senza di loro, come dovrebbe.)

Stampa ogni valore sulla propria riga, preceduto da >>e include il numero iniziale.


Puoi tornare a battere la mia risposta con #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... forse. Per qualche ragione, a TIO non piace questo, ma Mathematica sta bene con esso?)
Misha Lavrov,

Bene, ha #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 byte e funziona in TIO. Ma la mia copia di Mathematica non ritiene che le parentesi siano necessarie.
Misha Lavrov,

@MishaLavrov Grazie. Sì, non ho idea del perché TIO abbia bisogno delle parentesi, ma la sintassi nei file di script è a volte un po 'instabile.
Martin Ender,

1

Ohm v2 ,  9  7 byte

·Ω}#ΣΣu

Provalo online!

Spiegazione

          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

Non è uinutile?
Nick Clifford,

È necessario altrimenti }non dividere le cifre
Cinaski il

Hm. Potrebbe essere un bug. Io lo verificherò.
Nick Clifford,

1

Retina , 21 byte

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

Provalo online! (Gli output dei singoli casi non sono ben separati, ma ogni output termina con a1 .)

Stampa ogni numero sulla propria riga, in ordine, incluso il numero iniziale.

Spiegazione

;{:G`

Questa è solo una configurazione del programma. {esegue il ciclo del programma fino a quando non riesce a modificare il risultato (cosa che succede quando arriviamo a 1), :stampa il numero prima di ogni iterazione e ;impedisce che il risultato finale venga stampato due volte alla fine del programma. Il Gè solo il mio solito modo di creare una fase no-op.

.
$*1¶

Converti ogni cifra in unaria e inseriscila su una sua riga.

1
$%`1

Calcola il numero triangolare su ciascuna riga, sostituendo ciascuno 1con il suo prefisso. Potremmo anche usare M!&`1+qui, che ci dà tutti i suffissi di ogni riga.

1

Contare tutti 1s, che somma tutti i numeri triangolari e converte il risultato in decimale.


Retina è un linguaggio completo turing?

@ThePirateBay sì.
Martin Ender,

1

Ruby, 60 47 42 byte

-13 byte di @JustinMariner

-5 byte di @GB

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

Provalo online!


È possibile eliminare l'array e splat ( [*...]) e passare (k+1)a -~kper salvare un totale di 5 byte: Provalo online! Inoltre, puoi salvarne altri 8 passando a una funzione lambda anonima: provalo online!
Justin Mariner,

Hm, non ho idea del perché pensassi di .mapnon poter prendere le matrici.
Arte semplicemente

Puoi usare "sum {...}" invece di "map {...}. Sum" e quindi rimuovere lo spazio prima di "while"
GB

1

Befunge-93 , 51 byte

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

Provalo online!

James Holderness ha ridisegnato abilmente il mio progarm in una forma di 51 byte. Grazie!


1

Pushy , 24 22 21 17 byte

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

Provalo online!

Spiegazione

[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

1

Japt , 19 17 byte

Accetta input come una matrice a singolo elemento.

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

Provalo


0

R , 70 byte

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

Provalo online!

Restituisce anche il valore originale.

R , 80 byte

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

Provalo online!

Non restituisce il valore originale.



0

05AB1E , 20 12 byte

Risparmiato 2 byte grazie a caird coinheringaahing

ΔD,þ€iLO}O}}

Provalo online!

Spiegazione

(vecchia versione)

Δþ€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

0

JavaScript, 61 57 byte

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

Provalo online!



0

Carbone , 18 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

   θ                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


0

k , 19 byte

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

Non sorprende che funzioni in modo simile alle soluzioni APL e J già pubblicate

               $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

0

Gelatina , 7 byte

DRFSµÐĿ

Provalo online!

  • DRFSµÐĿ: Programma completo / collegamento monadico.

  • ÐĿ: Esegui il ciclo fino a quando i risultati non sono più univoci (se qualcosa di diverso da 1 si verificasse due volte, l'input specificato non avrà un risultato definito, dal momento che non raggiungerebbe mai 1).

  • D: Converte da intero a decimale.

  • R: Intervallo (1 indicizzato). Vettorizza.

  • F: Flatten e S: Sum ( µcrea solo una nuova catena monadica)


0

dc, 31 byte

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

La funzione mcalcola la funzione digitangolare del suo input; flo ripete fino a quando il risultato non raggiunge 1.

Nota che usiamo il radix di input per estrarre le cifre - questo significa che funzionerà in qualsiasi sistema di base, non solo in decimali.

dimostrazione

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


0

Neim , 8 byte

ͻ𝐂t𝕕𝐬D÷D

Spiegazione:

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

Provalo online!

Uscita formattata


0

D , 140 byte

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

Provalo online!


0

PHP, 71 + 1 byte

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

Esegui come pipe -nRo provalo online . (richiede PHP 5.3 o successivo per l'operatore Elvis)


Cos'è l'operatore Elvis?
caird coinheringaahing il

@cairdcoinheringaahing A?:B: se A è sincero, allora A else B
Titus

0

Aggiungi ++ , 32 byte

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

Provalo online!

Non genera il primo valore

Come funziona

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;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.