Цифровые цифры


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цифры. Максимальное значение, которое может иметь его цифроугольный аналог, равно 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.
Просто Красивое Искусство

Ответы:


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

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

@ 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 не оригинальная уловка, хотя я, конечно, вполне ее использую, когда вспоминаю.
Коул

4

APL (Dyalog) , 23 20 17 байтов

3 байта сохранены благодаря @ngn

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

Попробуйте онлайн!

Как?

⍵∪⍨ - добавить текущий массив к

+/ - сумма

- сплющенный

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

⍎¨⍕ - цифра

⊃⍵ - предыдущее значение

⍣≡до схождения. Использование (union) гарантирует, что после присоединения первого 1 следующее будет исключено из-за уникальности набора, и массив будет сходиться.


Из любопытства, сколько бы прошло времени, если бы вам также не разрешалось выводить исходное значение?
Caird Coinheringaahing

@cairdcoinheringaahing 2 байта - 1↓(сначала брось)
Уриэль

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

@ngn спасибо! Я пытался использовать оператор питания, но я не думал о том, что он сходится после 1. Скоро будет обновление
Уриэль

@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

Wolfram Language (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

Wolfram Language (Mathematica) , 49 42 39 байт

Спасибо Мише Лаврову за сохранение 3 байта.

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

Попробуйте онлайн! (По ++yкакой-то причине TIO нужны круглые скобки . В моей локальной установке 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), :печатает число перед каждой итерацией и ;предотвращает двойную печать окончательного результата в конце программы. Это Gпросто мой обычный способ создания неоперационной сцены.

.
$*1¶

Преобразуйте каждую цифру в одинарную и поместите ее в отдельной строке.

1
$%`1

Вычислите треугольное число в каждой строке, заменив каждый 1префиксом. Мы также могли бы использовать M!&`1+здесь, что дает нам все суффиксы каждой строки.

1

Подсчитайте все 1s, которые суммируют все треугольные числа и преобразуют результат обратно в десятичную.


Является ли Retina полноценным языком?

@ThePirateBay да.
Мартин Эндер

1

Рубин, 60 47 42 байта

-13 байт от @JustinMariner

-5 байт @GB

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

Попробуйте онлайн!


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

Хм, понятия не имею, почему я подумал .map не может принимать массивы.
Просто Красивое Искусство

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






0

05AB1E , 20 12 байтов

Сохранено 2 байта благодаря caird coinheringaahing

Δ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

к , 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

PHP, 71 + 1 байт

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

Запустите как трубу с -nRили попробуйте онлайн . (требуется PHP 5.3 или более поздняя версия для оператора Elvis)


Что такое оператор Элвиса?
Caird Coneheringaahing

@cairdcoinheringaahing A?:B: если A правдива, то A else B
Тит

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.