Secara teoritis menampilkan nomor Graham

44

Nomor Graham Gdidefinisikan dengan cara ini:

u(3,n,1) = 3^n
u(3,1,m) = 3
u(3,n,m) = u(3,u(3,n-1,m),m-1)
[Knuth's up-arrow notation]
[Conway chained arrow notation]

THEN

g1 = u(3,3,4)
g2 = u(3,3,g1)
g3 = u(3,3,g2)
...
G = u(3,3,g63)

Anda diberikan itu u(3,3,2)=7625597484987untuk memeriksa kode Anda.

Tugas Anda adalah menulis program / fungsi yang akan menampilkan nilai Gdeterministik, mengingat ukuran integer yang cukup dan waktu yang cukup.

Referensi

Papan peringkat

Biarawati Bocor
sumber
2
Terkait .
Leaky Nun
7
Apakah keacakan diperbolehkan? Jika saya hanya menampilkan nilai acak, akhirnya nomor Graham harus dihasilkan.
mil
15
@miles Mengapa tidak ada celah standar di bumi? Diklarifikasi
Leaky Nun
18
Peringatan: u (3, 3, 2) = u (3, 2, 3) = 7625597484987, jadi Anda juga ingin menguji nilai-nilai lain seperti u (3, 5, 1) = 243 untuk memastikan Anda mendapat urutan argumennya benar.
Anders Kaseorg
2
Nomor Graham?
Beta Decay

Jawaban:

48

Kalkulus biner biner , 114 bit = 14,25 byte

Hexdump:

00000000: 4457 42b0 2d88 1f9d 740e 5ed0 39ce 80    DWB.-...t.^.9..

Biner:

010001000101011101000010101100000010110110001000000111111001110101110100000011100101111011010000001110011100111010

Penjelasan

01 00                                           (λx.
│    01 00                                        (λy.
│    │    01 01 01 110                              x
│    │    │  │  └─ 10                               y
│    │    │  └─ 00                                  (λm.
│    │    │       01 01 01 10                         m
│    │    │       │  │  └─ 00                         (λg.
│    │    │       │  │       00                         λn.
│    │    │       │  │         01 01 10                  n
│    │    │       │  │         │  └─ 110                 g
│    │    │       │  │         └─ 00                     (λz.
│    │    │       │  │              10                     z))
│    │    │       │  └─ 00                            (λn.
│    │    │       │       00                            λf.
│    │    │       │         01 111110                    x
│    │    │       │         └─ 01 110                    (n
│    │    │       │            └─ 10                      f))
│    │    │       └─ 1110                             x)
│    │    └─ 10                                     y)
│    └─ 00                                        (λf.
│         00                                        λz.
│           01 110                                   f
│           └─ 01 01 1110                            (x
│              │  └─ 110                              f
│              └─ 10                                  z)))
└─ 00                                           (λf.
     00                                           λz.
       01 110                                      f
       └─ 01 110                                   (f
          └─ 01 110                                 (f
             └─ 10                                   z)))

Ini adalah (λ x . (Λ y . X ym . Mg . Λ n . N g 1) (λ n . Λ f . X ( n f )) x ) y ) (λ f . Λ z . f ( x f z ))) 3, di mana semua angka direpresentasikan sebagai angka Gereja. Angka gereja adalah standar representasi lambda kalkulus bilangan, dan mereka sangat cocok untuk masalah ini karena sejumlah gereja ditentukan oleh fungsi iterasi: n g adalah n th iterate dari fungsi g .

Misalnya, jika g adalah fungsi λ n . λ f . 3 ( n f ) yang dikalikan 3 dengan angka Gereja, lalu λ n . n g 1 adalah fungsi yang mengambil 3 pangkat dari angka Gereja. Iterasi operasi ini m kali memberi

mg . λ n . n g 1) (λ n . λ f . 3 ( n f )) n = u (3, n , m ).

(Kami menggunakan multiplikasi u (-, -, 0) daripada exponentiation u (-, -, 1) sebagai alas kasus, karena mengurangi 1 dari angka Gereja tidak menyenangkan .)

Pengganti n = 3:

mg . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3 = u (3, 3, m ).

Iterasi operasi itu 64 kali, mulai dari m = 4, beri

64 (λ m . Mg . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = G .

Untuk mengoptimalkan ungkapan ini, gantikan 64 = 4 ^ 3 = 3 4:

3 4 (λ m . Mg . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = G .

Ingat 4 = succ 3 = λ f . λ z . f (3 f z ) sebagai argumen lambda:

y . 3 ym . mg . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3) y ) (λ f . λ z . f (3 f z )) = G .

Akhirnya, ingat 3 = λ f . λ z . f ( f ( f z )) sebagai argumen lambda:

x . (λ y . x ym . mg . λ n . n g 1) (λ n . λ f . x ( n f )) x ) y ) (λ f . λ z . f ( x f z ))) 3 = G .

Anders Kaseorg
sumber
Di mana orang bisa menemukan penerjemah untuk bahasa ini?
Dennis
4
@Dennis tromp.github.io/cl/cl.html memiliki beberapa dari mereka.
Anders Kaseorg
1
Ini luar biasa . ini layak mendapatkan hadiah yang cukup besar
kucing
1
14.25 bytestampaknya mengacaukan leaderboard. Itu diurai sebagai 25 bytes, dan karena itu Anda ditempatkan sebagai yang kedua.
Dan
1
@Dan saya memperbaiki cuplikan papan pemimpin, saya pikir.
Anders Kaseorg
40

Haskell, 41 byte

i=((!!).).iterate
i(($3).i(`i`1)(*3))4 64

Penjelasan:

(`i`1)f n= i f 1 nmenghitung niterate dari fungsi fmulai dari 1. Secara khusus, (`i`1)(*3)n= 3 ^ n , dan iterasi konstruksi ini m kali memberikan i(`i`1)(*3)m n= u (3, n , m ). Kita dapat menulis ulang itu sebagai (($n).i(`i`1)(*3))m= u (3, n , m ), dan iterasi konstruksi k kali ini untuk mendapatkan i(($3).i(`i`1)(*3))4 k= g _ k .

Anders Kaseorg
sumber
16

Haskell, 43 byte

q=((!!).).iterate
g=q(`q`1)(3*)
q(`g`3)4$64

Ada cara yang lebih baik untuk flip ginline.

46 byte:

i=iterate
n%0=3*n
n%m=i(%(m-1))1!!n
i(3%)4!!64

48 byte:

n%1=3^n
1%m=3
n%m=(n-1)%m%(m-1)
iterate(3%)4!!64

Cukup menuliskan definisi.

Kasing dasar agak bersih didukung hingga 0, meskipun tidak menyimpan byte. Mungkin akan lebih mudah untuk menulis definisi alternatif.

n%0=3*n
0%m=1
n%m=(n-1)%m%(m-1)
z=iterate(3%)2!!1
Tidak
sumber
Bisakah Anda menggunakan fungsi lain yang memiliki prioritas lebih rendah daripada +untuk menghapus tanda kurung antara m-1?
Leaky Nun
Saya menghitung 44 byte, dan apa yang terjadi pada 4 dan 64?
Leaky Nun
Ups, saya menyalin dalam uji parameter yang lebih kecil. Saya tidak berpikir saya dapat mengubah prioritas operator karena saya mendefinisikan fungsi baru dan mereka memiliki prioritas awal. Saya tidak bisa menimpa fungsi yang ada.
xnor
Maksud saya, saya menghitung 44 byte setelah Anda mengubahnya kembali ke 64.
Leaky Nun
Saya pikir maksud Anda (`g`3), bukan (3`g`).
Anders Kaseorg
10

Pyth, 25 byte

M?H.UgbtH*G]3^3Gug3tG64 4

Bagian pertama M?H.UgbtH*G]3^3Gmendefinisikan metode g(G,H) = u(3,G,H+1).

Untuk menguji bagian pertama, periksa 7625597484987=u(3,3,2)=g(3,1): g3 1.

Bagian kedua ug3tG64 4dimulai dari r0 = 4dan kemudian menghitung rn = u(3,3,r(n-1)) = g(3,r(n-1))64 kali, menghasilkan nilai akhir ( rdipilih alih-alih guntuk menghindari kebingungan).

Untuk menguji bagian ini, mulai dari r0=2dan kemudian menghitung r1: ug3tG1 2.

Biarawati Bocor
sumber
Jika g (G, H) = u (3, G, H + 1), Anda harus memiliki r (n) = u (3, 3, r (n - 1)) = g (3, r (n - 1 ) - 1), bukan g (3, r (n - 1)). Saya pikir kode Anda benar tetapi penjelasan Anda tidak ada pada - 1.
Anders Kaseorg
Anda dapat menyimpan byte dengan menggunakan argumen u yang tidak disetel ( ^3*3, tGG), dan byte lain dengan .UgbtH*G]3e.ugNtHG1.
Anders Kaseorg
Cara alternatif untuk menyimpan byte kedua itu adalah *G]3ShG.
Anders Kaseorg
8

Sesos , 30 byte

0000000: 286997 2449f0 6f5d10 07f83a 06fffa f941bb ee1f33  (i.$I.o]...:....A...3
0000015: 065333 07dd3e 769c7b                              .S3..>v.{

Dibongkar

set numout
add 4
rwd 2
add 64
jmp
    sub 1
    fwd 3
    add 3
    rwd 1
    add 1
    jmp
        sub 1
        jmp
            fwd 1
            jmp
                jmp
                    sub 1
                    fwd 1
                    add 1
                    rwd 1
                jnz
                rwd 1
                jmp
                    sub 1
                    fwd 3
                    add 1
                    rwd 3
                jnz
                fwd 3
                jmp
                    sub 1
                    rwd 2
                    add 1
                    rwd 1
                    add 1
                    fwd 3
                jnz
                rwd 1
                sub 1
            jnz
            rwd 1
            jmp
                sub 1
            jnz
            add 1
            rwd 1
            sub 1
        jnz
        fwd 1
        jmp
            sub 1
            rwd 1
            add 3
            fwd 1
        jnz
        rwd 2
    jnz
    rwd 1
jnz
fwd 2
put

Atau dalam notasi Brainfuck:

++++<<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[->>>+++<+[-[>[[->+<]<[->>>+<<<]>>>[-<<+<+>>>]<-]<[-]+<-]>[-<+++>]<<]<]>>.

Pengujian

Untuk menghitung u (3, n , u (3, n , ... u (3, n , m ) ...)) dengan k panggilan bersarang ke u , mengganti tiga pertama addpetunjuk add 4, add 64, add 3dengan add m, add k, add n, masing-masing. Karena Sesos tidak dapat membuat angka lebih cepat daripada dalam waktu linier, Anda praktis terbatas pada nilai kecil seperti u (3, 2, 2) = 27, u (3, 5, 1) = 243, dan u (3, 1 , u (3, 1, ... u (3, 1, m ) ...)) = 3.

Anders Kaseorg
sumber
Anda dapat mengganti [-]dengan ,karena EOF 0.
mbomb007
6

JavaScript (ES7), 63 byte

u=(n,m)=>n>1&m>1?u(u(n-1,m),m-1):3**n
g=n=>n?u(3,g(n-1)):4
g(64)
Neil
sumber
@AndersKaseorg Ugh, dalam hal ini saya mungkin juga mengembalikan perubahan itu.
Neil
Ini menyebabkan stack overflow, mungkin perlu memeriksa ulang pola rekursi Anda.
NodeNodeNode
Ini bukan ES7 sederhana. Ini adalah ES7 tanpa batas (varian imajiner dari ES7 tetapi dengan bignum, mampu membuat oracle tanpa batas, dan menggunakan desimal dengan / # xE ^ sebagai steno).
user75200
5

Brachylog , 57 byte

4:64:1iw
:3{[1:N],3:N^.|t1,3.|hM:1-X,?t:1-:Mr:2&:Xr:2&.}.

Tidak mengharapkan Input atau Output dan menulis hasilnya ke STDOUT. Ini akan menghasilkan stack overflow pada satu titik.

Untuk memeriksa apakah ini berfungsi untuk nilai kecil (mis. u(3,3,2)) Anda dapat mengganti 4dengan nilai dari mdan 64dengan 1.

Penjelasan

Ini pada dasarnya adalah implementasi langsung dari cara yang dijelaskan dalam menghitung angka.

  • Predikat utama:

    4:64:1i                    Call Predicate 1 64 times with 4 as initial input (the second
                               call takes the output of the first as input, etc. 64 times).
           w                   Write the final output to STDOUT
    
  • Predikat 1:

    :3{...}.                   Call predicate 2 with input [Input, 3]. Its output is the 
                               output of predicate 1.
    
  • Predikat 2:

    [1:N],                     M = 1
          3:N^.                Output = 3^N
    |                          Or
    t1,                        N = 1
       3.                      Output = 3
    |                          Or
    hM:1-X,                    X is M - 1
           ?t:1-:Mr:2&         Unify an implicit variable with u(3,N-1,M)
                      :Xr:2&.  Unify Output with u(3,u(3,N-1,M),X)
    
Fatalisasi
sumber
5

Karamel , 38 byte

(64 ((f->(f,1)),(n f->(3 (n f))),3) 4)

Ini adalah gula sintaksis untuk ekspresi kalkulus lambda 64 (λ m . Mf . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4, di mana semua angka diwakili sebagai Gereja angka .

Anders Kaseorg
sumber
(n f->3 (n f))tidakkah seharusnya dibaca n-1?
Leaky Nun
@LeakyNun No. (n f->3 (n f))adalah fungsi untuk perkalian tiga oleh angka Gereja .
Anders Kaseorg
2
Tantangan ini tampaknya sangat sederhana dalam kalkulus lambda. Mengapa?
kucing
3

Prolog (SWIPL), 129/137 byte

g(1,R):-u(3,4,R).
g(L,R):-M is L-1,g(M,P),u(3,P,R).
u(N,1,R):-R is 3**N.
u(1,_,3).
u(N,M,R):-K is N-1,L is M-1,u(K,M,Y),u(Y,L,R).

Untuk menampilkan nomor Graham, kueri untuk g(64,G).(jika 8 byte dari kueri ini dihitung, panjangnya 137 byte):

?- g(64, G).
ERROR: Out of local stack

Tapi seperti yang bisa diharapkan, ini kehabisan tumpukan.

Uji

?- u(3, 2, X).
X = 7625597484987

Mundur menyebabkannya kehabisan tumpukan:

?- u(3, 2, X).
X = 7625597484987 ;
ERROR: Out of local stack

Tidak disatukan

Versi ungolfed menambahkan notasi panah atas umum, bukan hanya untuk 3, dan menggunakan pemotongan dan cek untuk menghindari situasi mundur dan tidak terdefinisi.

% up-arrow notation
u(X, 1, _M, X) :- !.
u(X, N, 1, R) :-
    R is X**N, !.
u(X, N, M, R) :-
    N > 1,
    M > 1,
    N1 is N - 1,
    M1 is M - 1,
    u(X, N1, M, R1),
    u(X, R1, M1, R).

% graham's number
g(1,R) :- u(3, 3, 4, R), !.
g(L,R) :-
    L > 1,
    L1 is L - 1,
    g(L1,G1),
    u(3, G1, R).
SQB
sumber
Bagaimana Anda bisa melakukannya tanpa nomor 64di kode Anda?
Leaky Nun
@ LeakyNun Saya diedit untuk menjelaskan; lebih baik?
SQB
Nah, kemudian tambahkan ke kode Anda serta byte-count Anda.
Leaky Nun
3

C, 161 byte

u(int a, int b){if(a==1)return 3;if(b==1)return pow(3,a);return u(u(a-1,b),b-1);}
g(int a){if(a==1)return u(3,4);return u(3,g(a-1));}
main(){printf("%d",g(64));}

EDIT: menyimpan 11 byte dengan menghapus tab dan baris baru. EDIT: thx auhmann menyimpan byte lain dan memperbaiki program saya

arrowarrow
sumber
1
Anda dapat menghapus g(int a){if(a==1)return u(3,4);return g(a-1);}karena tidak digunakan sama sekali ... Atau apakah Anda lupa sesuatu?
auhmaan
@auhmaan oops maaf, saya menggunakan nomor itu untuk pengujian dan lupa mengubahnya kembali. Terima kasih!!
thepiercingarrow
Anda return g(a-1)seharusnya return u(3,g(a-1)).
Anders Kaseorg
1
Saya tidak tahu apakah saya harus membuat jawaban yang tepat atau hanya mengomentari ini, tetapi Anda bisa mendapatkan solusi ini hingga 114 byte dengan cukup mudah dengan menyadari: Baris baru antar fungsi dapat dihilangkan. Menghapus tipe untuk semua argumen defaultnya menjadi int (pikirkan K&R). Jika pernyataan seperti ini dapat ditulis dengan ops ternary bersarang. Kode:u(a,b){return a<2?3:b<2?pow(3,a):u(u(a-1,b),b-1);}g(a){return a<2?u(3,4):u(3,g(a-1));}main(){printf("%d",g(64));}
algmyr
@ algmyr wow luar biasa! Anda harus memposting jawaban XD Anda sendiri.
thepiercingarrow
2

Mathematica, 59 byte

n_ ±1:=3^n
1 ±m_:=3
n_ ±m_:=((n-1)±m)±(m-1)
Nest[3±#&,4,64]

Menggunakan operator infiks yang tidak ditentukan ±yang hanya membutuhkan 1 byte saat disandikan dalam ISO 8859-1. Lihat @ Martin posting untuk info lebih lanjut. Fungsi Mathematica mendukung pencocokan pola untuk argumen mereka, sehingga dua kasus dasar dapat didefinisikan secara terpisah.

mil
sumber
1
Sejak kapan Mathematica menggunakan ISO 8859-1?
Leaky Nun
n_ ±m_:=Nest[#±(m-1)&,3,n]
Leaky Nun
2

C, 114 109 byte

Berdasarkan jawaban oleh @thepiercingarrow ( tautan ) saya menurunkan sedikit jawabannya. Sebagian besar penghematan disebabkan oleh penyalahgunaan argumen pengetikan default saat melakukan fungsi gaya K&R dan penggantian pernyataan if dengan operator ternary. Menambahkan baris baru opsional antara fungsi untuk keterbacaan.

Ditingkatkan menjadi 109 berkat @LeakyNun.

u(a,b){return a<2?3:b<2?pow(3,a):u(u(a-1,b),b-1);}
g(a){return u(3,a<2?4:g(a-1));}
main(){printf("%d",g(64));}
algmyr
sumber
g(a){return u(3,a<2?4:g(a-1));}
Leaky Nun
@ LeakyNun Bagus sekali. Terima kasih.
algmyr
1

Python, 85 byte

v=lambda n,m:n*m and v(v(n-1,m)-1,m-1)or 3**-~n
g=lambda n=63:v(2,n and g(n-1)-1or 3)

The vFungsi mendefinisikan fungsi yang sama seperti yang ditemukan di jawaban Dennis : v(n,m) = u(3,n+1,m+1). The gFungsi adalah versi nol-diindeks dari iterasi tradisional: g(0) = v(2,3), g(n) = v(2,g(n-1)). Jadi, g(63)ini nomor Graham. Dengan mengatur nilai default dari nparameter gfungsi ke 63, output yang diperlukan dapat diperoleh dengan memanggil g()(tanpa parameter), sehingga memenuhi persyaratan kami untuk pengiriman fungsi yang tidak memerlukan input.

Verifikasi v(2,1) = u(3,3,2)dan v(4,0) = u(3,5,1)uji kasus online: Python 2 , Python 3

Mego
sumber
1
Agak sulit untuk memverifikasi, tetapi fungsi Anda gtampaknya tidak aktif. Bukankah v(2,n-1)seharusnya g(n-1)seperti itu?
Dennis
@ Dennis Tangkapan yang bagus. Saya akan memperbaikinya.
Mego
Sebenarnya offset antara udan vartinya seharusnya g(n-1)-1.
Anders Kaseorg
@AndersKaseorg Saya seharusnya tidak melakukan pemrograman saat mengantuk. Saya harus belajar kembali ini setiap beberapa hari.
Mego
@AndersKaseorg Di masa depan, harap jangan mengedit kiriman orang lain, bahkan jika itu untuk memperbaiki kesalahan dalam perbaikan / perbaikan bug yang Anda sarankan.
Mego
1

Dyalog APL, 41 byte

u←{1=⍺:3⋄1=⍵:3*⍺⋄(⍵∇⍨⍺-1)∇⍵-1}
3u 3u⍣64⊣4

Kasus cobaan:

      3u 2
7625597484987
lstefano
sumber
Anda harus dapat mengonversi 1=⍺:3⋄1=⍵:3*⍺menjadi just 1=⍵:3*⍺( 3=3*1)
Zacharý
1

Ruby, 64 byte

Meminjam dari algoritma Teoritis untuk menghitung nomor Graham .

def f(a,b=3)b<2?3:a<1?3*b:f(a-1,f(a,b-1))end;a=4;64.times{a=f a};p a

Sederhananya, f a = u(3,3,a)dan ini berlaku 64 kali.

Seni Cukup Indah
sumber
Penjelasan yang baik tentang mengapa dan bagaimana kode ini bekerja akan menyenangkan.
Manish Kundu
Ini adalah aplikasi langsung dari definisi nomor Graham.
Simply Beautiful Art
0

J, 107 byte

u=:4 :0
if.y=1 do.3^x
elseif.x=1 do.3
elseif.1 do.x:(y u~<:x)u<:y
end.
)
(g=:(3 u 4[[)`(3 u$:@<:)@.(1&<))64

Saya sedang berusaha mengubah umenjadi agenda, tetapi untuk sekarang itu akan berhasil.

Conor O'Brien
sumber
Sesuatu seperti u=:3^[`[:(3$:])/[#<:@]@.*@](tidak diuji)
Leaky Nun
0

F #, 111 108 byte

Sunting

Ini menggunakan fungsi di bawah untuk menghitung nomor Graham

let rec u=function|b,1->int<|3I**b|1,c->3|b,c->u(u(b-1,c),c-1)
and g=function|1->u(3.,4.)|a->u(3.,g (a-1))
g 63

Inilah jawaban saya sebelumnya yang, yah, tidak:

Cukup mudah. Hanya definisiu fungsi saja.

let rec u=function|a,b,1->a**b|a,1.,c->a|a,b,c->u(a,u(a,b-1.,c),c-1)

Pemakaian:

u(3.,3.,2)
val it : float = 7.625597485e+12

Jika saya menganggap 3 sebagai nilai untuk, saya bisa memotongnya menjadi 60:

let rec u=function|b,1->3.**b|1.,c->3.|b,c->u(u(b-1.,c),c-1)

Pemakaian:

u(3.,2)
val it : float = 7.625597485e+12
asibahi
sumber
Tantangannya adalah menulis nomor Graham, bukan u. Tentu saja Anda dapat menyertakan fungsi perantara yang Anda butuhkan, seperti udengan atau tanpa argumen pertamanya ditetapkan pada 3.
Anders Kaseorg
@AndersKaseorg mengeditnya. Terima kasih. Komentar saya sebelumnya tampaknya telah hilang.
asibahi
0

R, 154 142 128 126 118 byte

u=function(n,b)return(if(n&!b)1 else if(n)u(n-1,u(n,b-1))else 3*b)
g=function(x)return(u(if(x-1)g(x-1)else 4,3))
g(64)

Saya menggunakan definisi Wikipedia dari fungsi rekursif ini karena untuk beberapa alasan aneh yang disarankan tidak bekerja ... atau saya hanya mengisap R golf.

UPD: mencukur 12 + 14 = 26 byte berkat tip dari Leaky Nun . Versi sebelumnya menggunakan yang besar dan kurang efisien

u=function(n,b)if(n==0)return(3*b)else if(n>0&b==0)return(1)else return(u(n-1,u(n,b-1)))
g=function(x)if(x==1)return(u(4,3))else return(u(g(x-1),3))

UPD: dicukur 2 + 6 + 2 byte lebih (lagi, pujian untuk Leaky Nun ) karena penggantian yang cerdik dengan "jika (x)" bukan "jika (x == 0)" karena x <0 tidak pernah dimasukkan ke dalam fungsinya ... kan?

Andreï Kostyrka
sumber
@ LeakyNun Terima kasih, perbarui jawabannya dengan pengakuan.
Andreï Kostyrka
Tunggu sebentar ... Hari ini adalah hari pertama saya bermain golf kode, ada banyak yang harus dipelajari!
Andreï Kostyrka
Anda diundang untuk bergabung dengan obrolan kami .
Leaky Nun
Lebih banyak bermain golf, silakan lihat peningkatannya.
Andreï Kostyrka
Ta-dam, selesai, mengubah fungsi udengan kunci yang sama seperti Anda gdan menyimpan 6 byte lagi — luar biasa!
Andreï Kostyrka
0

PHP, 114 byte

abaikan jeda baris; hanya untuk keterbacaan.

function u($n,$m){return$m>1&$n>1?u(u($n-1,$m),$m-1):3**$n;}
function g($x){return u(3,$x>1?g($x-1):4);}
echo g(63);

Dimungkinkan untuk mengintegrasikan kasus kedua ke yang pertama: untuk n=1, 3^nsama dengan 3.
Ini akan menghemat beberapa byte pada - sejauh yang saya bisa lihat - semua jawaban yang ada; menyimpan dua byte di my

versi sebelumnya, 62 + 43 + 11 = 116 byte

function u($n,$m){return$m>1?$n>1?u(u($n-1,$m),$m-1):3:3**$n;}

Asosiasi asosiatif kiri dari ternary membutuhkan tanda kurung ... atau urutan tes tertentu.
Ini menyimpan dua byte pada ekspresi yang di dalam tanda kurung.


Mungkin ada pendekatan iteratif, yang dapat memungkinkan golf lanjut ...
tapi saya tidak dapat meluangkan waktu untuk itu sekarang.

Titus
sumber
andai saya tahu Sesos atau punya waktu untuk mempelajarinya dan menerjemahkannya sekarang
Titus
@ Leaky Nun: Saya memecahnya menjadi hanya loop dan tambahan. Apakah ada cara di Sesos untuk menambahkan nilai satu sel ke sel lainnya?
Titus
@AndersKaseorg: Anda mungkin benar ... Saya mendapat lecet pada bola mata saya karena melihat algoritma itu. Akan segera melihatnya lagi.
Titus