Выведите последовательность Гудштейна


18

(Это может быть довольно классическим, но это мой первый пост здесь, так что я еще не готов к модным вещам)

Последовательность Гудштейна для входного номера определяется следующим образом:

Выберите начальное число n , пусть b = 2 и повторите:

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

Обозначение наследственной базы - это разложение числа, в котором основание - это большее число. Примеры:

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

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


Задача:

Учитывая введенное число в любом приемлемом формате, ваша задача состоит в том, чтобы вывести последовательность Гудштейна для этого числа, по крайней мере, пока оно не достигнет 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, используйте as (&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.
    • Он останавливается с пустым списком if 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.