Dijital sayılar


20

Bir üçgen sayıda Bunlar ayrıca, formül ile ifade edilebilir 1'den başlayarak, birbirini takip eden pozitif tamsayı toplamı olarak ifade edilebilir bir sayıdır n(n + 1) / 2, nbir pozitif tamsayıdır.

Bir sayının dijital muadili şu şekilde hesaplanır:

  1. Bir sayıyı basamak dizisine bölme ör. 613 => [6 1 3]
  2. Dizideki her sayı için nüçgen sayıyı hesaplayın ;[6 1 3] => [21 1 6]
  3. Sonuçtaki diziyi toplayın; [21 1 6] => 28

Göreviniz, bir tamsayı verildiğinde , sonuç 1'e eşit olana kadar nart arda ndigitangular olan karşılığını hesaplayın , sonra hesaplanan tüm değerleri çıktılayın. Değerleri istediğiniz sırayla ve dizinin başlangıcında isteğe bağlı olarak orijinal numaranın dahil edilmesiyle çıktı alabilirsiniz. Bu bir bu yüzden en kısa kod kazanır.

Test senaryoları

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
Sonuçta ilk sırada orijinal numarayı ekleyebilir miyiz?
Uriel

1
Her zaman 1'e indiğini nasıl bilebiliriz?
Simply Beautiful Art

5
Diyelim ki bir sayı daha büyük 141ve nrakam içeriyor . Bunu digitangular muadili olabilir en yüksek değerdir 45n, yani digi-△(x) ≤ 45n < 45(1+log_10(x)), ve için x > 141biz, 45(1+log_10(x)) < xbu nedenle, digi-△(x) ≤ x-1için x > 141, ve bir kere geçmesi 141sınırı, şey, programları ile ispat kaba kuvvet.
Sadece Güzel Sanat

1
Çıktımın sonunda arkada 1 olabilir mi?
Simply Beautiful Art

1
İlgili: Bu sıralamanın nihayetinde 1 olduğuna alternatif kanıtlar arayan dijital sayılar .
Simply Beautiful Art

Yanıtlar:


10

Kabuk , 6 bayt

U¡(ṁΣd

Çevrimiçi deneyin!

açıklama

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 bayt

Δ=SLO

Çevrimiçi deneyin! Düzenleme: @Emigna sayesinde 1 bayt kaydedildi. Açıklama:

Δ       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

Eğer değiştirirseniz ile S, bir tane atlayabilirsiniz O.
Emigna

@Emigna ... neden Lbu şekilde davranıyor?
Neil

Doğru hatırlıyorsam, kullanışlı olduğu ortaya çıkan ve bir özellik olarak kalması gereken bir hataydı. Bence bu vektörize giden ilk yöntemlerden biriydi.
Emigna

4

J, 20 19 bayt

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

Çevrimiçi deneyin!

Orijinal numarayı da verir.

açıklama

(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#.miyav!
FrownyFrog

@FrownyFrog orijinal bir numara değil, hatırladığımda kesinlikle bolca kullanıyorum.
cole

4

APL (Dyalog) , 23 20 17 bayt

@Ngn sayesinde 3 bayt kaydedildi

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

Çevrimiçi deneyin!

Nasıl?

⍵∪⍨ - geçerli diziyi

+/ - toplamı

- basık

⍳¨ - her birinin aralıkları

⍎¨⍕ - rakamı

⊃⍵ - önceki değer

⍣≡yakınsama kadar. (Birleşim) kullanımı , ilk 1'e katıldıktan sonra bir sonraki ayarlanan benzersizlik nedeniyle hariç tutulur ve dizi yakınsak olur.


Meraktan, orijinal değeri de çıkarmanıza izin verilmezse ne kadar olurdu?
17:31 de caird coinheringaahing

@cairdcoinheringaahing 2 bayt - 1↓(önce bırakın)
Uriel

@Uriel Burada güç limiti (⍣≡) özyinelemeden daha kısa bir çözüm sunuyor: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ ama APL'nin tüm tekrarlarını toplamak için özlü bir yolu yok yakınsamaya kadar bir işlev: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn teşekkürler! Güç operatörünü kullanmaya çalıştım, ancak 1'den sonra yakınsadığı gerçeğini düşünmedim. Yakında güncellenecek
Uriel

@ngn {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡Son 1 yazdırılmadan nasıl kullanılacağına dair bir fikriniz var mı?
Uriel

3

Haskell, 51 47 46 bayt

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

Çevrimiçi deneyin!

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 

Düzenleme: @ H.PWiz bir bayt kaydetti. Teşekkürler!



2

Wolfram Dili (Mathematica) , 43 41 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

İfade #.(#+1)/2&@IntegerDigits@#, 'nin dijital karşılığını verir #. Biz girdiyiz, ulaştığımız zaman durdurmak için Echoile kısa devre değerlendirmesini kullanıyoruz , aksi takdirde dijital muadili üzerinde geri çekiliyoruz.&&1


Martin Ender'e .hile için -2 bayt : Nokta Trçarpımıyla çarpımı değiştirirsek rakamları toplamak için kullanmamız gerekmez .#(#+1)/2#.(#+1)/2


2
Sadece cevabını şimdi gördüm. Aşağıdakilerden kaçınmak için skaler ürün hilesi kullanarak mayın yenebilirsiniz Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@MartinEnder Teşekkürler, bu temiz bir numara. "Bu işlevin tüm yinelemelerini sabit bir noktaya giderken yazdırmanın" herhangi bir daha golfçü yolu olup olmadığını merak ediyorum (aslında, FixedPointListsabit noktanın iki kez nasıl yazdırıldığı dışında yeniden uygulama ). Bu daha önce ortaya çıkmış gibi görünüyor.
Misha Lavrov

2

Wolfram Dili (Mathematica) , 49 42 39 bayt

3 bayt tasarruf ettiği için Misha Lavrov'a teşekkürler.

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

Çevrimiçi deneyin! (TIO'nun bir ++ynedenden dolayı parantezlere ihtiyacı var . Yerel Mathematica kurulumumda olması gerektiği gibi çalışıyor.)

Her değeri, öncesinde kendi satırına yazdırır >>ve başlangıç ​​numarasını içerir.


Cevabımı yenerek geri dönebilirsin #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... belki. TIO bir nedenden dolayı bunu sevmiyor, ama Mathematica bununla iyi mi?)
Misha Lavrov

Peki, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 bayt ve TIO'da çalışıyor. Ancak Mathematica kopyam parantezin gerekli olduğunu düşünmüyor.
Misha Lavrov

@MishaLavrov Teşekkürler. Evet, TIO'nun neden parantezlere ihtiyacı olduğuna dair bir ipucu yok, ancak komut dosyası dosyalarındaki sözdizimi bazen biraz sakat.
Martin Ender


1

Retina , 21 bayt

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

Çevrimiçi deneyin! (Her bir vakanın çıktıları iyi ayrılmış değildir, ancak her çıktı a ile biter 1.)

Her sayıyı başlangıç ​​numarası da dahil olmak üzere kendi satırına yazdırır.

açıklama

;{:G`

Bu programın sadece bir yapılandırmasıdır. {sonucu değiştirene kadar program döngüsünü yapar (biz ulaştığımızda olur 1), :her yinelemeden önce sayı yazdırır ve ;son sonucun programın sonunda iki kez yazdırılmasını önler. Bu Gsadece bir op-olmayan sahne oluşturmak benim her zamanki yoludur.

.
$*1¶

Her basamağı tekli olarak dönüştürün ve kendi satırına koyun.

1
$%`1

Her satırı 1önekiyle değiştirerek, her satırdaki üçgen sayıyı hesaplayın . Burada da kullanabiliriz M!&`1+, bu da bize her satırın tüm soneklerini verir.

1

Tüm 1üçgen sayıları toplayan ve sonucu ondalık sayıya dönüştüren tüm s değerlerini sayın .


Retina bir turing tam dili mi?

@ThePirateBay evet.
Martin Ender

1

Yakut, 60 47 42 bayt

@JustinMariner tarafından -13 bayt

@GB tarafından -5 bayt

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

Çevrimiçi deneyin!


Sen dizi ve uyarısı (bırakabilirsiniz [*...]) ve değişim (k+1)için -~k5 bayt toplam kaydetmek için: Online deneyin! Ayrıca, anonim bir lambda işlevine geçerek 8 tane daha tasarruf edebilirsiniz: Çevrimiçi deneyin!
Justin Mariner

Hm, neden .mapdizileri alamayacağını düşündüm .
Tek Güzel Güzel Sanat

"Map {...}. Sum" yerine "sum {...}" kullanabilir ve sonra "while" öncesindeki alanı kaldırabilirsiniz
GB


1

Pushy , 24 22 21 17 bayt

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

Çevrimiçi deneyin!

açıklama

[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


0

R , 70 bayt

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

Çevrimiçi deneyin!

Orijinal değeri de döndürür.

R , 80 bayt

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

Çevrimiçi deneyin!

Orijinal değeri döndürmez.



0

05AB1E , 20 12 bayt

Caird CoinheringAahing sayesinde 2 bayt kaydedildi

ΔD,þ€iLO}O}}

Çevrimiçi deneyin!

açıklama

(eski versiyon)

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

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

Çevrimiçi deneyin!



0

Kömür , 18 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

   θ                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 bayt

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

Şaşırtıcı olmayan bir şekilde zaten yayınlanan APL ve J çözümlerine benzer şekilde çalışır

               $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

Jöle , 7 bayt

DRFSµÐĿ

Çevrimiçi deneyin!

  • DRFSµÐĿ: Tam program / monadik bağlantı.

  • ÐĿ: Sonuçlar artık benzersiz olana kadar döngü yapmayın (1 dışında bir şey iki kez gerçekleşirse, verilen girdinin tanımlanmış bir sonucu olmaz, çünkü asla 1'e ulaşmaz).

  • D: Tamsayıdan ondalığa dönüştürme.

  • R: Aralık (1 dizinli). Vektörleştirir.

  • F: Düzleştir ve S: Toplam ( µsadece yeni bir monadik zincir oluşturur)


0

dc, 31 bayt

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

Fonksiyon m, girdisinin dijital fonksiyonunu hesaplar;fsonuç 1'e ulaşana kadar bunu tekrarlar.

Rakamları ayıklamak için giriş yarıçapını kullandığımızı unutmayın - bu, yalnızca ondalık olarak değil, herhangi bir temel sistemde çalışacağı anlamına gelir.

gösteri

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 bayt

ͻ𝐂t𝕕𝐬D÷D

Açıklama:

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

Çevrimiçi deneyin!

Biçimlendirilmiş çıktı


0

D , 140 bayt

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

Çevrimiçi deneyin!


0

PHP, 71 + 1 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin . (Elvis operatörü için PHP 5.3 veya üstünü gerektirir)


Elvis operatörü nedir?
Caird coinheringaahing

@cairdcoinheringaahing A?:B: A doğruysa o zaman başka bir B
Titus

0

++ , 32 bayt ekle

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

Çevrimiçi deneyin!

İlk değeri vermez

Nasıl çalışır

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;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.