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


22

Число знаходиться у спрощеній формі Goodstein у базовій b, якщо воно записане як

b + b + ... + b + c,   0 < c ≤ b

Спрощена послідовність Goodstein числа починається з запису числа у спрощеній формі Goodstein у базовій-1, потім заміни всіх 1-х на 2-х та віднімання 1. Перепишіть результат у спрощену форму Goodstein-основу-2, а потім замініть всі 2-ма на 3-і та відніміть 1 тощо, поки ви не досягнете 0.

Ваша програма повинна приймати введення та виведення / виведення / друк її послідовності Goodstein та припиняти. Ваша програма має обробляти числа менше 100, хоча вона може не припинятися за розумну кількість часу.

Наприклад, якщо 3 вводиться, ваша програма повинна виводити (права частина - лише пояснення)

1 + 1 + 1                | 3 = 1 + 1 + 1
2 + 2 + 1                | Change 1's to 2's, then subtract 1. (2 + 2 + 2 - 1 = 2 + 2 + 1)
3 + 3                    | 3 + 3 + 1 - 1 = 3 + 3
4 + 3                    | 4 + 4 - 1 = 4 + 3
5 + 2                    | 5 + 3 - 1 = 5 + 2
6 + 1                    | 6 + 2 - 1 = 6 + 1
7                        | 7 + 1 - 1 = 7
7                        | 8 - 1 = 7
6                        | Numbers are now lower than the base, so just keep subtracting 1.
5                        |
4                        |
3                        |
2                        |
1                        |
0                        | End

Інтервал не має значення.


Критерій виграшу:

Це . Найкоротший код виграє.


1
Чи потрібно включати останні 0?
KSab

5
@KSab Гм .... ні, мабуть, ні.
Просто красиве мистецтво

Відповіді:


2

05AB1E , 19 байт

Å1[D'+ý,N>D>:`Ž<)0K

Можна також переставити як >Å1[ND>:`Ž<)0KD'+ý,

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

Пояснення

Å1                    # push a list of 1's the length of the input
  [                   # start a loop
   D                  # duplicate the current list
    '+ý,              # join on "+" and print
        N>D>:         # replace <current_iteration>+1 with <current_iteration>+2
             `        # flatten the list to the stack
              Ž       # break loop if the stack is empty
               <      # decrement the top number
                )     # wrap the stack in a list
                 0K   # remove zeroes

10

Python 2, 77 74 байт

-3 байти завдяки Лінні

n=input();b=1
while n:print"+".join(n/b*[`b`]+[`n%b`][:n%b]);n+=n/b-1;b+=1

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

Легко працює до n = 100 (хоча результат занадто довгий для повного показу tio).


"Пробіл не має значення", тож вам там добре.
Просто красиве мистецтво

Збережіть байт, прочитавши вхід з STDIN:n=input() b=1 while n:…
Лін

1
І ще два с n+=n/b-1;b+=1. 74 байти
Лінн

1
@SimplyBeautifulArt виправлено
KSab

1
@SimplyBeautifulArt це, мабуть, стосується циклу while, ви не можете поставити whileнаступне ;. Я б припустив, що це тому, що якщо рядок починається з whileкожного наступного твердження (відокремленого крапками з комою) розглядається всередині його сфери, а поведінка буде неоднозначною або хоча б дещо непрозорою
KSab



1

Python 3, 155 байт

n=int(input());l=[1]*(n+1);i=0
while l:
    l=[t+1 if t==i else t for t in l];l[-1]-=1;l=l[:-1] if l[-1]==0 else l;print("+".join(list(map(str,l))));i+=1

Це можна переформатувати

n = int(input())
l = [0]*(n+1)
i = 0
while l:
    l = [t+1 if t==i else t for t in l]
    if l[-1] == 0:
        l = l[:-1]
    print("+".join(list(map(str,l))))
    i += 1

Ви пропустите перший рядок 1+1+...і зауважте, що ваша програма повинна обробляти будь-який позитивний цілий вхід.
Просто красиве мистецтво

1
Так, будь ласка. Крім того, MathJax не працює на цьому сайті: P
Просто красиве мистецтво

1
Для мене, здається, ви помістите пробіл у своїй версії для гольфу замість +.
Просто красиве мистецтво


1
@RGS -~xмає те саме значення x+1, що і вам, але вам не потрібно використовувати його в дужках, так як унар -(заперечення) і унар ~(побітове заперечення) мають перевагу вище, ніж *. У вашому випадку [1]*-~nдорівнює [1]*(n+1).
ов

1

Javascript ES6, 121 символ

for(q=1,s=Array(+prompt()).fill(1).join`+`;s!=0;s=s.split(q).join(++q).replace(/\d+$/,x=>x-1).replace(/\+0$/,''))alert(s)

alert=s=>document.write(s+'\n')
document.write("<pre>")

for(q=1,s=Array(+prompt()).fill(1).join`+`;s!=0;s=s.split(q).join(++q).replace(/\d+$/,x=>x-1).replace(/\+0$/,''))alert(s)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.