Teorik olarak Graham sayısının çıktısını alın


44

Graham'ın numarası Gbu şekilde tanımlanır:

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)

Bunu u(3,3,2)=7625597484987kodunuzu kontrol etmeniz için verilir .

Göreviniz G, yeterli tamsayı büyüklüğü ve yeterli zaman verilen , deterministik olarak değerini ortaya çıkaran bir program / işlev yazmaktır .

Referanslar

Liderler Sıralaması



7
Rastgele izin verilir mi? Eğer sadece rastgele değerler çıkarsam, sonunda Graham'ın sayısının üretilmesi gerekir.
mil,

15
@miles Neden dünyada zaten standart bir boşluk değil? Aydınlatılmış.
Sızdıran Rahibe

18
Uyarı: u (3, 3, 2) = u (3, 2, 3) = 7625597484987, bu nedenle, aldığınızdan emin olmak için u (3, 5, 1) = 243 gibi diğer değerleri de test etmek isteyeceksiniz. argüman sırası hakkı.
Anders Kaseorg

Yanıtlar:


48

İkili lambda hesabı , 114 bit = 14.25 bayt

HexDump:

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

İkili:

010001000101011101000010101100000010110110001000000111111001110101110100000011100101111011010000001110011100111010

açıklama

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)))

Bu (λ olan X . (Λ y . X -Ym . Mgr . Λ n . , N g 1) (λ n . Λ f . X ( n- m )) x ) y ) (λ f . Λ z . f ( x f z )) 3, burada tüm sayılar Kilise sayıları olarak gösterilir. Church rakamları doğal sayılar standart lambda taşı temsilidir ve kilise sayısı fonksiyonu yineleme ile tanımlanır çünkü de, bu sorunu için uygundur: n g olan N fonksiyonu yineleme inci g .

Örneğin, eğer g λ n ise . λ f . 3 ( n f ) 'yi bir Kilise rakamıyla çarpar, ardından λ n . n, g 1, bir Church rakamı gücüne 3 alır fonksiyonudur. Bu işlemi m kez tekrarlayarak verir

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

(Üslümü yerine üs ( u) (-, -, 1) yerine u (-, -, 0) çarpımını kullanırız , çünkü 1'i bir Kilise sayısından çıkarmak tatsızdır .)

Yedek n = 3:

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

Bu işlemi 64 m tekrarlamak, m = 4 ile başlamak,

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

Bu ifadeyi optimize etmek için, 64 = 4 ^ 3 = 3 4 yerine:

3 4 (λ m . Mgr . Λ n . , N g 1) (λ n . Λ f . 3 ( n- f )) 3) 4 = G .

Unutma 4 = succ 3 = λ f . λ z . lambda argümanı olarak f (3 f z ):

y . 3 ym . mgr . λ n . , n g 1) (λ n . λ f . 3 ( n- f )) 3) y ) (λ f . λ z . f (3 f z )) = G .

Son olarak, 3 = λ f değerini unutmayın . λ z . lambda argümanı olarak f ( f ( f z )):

X . (λ y . X -Ym . mgr . λ n . , n g 1) (λ n . λ f . x ( n- m )) x ) y ) (λ f . λ z . f ( x f z ))) 3 = G .


Bir kişi bu dil için nerede tercüman bulabilir?
Dennis

4
@Dennis tromp.github.io/cl/cl.html bunlardan bir kaçına sahiptir.
Anders Kaseorg

1
Bu harika . Bu oldukça büyük bir ödül hak ediyor
kedi

1
14.25 byteslider panosunu karıştırıyor gibi görünüyor. Olarak ayrıştırılır 25 bytesve bu nedenle ikinci olarak yerleştirilir.
Dan

1
@ Lider panosu pasajını düzelttim sanırım.
Anders Kaseorg

40

Haskell, 41 bayt

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

Açıklama:

(`i`1)f n= ile başlayan fonksiyonun yinelemesini i f 1 nhesaplar . Özellikle, = 3 ^ n ve bu yapıyı yineleyen m süreleri = u (3, n , m ) verir. Biz bu yeniden yazabilirsiniz = u (3, n , m ), ve tekrarlayın bu inşaat k olsun kat = gr _ k .nf1(`i`1)(*3)ni(`i`1)(*3)m n(($n).i(`i`1)(*3))mi(($3).i(`i`1)(*3))4 k


16

Haskell, 43 bayt

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

gSatır içi çevirmenin daha iyi bir yolu vardır .

46 bayt:

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

48 bayt:

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

Sadece tanımları yazıyorum.

Temel durumlar 0 baytlık bir miktar temizleyicidir, ancak byte tasarrufu yapmazlar. Belki alternatif bir tanım yazmayı kolaylaştıracaktır.

n%0=3*n
0%m=1
n%m=(n-1)%m%(m-1)
z=iterate(3%)2!!1

Aradaki +parantezleri kaldırmak için önceliğinden düşük olan başka bir işlev kullanabilir misiniz m-1?
Leaky Nun

44 bayt sayıyorum ve 4 ve 64'e ne oldu?
Sızdıran Rahibe

Hata! Daha küçük parametre testime kopyaladım. Operatör önceliğini değiştirebileceğimi sanmıyorum, çünkü yeni bir işlev tanımlıyorum ve bunlar varsayılan önceliğe sahip. Mevcut bir fonksiyonun üzerine yazamıyorum.
xnor

Yani, onu 64'e değiştirdikten sonra 44 bayt sayıyorum.
Leaky Nun

Bence demek (`g`3)istemedin (3`g`).
Anders Kaseorg

10

Pyth, 25 bayt

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

İlk bölüm M?H.UgbtH*G]3^3Gbir yöntemi tanımlar g(G,H) = u(3,G,H+1).

İlk bölümü test etmek için kontrol 7625597484987=u(3,3,2)=g(3,1): g3 1.

İkinci kısım , son değerin çıktısını alarak ( kafa karışıklığını önlemek yerine seçilir) 64 kez ug3tG64 4başlar r0 = 4ve sonra hesaplanır .rn = u(3,3,r(n-1)) = g(3,r(n-1))rg

Bu bölümü test etmek için, başlamak r0=2hesaplamak sonra ve r1: ug3tG1 2.


Eğer g (G, H) = u (3, G, H + 1) ise, r (n) = u (3, 3, r (n - 1)) = g (3, r (n - 1) olmalıdır. ) - 1), g (3, r (n - 1)) değil. Kodunuzun doğru olduğunu düşünüyorum ancak açıklamanız eksik - 1
Anders Kaseorg

Sen unoffsetted u argümanları (kullanarak bir bayt kaydedebilirsiniz ^3*3, tGG) ve başka byte .UgbtH*G]3e.ugNtHG1.
Anders Kaseorg

Bu ikinci byte'ı kaydetmenin alternatif bir yolu *G]3ShG.
Anders Kaseorg

8

Sesos , 30 bayt

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

Demonte

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

Veya Brainfuck notasyonunda:

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

Test yapmak

Hesaplamak u (3, n , u (3, n , ... u (3, n , m ) ...)) ile k iç içe çağrılar u , ilk üç yerine addtalimatları add 4, add 64, add 3ile add m, add k, add nsırasıyla. Sesos, sayıları doğrusal zamandan daha hızlı oluşturamayacağından, pratik olarak u (3, 2, 2) = 27, u (3, 5, 1) = 243 ve u (3, 1 ) gibi küçük değerlerle sınırlandırılırsınız. , u (3, 1,… u (3, 1, m )…)) = 3.


EOF olduğundan beri [-]ile değiştirebilirsiniz . ,0
mbomb007

6

JavaScript (ES7), 63 bayt

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)

@AndersKaseorg Ugh, bu durumda ben de bu değişikliği geri alabilirim.
Neil

Bu yığın taşmasına neden olur, geri alım kalıbınızı tekrar kontrol etmeniz gerekebilir.
NodeNodeNode Düğüm

Bu basit ES7 değil. Bu sınırsız ES7'dir (ES7'nin hayali bir varyantıdır ancak bignum ile, sonsuz bir şekilde kehanet edebiliyor ve / # xE ^ ile ondalık işareti kullanıyor).
user75200

5

Brachylog , 57 bayt

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

Girdi veya Çıktı beklemez ve sonucu yazar STDOUT. Bu, bir noktada yığın taşması üretecektir.

Küçük değerleri (örn için bu eserler çalışmadığını kontrol etmek için u(3,3,2)) Eğer yerine 4değeriyle mve 64birlikte 1.

açıklama

Bu temelde, sayının hesaplanmasında açıklanan yolun basit bir uygulamasıdır.

  • Ana tahmin:

    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
    
  • Tahmin 1:

    :3{...}.                   Call predicate 2 with input [Input, 3]. Its output is the 
                               output of predicate 1.
    
  • Tahmin 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)
    

5

Karamel , 38 bayt

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

Bu, 64 (λ m . Mf . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4 numaralı lambda hesabı için sözdizimsel şeker olup , burada tüm sayılar Kilise olarak temsil edilir. rakamları .


(n f->3 (n f))okumamalı n-1mı?
Sızdıran Rahibe

@LeakyNun No. (n f->3 (n f)), Kilise numaralarında üçe çarpma işlevidir .
Anders Kaseorg,

2
Bu zorluk lambda matematiğinde aşırı derecede basit görünüyor. Neden?
kedi

3

Prolog (SWIPL), 129/137 bayt

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).

Graham'ın sayısının çıktısını almak için sorguyu g(64,G).(bu sorgunun 8 baytı sayılacaksa, uzunluk 137 bayttır):

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

Beklenildiği gibi, bu yığın biter.

Ölçek

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

Geri izleme, yığının bitmesine neden olur:

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

Ungolfed

Ungolfed sürümü, sadece 3 için değil, genel yukarı ok gösterimini de ekler ve geri izleme ve tanımsız durumları önlemek için kesimler ve kontroller kullanır.

% 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).

64Kodunuzun herhangi bir yerinde numarayı olmadan bunu nasıl başardınız ?
Sızdıran Rahibe

@LeakyNun Ben açıklığa kavuşturmak için düzenlendi; daha iyi?
SQB

Öyleyse, bayt sayımın yanı sıra koduna da ekle.
Leaky Nun

3

C, 161 bayt

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: sekmeleri ve yeni satırları kaldırarak 11 bayt kurtardı. EDIT: thx auhmann başka bir bayt kurtardı ve programımı düzeltti


1
Hiç kullanılmadığından çıkartabilirsiniz g(int a){if(a==1)return u(3,4);return g(a-1);}... Yoksa bir şeyi mi unutacaksınız?
Auhmaan

@auhmaan ayıp, bu numarayı test etmek için kullandım ve tekrar değiştirmeyi unuttum. Teşekkürler!!
thepiercingarrow 29:16

Sizin return g(a-1)olmalıdır return u(3,g(a-1)).
Anders Kaseorg,

1
Uygun bir cevap vermeli miyim yoksa bu konuda yorumda mı bulunmalıyım bilmiyorum ama bu çözümü çok kolay bir şekilde gerçekleştirerek 114 bayta indirebilirsin: Fonksiyonlar arasındaki yeni satırlar atlanabilir. Tüm bağımsız değişkenler için türlerin çıkarılması, varsayılan olarak int (varsayılan K ve R) komutlarıdır. Bu gibi ifadeler iç içe üçlü harekat ile yazılabilir. Kod: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 vay şaşırtıcı! kendi cevabınızı XD göndermelisiniz.
thepiercingarrow

2

Mathematica, 59 bayt

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

±ISO 8859-1'de kodlandığında sadece 1 bayt gerektiren tanımsız bir ek işleci kullanır . Daha fazla bilgi için @ Martin yayınına bakın . Mathematica işlevleri, iki temel durumun ayrı ayrı tanımlanabilmesi için argümanları için kalıp eşleşmesini destekler.


1
Mathematica ne zamandan beri ISO 8859-1 kullanıyor?
Sızdıran Rahibe

n_ ±m_:=Nest[#±(m-1)&,3,n]
Sızdıran Rahibe

2

C, 114 109 bayt

@Thepiercingarrow ( link ) tarafından verilen cevaba göre yanıtı biraz aşağıya düşürdüm. Tasarrufların çoğu, K & R tarzı işlevler yaparken varsayılan argümanların yanlış yazılmasından ve if ifadelerinin üçlü operatörlerle değiştirilmesinden kaynaklanmaktadır. Okunabilirlik işlevleri arasında isteğe bağlı yeni satırlar eklendi.

@LeakyNun sayesinde 109'a geliştirildi.

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));}

g(a){return u(3,a<2?4:g(a-1));}
Leaky Nun

@LeakyNun Bu gerçekten iyi bir tane. Teşekkürler.
algmyr

1

Python, 85 bayt

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)

vFonksiyon bulunan aynı işlevi tanımlar Dennis'in cevap : v(n,m) = u(3,n+1,m+1). gFonksiyon geleneksel yineleme bir sıfır endeksli versiyonudur: g(0) = v(2,3), g(n) = v(2,g(n-1)). Böylece, g(63)Graham'ın numarası. Fonksiyon nparametresinin varsayılan değerini ayarlayarak, istenen çıkış çağrılarak elde edilebilir.g63g() (parametre olmadan) , bu sayede girdi almayan bir fonksiyon gönderimi için gereksinimlerimizi karşılayabiliriz.

Çevrimiçi v(2,1) = u(3,3,2)ve v(4,0) = u(3,5,1)test durumlarını doğrulayın : Python 2 , Python 3


1
Doğrulaması biraz zor, ama fonksiyonun gkapalı görünüyor. Olmamalı v(2,n-1)olmak g(n-1)ya da benzer bir şey mi?
Dennis

@Dennis İyi yakalamak. Bunu düzelteceğim.
Mego

Aslında aralarındaki denge uve volması gerektiği anlamına gelir g(n-1)-1.
Anders Kaseorg,

@AndersKaseorg Uykulu iken programlama yapmamalıyım. Bunu birkaç günde bir tekrar öğrenmeliyim.
Mego

@AndersKaseorg Gelecekte, önerdiğiniz bir iyileştirme / hata düzeltmesinde bir hata düzeltilse bile, lütfen diğer kişilerin gönderimlerini düzenlemeyin.
Mego

1

Dyalog APL, 41 bayt

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

Test durumu:

      3u 2
7625597484987

Sadece dönüştürmek 1=⍺:3⋄1=⍵:3*⍺gerekir 1=⍵:3*⍺( 3=3*1)
Zacharý


0

J, 107 bayt

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

uBir gündeme dönüştürmek için çalışıyorum ama şimdilik işe yarayacak.


Gibi bir şey u=:3^[`[:(3$:])/[#<:@]@.*@](test edilmemiş)
Leaky Nun

0

F #, 111 108 bayt

Düzenle

Bu Graham'ın numarasını hesaplamak için aşağıdaki işlevi kullanıyor.

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

İşte önceki cevabım, ki, yapmadım:

Oldukça basit. uFonksiyonun sadece bir tanımı .

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)

Kullanımı:

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

A değeri 3 olarak kabul edersem, bunu 60'a kesebilirim:

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

Kullanımı:

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

Buradaki zorluk Graham'ın numarasını yazmak değil u. Elbette u, 3'te belirlenen ilk argümanı olan veya olmayan gibi, ihtiyacınız olan herhangi bir ara işlevi
ekleyebilirsiniz

@AndersKaseorg bunu düzenledi. Teşekkürler. Önceki yorumum kayboldu gibi görünüyor.
asibahi

0

R, 154 142 128 126 118 bayt

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)

Bu özyinelemeli fonksiyonun Vikipedi tanımını kullandım, çünkü bazı garip nedenlerden ötürü işe yaramadı ... ya da sadece R golf oynamayı emerim.

UPD: Leaky Nun'dan bir bahşiş sayesinde 12 + 14 = 26 bayt tıraş edildi . Önceki sürüm hantal ve daha az verimli kullandı

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: “if (x == 0)” yerine “if (x)” ile zekice yapılan bir değişiklik nedeniyle 2 + 6 + 2 bayt daha (yine Leaky Nun’a kudos ) traş oldu . işlev ... doğru mu?


@LeakyNun Teşekkürler, cevap ile onay güncellendi.
Andreï Kostyrka,

Sadece bir saniye ... Bugün kod golf oynamak için ilk günüm, öğrenecek çok şey var!
Andreï Kostyrka,

Grubuna davet edilir Bizim sohbet .
Sızdıran Rahibe,

Daha fazla golf, lütfen gelişmeleri görün.
Andreï Kostyrka,

Ta-dam, bitti, uaynı anahtardaki işlevi değiştirdi gve 6 bayt daha kurtardı - harika!
Andreï Kostyrka

0

PHP, 114 bayt

Satır sonlarını yoksay; onlar sadece okunabilirlik içindir.

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);

İkinci durumu ilki ile bütünleştirmek mümkündür: for n=1, 3^neşittir 3.
Bu, varolan tüm cevapları - görebildiğim kadarıyla - bir kaç bayt kurtaracak; iki bayt kaydedildi

önceki sürüm, 62 + 43 + 11 = 116 bayt

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

PHP’nin üçlünün sol ilişkilendirmesi parantez veya özel bir test sırası gerektiriyor.
Bu parantez içindeki ifadede iki bayt kurtardı.


Orada tekrarlayıcı bir yöntem, muhtemelen olabilecek başka golf izin ...
ama şimdi bunun için zaman ayırın veremeyiz.


Keşke Sesos'u bilseydim, ya da şimdi öğrenecek ve çevirecek zamanım olsaydı
Titus

@ Leaky Nun: Sadece döngülere ve eklere ayırdım. Sesos'ta bir hücrenin değerini diğerine eklemenin bir yolu var mı?
Titus,

@AndersKaseorg: Muhtemelen haklısın ... Gözlerime bu algoritmaya bakarken kabarcıklarım var. Yakında tekrar bakacağız.
Titus,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.