Цифрові числа


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

Ваше завдання задається цілим числом n, багаторазово nобчислюйте цифровий кутовий аналог, поки результат не дорівнює 1, а потім виведіть усі обчислені значення. Ви можете виводити значення в будь-якому порядку та з необов'язковим включенням вихідного номера на початку масиву. Це з кодом, тому найкоротший код виграє.

Тестові кейси

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
Припустимо, що число більше, ніж 141і має nцифри. Значення максимального його 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межі, ну, ми грубою силою довести з допомогою програм.
Просто красиве мистецтво

1
Чи можу я мати кінець 1 в кінці мого результату?
Просто красиве мистецтво

1
Супутнє : Цифрові числа , шукаючи альтернативні докази того, що ця послідовність в кінцевому підсумку переходить до 1.
Просто красиве мистецтво

Відповіді:



7

05AB1E , 6 5 байт

Δ=SLO

Спробуйте в Інтернеті! Редагувати: Збережено 1 байт завдяки @Emigna. Пояснення:

Δ       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навіть так поводиться?
Ніл

Якщо я пригадую правильно, помилка виявилася корисною і залишилася залишатися функцією. Я думаю, що це один з перших методів, який векторизувався.
Емінья

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 (Діалог) , 23 20 17 байт

3 байти збережено завдяки @ngn

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

Спробуйте в Інтернеті!

Як?

⍵∪⍨ - додати поточний масив до

+/ - сума

- сплюснуто

⍳¨ - діапазони кожного

⍎¨⍕ - цифра

⊃⍵ - попереднє значення

⍣≡до зближення. Використання (об'єднання) гарантує, що після приєднання першого 1, наступне буде виключено через встановлену унікальність, і масив зблизиться.


З цікавості, скільки часу пройшло б, якби вам також не дозволили вивести початкове значення?
caird coinheringaahing

@cairdcoinheringaahing 2 байти - 1↓(крапля перша)
Uriel

@Uriel Тут обмеження потужності (⍣≡) дає коротше рішення, ніж рекурсія: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡, але прикро APL не має стислого способу збирання всіх ітерацій функція до конвергенції: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn спасибі! Я намагався використовувати енергооператор, але я не замислювався над фактом, який він зблизиться після 1. Скоро оновиться
Uriel

@ngn будь-яка ідея, як користуватися, {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡не отримуючи останнього 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

Мова Вольфрама (Mathematica) , 43 41 байт

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

Спробуйте в Інтернеті!

Як це працює

Вираз #.(#+1)/2&@IntegerDigits@#дає цифровий аналог #. Ми вводимо Echo, використовуємо оцінку короткого замикання, &&щоб зупинити, якщо ми досягли 1, і в іншому випадку повторюємо цифровий кутовий аналог.


-2 байти завдяки Мартіну Ендеру за .хитрість: нам не доведеться використовувати Trпідсумки цифр, якщо замінити множення #(#+1)/2на крапковий добуток #.(#+1)/2.


2
Лише щойно бачив вашу відповідь. Ви можете перемогти шахту, використовуючи скалярний трюк продукту, щоб уникнути Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Мартін Ендер

@MartinEnder Дякую, це акуратний трюк. Мені цікаво, чи є якісь ще й гольфістські способи зробити "друк всіх ітерацій цієї функції на шляху до фіксованої точки" (по суті, повторне виконання, FixedPointListза винятком того, як це друкує фіксовану крапку двічі). Схоже, що це повинно було бути раніше.
Міша Лавров

2

Мова Вольфрама (Mathematica) , 49 42 39 байт

Дякуємо Міші Лаврову за збереження 3 байтів.

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

Спробуйте в Інтернеті! (TIO потрібні дужки навколо навколо ++yчомусь. У моїй локальній програмі Mathematica вона працює без них, як слід.)

Друкує кожне значення у своєму власному рядку, перед яким передує >>та включає стартове число.


Ви можете повернутися, щоб перемогти мою відповідь #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... можливо. Чомусь ТІО цього не подобається, але 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

Спробуйте в Інтернеті! (Виходи окремих випадків недостатньо розділені, але кожен вихід закінчується символом a 1.)

Друкує кожне число у власному рядку в порядку, включаючи початковий номер.

Пояснення

;{:G`

Це лише деяка конфігурація програми. {робить цикл програми до тих пір, поки не змінить результат (що відбувається, як тільки ми дістанемося 1), :надрукує номер перед кожною ітерацією та ;запобігає друкуванню кінцевого результату двічі в кінці програми. Це Gпросто мій звичайний спосіб створення сцени без операції.

.
$*1¶

Перетворіть кожну цифру в одинакову і поставте її у свій власний рядок.

1
$%`1

Обчисліть трикутне число у кожному рядку, замінивши кожен 1його префіксом. Тут ми також могли б використати M!&`1+, що дає нам усі суфікси кожного рядка.

1

Порахуйте всі 1s, що підсумовує всі трикутні числа та перетворює результат назад у десятковий.


Чи є Сітківка твердою повною мовою?

@ThePirateBay так.
Мартін Ендер

1

Рубі, 60 47 42 байт

-13 байт від @JustinMariner

-5 байт від @GB

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

Спробуйте в Інтернеті!


Ви можете залишити масив і знак оклику ( [*...]) і зміни (k+1)в , -~kщоб зберегти в цілому 5 байт: Спробуйте його в Інтернеті! Крім того, ви можете зберегти ще 8, перейшовши на функцію анонімної лямбда: Спробуйте в Інтернеті!
Джастін Марінер

Гм, поняття не знаю, чому я .mapне міг взяти масиви.
Просто красиве мистецтво

Ви можете використовувати "sum {...}" замість "map {...}. Sum", а потім видалити пробіл перед "while"
GB






0

05AB1E , 20 12 байт

Збережено 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: Перетворення з цілого числа в десятковий.

  • R: Дальність (1-індексований). Векторизує.

  • F: Flatten і S: Sum ( µпросто створює новий монадичний ланцюг)


0

постійного струму, 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

Додати ++ , 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;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.