数字


20

三角形の数は、それらはまた、式で表すことができる1から始まる、連続する正の整数の和として表すことができる数でありn(n + 1) / 2nいくつかの正の整数です。

数値の対応する数字は、次の方法で計算されます。

  1. 数字をその数字の配列に分割します。例えば 613 => [6 1 3]
  2. 配列内の各番号について、nth三角番号を計算します。[6 1 3] => [21 1 6]
  3. 結果の配列を合計します。 [21 1 6] => 28

あなたのタスクは、整数が与えられると、結果が1になるまでn繰り返しのn対応する数字を計算し、計算されたすべての値を出力します。値は任意の順序で出力でき、オプションで配列の先頭に元の番号を含めることができます。これはので、最短のコードが優先されます。

テストケース

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
結果の配列の最初に元の数を含めることができますか?
ウリエル

1
常に1になっていることをどのように確認しますか?
単に美しいアート

5
数字141n数字より大きく、数字があると仮定しましょう。対応する桁の最大値は45n、so digi-△(x) ≤ 45n < 45(1+log_10(x))、およびfor x > 141であり45(1+log_10(x)) < x、したがってdigi-△(x) ≤ x-1、for x > 141であり、141制限を超えると、プログラムを介してブルートフォースが証明されます。
単に美しいアート

1
出力の最後に末尾の1を付けることはできますか?
単に美しいアート

1
関連:Digitangular number。このシーケンスが最終的に1になるという代替証明を求めています。
単に美しいアート

回答:


10

、6バイト

U¡(ṁΣd

オンラインでお試しください!

説明

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

05AB1E6 5バイト

Δ=SLO

オンラインでお試しください!編集:@Emignaのおかげで1バイト保存されました。説明:

Δ       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

に置き換える場合S、スキップできますO
エミグナ

@Emigna ...なぜLそのように振る舞うのですか?
ニール

正しく思い出すと、それは有用であることが判明し、機能として残っていたバグでした。ベクトル化した最初の方法の1つだったと思います。
エミグナ

4

J、20 19バイト

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

オンラインでお試しください!

元の数値も出力します。

説明

(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#.ニャー!
FrownyFrog

@FrownyFrogはオリジナルのトリックではありませんが、覚えているときは確かに十分に活用しています。
コール

4

APL(Dyalog)23 20 17バイト

@ngnのおかげで3バイト節約

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

オンラインでお試しください!

どうやって?

⍵∪⍨ -現在の配列を先頭に追加

+/ -の合計

-平坦化

⍳¨ -それぞれの範囲

⍎¨⍕ -の桁

⊃⍵ -以前の値

⍣≡収束するまで。(union)を使用すると、最初の1が結合された後、セットの一意性のために次の1が除外され、配列が収束します。


好奇心から、元の値を出力することも許可されなかった場合、どのくらいの時間がかかりますか?
ケアノイ共和党

2バイト@cairdcoinheringaahing - 1↓(第一滴)
ウリエル

@Urielここで、電力制限(⍣≡)は再帰よりも短い解決策を提供します:{∊⍳ + / ∊⍳¨⍎¨⍕⊃⍵}⍣≡しかし、それは残念ですAPLは収束までの関数:⍵(f⍵)(f⍣2⊢⍵)(f⍣3⊢⍵)...
ngn

@ngnありがとう!私はパワー演算子を使用しようとしましたが、1の後に収束するという事実については考えませんでした。まもなく更新されます
Uriel

{+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡最後の1つを印刷せずに使用する方法についてのアイデアはありますか?
ウリエル

3

Haskell、51 47 46バイト

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

オンラインでお試しください!

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 

編集:@ H.PWizはバイトを保存しました。ありがとう!



2

Wolfram言語(Mathematica)43 41バイト

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

オンラインでお試しください!

使い方

#.(#+1)/2&@IntegerDigits@#は、の対応するディジット角を与え#ます。私たちEchoは入力し、に&&到達したら停止するための短絡評価を使用し1、それ以外の場合は対応する数字で再帰します。


-2バイト、.トリックのMartin Enderに感謝します。Tr乗算#(#+1)/2をドット積で置き換える場合、数字の合計に使用する必要はありません#.(#+1)/2


2
今あなたの答えを見ただけです。あなたは避けるように内積のトリックを使用して鉱山を打つことができるTrEcho@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
マーティン・エンダー

@MartinEnderありがとう、すてきなトリックです。「固定小数点への途中でこの関数のすべての反復を印刷する」(基本的にFixedPointList、固定小数点を2回印刷する方法を除いて再実装する)方法はありますか?それは前に出てきたはずのようです。
ミシャラヴロフ

2

Wolfram言語(Mathematica)49 42 39バイト

3バイトを節約してくれたMisha Lavrovに感謝します。

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

オンラインでお試しください!(TIOには++y何らかの理由で括弧が必要です。ローカルのMathematicaインストールでは、括弧がなくても動作します。)

先頭にが付いた独自の行に各値を出力し>>、開始番号を含めます。


あなたは私の答えを叩きに戻ることができる#//.x_:>(y=IntegerDigits@Echo@x).++y/2&。(...たぶん。何らかの理由で、TIOはこれを好まないが、Mathematicaはそれでいいのか?)
ミシャラヴロフ

まあ、#//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41バイトであり、TIOで動作します。しかし、私のMathematicaのコピーは、括弧が必要だとは考えていません。
ミシャラヴロフ

@MishaLavrovありがとう。ええ、TIOがかっこを必要とする理由はわかりませんが、スクリプトファイルの構文は少し不安定です。
マーティンエンダー

1

オームV2 9つの  7バイト

·Ω}#ΣΣu

オンラインでお試しください!

説明

          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

u不要ではありませんか?
ニッククリフォード

それ以外の場合}は、数字を分割しないことが必要です
Cinaski

ふむ それはバグかもしれません。確かめます。
ニッククリフォード

1

網膜、21バイト

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

オンラインでお試しください!(個々のケースの出力は十分に分離されていませんが、各出力はで終わり1ます。)

開始番号を含め、各番号を順番に独自の行に出力します。

説明

;{:G`

これはプログラムの一部の構成です。{結果の変更に失敗するまでプログラムをループさせ(これはに到達すると発生します1)、:各反復の前に数値を出力し;、プログラムの最後に最終結果が2回出力されるのを防ぎます。これGは、ノーオペレーションステージを作成する私の通常の方法です。

.
$*1¶

各桁を単項に変換し、独自の行に配置します。

1
$%`1

各行1を接頭辞で置き換えて、各行の三角数を計算します。M!&`1+ここでも使用できます。これにより、各行のすべての接尾辞が得られます。

1

すべて1のsをカウントします。これにより、すべての三角数字が合計され、結果が10進数に変換されます。


Retinaは完全なチューリング言語ですか?

@ThePirateBayはい。
マーティンエンダー

1

ルビー、60 47 42バイト

@JustinMarinerによる-13バイト

-5バイト@GB

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

オンラインでお試しください!


アレイとスプラット([*...])をドロップし、に変更(k+1)-~kて合計5バイトを節約できます。オンラインで試してください! さらに、匿名のラムダ関数に切り替えることで、さらに8つ節約できます。オンラインで試してください!
ジャスティンマリナー

うーん、なぜ.map配列を取得できないと思ったのかわかりません。
単に美しいアート

「{...}の和マップ」あなたが「合計{...}」の代わりに使用し、「しばらく」の前にスペースを削除することができます
GB


1

Pushy24 22 21 17バイト

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

オンラインでお試しください!

説明

[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

、18バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

   θ                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バイト

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

当然のことながら、すでに投稿されているAPLおよびJソリューションと同様に機能します。

               $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

ゼリー、7バイト

DRFSµÐĿ

オンラインでお試しください!

  • DRFSµÐĿ:完全なプログラム/モナドリンク。

  • ÐĿ:結果が一意でなくなるまでループします(1以外の何かが2回発生する場合、1に到達しないため、指定された入力には定義された結果がありません)。

  • D:整数から10進数に変換します。

  • R:範囲(1-indexed)。ベクトル化します。

  • F:Flatten and S:Sum(µ新しいモナド連鎖を作成するだけです)


0

dc、31バイト

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

この関数mは、入力のデジット角関数を計算します。f結果が1になるまでこれを繰り返します。

入力基数を使用して数字を抽出することに注意してください-これは、10進数だけでなく、任意の基本システムで機能することを意味します。

デモ

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

Add ++、32バイト

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

オンラインでお試しください!

最初の値を出力しません

使い方

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;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.