Виведіть послідовність Goodstein


18

(Це може бути досить класично, але це моя перша публікація тут, тому я ще не готовий до вигадливих речей)

Послідовність Goodstein визначається для вхідного номера наступним чином:

Виберіть початкове число n , нехай b = 2 і повторіть:

  • запишіть n у спадковій основі b позначення
  • замініть всі ( b ) s на ( b +1) s на n та підрезюме 1
  • вивести нове десяткове оцінювання n
  • приріст b

Позначення спадкової бази - це декомпозиція числа, де основою є більша кількість, що з'являється. Приклади:

  • 83 в HB3: 3^(3+1)+2
  • 226 в HB2: 2^(2^(2+1))+2^(2+1)+2

Послідовності Goodstein завжди закінчуються 0 , але вони схильні спочатку отримувати досить великі швидкості, тому не просять вивести повну послідовність.


Завдання:

З огляду на номер введення в будь-якому розумному форматі, ваше завдання - вивести послідовність Goodstein для цього числа принаймні, поки воно не досягне 10 ^ 25 або 0

Приклади:

Input: 3
Output: 3, 3, 3, 2, 1, 0
Input: 13
Output: 13, 108, 1279, 16092, 280711, 5765998, 134219479, 3486786855, 100000003325, 3138428381103, 106993205384715, 3937376385706415, 155568095557821073, 6568408355712901455, 295147905179352838943, 14063084452067725006646, 708235345355337676376131, 37589973457545958193377292
Input: 38
Output: 38, 22876792454990

Деталі:

  • Вхідним номером може бути масив, рядок, ціле число, якщо воно знаходиться в десятковій базі
  • Вихідний результат дотримується того самого правила
  • Поділ доданків у висновку може бути пробілами, новими рядками або будь-яким розумним поділом
  • Як тільки послідовність стає більше 10 ^ 25, ваша програма може нормально вийти, викинути помилку / виняток або продовжити (без обмеження)
  • Це , тому найкоротша відповідь (у байтах) виграє
  • Звичайно, стандартні лазівки заборонені
  • Python ungolfed робочого прикладу тут

2
Чи можете ви додати крок за кроком одного тестового випадку?
Прут

5
Ласкаво просимо до PPCG! Приємний перший виклик!
FantaC


2
@ ØrjanJohansen Так, помилка в тому, що int(q/base.b), q%base.bпотрібно q//base.b, q%base.b(або просто divmod(q, base.b)), щоб уникнути помилок з плаваючою комою.
Андерс Касеорг

2
Чи означає «принаймні, поки він не досягне 10 ^ 25 або 0», що програма може продовжуватися після досягнення 0 (імовірно, з −1, −2, −3,…)?
Андерс Касеорг

Відповіді:


3

Pyth , 28 26 байт

.V2JbL&bs.e*^hJykb_jbJ=ty

Новий рядок є важливим.

Спробуйте в Інтернеті! (Це посилання включає додатковий, Qне потрібний поточній версії Pyth.)

Як це працює

.V2JbL&bs.e*^hJykb_jbJ=ty
.V2                          for b in [2, 3, 4, ...]:
   Jb                          assign J = b
     L                         def y(b):
      &b                         b and
                   jbJ             convert b to base J
                  _                reverse
         .e                        enumerated map for values b and indices k:
             hJ                      J + 1
            ^  yk                    to the power y(k)
           *     b                   times b
(newline)                      print Q (autoinitialized to the input)
                        y      y(Q)
                       t       subtract 1
                      =        assign back to Q

Важливо, щоб yце було переосмислено в кожній ітерації циклу, щоб запобігти запам'ятовуванню через зміни глобальної змінної J.


3

Haskell , 77 байт

(&2)це анонімна функція, яка приймає Integerі повертає (можливо, дуже довгий) список Integers, використовуйте як (&2) 13.

(&2)
n&b|n<0=[]|let _?0=0;e?n=(e+1)?div n b+mod n b*(b+1)^0?e=n:(0?n-1)&(b+1)

Спробуйте в Інтернеті! (відсікається в 10^25.)

Як це працює

  • (&2)починає послідовність з основи 2.
  • n&bобчислює підряд, починаючи з числа nта бази b.
    • Він зупиняється з порожнім списком, якщо n<0, як правило, відбувається крок після n==0.
    • В іншому випадку воно робить вигляд nсписку, поверненого рекурсивно виразом (0?n-1)&(b+1).
  • ?- локальний оператор функцій. 0?nдає результат перетворення nна спадкову базу b, потім збільшуючи базу скрізь.
    • Перетворення повторюється зі змінною eвідстеженням поточного показника. e?nперетворює число n*b^e.
    • Рекурсія зупиняється з 0коли n==0.
    • В іншому випадку він ділиться nза основою b.
      • (e+1)?div n b обробляє рекурсію для коефіцієнта та наступного вищого показника.
      • mod n b*(b+1)^0?eобробляє залишок (який є цифрою, що відповідає поточному показнику e), приріст бази та перетворює поточний показник у спадкове відношення 0?e.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.