Digitangular 숫자


20

삼각형 개수 이들은 또한 화학식으로 표현 될 수있다 (1)에서 시작하여 연속적인 양의 정수의 합으로 표현 될 수있는 수이고 n(n + 1) / 2, n어떤 양의 정수이다.

숫자의 디지털 대응 숫자는 다음과 같은 방식으로 계산됩니다.

  1. 숫자를 숫자의 배열로 나눕니다. 예 : 613 => [6 1 3]
  2. 배열의 각 숫자에 대해 n삼각형의 숫자를 계산하십시오 .[6 1 3] => [21 1 6]
  3. 결과 배열을 합산하십시오. [21 1 6] => 28

당신의 작업은 정수가 주어지면 결과가 1이 될 때까지 n반복적으로 ndigitangular 대응을 계산 한 다음 계산 된 모든 값을 출력합니다. 배열 시작시 원래 번호를 선택적으로 포함하여 임의의 순서로 값을 출력 할 수 있습니다. 이것은 이므로 가장 짧은 코드가 승리합니다.

테스트 사례

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숫자 보다 크고 숫자가 있다고 가정 해 봅시다 . 그 digitangular 대응이 가질 수있는 최대 값은 45n너무, digi-△(x) ≤ 45n < 45(1+log_10(x))그리고를 위해 x > 141우리가 가진, 45(1+log_10(x)) < x따라서, digi-△(x) ≤ x-1위해 x > 141, 우리는 합격 한 후 141제한, 음, 우리가 프로그램을 통해 증명 무력.
Simply Beautiful Art

1
출력이 끝날 때 후행 1을 가질 수 있습니까?
Simply Beautiful Art

1
관련 : Digitangular numbers ,이 시퀀스가 ​​결국 1이된다는 대체 증거를 찾습니다.
Simply Beautiful Art

답변:



7

05AB1E , 6 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

@Emigna ... 왜 L그런 식으로 행동합니까?

내가 올바르게 기억한다면 그것은 유용한 것으로 판명되고 기능으로 남아있는 버그였습니다. 나는 그것이 벡터화 된 첫 번째 방법 중 하나라고 생각합니다.
Emigna

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는 원래 트릭이 아니지만 기억할 때 확실히 사용합니다.
cole

4

APL (Dyalog) , 23 20 17 바이트

@ngn 덕분에 3 바이트 절약

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

온라인으로 사용해보십시오!

방법?

⍵∪⍨ -현재 배열 앞에

+/ - 의 합

-평평

⍳¨ -각각의 범위

⍎¨⍕ -자릿수

⊃⍵ -이전 값

⍣≡수렴까지. 의 사용 (노동 조합)에 의한 일련의 고유성에 최초의 1에 가입 한 후 확인, 다음은 제외됩니다 만들고, 배열 수렴됩니다.


호기심으로 인해 원래 값을 출력하지 않으면 얼마나 오래 걸립니까?
caird coinheringaahing

@cairdcoinheringaahing 2 바이트- 1↓(drop first)
Uriel

@Uriel 여기에서 전력 제한 (⍣≡)은 재귀보다 더 짧은 해결책을 제공합니다. {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ 수렴까지의 함수 : ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn 감사합니다! 나는 전원 연산자를 사용하려고했지만 나는 곧 업데이트 예정 1. 후 수렴 사실에 대해 생각하지 않았다
우리엘

@ngn {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡마지막 1 장을 인쇄하지 않고 사용하는 방법에 대한 아이디어가 있습니까?
우리엘

3

하스켈, 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 Language (Mathematica) , 43 41 바이트

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

온라인으로 사용해보십시오!

작동 원리

이 표현 #.(#+1)/2&@IntegerDigits@#은의 대응하는 숫자를 나타 #냅니다. 우리 Echo입력이와 단락 회로 평가를 사용하여 &&우리가 도달 한 경우 정지 1digitangular 대응에, 그렇지 않으면 같이 Recurse합니다.


.트릭 을 위해 Martin Ender 덕분에 -2 바이트 : 우리는 내적을 Tr#(#+1)/2으로 대체 할 경우 숫자를 합산하는 데 사용할 필요가 없습니다 #.(#+1)/2.


2
지금 당신의 대답 만 보았습니다. 스칼라 곱 트릭을 사용하면 다음과 같은 상황을 피할 수 있습니다 Tr.Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@MartinEnder 감사합니다. 깔끔한 트릭입니다. "고정 점으로가는 길에이 함수의 모든 반복을 인쇄"( FixedPointList실제로 고정 점을 두 번 인쇄하는 방법을 제외하고 다시 구현)하는 골퍼 방법이 있는지 궁금합니다 . 그것은 전에 나온 것 같습니다.
Misha Lavrov

2

Wolfram Language (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하지 같은 않지만, 그것 티카의 미세?)
미샤 라브 로프

글쎄, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 바이트이며 TIO에서 작동합니다. 그러나 Mathematica의 사본은 괄호가 필요하다고 생각하지 않습니다.
Misha Lavrov

@MishaLavrov 감사합니다. 예, TIO에 괄호가 필요한 이유는 알 수 없지만 스크립트 파일의 구문이 약간 까다로운 경우가 있습니다.
Martin Ender


1

망막 , 21 바이트

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

온라인으로 사용해보십시오! 개별 사례의 결과는 잘 구분되지 않지만 각 결과는로 끝납니다 1.

시작 번호를 포함하여 순서대로 각 번호를 한 줄에 인쇄합니다.

설명

;{:G`

이것은 프로그램의 일부 구성 일뿐입니다. {결과가 변경되지 않을 때까지 (우리가 일단 도달하면 1) 프로그램을 :반복하고, 각 반복 전에 숫자를 ;인쇄하고, 프로그램의 마지막에 최종 결과가 두 번 인쇄되는 것을 방지합니다. 이것은 G나만의 무대를 만드는 일반적인 방법입니다.

.
$*1¶

각 숫자를 단항으로 변환하고 자체 줄에 넣습니다.

1
$%`1

각 줄을 1접두사 로 바꾸어 각 줄의 삼각 숫자를 계산하십시오 . 우리는 또한 M!&`1+여기서 사용할 수 있으며 , 이것은 각 줄의 모든 접미사를 제공합니다.

1

모든 1s를 세십시오. 이는 모든 삼각 수를 합산하고 결과를 다시 10 진수로 변환합니다.


Retina는 완전한 언어입니까?

@ThePirateBay 예.
Martin Ender

1

루비, 60 47 42 바이트

@JustinMariner의 -13 바이트

@GB -5 바이트

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

온라인으로 사용해보십시오!


당신은 배열과 플랫 (삭제할 수 있습니다 [*...]) 변경을 (k+1)위해 -~k5 바이트의 총 저장 : 온라인으로보십시오! 또한 익명의 람다 기능으로 전환하여 8을 더 절약 할 수 있습니다. 온라인으로 사용해보십시오!
저스틴 마리너

흠, 왜 내가 .map배열을 취할 수 없다고 생각했는지 모르겠다 .
Simply Beautiful Art

"map {...}. sum"대신 "sum {...}"을 사용한 다음 "while"앞의 공백을 제거 할 수 있습니다.
GB


1

Pushy , 24 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

05AB1E , 20 12 바이트

caird coinheringaahing으로 2 바이트 절약

ΔD,þ€iLO}O}}

온라인으로 사용해보십시오!

설명

(구 버전)

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

, 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이 아닌 다른 항목이 두 번 발생하는 경우 지정된 입력은 1에 도달하지 않으므로 정의 된 결과가 없습니다).

  • D: 정수에서 10 진수로 변환합니다.

  • R: 범위 (1- 색인). 벡터화합니다.

  • F: Flatten and S: Sum ( µ단순히 새로운 모나 딕 체인을 만듭니다)


0

dc, 31 바이트

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

이 함수 m는 입력의 디지털 함수를 계산합니다. f결과가 1에 도달 할 때까지이를 반복합니다.

입력 기수를 사용하여 숫자를 추출한다는 점에 유의하십시오. 이는 소수점뿐만 아니라 모든 기본 시스템에서 작동한다는 것을 의미합니다.

데모

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 바이트

ͻ𝐂t𝕕𝐬D÷D

설명:

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

온라인으로 사용해보십시오!

형식화 된 출력




0

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.