Найкоротша програма завершення, розмір виходу якої перевищує кількість Грема


37

Напишіть найкоротшу можливу програму (довжина вимірюється в байтах), що відповідає таким вимогам:

  • немає вводу
  • вихід - до stdout
  • виконання з часом припиняється
  • загальна кількість вихідних байтів перевищує число Грема

Припустимо, що програми працюють до "нормального" завершення на ідеальному комп'ютері 1, який має доступ до необмежених ресурсів, і що загальні мови програмування змінюються при необхідності (без зміни синтаксису), щоб це допустити. Через ці припущення ми можемо назвати це своєрідним експериментом Геданке.

Щоб почати все, ось 73-байтна програма Ruby, яка обчислює f ω + 1 (99) у швидко зростаючій ієрархії :

f=proc{|k,n|k>0?n.times{n=f[k-1,n]}:n+=1;n};n=99;n.times{n=f[n,n]};puts n

1 EDIT: Точніше, припустимо, ми приймаємо існуючу систему та модифікуємо її лише для того, щоб не було верхньої межі розміру пам’яті (але вона завжди обмежена). Час виконання інструкцій не повинен змінюватися, але припускається, що машина є ідеальною, оскільки у неї не буде верхньої межі терміну експлуатації.


Це піднімає моє питання тетрації на абсолютно новий рівень!
MrZander

1
Колись був подібний конкурс програмування під назвою Bignum Bakeoff. Деякі записи є досить цікавими; результати тут: djm.cc/bignum-results.txt
Danny Chia

Відповіді:


11

GolfScript ( 49 47 символів)

4.,{\):i\.0={.0+.({<}+??\((\+.@<i*\+}{(;}if.}do

Докладніше про життя черв'яка див . Коротше кажучи, це друкує число, що перевищує f ω ω (2).


f_ (ω ^ ω) (2) приблизно такий же великий, як g_ (f_8 (8)), тож не такий надмірний, як це випливає з цього виразу.
Просто красиве мистецтво

21

Haskell, 59 57 55 63

(f%s)1=s;(f%s)n=f.(f%s)$n-1
main=print$((flip((%3)%(3^))3)%4)66

Як це працює: %просто приймає функцію і складає її n-1на вершині s; тобто %3приймає функцію fі повертає функцію, nщо дорівнює її застосуванню fдо 3, n-1раз підряд. Якщо ми повторимо застосування цієї функції вищого порядку, ми отримаємо швидко зростаючу послідовність функцій - починаючи з експоненціації, це саме послідовність розмірів Кнут-стрілка-ліс:
((%3)%(3^))1 n = (3^)n     = 3ⁿ = 3↑n
((%3)%(3^))2 n = ((3^)%3)n = (3↑)ⁿ⁻¹ $ 3 = 3↑↑n
((%3)%(3^))3 n = (((3^)%3)%3)n = (3↑↑)ⁿ⁻¹ $ 3  = 3↑↑↑n
і так далі. ((%3)%(3^))n 3це те 3 ↑ⁿ 3, що відображається в обчисленні до числа Грема. Залишилося лише скласти функцію(\n -> 3 ↑ⁿ 3) ≡ flip((%3)%(3^))3більше 64 разів, зверху 4 (кількість стрілок, з якої починається обчислення), щоб отримати число, що перевищує число Грема. Очевидно, що логарифм (що таке кульгаво повільна функція!) Все- g₆₅таки більший g₆₄=G, тому якщо ми друкуємо це число, довжина виходу перевищує G.


Коли я перевірити це з print$((flip((%3)%(3*))3)%2)1, є помилка часу - Ви можете сказати , чому? Він досягає успіху, коли 2змінено на 1(вихід 81).
res

Ой, схоже, ideone має 32-бітну версію, тому Intшвидко переходить до переповнення . У 64-бітовій системі, яка споживає занадто багато пам'яті для відтворення, але, звичайно, вона все ще не дозволить дістатися G. Мені потрібен Integerтип (big-int) , тому я не можу використовувати !!; зачекайте ...
перестали повертати проти годинника,

Виправлено це тепер, довелося використовувати явну рекурсію для реалізації %.
перестала повертати проти годинника,

Я вважаю, що ((%3)%(3*))2 nнасправді росте швидше, ніж ти кажеш ( гарна річ), але мій Haskell-fu недостатній, щоб зрозуміти, чому. Бо n = 0, 1, 2, ...замість того, щоб давати 3, 3^3, 3^(3^3), ..., дає 3, 3^(3+1), 3^((3^(3+1))+1), ....
res

Як я сказав: « ((%3)%(3*))n 3це більше , ніж 3 ↑ⁿ 3». Або ти маєш на увазі щось інше? У всякому разі, я змінив визначення, щоб це все рівності (принаймні, я так думаю, щоб ледачий перевірити зараз ...), а не більші-тани. І якщо ви зміните 66до 65, на справді справляє Gсебе, що не то, що добре?
перестала повертати проти годинникових

5

Pyth , 29 28 байт

M?*GHgtGtgGtH^ThH=ZTV99=gZTZ

Визначає лямбда для гіпер-операції і рекурсивно називає її. Як і визначення числа Грема, але з більшими значеннями.

Це:

M?*GHgtGtgGtH^3hH

Визначає лямбда, приблизно рівну пітону

g = lambda G, H:
  g(G-1, g(G, H-1)-1) if G*H else 3^(H+1)

Це дає функцію гіпер-операції, g (G, H) = 3 ↑ G + 1 (H + 1).
Так, наприклад, g (1,2) = 3 ↑ 2 3 = 7,625,597,484,987, які ви можете перевірити тут .

V<x><y>починає цикл , який виконує тіло, y, xраз.
=gZT- це тіло петлі, яке рівносильноZ=g(Z,10)

Кодекс:

M?*GHgtGtgGtH^3hH=Z3V64=gZ2)Z

Якщо рекурсивно слід зателефонувати на гіперпроцедур вище 64 разів, вказавши номер Грема.

У своїй відповіді, однак, я замінив однозначні цифри на T, які ініціалізуються на 10, і збільшив глибину рекурсії до 99. Використовуючи позначення масиву Грема, число Грем є [3,3,4,64], і мій програма виводить більші [10,11,11,99]. Я також видалив те, )що закриває цикл, щоб зберегти один байт, тому він друкує кожне наступне значення в 99 ітераціях.


3

Python (111 + n), n = довжина (x)

Хоча ця програма не така коротка, як програма Ruby відповіді, я все одно опублікую її, щоб виключити цю можливість.

Він використовує функцію Ackermann і викликає функцію Ackermann, при цьому m і n є значеннями з іншого виклику до функції Ackermann, і повторюється 1000 разів.

Це, мабуть, більше, ніж число Грема, але я не впевнений, тому що ніхто не знає точної довжини. Його можна легко розширити, якщо він не більший.

x=999
b='A('*x+'5,5'+')'*x
def A(m,n):n+1 if m==0 else A(m-1,A(m,n-1)if n>0 else 1)
exec('print A('%s,%s')'%(b,b))

вихід на stdout? також вам потрібна returnзаява або а lambda.
кабінка

7
Крім того, якщо A (m, n) повертає одне значення, то чи не пропускає аргумент A (A (5,5))? ... Це проблема з таким викликом: він спонукає людей не перевіряти свій код, тому що повний цикл є чисто теоретичним.
хлібниця

Якщо ви заміните свій останній рядок на exec'x=A(x,x);'*x;print x, програма з цим нормально, а вихід приблизно f_ (ω + 1) (x) (припустимо, що код функції Ackermann є правильним), який має більше G байт навіть для x = 99, скажімо . (У моїй програмі Ruby f[m,n]є версія A(m,n).)
res

@breadbox - Добрий момент ... Теоретичні питання на кшталт цього вимагають переконатися, що програма є нормальною для малих параметрів (тобто нетеоретичних) тестових випадків, які чітко узагальнюють, щоб дати правильну відповідь.
res

1
Його довше, але якщо ви хочете використовувати evalзамість exec, ваш останній рядок може бути f=lambda x:A(x,x);print eval('f('*x+'x'+')'*x). Крім того, ваше значення A (m, n) потрібно виправити за коментарем кабіни.
res

2

Рубі, 54 52 50 байт

f=->b{a*=a;eval"f[b-1];"*b*a};eval"f[a];"*a=99;p a

Рубі, 85 81 76 71 68 64 63 59 57 байт

f=->a,b=-a{eval"a*=b<0?f[a,a]:b<1?a:f[a,b-1];"*a};p f[99]

Досить швидко зростаюча ієрархія з f (a + 1)> f ω + 1 (a).


Рубін, 61 байт

f=->a,b=-a{a<0?9:b==0?a*a:f[f[a-1,b],b>0?b-1:f[a,b+1]]};f[99]

В основному функція Ackermann з поворотом.


Рубі, 63 59 байт

n=99;(H=->a{b,*c=a;n.times{b ?H[[b-1]*n*b+c]:n+=n}})[n];p n

Ще один Рубін, 74 71 байт

def f(a,b=a)a<0?b:b<0?f(a-1):f(a-1,f(a,b-1))end;n=99;n.times{n=f n};p n

В основному, Акерманн функціонує на собі 99 разів.


0

Пітон: 85

f=lambda a,a:a*a
exec'f=lambda a,b,f=f:reduce(f,[a]*b,1)'*99
exec'f('*64+'3'+',3)'*64

Що, можливо, можна скоротити до 74 +length(X) :

f=lambda a,a:a*a
exec'f=lambda a,b,f=f:reduce(f,[a]*b,1)'*int('9'*X)
f(3,3)

Де X є відповідне велике число, таке, що результуюча гіперпереробка на 3, 3це більше, ніж число Гремса (якщо це число менше, ніж 99999999999деякий байт зберігається).


Примітка. Я припускаю, що код python виконується на інтерактивному інтерпретаторі, тому результат друкується до stdout, інакше додайте 9байти до кожного рішення для виклику print.


2
Ваше байтове рішення 74ish не дає результату майже достатньо.
lirtosiast

0

Javascript, 83 байти

Ще одне рішення функції Ackermann.

(function a(m,n,x){return x?a(a(m,n,x-1),n,0):(m?a(m-1,n?a(m,n-1):1):n+1)})(9,9,99)

0

JavaScript, 68 байт, однак не конкурентоспроможний для використання ES6

a=(x,y)=>y?x?a(a(x-1,y)*9,y-1):a(9,y-1):x;b=x=>x?a(9,b(x-1)):9;b(99)

a функція схожа на позначення стрілки вгору з базою 9.

       /a(a(x-1,y)*9,y-1)  x>0, y>0
a(x,y)=|a(9,y-1)           x=0, y>0
       \x                  y=0

bфункція: b (x) = b x (9).

b(99)є ~ f ω + 1 (99), порівняно з числом Грема <f ω + 1 (64).


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