Phiên dịch viên tự phiên dịch


25

Dựa trên một nhận xét của George Edison cho câu hỏi này , hãy viết trình thông dịch tự phiên dịch nhỏ nhất.

  • Bạn có thể sử dụng ngôn ngữ của sự lựa chọn của bạn.
  • Ngôn ngữ trống không được tính. Chương trình của bạn phải dài ít nhất hai ký tự.
  • Chương trình không cần phải giải thích toàn bộ ngôn ngữ, chỉ cần một tập hợp con Turing - đầy đủ các tính năng ngôn ngữ (có chứa trình thông dịch).
  • Quines không được tính.
  • Không sử dụng evalchức năng tích hợp hoặc ngôn ngữ của bạn . Tương tự như vậy apply, vv

1
(Hmm .. Tôi nên làm gì đó với /usr/bin/cat) còn Turing-đầy đủ thì sao?
Ming-Tang

@ SHiNKiROU: Cảm ơn, tôi đã không nghĩ đó là một thử nghiệm. Cập nhật.
Hoa Long Tâm

Liên quan: Ngôn ngữ w / trình thông dịch nhỏ nhất được viết bằng chính trên Stack Overflow, mặc dù có rất ít câu trả lời (chỉ một?) Thực sự tuân thủ các quy tắc được đưa ra ở đây.
dmckee

1
Chúng ta có phải viết lại trình phân tích cú pháp sexp Scheme đó không, hoặc chúng ta có thể xem xét ngôn ngữ máy chủ không?
JB

@JB: Các tiện ích xử lý chuỗi của ngôn ngữ đều ổn, bao gồm sexptrình phân tích cú pháp.
Hoa Long Tâm

Câu trả lời:


19

CI - 260

,(1p0(2d())(41(2d())('#((1p0()(10()(1d,1p$)=)<)$2d,1p$)(40(1d,1c$^)(''(1d,^)('0
'9('0-(,'0'9('0-2p10*+1p$)(!1d)~)$^)(0($)'$(^)'^(&)'&(c)'c(p)'p(d)'d(=)'=(<)'<(
>)'>(~)'~(.)'.(,)',(!)'!(+)'+(-)'-(*)'*(/)'/(%)'%()38p(1p3p0(3d)((2)(3)=p1d1p$)
=)$)~)=)=,2p$&)=)=)<)$$

320 → 260: Đẩy ánh xạ ký tự đơn giản sang hướng dẫn, sau đó gập chúng lại. Điều này giảm một nửa kích thước mã cho mỗi trường hợp (có 18 trường hợp), nhưng chi phí 30 ký tự để thực hiện việc gấp.

Đây là một trong những ngôn ngữ được xây dựng của tôi, (trình thông dịch cơ sở được lưu trữ trên Gist ). Điều độc đáo ở đây là ngôn ngữ thống nhất các đoạn mã. Đó là, các chuỗi hướng dẫn trong ngôn ngữ dựa trên ngăn xếp này được sử dụng cho cùng hiệu ứng với cấu trúc dữ liệu hoặc các bao đóng trong các ngôn ngữ khác:

1^      # Push a 1, and "lift" it to be a code literal.
(5 +)   # Define a code literal.
&       # Join the two code literals, forming (1 5 +)
$       # Execute the code literal.

Trình thông dịch xây dựng một đoạn mã của toàn bộ chương trình trước khi chạy nó, vì vậy nó cũng có thể được coi là một trình biên dịch. Bởi vì điều này, việc xếp chồng trình thông dịch không dẫn đến chi phí thời gian chạy theo cấp số nhân.

Trình thông dịch xuất phát tất cả các toán tử của nó trực tiếp từ trình thông dịch chủ. Tuy nhiên, nó tự phân tích cú pháp, do đó, phần lớn mã chỉ là các chuỗi dịch các ký tự thành các ký tự mã tương ứng của chúng. Điều này không giống như sử dụng eval, nhưng nó cho thấy mức độ phụ thuộc của bất kỳ triển khai ngôn ngữ lập trình nào vào ngữ nghĩa của ngôn ngữ / kiến ​​trúc máy chủ của nó.


Ngôn ngữ tham khảo:

Nhận thông dịch viên ở đây

Khối

  • ( ... )

    Tạo một "khối", đây thực sự là một danh sách các hướng dẫn không có ngữ cảnh. Trong nội bộ, nó thậm chí có thể là mã máy.

  • khối $

    Gọi một khối. Các callee được trao ngăn xếp toàn cầu, bao gồm các khối được gọi.

  • giá trị ^

    Nâng một giá trị. Cụ thể, biến nó thành một khối đẩy giá trị đó.

    Ví dụ :

       1 ^
    == (1)
    
  • khối1 khối2 &

    Tham gia hai khối, tạo thành một khối chạy cả hai theo thứ tự.

    Ví dụ :

       (1) (2) &
    == (1 2)
    

Thao tác ngăn xếp

  • n c

    Sao chép giá trị thứ n của ngăn xếp.

    Ví dụ :

       5 4 3 2 1 0 3c
    == 5 4 3 2 1 0 3
    
  • n p

    Nhổ giá trị thứ n của ngăn xếp (loại bỏ nó và đưa nó ra phía trước).

    Ví dụ :

       5 4 3 2 1 0 3p
    == 5 4 2 1 0 3
    
  • n d

    Thả n giá trị từ ngăn xếp. 0dlà một không-op.

    Ví dụ :

       5 4 3 2 1 0 3d
    == 5 4 3
    

Toán tử quan hệ

  • ab (on_true) (on_false) =

    Kiểm tra nếu a bằng b. Sử dụng tất cả trừ đối số đầu tiên và gọi on_true hoặc on_false. Nếu một đối số bằng 0 và đối số kia là bất kỳ loại nào khác, kết quả sẽ là sai. Mặt khác, a và b phải là số nguyên.

    Ví dụ :

       3 3 ('0+ .) (1d) =
    == 3 '0+ .
    
  • ab (on_true) (on_false) <

    Kiểm tra nếu a nhỏ hơn b. a và b phải là số nguyên.

    Ví dụ :

       3 5 (1d 5) () <
    == 3 1d 5
    == 5
    
  • ab (on_true) (on_false) >

    Kiểm tra nếu a lớn hơn b. a và b phải là số nguyên.

    Ví dụ :

       3 5 (1d 5) () >
    == 3
    
  • một lo hi (on_true) (on_false) ~

    Kiểm tra nếu lo <= a <= hi. a, lo và hi phải là số nguyên.

    Ví dụ :

       3 0 10 ('0+ .) (1d) ~
    == 3 '0+ .
    

Tôi / O

  • c .

    Đặt ký tự c (tiêu thụ nó từ ngăn xếp).

  • ,

    Nhận một nhân vật và đẩy nó vào ngăn xếp. Nếu đã kết thúc tập tin, -1 được đẩy.

  • c !

    Unget một nhân vật. Giống như ungetc trong C, chỉ được phép đẩy lùi một lần.

Chữ nguyên

  • 'c

    Đẩy nhân vật c.

  • [0-9] +

    Đẩy một số nguyên thập phân.

Số học

  • ab +
  • ab -
  • ab *

    Cộng / trừ / nhân hai số.

    Ví dụ :

       3 5 + 7 3 + *
    == 80
    
  • ab /

  • ab %

    Phân chia và mô đun. Không giống như trong C, các vòng này hướng tới vô cực âm.

Linh tinh

  • #nhận xét

    Các #nhân vật bình luận tất cả mọi thứ đến cuối dòng.

  • )

    Được sử dụng để kết thúc khối. Có thể được sử dụng để kết thúc toàn bộ chương trình, quá.

  • Tất cả các nhân vật khác được bỏ qua.


24

Tính toán Lambda nhị phân, 232 bit (29 byte)

0101000110100000000101011000000000011110000101111110011110000101110011110000001111000010110110111001111100001111100001011110100111010010110011100001101100001011111000011111000011100110111101111100111101110110000110010001101000011010

Xem http://en.wikipedia.org/wiki/Binary_lambda_calculus#Lambda_encoding để biết chi tiết


2
Tại sao đây không phải là câu trả lời được chấp nhận D: BLC thật tuyệt vời!
con mèo

Bạn có thể giải thích nó không?
PyRulez

1
Thật không may, Wikipedia đã xóa trang Tính toán nhị phân Lambda. Trang tromp.github.io/cl/cl.html của tôi liên kết đến một bản sao được bảo quản và đến một bài báo mà tôi đã viết giải thích hoạt động của trình thông dịch.
John Tromp

13

Tôi không thể lấy tín dụng cho cái này , nhưng tôi nghĩ tôi sẽ chia sẻ cái tuyệt vời này:

Brainf *** (423)

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

10

BlockScript - 535

{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

BlockScript là một ngôn ngữ dựa trên ngăn xếp spaghetti tầm thường mà tôi đã tạo riêng cho thử thách này. Trình thông dịch cơ sở là blockscript.c .

Chương trình mẫu (in 15 số Fibonacci đầu tiên):

{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;

Trình thông dịch đọc cả mã nguồn và đầu vào chương trình từ đầu vào tiêu chuẩn, theo thứ tự đó. Điều này có nghĩa là để chạy trình thông dịch trong trình thông dịch trong trình thông dịch, chỉ cần sao chép và dán:

# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;

# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;

Giống như bộ phim Inception , bạn gần như không thể đi sâu hơn ba cấp độ. Đó không phải là vấn đề thời gian, mà là không gian. BlockScript rò rỉ bộ nhớ rất nhiều và điều này liên quan đến cách ngôn ngữ được thiết kế.


Ngôn ngữ tham khảo:

Nhận thông dịch viên ở đây

Trong BlockScript, "ngăn xếp" không phải là một mảng được ghi đè bởi các hoạt động tiếp theo như bạn có thể được sử dụng. Nó thực sự được thực hiện như một danh sách liên kết bất biến, và một ngăn xếp vẫn tồn tại trong suốt thời gian của chương trình. Ngoài ra, không có toán tử (ngoại trừ @) loại bỏ các giá trị khỏi ngăn xếp. Tuy nhiên, sửa đổi ngăn xếp chỉ ảnh hưởng đến khối mà chúng xảy ra.

Lựa chọn giá trị

  • a xuyên qua z

    Lấy mục 0-25 từ ngăn xếp và đẩy nó vào ngăn xếp. ađề cập đến đầu, hoặc vật phẩm được đẩy gần đây nhất của ngăn xếp.

  • A xuyên qua Z

    Lấy mục 0-25 của khung hiện tại và đẩy nó vào ngăn xếp.

  • [

    Mở "khung" để chọn các mục từ tham chiếu ngăn xếp (xem bên dưới) trên đầu ngăn xếp. [không yêu cầu khớp ], nhưng các khung có phạm vi từ vựng. Trong BlockScript, "scope" được xác định bởi dấu ngoặc ( {... }) tạo thành khối. Do đó, việc mở một khung bên trong một khối sẽ không ảnh hưởng đến mã bên ngoài khối.

  • ]

    Đóng khung hiện tại, trở về khung trước đó (nếu có).

Khối

  • { ... }

    Tạo một "khối" và đẩy nó vào ngăn xếp. Bên trong một khối, ngăn xếp sẽ bắt đầu ở vị trí trước khối, ngoại trừ ngăn xếp của người gọi sẽ được đẩy lên trên. Các ngăn xếp là liên tục và bất biến trong BlockScript, vì vậy các khối là các bao đóng. Thành ngữ {[có nghĩa là mở một khối, sau đó mở một khung để bắt đầu chọn đối số (sử dụng Athông qua Z). Giá trị trả về của một khối là phần đầu của ngăn xếp khi }đạt được.

    Thí dụ:

    '3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
    

    Bản in này 123BCD123DCB123BCD123DCB…. Các chữ cái viết thường đề cập đến các giá trị ngăn xếp, trong khi các chữ cái viết hoa đề cập đến các đối số (vì khung được đặt thành ngăn xếp của người gọi). A!lấy đầu của người gọi (được đảm bảo là khối được gọi) và gọi nó. Nếu bạn đang tự hỏi tại sao nó lại đảo ngược BCDmọi lúc, thì đó là vì B. C. D.đẩy các đối số đó theo thứ tự ngược lại ngay trước khi khối tự gọi.

  • !

    Gọi một khối. Đẩy giá trị trả về ngăn xếp.

Tài liệu tham khảo ngăn xếp

  • &

    Tạo một tham chiếu ngăn xếp và đẩy nó vào ngăn xếp. Hãy nghĩ về điều này như là "siêu khuyết điểm", vì nó thực sự lấy mọi vật phẩm trên ngăn xếp và tạo thành một "tuple" từ nó. Các thành ngữ &[có nghĩa rằng bất cứ a, b, cgọi trước khi bây giờ có thể được truy cập với A, B, C(đối với phần còn lại của khối hoặc cho đến khi ]bắt gặp).

    Một phần vì &thu được nhiều giá trị hơn mức cần thiết, BlockScript rò rỉ bộ nhớ theo thiết kế.

  • @

    Chuyển sang ngăn xếp được trỏ đến bởi tham chiếu ngăn xếp a. Toán tử này khá kỳ lạ, nhưng trình tự thông dịch BlockScript sử dụng nó một vài lần để tránh phải đẩy các đối số tương tự hai lần. Các ảnh hưởng của @(hoặc bất kỳ hoạt động ngăn xếp nào, đối với vấn đề đó) được giới hạn trong khối mà nó được gọi. Ngoài ra, khung không bị ảnh hưởng bởi @vì vậy khung có thể được sử dụng để lấy các giá trị bạn cần sau khi chuyển ngăn xếp.

Biểu thức điều kiện

  • ? <trên đúng> : <trên sai>

    Biểu thức điều kiện, giống như toán tử ternary trong C. Nghĩa là, nếu alà "true" (nghĩa là không bằng số nguyên 0), thì hãy làm <on true> , nếu không thì làm <on false> .

Tôi / O

Lưu ý: Đầu vào và đầu ra được thực hiện trong UTF-8. "Ký tự" là một số nguyên tương ứng với chỉ mục Unicode.

  • ,

    Lấy ký tự tiếp theo của đầu vào và đẩy nó vào ngăn xếp. Nếu kết thúc đầu vào đạt được, thay vào đó hãy ấn -1.

  • .

    Xuất ký tự trên đầu ngăn xếp.

Số nguyên / ký tự

Lưu ý: Số nguyên và ký tự là cùng một thứ trong BlockScript.

  • 'c

    Đẩy nhân vật c.

  • [0-9] +

    Đẩy một số nguyên thập phân.

Số học

Các toán tử này chỉ hoạt động trên các giá trị số nguyên.

  • +Tính b+ a(đẩy kết quả, nhưng không loại bỏ một trong hai giá trị).
  • -Tính toán b- a.
  • *Tính b* a.
  • /Tính b/ a(chia số nguyên; làm tròn về vô cực âm).
  • %Tính b% a(mô đun nguyên; làm tròn về vô cực âm).

Toán tử quan hệ

Các toán tử này chỉ hoạt động trên các giá trị số nguyên.

  • <Nếu bnhỏ hơn a, đẩy 1, khác đẩy 0.
  • >
  • =

Linh tinh

  • # Nhận xét đến cuối dòng
  • Chương trình phải kết thúc bằng ;
  • Tất cả các nhân vật khác được bỏ qua.

2
Chúa Kitô Muốn chia sẻ thông số kỹ thuật như bạn đã làm cho CI?
Casey

@Casey: Đã thêm một tài liệu tham khảo.
Joey Adams

1
Bạn có muốn biết rằng bạn đang mơ không? ... Ở cấp 4.
Mateen Ulhaq

3

ZISotez LISP : 414

nguồn cấp dữ liệu được thêm vào để có được một khối đẹp là không cần thiết và không được tính.

((\(E V A L)(E(r)'(())))(\(x e)(?(s x)(V x e)((\(b j)(?(= b ")(a j)(?(= b \)x
(?(= b ?)(?(E(a j)e)(E(a(d j))e)(E(a(d(d j)))e))(?(s b)(A b(E(a j)e)(E(a(d j)
)e))(E(a(d(d b)))(L(a(d b))j e)))))))(E(a x)e)(d x))))(\(x g)(? g(?(= x(a(a
g)))(d(a g))(V x(d g)))x))(\(f h v)(?(= f r)(r)(?(= f p)(p h)(?(= f s)(s h)(?
(= f a)(a h)(?(= f d)(d h)(?(= f =)(= h v)(c h v))))))))(\(k v i)(? k(L(d k)(
d v)(c(c(a k)(E(a v)i))i))i)))

Về lý thuyết, nó có thể tự chạy, nhưng vì trình thông dịch gốc là tệp nhị phân BrainFuck và bản thân nó là trình thông dịch nên tôi chỉ có thể kiểm tra từng phần. Khi được cho chính nó và một biểu thức đơn giản, (p p)tôi nghĩ rằng nó cần nhiều thời gian hơn 40 phút tôi đã chờ đợi cho đến nay và tôi đang sử dụng tốc độ nhanh của mình jitbfđể chạy nó (mis) sử dụng Perl Inline-C để chạy mã C một cách nhanh chóng .

Không thể thực hiện toàn bộ Zozotez trong Zozotez vì nó không có phương tiện để thay đổi khuyết điểm và :(setq / định nghĩa) cần điều đó để cập nhật các ràng buộc. Tôi cũng không triển khai đối số rõ ràng bắt đầu / tiên lượng hoặc & nghỉ ngơi, macro và đối số in đặc biệt vì tôi không sử dụng nó trong trình thông dịch. Tôi đã bao gồm p(in) mặc dù tôi không sử dụng nó vì vậy các chương trình cần in rõ ràng các tính toán của họ giống như trình thông dịch gốc.

Cùng vô dụng:

;; A stand alone Zozotez script need to be
;; contained in one expression, here with
;; all functions provided as arguments to
;; get them bound in the dynamic environment
((\ (E V A L)
  (E(r)'(())))
 ;; E (EVAL)
 (\ (x e)
   (? (s x)
      (V x e)
      ((\ (b j)
         (? (= b ") (a j)
         (? (= b \) x
         (? (= b ?) (? (E(a j)e) (E(a(d j))e) (E(a(d(d j)))e))
         (? (s b)
            (A b (E(a j)e) (E (a(d j))e))
            (E (a(d(d b))) (L(a(d b))j e)))))))
       (E (a x) e)(d x))))
 ;; V (VALUE / symbol->value)
 (\ (x g)
   (? g
      (? (= x (a (a g)))
         (d (a g))
         (V x (d g)))
      x))
 ;; A (APPLY) but just for primitives
 (\ (f h v)
   (? (= f r) (r)
   (? (= f p) (p h)
   (? (= f s) (s h)
   (? (= f a) (a h)
   (? (= f d) (d h)
   (? (= f =)
      (= h v)
      (c h v))))))))
 ;; L ( joint evLis / extend-env)
 (\ (k v i)
   (? k
      (L (d k) 
         (d v)
     (c (c (a k) 
           (E (a v) i)) 
        i))
      i)))

0

CHIQRSX9 + (có thể không cạnh tranh), 2 byte

+I

Không có cách nào để viết trình thông dịch tự phiên dịch bằng ngôn ngữ dựa trên HQ9 + này mà không sử dụng I, nó chạy trình thông dịch tích hợp xử lý STDIN.


1
Không ở đâu trong các quy tắc nó nói rằng các trình thông dịch tự tích hợp không được phép. Nó nói cho eval, đó là cho biểu thức, không phải chương trình.
Erik the Outgolfer

Làm thế nào để một số nguyên tố tính toán trong ngôn ngữ này?
pppery

@ppperry Xđược cho là làm cho ngôn ngữ Turing- Complete (do đó có thể tính các số nguyên tố) theo cách phụ thuộc vào việc thực hiện.
dorukayhan muốn Monica trở lại vào

Theo trang Esolang, Xlệnh của trình thông dịch Perl ngẫu nhiên gây nhiễu chương trình và thực thi nó, nghĩa là người ta không thể sử dụng hơn lệnh để tính các số nguyên tố xác định. Bạn có thể cho tôi một trình thông dịch mẫu cho phép bạn sử dụng Xtheo cách bạn đã chỉ định không?
pppery

@ppperry Rõ ràng trình thông dịch viết bằng Perl là trình thông dịch duy nhất, nên không. Ngoài ra, nếu có một chương trình tính các số nguyên tố khi "ngẫu nhiên hóa" với một giá trị cụ thể thì sao?
dorukayhan muốn Monica trở lại vào

0

Hệ thống tập tin đồng thời Befunge 98 - 53 \ 18 byte (gần như chắc chắn là gian lận)

Trình thông dịch đầy đủ 53 byte không có hạn chế (mặc dù tôi chưa thử nghiệm các tương tác thời gian phức tạp liên quan đến việc tách và gói IP):

v ;;;;;;;;
>]390'ai@
 t;;;;;;;;
;>zzzzz#;

Đọc đầu vào từ một tệp có tên avà thực thi nó. Nó không được quy định trong các quy tắc mà chúng ta không thể sử dụng mã tự sửa đổi.

Trình thông dịch 18 byte không cho phép gói (IP di chuyển một cạnh của mã và bắt đầu ở cạnh đối diện):

]210'ai@
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.