Неодноразова послідовна конвергенція суми цифрових продуктів


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**

Виграєш?

Це , найнижчий байт - переможець.


Annnnnnnnnnnnnnnnnndnd ... це НЕ пісочниця. Лайно. Ну, не дуже багато я можу зараз зробити, вибачте всіх ._.
Чарівна восьминога урна

11
Було б добре мати тестові випадки, коли цифри одного і того ж виду не всі в послідовному відрізку.
xnor

1
Чи можемо ми взяти введення як список цифр? Деякі мови не можуть підтримувати цілі числа так високо, як 11122233344455566677788899.
ETHproductions

@ETHproductions ви можете вказати максимальний цілий вхід, дозволений вашою мовою, і ваша відповідь буде дійсною, якщо ви можете пояснити обмеження.
Magic Octopus Urn

4
Чи з’явиться однакова цифра evet у двох різних запусках, наприклад 33445555666333:?
Містер Xcoder

Відповіді:


7

05AB1E , 7 6 5 байт

Дякуємо Еміньї за збереження байта!

vSγPO

Використовує кодування 05AB1E . Спробуйте в Інтернеті!


3
Я щойно вперше помітив, що твій аватар - це мем дожів.
Чарівний восьминіг Урна

@MagicOctopusUrn, і ти щойно змусив мене це помітити ...
Socrat Phoenix

Ви можете замінити 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
Zacharý

О, я бачу - Œgнепослідовно, коли є лише одна група. Які міркування за цим?
Esolanging Fruit

Немає жодної підказки!
Zacharý

5

Математика, 55 42 байти

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

-13 байт від @JungHwan Min . Дякую!

якщо хтось хоче використати це як генератор випадкових цифр,
ось підрахунок перших 100 000 чисел

{{1, 17320}, {2, 4873}, {3, 10862}, {4, 11358}, {5, 10853}, {6, 9688}, {7, 11464}, {8, 10878}, { 9, 12704}}
або якщо ви граєте, не кладіть свої гроші на 2!


5

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

Ви також можете просто прийняти це як ціле число і вказати максимально допустимий вхід, вибачте, я змінив свою відповідь після публікації її до моєї відповіді за замовчуванням на це питання.
Magic Octopus Urn

@MagicOctopusUrn О, ей, дякую. Це все-таки економить два байти ...
ETHproductions

1
Крім того, x_×поєднане зі I'm unsatisfiedзмусило мене сміятися. Спасибі ;).
Magic Octopus Urn

Я думав, що це ßміг бути шлях. Я був неправий! (Принаймні о пів на 5 ранку ', сіла в автобус до аеропорту, який я був!)
Shaggy

"Ще не незадоволений" ... так ... ви нарешті задоволені?
Zacharý


4

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

Ḋ|ẹḅ×ᵐ+↰

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

Пояснення

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

Ви ніколи не очікували, що Брахілог перевершить Желі тут?
Erik the Outgolfer

@EriktheOutgolfer Коли Брахілог б'є желе, моє перше припущення - це те, що відповідь Желе не є оптимальною
Fatalize

Моя теж, за винятком того, що я намагався це зробити і в Jelly. Річ у тому, що, 05AB1E все ще перемагає це. :)
Erik the Outgolfer

Добре. це один байт, і відповідь «Желе» - це я, я б очікував, що Брахілог переможе Желе.
Zacharý



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, що зберігає дужки.
Ørjan Johansen

Так, це набагато краще!
bartavelle

1
Ви можете використовувати $замість зовнішніх дужок.
Ørjan Johansen

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тип ;-)
Фредерік

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

Braingolf, 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.