Về mặt lý thuyết đầu ra số Graham


44

Số của Graham Gđược định nghĩa theo cách này:

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)

Bạn được cho rằng u(3,3,2)=7625597484987để kiểm tra mã của bạn.

Nhiệm vụ của bạn là viết một chương trình / hàm sẽ xuất giá trị Gxác định, cho đủ kích thước nguyên và đủ thời gian.

Người giới thiệu

Bảng xếp hạng



7
Là ngẫu nhiên được phép? Nếu tôi chỉ xuất các giá trị ngẫu nhiên, cuối cùng số của Graham phải được tạo ra.
dặm

15
@miles Tại sao trên trái đất nó không phải là một lỗ hổng tiêu chuẩn? Làm rõ.
Nữ tu bị rò rỉ

18
Cảnh báo: u (3, 3, 2) = u (3, 2, 3) = 7625597484987, vì vậy bạn cũng sẽ muốn kiểm tra các giá trị khác như u (3, 5, 1) = 243 để đảm bảo bạn đã nhận được thứ tự đúng.
Anders Kaseorg

Câu trả lời:


48

Phép tính lambda nhị phân , 114 bit = 14,25 byte

Hexdump:

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

Nhị phân:

010001000101011101000010101100000010110110001000000111111001110101110100000011100101111011010000001110011100111010

Giải trình

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

Đây là (λ x . (Λ y . X ym . Mg . Λ n . N g 1) (λ n . Λ f . X ( n f )) x ) y ) (λ f . z . f ( x f z ))) 3, trong đó tất cả các số được biểu diễn dưới dạng số Church. Các số của Giáo hội là đại diện tính toán lambda tiêu chuẩn của các số tự nhiên và chúng rất phù hợp với vấn đề này bởi vì một số Giáo hội được xác định bởi phép lặp hàm: n g là lần lặp thứ n của hàm g .

Ví dụ: nếu g là hàm λ n . λ f . 3 ( n f ) nhân 3 với một số của Giáo hội, sau đó λ n . n g 1 là hàm lấy 3 số lũy thừa của số Giáo hội. Lặp lại thao tác này m lần cho

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

(Chúng tôi sử dụng phép nhân u (-, -, 0) thay vì lũy thừa u (-, -, 1) làm trường hợp cơ sở, vì trừ 1 từ một số của Giáo hội là khó chịu .)

Thay thế n = 3:

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

Lặp lại thao tác đó 64 lần, bắt đầu từ m = 4, cho

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

Để tối ưu hóa biểu thức này, thay thế 64 = 4 ^ 3 = 3 4:

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

Nhớ 4 = succ 3 = f . λ z . f (3 f z ) là đối số lambda:

y . 3 y ( m . Mg . λ n . N g 1) (λ n . λ f . 3 ( n f )) 3) y ) (λ f . λ z . F (3 f z )) = G .

Cuối cùng, hãy nhớ 3 = λ f . λ z . f ( f ( f z )) dưới dạng đối số lambda:

x . ( y . X y ( m . Mg . λ n . N g 1) (λ n . λ f . X ( n f )) x ) y ) (λ f . λ z . f ( x f z ))) 3 = G .


Nơi nào người ta có thể tìm thấy một thông dịch viên cho ngôn ngữ này?
Dennis

4
@Dennis tromp.github.io/cl/cl.html có một vài trong số họ.
Anders Kaseorg

1
Điều này thật tuyệt vời . đây xứng đáng là một tiền thưởng đáng kể
con mèo

1
14.25 bytesdường như đang làm rối tung bảng xếp hạng. Nó được phân tích cú pháp như 25 bytes, và do đó bạn được đặt là thứ hai.
Dan

1
@ Tôi có thể sửa đoạn trích ban lãnh đạo, tôi nghĩ vậy.
Anders Kaseorg

40

Haskell, 41 byte

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

Giải trình:

(`i`1)f n= i f 1 ntính toán nlần lặp thứ nhất của hàm fbắt đầu từ 1. Cụ thể, (`i`1)(*3)n= 3 ^ n và lặp lại công trình này m lần cho i(`i`1)(*3)m n= u (3, n , m ). Chúng ta có thể viết lại rằng as (($n).i(`i`1)(*3))m= u (3, n , m ) và lặp lại công trình này k lần để có được i(($3).i(`i`1)(*3))4 k= g _ k .


16

Haskell, 43 byte

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

Có một cách tốt hơn để lật gnội tuyến.

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

Chỉ cần viết ra các định nghĩa.

Các trường hợp cơ bản là sạch hơn một chút được sao lưu lên 0, mặc dù nó không tiết kiệm byte. Có lẽ nó sẽ làm cho nó dễ dàng hơn để viết một định nghĩa thay thế.

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

Bạn có thể sử dụng một chức năng khác có mức độ ưu tiên thấp hơn +để loại bỏ dấu ngoặc giữa m-1không?
Nữ tu bị rò rỉ

Tôi đếm 44 byte, và điều gì đã xảy ra với 4 và 64?
Leaky Nun

Rất tiếc, tôi đã sao chép trong bài kiểm tra tham số nhỏ hơn của mình. Tôi không nghĩ rằng tôi có thể thay đổi quyền ưu tiên của toán tử vì tôi đang xác định hàm mới và các hàm này có quyền ưu tiên mặc định. Tôi không thể ghi đè một chức năng hiện có.
xnor

Ý tôi là, tôi đếm 44 byte sau khi bạn đổi nó thành 64.
Leaky Nun

Tôi nghĩ bạn có nghĩa là (`g`3)không (3`g`).
Anders Kaseorg

10

Bình thường, 25 byte

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

Phần đầu tiên M?H.UgbtH*G]3^3Gđịnh nghĩa một phương thức g(G,H) = u(3,G,H+1).

Để kiểm tra phần đầu tiên, hãy kiểm tra xem 7625597484987=u(3,3,2)=g(3,1): g3 1.

Phần thứ hai ug3tG64 4bắt đầu từ r0 = 4và sau đó tính toán rn = u(3,3,r(n-1)) = g(3,r(n-1))64 lần, xuất ra giá trị cuối cùng ( rđược chọn thay vì gđể tránh nhầm lẫn).

Để kiểm tra phần này, bắt đầu từ r0=2và sau đó tính toán r1: ug3tG1 2.


Nếu g (G, H) = u (3, G, H + 1), bạn nên có r (n) = u (3, 3, r (n - 1)) = g (3, r (n - 1 ) - 1), không phải g (3, r (n - 1)). Tôi nghĩ rằng mã của bạn là đúng nhưng lời giải thích của bạn bị thiếu - 1.
Anders Kaseorg

Bạn có thể tiết kiệm một byte bằng cách sử dụng lập luận u unoffsetted ( ^3*3, tGG), và một byte với .UgbtH*G]3e.ugNtHG1.
Anders Kaseorg

Một cách khác để tiết kiệm mà byte thứ hai là *G]3ShG.
Anders Kaseorg

8

Vừng , 30 byte

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

Tháo rời

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

Hoặc trong ký hiệu Brainfuck:

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

Kiểm tra

Để tính u (3, n , u (3, n , ... u (3, n , m ) ...)) với k lồng cuộc gọi đến u , thay thế ba đầu tiên addhướng dẫn add 4, add 64, add 3với add m, add k, add n, tương ứng. Vì Sesos không thể tạo số nhanh hơn thời gian tuyến tính, nên thực tế bạn bị giới hạn ở các giá trị nhỏ như u (3, 2, 2) = 27, u (3, 5, 1) = 243 và u (3, 1 , u (3, 1, Giảm u (3, 1, m ) Rọ)) = 3.


Bạn có thể thay thế [-]bằng ,vì EOF là 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)

@AndersKaseorg Ugh, trong trường hợp đó tôi cũng có thể hoàn nguyên sự thay đổi đó.
Neil

Điều này gây ra lỗi tràn ngăn xếp, có thể cần kiểm tra lại mô hình reccursion của bạn.
NodeNodeNode

Đây không phải là ES7 đơn giản. Đây là ES7 không giới hạn (một biến thể tưởng tượng của ES7 nhưng với bignum, có thể xuất hiện vô hạn và đang sử dụng số thập phân với / # xE ^ làm tốc ký).
dùng75200

5

Brachylog , 57 byte

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

Yêu cầu không có Đầu vào cũng như Đầu ra và ghi kết quả vào STDOUT. Điều này sẽ tạo ra một tràn ngăn xếp tại một điểm.

Để kiểm tra xem điều này có hiệu quả đối với các giá trị nhỏ (ví dụ u(3,3,2)) bạn có thể thay thế 4bằng giá trị của m64bằng 1.

Giải trình

Về cơ bản, đây là một cách thực hiện đơn giản về cách tính toán số.

  • Vị ngữ chính:

    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
    
  • Vị ngữ 1:

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

Caramel , 38 byte

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

Đây là cú pháp đường cho sự biểu hiện phép tính lambda 64 (λ m . Mf . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4, nơi tất cả các số được biểu diễn như Giáo Hội chữ số .


(n f->3 (n f))nó không nên đọc n-1?
Rò rỉ Nun

@LeakyNun số (n f->3 (n f))là một hàm để nhân ba trong số của Giáo hội .
Anders Kaseorg

2
Thử thách này có vẻ quá đơn giản trong tính toán lambda. Tại sao?
con mèo

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

Để xuất số của Graham, truy vấn cho g(64,G).(nếu 8 byte của truy vấn này được tính, độ dài là 137 byte):

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

Nhưng như có thể dự đoán, điều này sẽ hết stack.

Kiểm tra

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

Quay lui khiến nó hết stack:

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

Ung dung

Phiên bản không được bổ sung thêm ký hiệu mũi tên lên chung, không chỉ cho 3, và sử dụng các vết cắt và kiểm tra để tránh quay lại và các tình huống không xác định.

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

Làm thế nào bạn quản lý để làm điều đó mà không có số 64ở bất cứ đâu trong mã của bạn?
Nữ tu rò rỉ

@LeakyNun Tôi chỉnh sửa để làm rõ; tốt hơn?
SQB

Chà, sau đó thêm nó vào mã cũng như số byte của bạn.
Rò rỉ 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: đã lưu 11 byte bằng cách xóa các tab và dòng mới. EDIT: thx auhmann đã lưu một byte khác và sửa chương trình của tôi


1
Bạn có thể xóa g(int a){if(a==1)return u(3,4);return g(a-1);}vì nó hoàn toàn không được sử dụng ... Hoặc bạn đang quên điều gì đó?
auhmaan

@auhmaan xin lỗi, tôi đã sử dụng số đó để kiểm tra và quên thay đổi lại. Cảm ơn!!
thepiercingarrow

Bạn return g(a-1)nên là return u(3,g(a-1)).
Anders Kaseorg

1
Tôi không biết mình nên trả lời đúng hay chỉ nhận xét về vấn đề này, nhưng bạn có thể đưa giải pháp này xuống còn 114 byte khá dễ dàng bằng cách nhận ra: Có thể bỏ qua các dòng mới giữa các chức năng. Bỏ các loại cho tất cả các argumens mặc định chúng thành int (nghĩ rằng K & R). Nếu những câu như thế này có thể được viết bằng ops ternary lồng nhau. Mã số: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

@ achmyr wow tuyệt vời! bạn nên đi đăng câu trả lời của riêng bạn XD.
thepiercingarrow

2

Toán học, 59 byte

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

Sử dụng toán tử infix không xác định ±, chỉ cần 1 byte khi được mã hóa theo ISO 8859-1. Xem bài viết của @ Martin để biết thêm. Các hàm Mathicala hỗ trợ khớp mẫu cho các đối số của chúng, sao cho hai trường hợp cơ sở có thể được định nghĩa riêng.


1
Mathicala sử dụng ISO 8859-1 từ khi nào?
Rò rỉ Nun

n_ ±m_:=Nest[#±(m-1)&,3,n]
Rò rỉ Nun

2

C, 114 109 byte

Dựa trên câu trả lời của @thepiercingarrow ( link ) Tôi đã đánh golf câu trả lời xuống khá nhiều. Hầu hết các khoản tiết kiệm là do lạm dụng kiểu gõ đối số mặc định khi thực hiện các hàm kiểu K & R và thay thế các câu lệnh if bằng toán tử ternary. Đã thêm các dòng mới tùy chọn giữa các chức năng để dễ đọc.

Cải thiện thành 109 nhờ @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));}

g(a){return u(3,a<2?4:g(a-1));}
Nữ tu bị rò rỉ

@LeakyNun Đó là một trong những thực sự tốt. Cảm ơn.
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)

Các vchức năng xác định các chức năng tương tự như một trong những tìm thấy trong câu trả lời của Dennis : v(n,m) = u(3,n+1,m+1). Các gchức năng là một phiên bản zero-lập chỉ mục của phiên truyền thống: g(0) = v(2,3), g(n) = v(2,g(n-1)). Vì vậy, g(63)là số của Graham. Bằng cách đặt giá trị mặc định của ntham số của ghàm thành 63, có thể thu được đầu ra cần thiết bằng cách gọi g()(không có tham số), do đó đáp ứng các yêu cầu của chúng tôi để gửi hàm không có đầu vào.

Xác minh v(2,1) = u(3,3,2)v(4,0) = u(3,5,1)kiểm tra các trường hợp trực tuyến: Python 2 , Python 3


1
Thật khó để xác minh, nhưng chức năng của bạn gdường như tắt. Không nên v(2,n-1)được g(n-1)hoặc cái gì đó tương tự?
Dennis

@Dennis Bắt tốt. Tôi sẽ sửa nó.
Mego

Trên thực tế, sự bù trừ giữa uvcó nghĩa là nó phải được g(n-1)-1.
Anders Kaseorg

@AndersKaseorg Tôi không nên lập trình trong khi buồn ngủ. Tôi phải học lại điều này cứ sau vài ngày.
Mego

@AndersKaseorg Trong tương lai, vui lòng không chỉnh sửa nội dung gửi của người khác, ngay cả khi đó là để sửa lỗi trong một cải tiến / sửa lỗi mà bạn đề xuất.
Mego

1

APL Dyalog, 41 byte

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

Trường hợp thử nghiệm:

      3u 2
7625597484987

Bạn sẽ có thể chuyển đổi 1=⍺:3⋄1=⍵:3*⍺thành chỉ 1=⍵:3*⍺( 3=3*1)
Zacharý

1

Ruby, 64 byte

Mượn từ thuật toán lý thuyết để tính số của 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

Đơn giản chỉ cần đặt, f a = u(3,3,a)và nó áp dụng 64 lần này.


Một lời giải thích tốt về lý do tại sao và làm thế nào mã này hoạt động sẽ tốt đẹp.
Manish Kundu

Đây là một ứng dụng đơn giản cho định nghĩa về số của Graham.
Nghệ thuật đơn giản là đẹp

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

Tôi đang làm việc uđể chuyển đổi thành một chương trình nghị sự, nhưng bây giờ nó sẽ làm.


Một cái gì đó giống như u=:3^[`[:(3$:])/[#<:@]@.*@](không được thử nghiệm)
Leaky Nun

0

F #, 111 108 byte

Biên tập

Đây là sử dụng chức năng dưới đây để tính toán số của 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

Đây là câu trả lời trước đây của tôi, tốt, không:

Khá đơn giản. Chỉ là một định nghĩa của uchức năng.

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)

Sử dụng:

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

Nếu tôi giả sử 3 là giá trị cho a, tôi có thể cắt nó xuống 60:

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

Sử dụng:

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

Thách thức là viết số của Graham chứ không phải u. Tất nhiên, bạn có thể bao gồm bất kỳ chức năng trung gian nào bạn cần, chẳng hạn như ucó hoặc không có đối số đầu tiên được cố định ở 3.
Anders Kaseorg

@AndersKaseorg chỉnh sửa nó trong. Cảm ơn. Nhận xét trước đây của tôi dường như đã biến mất.
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)

Tôi đã sử dụng định nghĩa Wikipedia về chức năng đệ quy này bởi vì một số lý do kỳ lạ, đề xuất này không hoạt động ... hoặc tôi chỉ mải mê chơi golf.

CẬP NHẬT: loại bỏ 12 + 14 = 26 byte nhờ một mẹo từ Leaky Nun . Phiên bản trước sử dụng cồng kềnh và kém hiệu quả

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

CẬP NHẬT: đã loại bỏ 2 + 6 + 2 byte nữa (một lần nữa, kudos thành Leaky Nun ) nhờ vào sự thay thế khéo léo với tên if (x), thay vì một chữ if (x == 0) vì vì x <0 không bao giờ được đưa vào chức năng ... phải không?


@LeakyNun Cảm ơn bạn, đã cập nhật câu trả lời với sự thừa nhận.
Andreï Kostyrka

Chỉ một giây thôi ... Hôm nay là ngày đầu tiên chơi golf của tôi, có rất nhiều điều để học!
Andreï Kostyrka

Bạn được mời tham gia trò chuyện của chúng tôi .
Rò rỉ Nun

Chơi golf nhiều hơn, xin vui lòng xem sự cải thiện.
Andreï Kostyrka

Ta-dam, đã hoàn thành, đã thay đổi chức năng utrong cùng khóa với khóa của bạn gvà lưu thêm 6 byte byte tuyệt vời!
Andreï Kostyrka

0

PHP, 114 byte

bỏ qua các ngắt dòng; chúng chỉ dành cho khả năng đọc.

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

Có thể tích hợp trường hợp thứ hai vào trường hợp thứ nhất: for n=1, 3^nbằng 3.
Điều này sẽ tiết kiệm một vài byte trên - theo như tôi có thể thấy - tất cả các câu trả lời hiện có; đã lưu hai byte trên của tôi

phiên bản trước, 62 + 43 + 11 = 116 byte

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

Các dữ liệu PHP bên trái sự kết hợp của chim nhạn yêu cầu dấu ngoặc đơn ... hoặc một thứ tự kiểm tra cụ thể.
Điều này đã lưu hai byte trên biểu thức ngoặc đơn.


Có lẽ có một cách tiếp cận lặp đi lặp lại, có thể cho phép chơi gôn thêm ...
nhưng tôi có thể dành thời gian cho nó ngay bây giờ.


ước gì tôi biết Sesos hoặc có thời gian để học nó và dịch ngay bây giờ
Titus

@Leaky Nun: Tôi đã chia nó thành các vòng lặp và bổ sung. Có cách nào trong Sesos để thêm giá trị của một ô này vào ô khác không?
Tít

@AndersKaseorg: Bạn có thể đúng ... Tôi bị nổi mụn nước khi nhìn vào thuật toán đó. Sẽ nhìn lại nó sớm thôi.
Tít
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.