Số chữ số


20

Một số tam giác là một số có thể được thể hiện dưới dạng tổng của các số nguyên dương liên tiếp, bắt đầu từ 1. Họ cũng có thể được biểu diễn bằng công thức n(n + 1) / 2, nơi nlà một số nguyên dương.

Đối tác số hóa của một số được tính theo cách sau:

  1. Chia một số thành một mảng các chữ số của nó, vd 613 => [6 1 3]
  2. Đối với mỗi số trong mảng, tính nsố tam giác thứ;[6 1 3] => [21 1 6]
  3. Tính tổng mảng kết quả; [21 1 6] => 28

Nhiệm vụ của bạn là, được đưa ra một số nguyên n, lặp đi lặp lại tính toán nđối số của số, cho đến khi kết quả bằng 1, sau đó xuất tất cả các giá trị đã được tính toán. Bạn có thể xuất các giá trị theo bất kỳ thứ tự nào và với tùy chọn bao gồm số gốc ở đầu mảng. Đây là một để mã ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

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
Chúng tôi có thể bao gồm số ban đầu là số đầu tiên trong mảng kết quả không?
Uriel

1
Làm thế nào để chúng ta biết nó luôn luôn giảm xuống 1?
Đơn giản là nghệ thuật đẹp

5
Giả sử rằng một số lớn hơn 141và có nchữ số. Giá trị lớn nhất đối digitangular của nó có thể có là 45n, vì vậy digi-△(x) ≤ 45n < 45(1+log_10(x)), và cho x > 141, chúng tôi có 45(1+log_10(x)) < x, vì thế digi-△(x) ≤ x-1cho x > 141, và một khi chúng ta vượt qua 141giới hạn, tốt, chúng tôi Brute Force chứng minh qua các chương trình.
Đơn giản là nghệ thuật đẹp

1
Tôi có thể có dấu 1 ở cuối sản phẩm không?
Đơn giản là nghệ thuật đẹp

1
Liên quan: Số chữ số , tìm kiếm bằng chứng thay thế rằng chuỗi này cuối cùng sẽ lên 1.
Nghệ thuật đơn giản là đẹp

Câu trả lời:


10

Husk , 6 byte

U¡(ṁΣd

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu 1 byte nhờ @Emigna. Giải trình:

Δ       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

Nếu bạn thay thế bằng S, bạn có thể bỏ qua một O.
Emigna

@Emigna ... tại sao Lthậm chí hành xử theo cách đó?
Neil

Nếu tôi nhớ lại một cách chính xác thì đó là một lỗi có vẻ hữu ích và vẫn còn là một tính năng. Tôi nghĩ rằng đó là một trong những phương pháp đầu tiên được vector hóa.
Emigna

4

J, 20 19 byte

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

Hãy thử trực tuyến!

Đầu ra số ban đầu, quá.

Giải trình

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

@FrownyFrog không phải là một thủ thuật ban đầu, mặc dù tôi chắc chắn sử dụng nó rất nhiều khi tôi nhớ.
cole

4

APL (Dyalog) , 23 20 17 byte

3 byte được lưu nhờ @ngn

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

Hãy thử trực tuyến!

Làm sao?

⍵∪⍨ - nạp trước mảng hiện tại vào

+/ - Tổng của

- dẹt

⍳¨ - phạm vi của mỗi

⍎¨⍕ - chữ số của

⊃⍵ - giá trị trước đây

⍣≡Cho đến khi hội tụ. Việc sử dụng (union) đảm bảo sau khi 1 đầu tiên được tham gia, tiếp theo sẽ bị loại trừ do tính duy nhất được đặt và mảng sẽ hội tụ.


Vì tò mò, sẽ mất bao lâu nếu bạn không được phép xuất giá trị ban đầu?
caird coinheringaahing

@cairdcoinheringaahing 2 byte - 1↓(thả trước)
Uriel

@Uriel Ở đây giới hạn công suất (⍣≡) đưa ra giải pháp ngắn hơn đệ quy: {+ / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ nhưng thật đáng tiếc APL không có cách ngắn gọn để thu thập tất cả các lần lặp của một hàm cho đến khi hội tụ: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn cảm ơn! Tôi đã thử sử dụng toán tử điện, nhưng tôi không nghĩ về thực tế nó hội tụ sau 1. Sẽ cập nhật sớm
Uriel

@ngn có ý kiến ​​gì về cách sử dụng {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡mà không in 1 lần cuối không?
Uriel

3

Haskell, 51 47 46 byte

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

Hãy thử trực tuyến!

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 

Chỉnh sửa: @ H.PWiz đã lưu một byte. Cảm ơn!



2

Ngôn ngữ Wolfram (Mathicala) , 43 41 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Biểu thức #.(#+1)/2&@IntegerDigits@#cho đối tác số hóa của #. Chúng tôi Echođầu vào, sử dụng đánh giá ngắn mạch &&để dừng lại nếu chúng tôi đạt được 1, và nếu không thì lặp lại trên đối tác số hóa.


-2 byte nhờ Martin Ender cho .mẹo: chúng ta không phải sử dụng Trđể tính tổng các chữ số nếu chúng ta thay thế phép nhân #(#+1)/2bằng sản phẩm chấm #.(#+1)/2.


2
Chỉ nhìn thấy câu trả lời của bạn bây giờ. Bạn có thể đánh bại tôi bằng cách sử dụng thủ thuật sản phẩm vô hướng để tránh Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@MartinEnder Cảm ơn, đó là một mẹo gọn gàng. Tôi tự hỏi liệu có bất kỳ cách nào thậm chí còn hơn để thực hiện "in tất cả các lần lặp của chức năng này trên đường đến một điểm cố định" (về cơ bản, thực hiện lại FixedPointListngoại trừ cách in điểm cố định hai lần). Có vẻ như điều đó đã xảy ra trước đây.
Misha Lavrov

2

Ngôn ngữ Wolfram (Mathicala) , 49 42 39 byte

Cảm ơn Misha Lavrov vì đã tiết kiệm 3 byte.

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

Hãy thử trực tuyến! (TIO cần dấu ngoặc đơn xung quanh ++yvì một số lý do. Trong bản cài đặt Mathicala cục bộ của tôi, nó hoạt động mà không có chúng, như vậy.)

In từng giá trị trên dòng riêng của nó, trước >>và bao gồm số bắt đầu.


Bạn có thể quay lại để đánh bại câu trả lời của tôi với #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... có lẽ. Vì một số lý do, TIO không thích điều này, nhưng Mathicala có ổn với nó không?)
Misha Lavrov

Vâng, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&là 41 byte và hoạt động trong TIO. Nhưng bản sao Mathicala của tôi không nghĩ rằng dấu ngoặc đơn là cần thiết.
Misha Lavrov

@MishaLavrov Cảm ơn. Vâng, không có lý do tại sao TIO cần dấu ngoặc đơn, nhưng cú pháp trong các tệp script đôi khi hơi khó hiểu.
Martin Ender

1

Ohm v2 ,  9  7 byte

·Ω}#ΣΣu

Hãy thử trực tuyến!

Giải trình

          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

ucần thiết không?
Nick Clifford

Nếu không, }sẽ không phân chia các chữ số
Cinaski

Hừm. Đó có thể là một lỗi. Tôi sẽ kiểm tra.
Nick Clifford

1

Võng mạc , 21 byte

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

Hãy thử trực tuyến! (Đầu ra của các trường hợp riêng lẻ không tách biệt tốt, nhưng mỗi đầu ra kết thúc bằng a 1.)

In mỗi số trên dòng riêng của mình, theo thứ tự, bao gồm số bắt đầu.

Giải trình

;{:G`

Đây chỉ là một số cấu hình của chương trình. {làm cho vòng lặp chương trình cho đến khi nó không thay đổi kết quả (điều này xảy ra một khi chúng ta nhận được 1), :in số trước mỗi lần lặp và ;ngăn kết quả cuối cùng được in hai lần vào cuối chương trình. Đây Gchỉ là cách thông thường của tôi để tạo ra một sân khấu không hoạt động.

.
$*1¶

Chuyển đổi từng chữ số thành unary và đặt nó trên dòng riêng của nó.

1
$%`1

Tính số tam giác trên mỗi dòng, bằng cách thay thế mỗi số 1bằng tiền tố của nó. Chúng tôi cũng có thể sử dụng M!&`1+ở đây, cung cấp cho chúng tôi tất cả các hậu tố của mỗi dòng.

1

Đếm tất cả 1s, tổng hợp tất cả các số tam giác và chuyển kết quả trở lại thành số thập phân.


Retina có phải là một ngôn ngữ hoàn chỉnh không?

@ThePirateBay có.
Martin Ender

1

Ruby, 60 47 42 byte

-13 byte bởi @JustinMariner

-5 byte bởi @GB

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

Hãy thử trực tuyến!


Bạn có thể thả các mảng và splat ( [*...]) và thay đổi (k+1)để -~ktiết kiệm được tổng cộng 5 byte: Thử trực tuyến! Ngoài ra, bạn có thể tiết kiệm thêm 8 bằng cách chuyển sang chức năng lambda ẩn danh: Dùng thử trực tuyến!
Justin Mariner

Hừm, không biết tại sao tôi nghĩ .mapkhông thể lấy mảng.
Đơn giản là nghệ thuật đẹp

Bạn có thể sử dụng "sum {...}" thay vì "map {...}. Sum" và sau đó xóa khoảng trắng trước "while"
GB


1

Pushy , 24 22 21 17 byte

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

Hãy thử trực tuyến!

Giải trình

[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 byte

Đã lưu 2 byte nhờ caird coinheringaahing

ΔD,þ€iLO}O}}

Hãy thử trực tuyến!

Giải trình

(phiên bản cũ)

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

Than , 18 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

   θ                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}\

Không có gì ngạc nhiên khi hoạt động tương tự như các giải pháp APL và J đã được đăng

               $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

Thạch , 7 byte

DRFSµÐĿ

Hãy thử trực tuyến!

  • DRFSµÐĿ: Chương trình đầy đủ / liên kết đơn âm.

  • ÐĿ: Lặp lại cho đến khi kết quả không còn là duy nhất (nếu một cái gì đó không phải là 1 sẽ xảy ra hai lần, thì đầu vào đã cho không có kết quả được xác định, vì nó sẽ không bao giờ đạt đến 1).

  • D: Chuyển đổi từ số nguyên sang số thập phân.

  • R: Phạm vi (1 chỉ mục). Vector hóa.

  • F: Flatten và S: Sum ( µchỉ tạo ra một chuỗi đơn nguyên mới)


0

dc, 31 byte

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

Hàm mtính toán hàm số của đầu vào của nó; flặp lại điều này cho đến khi kết quả đạt 1.

Lưu ý rằng chúng tôi sử dụng cơ số đầu vào để trích xuất các chữ số - điều này có nghĩa là nó sẽ hoạt động trong bất kỳ hệ thống cơ sở nào, không chỉ là số thập phân.

Bản giới thiệu

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

Giải trình:

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

Hãy thử trực tuyến!

Định dạng đầu ra



0

PHP, 71 + 1 byte

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

Chạy như ống với -nRhoặc thử trực tuyến . (yêu cầu PHP 5.3 trở lên cho toán tử Elvis)


Toán tử Elvis là gì?
caird coinheringaahing

@cairdcoinheringaahing A?:B: nếu A là sự thật thì A khác B
Titus

0

Thêm ++ , 32 byte

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

Hãy thử trực tuyến!

Không xuất giá trị đầu tiên

Làm thế nào nó hoạt động

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;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.