Write the shortest possible program (length measured in bytes) satisfying the following requirements:
- no input
- output is to stdout
- execution eventually terminates
- total number of output bytes exceeds Graham's number
Assume that programs run until "normal" termination on an ideal computer1 able to access unlimited resources, and that the common programming languages are modified if necessary (without changing the syntax) to allow this. Because of these assumptions, we might call this a kind of Gedankenexperiment.
To get things started, here's a 73-byte Ruby program that computes fω+1(99) in the fast-growing hierarchy:
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: More precisely, suppose we're taking an existing system and modifying it only to have no upper limit on storage size (but it is always finite). The execution-times of instructions are not supposed to be modified, but the machine is assumed to be ideal in that it will have no upper limit on its operating lifetime.
-
\$\begingroup\$ This takes my tetration question to a whole new level! \$\endgroup\$MrZander– MrZander2012年06月25日 03:47:07 +00:00Commented Jun 25, 2012 at 3:47
-
4\$\begingroup\$ There was once a similar programming contest called the Bignum Bakeoff. Some of the entries are quite interesting; the results are here: djm.cc/bignum-results.txt \$\endgroup\$Danny– Danny2013年06月09日 19:01:34 +00:00Commented Jun 9, 2013 at 19:01
19 Answers 19
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
How it works: %
simply takes a function and composes it n-1
times on top of s
; i.e. %3
takes a function f
and returns a function of n
that equals applying it f
to 3, n-1
times in a row. If we iterate the application of this higher-order function, we get a fast-growing sequence of functions – starting with exponentiation, it's exactly the sequence of Knuth-arrow-forest sizes:
((%3)%(3^))1 n = (3^)n = 3n = 3↑n
((%3)%(3^))2 n = ((3^)%3)n = (3↑)n−1 $ 3 = 3↑↑n
((%3)%(3^))3 n = (((3^)%3)%3)n = (3↑↑)n−1 $ 3 = 3↑↑↑n
and so on. ((%3)%(3^))n 3
is 3 ↑n 3
, which is what appears in the calculation to Graham's number. All that's left to do is composing the function (\n -> 3 ↑n 3) ≡ flip((%3)%(3^))3
more than 64 times, on top of 4 (the number of arrows the calculation starts with), to get a number larger than Graham's number. It's obvious that the logarithm (what a lamely slow function that is!) of g65
is still larger than g64=G
, so if we print that number the output length exceeds G
.
⬛
-
-
\$\begingroup\$ Oh... ideone seems to run a 32-bit version, so it gets to an overflow of
Int
quickly. On a 64-bit system, that consumes too much memory to reproduce, but of course it still won't allow to reachG
. I need the (big-int)Integer
type, so I can't use!!
; wait... \$\endgroup\$ceased to turn counterclockwis– ceased to turn counterclockwis2012年06月25日 12:44:16 +00:00Commented Jun 25, 2012 at 12:44 -
\$\begingroup\$ Fixed it now, had to use explicit recursion to implement
%
. \$\endgroup\$ceased to turn counterclockwis– ceased to turn counterclockwis2012年06月25日 12:51:26 +00:00Commented Jun 25, 2012 at 12:51 -
\$\begingroup\$ I find
((%3)%(3*))2 n
actually grows faster than you say (a good thing), but my Haskell-fu is inadequate to understand why. Forn = 0, 1, 2, ...
, instead of giving3, 3^3, 3^(3^3), ...
, it gives3, 3^(3+1), 3^((3^(3+1))+1), ...
. \$\endgroup\$r.e.s.– r.e.s.2012年06月29日 14:15:39 +00:00Commented Jun 29, 2012 at 14:15 -
\$\begingroup\$ As I said: "
((%3)%(3*))n 3
is larger than3 ↑n 3
". Or do you mean something else? Anyway, I changed the definition so that it's all equalities (at least I think so, to lazy to check now...) rather than larger-thans. And if you change66
to65
, it actually producesG
itself, ain't that nice? \$\endgroup\$ceased to turn counterclockwis– ceased to turn counterclockwis2012年06月29日 21:43:57 +00:00Commented Jun 29, 2012 at 21:43
Binary Lambda Calculus, (削除) 7.625 (削除ここまで) (削除) 7.5 (削除ここまで) (削除) 6.75 (削除ここまで) 6.125 bytes, (削除) 61 (削除ここまで) (削除) 60 (削除ここまで) (削除) 54 (削除ここまで) 49 bits
0100011010000110011000000101101100000011100111010
This encodes:
(\x.x x) (\y.y (y (\g m.m g (\f n.f (f n)))))
To simplify things a bit, let H = (\g m.m g 2)
where 2
is the Church numeral (\f n.f (f n))
. These are the first few steps of the reduction:
(\x.x x) (\y.y (y H))
(\y.y (y H)) (\y.y (y H))
(\y.y (y H)) ((\y.y (y H)) H)
(\y.y (y H)) (H (H H))
H (H H) (H (H H) H)
H (H H) H (H H) 2
H (H H) 2 (H H) 2
2 (H H) 2 (H H) 2
H H (H H 2) (H H) 2
H H 2 H 2 (H H) 2
2 H 2 H 2 (H H) 2
H (H 2) H 2 (H H) 2
H (H 2) 2 2 (H H) 2
2 (H 2) 2 2 (H H) 2
H 2 (H 2 2) 2 (H H) 2
H 2 2 2 2 2 (H H) 2
2 2 2 2 2 2 (H H) 2
2^^6 (H H) 2
The next step is applying H H
\2ドル\uparrow\uparrow6\$ times to 2
. After an odd number of aplications the result is not a number, but after an even number of aplications it is. Here \2ドル\uparrow\uparrow6\$ is not an aproximation, and since it is even, the final answer will be a number. We will use \$\frac{2\uparrow\uparrow6}{2}\$ times a function that applies H H
twice. The function H H (H H n)
grows as fast as the Ackermann function, to see this, let's take a look at a more general case. The function k H 2 n
grows as fast as \2ドル\uparrow^kn\$:
0 H 2 n = 2 n = n^2 > 2*n = 2{0}n
k+1 H 2 n = H (k H 2) n = H (\x.k H 2 x) n >= H (\x. 2{k}x) n
= n (\x. 2{k}x) 2 = 2{k+1}(n+1) > 2{k+1}n
Applying this to H H (H H n)
we get H H (H H n) = H H n H 2 = n H 2 H 2 = H (n-1 H 2) H 2 = H (n-1 H 2) 2 2 = 2 (n-1 H 2) 2 2 = n-1 H 2 (n-1 H 2 2) 2 >= n-1 H 2 2{n-1}2 2 >= 2{n-1}2{n-1}2 2 = 2{n}3 2 > 2{n}3
, which is about the same as \$A(n,n)\$. So the size of the expression 2^^6 (H H) 2
is about \$g_{\frac{2\uparrow\uparrow6}{2}} > g_{64}\$.
-
3\$\begingroup\$ Brilliant! This deserves way more up votes. I've detailed the proof a bit more at github.com/tromp/AIT/blob/master/fast_growing_and_conjectures/… \$\endgroup\$John Tromp– John Tromp2023年12月04日 15:30:53 +00:00Commented Dec 4, 2023 at 15:30
-
1\$\begingroup\$ Always knew BLC was concise, but wow. \$\endgroup\$TLW– TLW2023年12月17日 21:26:27 +00:00Commented Dec 17, 2023 at 21:26
Binary Lambda Calculus, 78 bits = 9.75 bytes
Here is an expression in Binary Lambda Calculus that is less than 10 bytes, yet surpasses Graham's Number. This is over 5x shorter than my previous post in JavaScript. Since Binary Lambda Calculus is radically different than JavaScript, I decided to answer this in a separate post.
010101000001110011101000000101011000000101101101011010000110100000011100111010
You can find some interpreters here.
Explanation I made on another post
Essentially, this binary expression encodes this lambda calculus expression:
(\f x.f (f x))(\f n.n (\g m.m g m) f n)(\x.x x)(\f x.f (f x))
The decodings can be described like this:
(\f x.f (f x))
at the start and at the end corresponds to the Church Numeral \2ドル\$.(\f n.n (\g m.m g m) f n)
takes in a function \$f\$ and a number \$n\$, and returns \$f_n (n)\$ where \$f_0 (n) = f(n)\$ and \$f_{m+1} (n) = f_m^n (n)\$ using functional recursion. Let's call this function \$S\$.(\x.x x)
corresponds to the function that raises a number to the power of itself, or \$f(x)=x^x\$.
Since Church Numerals naturally nest the function that they apply to, the lambda calculus string gets reduced as follows: $2ドルSf2 \rightarrow S(Sf)2$$ Since each \$S\$ adds \$\omega\$ to the growth rate of the function, and the \$f(x)=x^x\$ has growth rate \$f_2\$ in the Fast Growing Hierarchy, then \$(Sf)\$ has growth rate \$f_{\omega}\$, and \$S(Sf) = 2Sf\$ has growth rate \$f_{\omega2}\$.
This means the expression \2ドルSf2\$ described above has the value of about \$f_{\omega2} (2)\$ in the Fast-growing Hierarchy. This is greater than Graham's Number.
Therefore, Graham's Number can be beaten by a program that less than 10 bytes!
-
2\$\begingroup\$ You can remove 1 byte by doing
(\t. t S f t) 2 -> 2 S f 2
at the beginning. The 70 bits:0100010101100000010101100000010110110101101000011010100000011100111010
\$\endgroup\$2014MELO03– 2014MELO032021年06月01日 01:02:07 +00:00Commented Jun 1, 2021 at 1:02 -
8\$\begingroup\$ 63 bits:
010001010110010110000000010101101110110101010100000011100111010
. This encodes(\t.t (t (\h g m.m h g m) t) t t) (\f x.f (f x))
and becomes2 (\f n.n (\g m.m 2 g m) f n) (\x.2 x) 2
, which is greater than2 S f 2
. \$\endgroup\$2014MELO03– 2014MELO032021年08月24日 19:48:19 +00:00Commented Aug 24, 2021 at 19:48 -
\$\begingroup\$ @2014MELO03 Unfortunately, my lambda-fu is not good enough to confirm the "... and becomes ..." in your last comment. Would you (or anyone) be so kind as to briefly describe the main steps involved in that conversion? \$\endgroup\$r.e.s.– r.e.s.2023年03月25日 00:38:21 +00:00Commented Mar 25, 2023 at 0:38
-
\$\begingroup\$ I just wrote a post about this program at googology.fandom.com/wiki/User_blog:JohnTromp/… \$\endgroup\$John Tromp– John Tromp2023年03月25日 22:23:54 +00:00Commented Mar 25, 2023 at 22:23
-
\$\begingroup\$ @JohnTromp Does it output anything to stdout? This program computes a Church numeral, not a string. The number 2 doesn't output "2". \$\endgroup\$2014MELO03– 2014MELO032023年03月26日 02:45:28 +00:00Commented Mar 26, 2023 at 2:45
GolfScript ((削除) 49 (削除ここまで) 47 chars)
4.,{\):i\.0={.0+.({<}+??\((\+.@<i*\+}{(;}if.}do
See Lifetime of a worm for lots of explanation. In short, this prints a number greater than fωω(2).
-
\$\begingroup\$ f_(ω^ω)(2) is about as large as g_(f_8(8)), so not as overkill as that expression would imply. \$\endgroup\$Simply Beautiful Art– Simply Beautiful Art2017年12月03日 20:47:40 +00:00Commented Dec 3, 2017 at 20:47
Python 3, 53 bytes
m=lambda x:-x if x<0 else m(x-m(x-1))/2;print(1/m(9))
It computes the reciprocal of the gap between the 9 and the smallest tame fusible number above it, which is shown here to be at least \$f_{\varepsilon_0}(2)\$ in the fast-growing hierarchy, thus beating Graham's number.
Pyth, (削除) 24 (削除ここまで) 22 bytes
-2 bytes thanks to r.e.s.
DlHR?<HZ_H/l-Hl-H12)lT
Same algorithm as before. I changed the argument 9 to 10 (which due to the predefined variable T
doesn't increase the length), thus making the output at least \$f_{\varepsilon_0}(3)\$, absolutely dominating Graham's number and every other answer so far.
-
\$\begingroup\$ This is very cool! I think you can also make a great submission to Write a program whose nontermination is independent of Peano arithmetic based the termination of
M
for all natural numbers. (Edit: Or not, the "for all" quantifier goes the wrong way.) \$\endgroup\$xnor– xnor2021年09月22日 23:21:45 +00:00Commented Sep 22, 2021 at 23:21 -
\$\begingroup\$ By the way you can golf the base case to
-x*(x<0)or ...
\$\endgroup\$xnor– xnor2021年09月22日 23:30:48 +00:00Commented Sep 22, 2021 at 23:30 -
\$\begingroup\$ You don't need to take the reciprocal, because it's just the total number of output bytes that matters. \$\endgroup\$r.e.s.– r.e.s.2021年09月23日 05:58:41 +00:00Commented Sep 23, 2021 at 5:58
-
1\$\begingroup\$ This program is an infinite loop due to floating point precision. While Python
int
s are arbitrarily long, Pythonfloat
s are not. We getm(9) = m(9 - m(8 - m(7 - m(6 - m(5 - m(4 - m(2.999023318232446)/2/2/2/2)/2)/2)/2)/2)/2)/2
, which then recurses forever atm(2.999023318232446) = m(2.999023318232446 - 1.1102230246251565e-16)/2 = m(2.999023318232446)/2
. Consider using thefractions
module or pairs ofint
s. \$\endgroup\$Anders Kaseorg– Anders Kaseorg2021年11月28日 21:32:35 +00:00Commented Nov 28, 2021 at 21:32 -
\$\begingroup\$ @AndersKaseorg @E.Z.L. The program will avoid floating point if it's considered to be in the SageMath language (rather than Python), where the variables default to Integer and Rational types. In this language, the program can also be shortened to 43 bytes:
M=lambda x:-x if x<0else M(x-M(x-1))/2;M(9)
' \$\endgroup\$r.e.s.– r.e.s.2023年03月26日 21:09:19 +00:00Commented Mar 26, 2023 at 21:09
Pyth, (削除) 29 (削除ここまで) 28 bytes
M?*GHgtGtgGtH^ThH=ZTV99=gZTZ
Defines a lambda for hyper-operation and recursively calls it. Like the definition for Graham's number, but with larger values.
This:
M?*GHgtGtgGtH^3hH
Defines a lambda, roughly equal to the python
g = lambda G, H:
g(G-1, g(G, H-1)-1) if G*H else 3^(H+1)
This gives the hyper-operation function, g(G,H) = 3↑G+1(H+1).
So, for example, g(1,2)=3↑23 = 7,625,597,484,987, which you can test here.
V<x><y>
starts a loop that executes the body, y
, x
times.
=gZT
is the body of the loop here, which is equivalent to Z=g(Z,10)
The code:
M?*GHgtGtgGtH^3hH=Z3V64=gZ2)Z
Should recursively call the hyperoperation above 64 times, giving Graham's Number.
In my answer, however, I've replaced the single digits with T
, which is initialized to 10, and increased the depth of recursion to 99. Using Graham Array Notation, Graham's Number is [3,3,4,64], and my program outputs the larger [10,11,11,99]. I've also removed the )
that closes the loop to save one byte, so it prints each successive value in the 99 iterations.
Javascript, 50 Bytes, \$f_{\omega+8} (9)\$
n=(y,x=9)=>y?y-9?n(y-1,x?n(y,x-1)*9:9):x:n(x);n(8)
Here, n is a binary function. The function is defined as followed:
n(9,x) = x
n(y,0) = n(y-1,9)
n(y,x) = n(y-1,n(y,x-1)*9)
The *9
ensures that n(y,x)
is an increasing function with respect to x.
n(9,x)
= xn(10,x)
= 9^(x+1)n(11,x)
~ 9^^xn(12,x)
~ 9^^^xn(y+1,x)
recurses overn(y,x)
with respect to x.
We also defined n(y)=n(y,9), so n(y) grows as fast as \$f_{\omega}\$ in the Fast Growing Hierarchy.
Now here is the twist:
n(0,x)=n(x)=n(x,9)
This starts an entirely new hierarchy starting from y=0
all the way up to y=8
.
n(0,x)
grows at \$f_{\omega}\$ in the FGHn(1,x)
grows at \$f_{\omega+1} = G\$n(2,x)
grows at \$f_{\omega+2}\$- ...
n(8,x)
grows at \$f_{\omega+8}\$
Therefore, n(8)
~ \$f_{\omega+8} (9) > G_{64}\$
Ruby, (削除) 54 (削除ここまで) (削除) 52 (削除ここまで) 50 bytes
f=->b{a*=a;eval"f[b-1];"*b*a};eval"f[a];"*a=99;p a
Ruby, (削除) 85 (削除ここまで) (削除) 81 (削除ここまで) (削除) 76 (削除ここまで) (削除) 71 (削除ここまで) (削除) 68 (削除ここまで) (削除) 64 (削除ここまで) (削除) 63 (削除ここまで) (削除) 59 (削除ここまで) 57 bytes
f=->a,b=-a{eval"a*=b<0?f[a,a]:b<1?a:f[a,b-1];"*a};p f[99]
Pretty much fast growing hierarchy with f(a+1)> fω+1(a).
Ruby, 61 bytes
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]
Basically an Ackermann function with a twist.
Ruby, (削除) 63 (削除ここまで) 59 bytes
n=99;(H=->a{b,*c=a;n.times{b ?H[[b-1]*n*b+c]:n+=n}})[n];p n
Another Ruby, (削除) 74 (削除ここまで) 71 bytes
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
Basically Ackermann function to itself 99 times.
Python (111+n), n=length(x)
Although this one is not as short as the answerer's Ruby program, I'll post it anyway, to rule this possibility out.
It uses the Ackermann function, and calls the Ackermann function with m and n being the values from another call to the Ackermann function, and recurses 1000 times.
This is probably bigger than Graham's number, but I'm not sure, because nobody knows the exact length of it. It can be easily extended, if it's not bigger.
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))
-
\$\begingroup\$ output to stdout? also, you need a
return
statement or alambda
. \$\endgroup\$boothby– boothby2012年06月22日 05:43:07 +00:00Commented Jun 22, 2012 at 5:43 -
9\$\begingroup\$ Also if A(m,n) returns a single value, then isn't A(A(5,5)) missing an argument? ... This is the problem with a challenge like this: it encourages people not to test their code, because a complete run is purely theoretical. \$\endgroup\$breadbox– breadbox2012年06月22日 06:19:58 +00:00Commented Jun 22, 2012 at 6:19
-
\$\begingroup\$ If you replace your last line with
exec'x=A(x,x);'*x;print x
, then the program is ok and the output is approximately f_(ω+1)(x) (assumimg the Ackermann function code is correct), which has more than G bytes even for x=99, say. (In my Ruby program,f[m,n]
is a version ofA(m,n)
.) \$\endgroup\$r.e.s.– r.e.s.2012年06月22日 12:18:25 +00:00Commented Jun 22, 2012 at 12:18 -
\$\begingroup\$ @breadbox - Good point ... Theoretical questions like this require us to make sure a program is ok for small-parameter (i.e. non-theoretical) test-cases that clearly generalize to give a correct answer. \$\endgroup\$r.e.s.– r.e.s.2012年06月22日 12:46:36 +00:00Commented Jun 22, 2012 at 12:46
-
1\$\begingroup\$ Its's longer, but if you want to use
eval
instead ofexec
, your last line could bef=lambda x:A(x,x);print eval('f('*x+'x'+')'*x)
. Also, your def of A(m,n) needs to be corrected per boothby's comment. \$\endgroup\$r.e.s.– r.e.s.2012年06月22日 13:51:15 +00:00Commented Jun 22, 2012 at 13:51
GolfScript, (削除) 24 (削除ここまで) (削除) 20 (削除ここまで) 18 bytes
"`'1,ドル*~'+"{.~~})*
"`'1,ドル*~'+" # Push this string
{.~~})* # Becomes {.~}126* and this duplicates and executes the string 126 times
When executed, this string modifies the string at the top of the stack:
` # Parse it to a string inside the string 'foo' -> '"foo"'
'1,ドル*~'+ # Add '1,ドル*~' at the end '"foo"' -> '"foo"1,ドル*~'
When we execute this new string it does whatever foo
used to do, but many times.
1,ドル # Get the number of bytes of the string at the top of the stack
"foo" * # Make that many copies of foo
~ # Execute all of them
We will be dealing with only one string, that will modify itself 126 times. Let L
be the number of loops and B
the number of bytes the string has. These values can be calculated with \$B=2^{L+1}+3L+7\$, but for simplicity's sake we will round B
down to L
. The number of bytes grows exponentially because every time a loop is added, every "
becomes \"
and every \
becomes \\
. Now the loops execute L
times instead of B
. When the string has no loops it just adds "
"1,ドル*~
around itself, in other words L = L + 1
. With a
loops it executes L
times the version with a-1
loops. This is exactly the same definition of f
in the fast growing hierarchy for when a
is a successor:
$$f_0(L)=L+1$$ $$f_a(L)=f_{a-1}^L(L)$$
Before each execution a
and L
are the same number, so every time we execute the string, L
becomes \$f_\omega(L)\$.
We execute it 126 times starting with L = 0
, so the number of bytes in the output will be:
$$f_\omega^{126}(0)=f_\omega^{122}(f_8(8))>f_\omega^{122}(122)=f_{\omega+1}(122)$$
Functoid, 14 bytes
B"W(BiCA])9.Ef
The pointer wraps around whenever it moves out of the source code, this happens once here, making the code equivalent to B"W(BiCA])9.EfB"W(BiCA])9.Ef
. The string "W(BiCA])9.EfB"
gets converted to base 10 and becomes "91772447243986"
. Now we can rewrite the code as BkW(BiCA])9.Ef
, where k
represents that big number.
BkW(BiCA])9 # set the current function to B k W (B i C A ]) 9
. # evaluate and print the current function as a number
Ef # terminate the program
Let f_a
be a lambda function equivalent to \$f_a\$ in the fast growing hierarchy. To increase the index by 1, the function needs to be applied to itself n
times \$f_a^n(n) = f_{a+1}(n)\$. In code this would be f_(a+1) n = n f_a n = C A f_a n
. To get any finite index we just need to apply C A
a lot of times to f_0 = ]
:
f_0 = ]
f_1 = C A ]
f_2 = C A (C A ])
f_3 = C A (C A (C A ]))
...
\$f_\omega(n) = f_n(n)\$ = n (C A) ] n = W (i (C A) ]) n
The expression B k W (B i C A ]) 9
can be reduced to k (W (i (C A) ])) 9 = k f_ω 9
and this returns \$f_\omega^{91772447243986}(9)\$.
Python 3, 79 bytes
f=lambda x,y:f(x-1,f(x,y-1))if x*y else x+y+1
z=9;exec("z=f(z,z);"*99);print(z)
f(x,y) is a modified version of ackermann for golfing purposes
f(x,y) = f(x-1,f(x,y-1)) if both x and y are greater than 0
f(x,0) and f(0,y) each add one to the nonzero entry (if both are zero, it is 1)
Then the program does recursion on f(x,x) 99 times.
-
\$\begingroup\$ Welcome to Code Golf, and nice answer! \$\endgroup\$2023年02月11日 17:37:48 +00:00Commented Feb 11, 2023 at 17:37
JavaScript, 68 bytes, however uncompeting for using 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
function is similar to up-arrow notation with base 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
function is: b(x)=bx(9).
b(99)
is ~fω+1(99), compared to Graham's number<fω+1(64).
-
3\$\begingroup\$ If you've marked this non-competing due to the language being newer than the question, you don't have to do that anymore \$\endgroup\$Jo King– Jo King2019年04月29日 21:48:33 +00:00Commented Apr 29, 2019 at 21:48
Python 3, (削除) 174 (削除ここまで) (削除) 171 (削除ここまで) (削除) 168 (削除ここまで) (削除) 148 (削除ここまで) (削除) 125 (削除ここまで) (削除) 117 (削除ここまで) (削除) 116 (削除ここまで) (削除) 112 (削除ここまで) 101 bytes
3^^^...^3 with Graham's number arrows i.e. G(65) (boring, I know)
a=lambda b,c:3if b<2else(a(a(b-1,c),c-1)if c else 3*b)
G=lambda k:a(3,G(k-1))if k else 4
print(G(65))
Pretty human-readable. a implements arrow notation, G is Graham's sequence.
Improvements
- Replaced G(64)+1 with G(65), saving two bytes
- Replaced
if c==1:return a**b
withif c==0:return a*b
, saving one byte - Renamed ar function to a and renamed variable a to k, saving three bytes
- Turned G function from a proper function into a lambda, saving twenty bytes, believe it or not!
- Turned a function from a proper function also into a lambda, saving twenty-three bytes!
- Removed k from a function since we will only be using it with base 3, saving eight bytes.
- Removed an unnecessary space
- Removed some more unnecessary spaces, saving four bytes
- Shortened definitions of a and G, saving eleven bytes
-
\$\begingroup\$ You can save 7 bytes with
a=lambda b,c:3if b<2else(a(a(b-1,c),c-1)if c else 3*b)
, and another 4 bytes withG=lambda k:a(3,G(k-1))if k else 4
. \$\endgroup\$r.e.s.– r.e.s.2021年11月28日 17:21:58 +00:00Commented Nov 28, 2021 at 17:21 -
\$\begingroup\$ Thank you so much! I will definitely do that. \$\endgroup\$Caelus– Caelus2021年11月28日 18:23:55 +00:00Commented Nov 28, 2021 at 18:23
7, 17.5 bytes
00000000: 505e 91e7 a3a4 63c8 edda 476d ea0b d556 P^....c...Gm...V
00000010: d7e ..
Written in octal:
24057221717216443074435566443555724057252555375
721gge644355
is a function that, given a function f_a()
, returns f_(a+1)()
:
|f_a() 721gge644355
|c7{f_a()}ggerr # Where {f_a()} represents the pacified version of f_a()
# Applying the result to some number n, to see that it worked:
|n c7{f_a()}ggerr
|n|f_a() nr
f_a() n # Make n copies of f_a(), resulting in f^n_a()
n r # Apply it to n, resulting in f^n_a(n) = f_(a+1)(n)
From that, a function f_w()
can be written:
|n cc71721644307443556ggerrr
|n|n|721gge644355 nrr
n # A function (\x -> x^n), representing f_0()
721gge644355 nr # Add 1 n times to the index of f_0(), resulting in f_n()
n r # Apply the result to n, resulting in f_n(n) = f_w(n)
The full program computes f^256_w(2)
, which is greater than Graham's number:
|| 24057221717216443074435566443555724057252555375
||cg6r|cc71721644307443556ggerrr|cg6r|crcrrre|r
||cg6r|cc71721644307443556ggerrr|cg6r|crcrrre|r r
||cg6r|cc71721644307443556ggerrr|cg6r|crcrrre r
||cg6r|cc71721644307443556ggerrr|cg6r crcrrre
cg6r # The number 2
cr # Raise 2, to itself returning 4
cr # Raise 4, to itself returning 256
cc71721644307443556ggerrr r # Make 256 copies of f_w(), resulting in f^256_w()
cg6r r # Apply this function to 2, resulting in f^256_w(2)
e # Print the result in the same encoding as the source code
We can see the code working by reducing it to just f_w(2)
. This outputs 2^2^18
, which is represented by 2^18
copies of 2405
in the same encoding as the source.
2405722171721644307443556644355575375
Python 3, (削除) 52 (削除ここまで) 49 bytes
m=lambda x:-x*(x<0)or m(x-m(x-1))/9;print(9/m(9))
This code uses fusible margins, and the final output is around \$f_{\varepsilon_0}(9)\$.
-
\$\begingroup\$ Welcome! Looks like you can up with the same approach as this answer. You can golf the base case to
-x*(x<0)or ...
\$\endgroup\$xnor– xnor2025年07月22日 07:11:10 +00:00Commented Jul 22 at 7:11
Python: 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
Which maybe could be shortened to 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)
Where X
is an appropriate big number such that the resultant hyperoperation on 3, 3
is bigger than Grahams number(if this number is less than 99999999999
then some byte is saved).
Note: I assume the python code is executed on the interactive interpreter hence the result is printed to stdout, otherwise add 9
bytes to each solution for the call to print
.
-
2\$\begingroup\$ Your 74ish byte solution does not produce an output nearly large enough. \$\endgroup\$lirtosiast– lirtosiast2015年12月05日 02:08:46 +00:00Commented Dec 5, 2015 at 2:08
Javascript, 83 bytes
Another Ackermann function solution.
(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)
Ruby, 60 bytes
f=->n{n.times{eval("n.times{"*n+"n+=1"+"}"*n)};n};f.call(64)
This is \$f_{\omega+1}(64)\$, exactly, which is slightly bigger than Graham's number :) I copied this from Simply Beautiful Art on their Bignum Bakeoff post.