Повторная последовательная конвергенция суммы цифрового продукта


13

Учитывая положительное целое число n( пример:n=1234444999 )

  • Разделяйте на последовательные цифры:
    • [1, 2, 3, 4444, 999]
  • Возьмите цифровой продукт каждого запуска.
    • [1, 2, 3, 4*4*4*4, 9*9*9] = [1, 2, 3, 256, 729]
  • Суммируйте это ...
    • +991
  • Повторите, пока это не сходится к одному числу:
    • 1234444999
    • +991
    • 82
    • 10
    • 1
  • Верните последний номер.

Тестовые случаи

BASE CASES:
0 = 0
...
9 = 9

OTHER CASES:
1234444999                     = 1
222222222222222                = 8
111222333444555666777888999000 = 9
11122233344455566677788899     = 8
1112223334445                  = 6
14536                          = 1
99                             = 9

Запрошенный пример:

334455553666333
9+16+625+3+216+27
896
8+9+6
23
2+3
**5**

Победа?

Это , самый низкий счетчик байтов является победителем.


Annnnnnnnnnnnnnnnnnnd ... это не песочница. Дерьмо. Ну, я мало что могу сделать, извини всех ._.
Волшебная Осьминог Урна

11
Было бы хорошо иметь тестовые случаи, когда цифры одного и того же типа не все в последовательном блоке.
xnor

1
Можем ли мы принять ввод как список цифр? Некоторые языки не могут поддерживать целые числа 11122233344455566677788899.
ETHпродукция

@ETHproductions вы можете указать максимальный целочисленный ввод, допустимый вашим языком, и ваш ответ будет действительным, если вы сможете объяснить ограничения.
Волшебная Осьминога Урна

4
Будет та же цифра Evet появляется в 2 -х различных трасс, например: 33445555666333?
Мистер Кскодер

Ответы:


7

05AB1E , 7 6 5 байт

Благодаря Emigna за сохранение байта!

vSγPO

Использует кодировку 05AB1E . Попробуйте онлайн!


3
Я только сейчас впервые заметил, что ваш аватар - мем-дож.
Волшебная Осьминог Урна

@MagicOctopusUrn и ты только что заставил меня это заметить ...
Сократик Феникс

Вы можете заменить gFна v.
Эминья

@ Emigna Оооо конечно! Спасибо! :)
Аднан

5

Желе, 9 байт

DŒgP€SµÐL

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

Вот как это работает:

D  - input as a list of digits
Œg - group runs of equal elements
P€ - the product of each element
S  - the sum of the list
µ  - syntax stuff to separate the left from the right
ÐL - repeat until we get a result twice, then return that result.

Почему P автоматически не векторизуется? Это кажется странным ...
Esolanging Fruit

Нет, P автоматически векторизуется, поэтому вам не нужно .
Esolanging Fruit

Нет, P не векторизируется: tio.run/##y0rNyan8/9/l6KT0gOBDWw9P8Pn//78RKgAA
Захарий

А ну понятно - Œg это противоречиво, когда есть только одна группа. В чем причина этого?
Esolanging Fruit

Понятия не имею вообще!
Захари

5

Mathematica, 55 42 байта

#//.i_:>Tr[Times@@@Split@IntegerDigits@i]&

-13 байтов от @JungHwan Мин . Thanx!

в случае, если кто-то хочет использовать это как генератор случайных цифр,
вот подсчет первых 100.000 чисел

{{1, 17320}, {2, 4873}, {3, 10862}, {4, 11358}, {5, 10853}, {6, 9688}, {7, 11464}, {8, 10878}, { 9, 12704}}
или если вы играете в азартные игры, не ставьте свои деньги на 2!


5

Джапт , 17 15 13 байт

e".+"_¬ò¦ x_×

Проверьте это онлайн!Принимает ввод в виде строки.

Все еще не удовлетворен этим ответом ...

объяснение

e".+"_  ¬ ò¦  x_  ×
e".+"Z{Zq ò!= xZ{Zr*1}}

e".+"                     Repeatedly replace all matches of /.+/ (the entire string)
     Z{               }   Z with this function:
       Zq                   Split Z into chars.
          ò!=               Partition at inequality; that is, split into runs of equal items.
              xZ{    }      Take the sum of: for each item in Z:
                 Zr*1         the item reduced by multiplication (i.e. the product).
                          This procedure is repeated until the same result is yielded twice.
                          Implicit: output result of last expression

Вы также можете просто взять его как целое число и указать максимально допустимый ввод, извините, я изменил свой ответ после публикации на мой ответ по умолчанию на этот вопрос.
Волшебная Осьминог Урна

@MagicOctopusUrn О, эй, спасибо. В любом случае это экономит два байта ...
ETHproductions

1
Кроме того, в x_×сочетании с I'm unsatisfiedзаставило меня смеяться. Благодарность ;).
Волшебная Осьминог Урна

Я думал, что, ßвозможно, был путь сюда. Я ошибался! (По крайней мере, в половине 5 утра ', сел в автобус до аэропорта я был!)
Лохматый

"Все еще не неудовлетворен" ... так что ... ты наконец доволен?
Захари


4

Брахилог , 8 байт

Ḋ|ẹḅ×ᵐ+↰

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

объяснение

Ḋ          Input = Output = a digit
 |         Or
  ẹ        Split into a list of digits
   ḅ       Group consecutive equal elements together
    ×ᵐ     Map multiply
      +    Sum
       ↰   Recursive call

Вы бы никогда не ожидали, что Брахилог превзойдет Джелли здесь?
Эрик Outgolfer

@EriktheOutgolfer Когда Brachylog побеждает Jelly, мое первое предположение заключается в том, что ответ Jelly не является оптимальным
Fatalize

Мой тоже, за исключением того, что я пытался сделать это и в желе. Дело в том, что 05AB1E все еще лучше. :)
Эрик Outgolfer

Что ж. это один байт, и ответ от Jelly - мой, да, я ожидаю, что Brachylog победит Jelly.
Захарий



2

Шелуха , 8 байт

ωöṁΠgmis

Принимает и возвращает целое число. Попробуйте онлайн!

объяснение

Было бы неплохо иметь встроенную базовую цифру в 10 цифр ...

ωöṁΠgmis
ω         Iterate until a fixed point is found
 ö        the composition of the following four functions:
       s   convert to string,
     mi    convert each digit to integer,
    g      group equal adjacent integers,
  ṁΠ       take product of each group and sum the results.

2

JavaScript (ES6), 77 73 67 65 байт

Сохранено 2 байта благодаря @CraigAyre

f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s

Как?

Входные данные s преобразуются в арифметическое выражение с:

s.replace(/(.)\1*/g, s => '+' + [...s].join`*`)

Например, 1234444999становится +1+2+3+4*4*4*4+9*9*9.

Мы оцениваем это выражение и делаем рекурсивный вызов с результатом, пока он не сводится к одной десятичной цифре.

Контрольные примеры


Можете ли вы сэкономить пару байтов, сравнивая с 9 ?:f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s
Крейг Эйр

@CraigAyre Похоже, мой подход был немного сложным. Благодарность!
Арно


2

Haskell , 103 70 69 байт

import Data.List
until(<10)$sum.map product.group.map(read.pure).show

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


1
Вы можете сократить это с помощью until(<10). Также map(read.pure)можно перемещать до show, что сохраняет скобки.
Орджан Йохансен

Да, это намного лучше!
Bartavelle

1
Вы можете использовать $вместо внешних скобок.
Орджан Йохансен

1

R , 114 104 байта

n=scan(,'');while(nchar(n)>1){n=el(strsplit(n,''));b=table(n);n=as.character(sum(strtoi(names(b))^b))};n

читает со стандартного ввода; возвращает ответ в виде строки.

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


Вы могли бы использовать pasteвместо as.character. Бывший принуждает его ввод в characterтип ;-)
Frédéric

1

MATL, 11 байт

`!UY'^sVtnq

Попробуйте это на MATL Online

объяснение

        % Implicitly grab input as a string
`       % Do...while loop
  !U    % Convert the string to an array of numbers (the digits)
  Y'    % Perform run-length encoding
  ^     % Raise the digits to the power corresponding to the number of times they
        % occurred consecutively
  s     % Sum the result
  V     % Convert to a string
  tn    % Duplicate and determine the number of characters in the string
  q     % Subtract one, causes the loop to continue until it's a single digit
        % Implicit end of do...while loop and display


1

R 97 96 байт

a=scan(,"");while(nchar(a)>1){a=paste(sum(strtoi((b<-rle(el(strsplit(a,""))))$v)^strtoi(b$l)))}a

Немного другой подход, чем другой ответ с использованием R.

Этот ответ использует rleфункцию, котораяcompute[s] the lengths and values of runs of equal values in a vector .

-1 байт благодаря @Giuseppe!


1
**эквивалентно^
Джузеппе

1

Брайнгольф, 25 байт

!L1-Mv[RG(d&*)&+!L1-Mv>]R

Добавлю ссылку TIO, как только я заставлю Денниса вытянуть последнюю версию, так как использование жадных операторов внутри (...)циклов в TIO в настоящее время не работает

объяснение

!L1-Mv[RG(d&*)&+!L1-Mv>]R  Implicit input from commandline args
!L1-M                      Push length of input minus 1 to stack2
     v                     Switch to stack2
      [.........!L1-Mv>]   While length of input > 1..
       RG                  Split into digit runs
         (d&*)             Product of digits of each item in stack
              &+           Sum stack
                        R  Return to stack1
                           Implicit output from stack

1

Japt , 19 байт

=ò¦ m¬®×Ãx)<A?U:ßUs

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

Объяснение:

=ò¦ m¬®×Ãx)<A?U:ßUs
=                    // Implicit U (input) =
 ò¦                  //   Split the input into an array of consecutive digit runs
    m¬               //   Split each inner array: ["1","22","333"] -> [["1"],["2","2"],["3","3","3"]]
      ®              //   Map; At each item:
       ×             //     Get the product of each run
        Ã            //   }
         x           //   Sum
           <A        // <10
             ?       // If true:
              U      //   return U
               :     // Else:
                ß    //   Run the program again; Pass:
                 Us  //     U, cast to a string
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.