Angka digitangular

20

Angka segitiga adalah angka yang dapat dinyatakan sebagai jumlah dari bilangan bulat positif berurutan, mulai dari 1. Mereka juga dapat dinyatakan dengan rumus n(n + 1) / 2, di mana nada bilangan bulat positif.

Pasangan digit angka dihitung dengan cara berikut:

  1. Membagi angka menjadi array dari digit misalnya 613 => [6 1 3]
  2. Untuk setiap angka dalam array, hitung angka nsegitiga th;[6 1 3] => [21 1 6]
  3. Jumlah array yang dihasilkan; [21 1 6] => 28

Tugas Anda adalah, diberi bilangan bulat n, berulang kali menghitung nmitra digitangular, hingga hasilnya sama dengan 1, lalu menampilkan semua nilai yang dihitung. Anda dapat menampilkan nilai dalam urutan apa pun, dan dengan penyertaan opsional dari nomor asli pada awal array. Ini adalah sehingga kode terpendek menang.

Uji kasus

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
sumber
1
Bisakah kita memasukkan nomor asli sebagai yang pertama dalam array yang dihasilkan?
Uriel
1
Bagaimana kita tahu itu selalu turun ke 1?
Simply Beautiful Art
5
Misalkan angka lebih besar dari 141dan memiliki nangka. Nilai maksimum yang dapat dimiliki oleh mitra digitangular-nya adalah 45n, jadi digi-△(x) ≤ 45n < 45(1+log_10(x)), dan untuk x > 141, kita miliki 45(1+log_10(x)) < x, maka digi-△(x) ≤ x-1untuk x > 141, dan begitu kita melewati 141batas, yah, kita membuktikan secara brutal melalui program.
Simply Beautiful Art
1
Bisakah saya mengekor 1 di akhir output saya?
Simply Beautiful Art
1
Terkait: Angka digitangular , mencari bukti alternatif bahwa urutan ini akhirnya menuju ke 1.
Simply Beautiful Art

Jawaban:

10

Sekam , 6 byte

U¡(ṁΣd

Cobalah online!

Penjelasan

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
sumber
7

05AB1E , 6 5 byte

Δ=SLO

Cobalah online! Sunting: Disimpan 1 byte berkat @Emigna. Penjelasan:

Δ       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
sumber
Jika Anda mengganti dengan S, Anda dapat melewati satu O.
Emigna
@ Emigna ... mengapa Lberperilaku seperti itu?
Neil
Jika saya ingat dengan benar itu adalah bug yang ternyata berguna dan tetap sebagai fitur. Saya pikir itu adalah salah satu metode pertama yang vektor.
Emigna
4

J, 20 19 byte

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

Cobalah online!

Keluaran nomor aslinya juga.

Penjelasan

(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
sumber
1
[:+/-> 1#.meow!
FrownyFrog
@FrownyFrog bukan trik orisinal, meskipun saya pasti memanfaatkannya saat saya ingat.
cole
4

APL (Dyalog) , 23 20 17 byte

3 byte disimpan berkat @ngn

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

Cobalah online!

Bagaimana?

⍵∪⍨ - letakkan dulu array saat ini ke

+/ - jumlah dari

- diratakan

⍳¨ - rentang masing-masing

⍎¨⍕ - digit dari

⊃⍵ - nilai sebelumnya

⍣≡sampai konvergensi. Penggunaan (gabungan) memastikan setelah 1 yang pertama bergabung, yang berikutnya akan dikecualikan karena mengatur keunikan, dan array akan konvergen.

Uriel
sumber
Karena penasaran, berapa lama jika Anda tidak diizinkan untuk menampilkan nilai aslinya juga?
caird coinheringaahing
@cairdcoinheringaahing 2 byte - 1↓(drop dulu)
Uriel
@Uriel Here batas daya (⍣≡) memberikan solusi yang lebih pendek daripada rekursi: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ tapi sayang sekali APL tidak memiliki cara ringkas untuk mengumpulkan semua iterasi dari sebuah fungsi sampai konvergensi: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn
@ ngn terima kasih! Saya memang mencoba menggunakan operator daya, tetapi saya tidak memikirkan fakta konvergen setelah 1. Akan segera diperbarui
Uriel
@ tidak tahu bagaimana cara menggunakan {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡tanpa mencetak 1 yang terakhir?
Uriel
3

Haskell, 51 47 46 byte

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

Cobalah 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 

Sunting: @ H.PWiz menyimpan satu byte. Terima kasih!

nimi
sumber
2

Python 2 , 62 byte

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

Cobalah online!

benar-benar manusiawi
sumber
2

Bahasa Wolfram (Mathematica) , 43 41 byte

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

Cobalah online!

Bagaimana itu bekerja

Ekspresi #.(#+1)/2&@IntegerDigits@#memberikan padanan digitangular dari #. Kami Echoinput, gunakan evaluasi hubung singkat dengan &&untuk berhenti jika kami telah mencapai 1, dan jika tidak berulang pada mitra digitangular.


-2 byte terima kasih kepada Martin Ender untuk .triknya: kita tidak perlu menggunakan Trjumlah penjumlahan jika kita mengganti perkalian #(#+1)/2dengan produk titik #.(#+1)/2.

Misha Lavrov
sumber
2
Hanya melihat jawaban Anda sekarang. Anda dapat mengalahkan tambang dengan menggunakan trik produk skalar untuk menghindari Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender
@ MartinEnder Terima kasih, itu trik yang rapi. Saya bertanya-tanya apakah ada cara golfier untuk melakukan "cetak semua iterasi fungsi ini dalam perjalanan ke titik tetap" (pada dasarnya, menerapkan kembali FixedPointListkecuali untuk bagaimana mencetak titik tetap dua kali). Sepertinya itu seharusnya muncul sebelumnya.
Misha Lavrov
2

Bahasa Wolfram (Mathematica) , 49 42 39 byte

Terima kasih kepada Misha Lavrov karena telah menghemat 3 byte.

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

Cobalah online! (TIO membutuhkan tanda kurung di sekitar ++yuntuk beberapa alasan. Dalam instalasi Mathematica lokal saya berfungsi tanpa mereka, sebagaimana mestinya.)

Mencetak setiap nilai pada barisnya sendiri, didahului oleh >>, dan termasuk angka awal.

Martin Ender
sumber
Anda dapat kembali mengalahkan jawaban saya #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... mungkin. Untuk beberapa alasan, TIO tidak suka ini, tetapi Mathematica baik-baik saja dengan itu?)
Misha Lavrov
Nah, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 byte dan bekerja di TIO. Tetapi salinan Mathematica saya tidak menganggap tanda kurung itu perlu.
Misha Lavrov
@MishaLavrov Terima kasih. Ya, tidak ada petunjuk mengapa TIO membutuhkan tanda kurung, tetapi sintaksis dalam file skrip terkadang agak miring.
Martin Ender
1

Ohm v2 ,  9  7 byte

·Ω}#ΣΣu

Cobalah online!

Penjelasan

          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
sumber
Bukankah tidak uperlu?
Nick Clifford
Ini perlu jika }tidak tidak akan membagi angka
Cinaski
Hm Itu mungkin bug. Saya akan mengeceknya.
Nick Clifford
1

Retina , 21 byte

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

Cobalah online! (Output dari masing-masing case tidak dipisahkan dengan baik, tetapi setiap output berakhir dengan a 1.)

Mencetak setiap nomor pada barisnya sendiri, secara berurutan, termasuk nomor awal.

Penjelasan

;{:G`

Ini hanya beberapa konfigurasi program. {membuat loop program sampai gagal mengubah hasil (yang terjadi setelah kita sampai 1), :mencetak nomor sebelum setiap iterasi, dan ;mencegah hasil akhir dari dicetak dua kali pada akhir program. Itu Ghanya cara biasa saya untuk membuat tahap no-op.

.
$*1¶

Ubah setiap digit menjadi unary dan letakkan di barisnya sendiri.

1
$%`1

Hitung angka segitiga pada setiap baris, dengan mengganti masing 1- masing dengan awalannya. Kita juga bisa menggunakan di M!&`1+sini, yang memberi kita semua sufiks dari setiap baris.

1

Hitung semua 1s, yang merangkum semua angka segitiga dan mengubah hasilnya kembali menjadi desimal.

Martin Ender
sumber
Apakah Retina bahasa yang lengkap?
@ThePirateBay ya.
Martin Ender
1

Ruby, 60 47 42 byte

-13 byte oleh @JustinMariner

-5 byte oleh @GB

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

Cobalah online!

Seni Cukup Indah
sumber
Anda dapat menjatuhkan array dan splat ( [*...]) dan mengubah (k+1)ke -~kuntuk menyimpan total 5 byte: Coba online! Selain itu, Anda dapat menyimpan 8 lebih banyak dengan beralih ke fungsi lambda anonim: Cobalah online!
Justin Mariner
Hm, tidak tahu mengapa saya pikir .maptidak bisa mengambil array.
Simply Beautiful Art
Anda dapat menggunakan "jumlah {...}" alih-alih "peta {...}. Jumlah" dan kemudian hapus spasi sebelum "sementara"
GB
1

Befunge-93 , 51 byte

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

Cobalah online!

James Holderness dengan cerdik membentuk kembali progarm saya menjadi bentuk 51-byte. Terima kasih!

Lynn
sumber
1

Pushy , 24 22 21 17 byte

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

Cobalah online!

Penjelasan

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

Japt , 19 17 byte

Mengambil input sebagai array elemen tunggal.

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

Cobalah

Shaggy
sumber
0

R , 70 byte

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

Cobalah online!

Mengembalikan nilai asli juga.

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}

Cobalah online!

Tidak mengembalikan nilai asli.

Giuseppe
sumber
0

Lua , 91 byte

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

Cobalah online!

Jonathan S.
sumber
0

05AB1E , 20 12 byte

Disimpan 2 byte berkat caird coinheringaahing

ΔD,þ€iLO}O}}

Cobalah online!

Penjelasan

(versi lama)

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

sumber
0

JavaScript, 61 57 byte

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

Cobalah online!


sumber
0

Arang , 18 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

k , 19 byte

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

Tidak mengherankan bekerja sama dengan solusi APL dan J yang sudah diposting

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

Jelly , 7 byte

DRFSµÐĿ

Cobalah online!

  • DRFSµÐĿ: Tautan program / monadik lengkap.

  • ÐĿ: Loop sampai hasilnya tidak lagi unik (jika sesuatu selain 1 akan muncul dua kali, maka input yang diberikan tidak memiliki hasil yang pasti, karena tidak akan pernah mencapai 1).

  • D: Konversi dari integer ke desimal.

  • R: Range (1-diindeks). Vectorizes.

  • F: Ratakan dan S: Sum ( µhanya menciptakan rantai monadik baru)

Tuan Xcoder
sumber
0

dc, 31 byte

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

Fungsinya m menghitung digitangular dari inputnya; fulangi ini sampai hasilnya mencapai 1.

Perhatikan bahwa kami menggunakan input radix untuk mengekstrak digit - ini berarti ia akan bekerja di sistem basis apa pun, tidak hanya desimal.

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

Neim , 8 byte

ͻ𝐂t𝕕𝐬D÷D

Penjelasan:

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

Cobalah online!

Output terformat

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

Cobalah online!

Zacharý
sumber
0

PHP, 71 +1 byte

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

Jalankan sebagai pipa dengan -nRatau coba online . (membutuhkan PHP 5.3 atau yang lebih baru untuk operator Elvis)

Titus
sumber
Apa operator Elvis?
caird coinheringaahing
@cairdcoinheringaahing A?:B: jika A benar maka A yang lain B
Titus
0

Tambahkan ++ , 32 byte

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

Cobalah online!

Tidak menampilkan nilai pertama

Bagaimana itu bekerja

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
sumber