Viết chương trình bằng ngôn ngữ yêu thích của bạn bằng ngôn ngữ khác [đã đóng]


168

Lập trình viên thực sự quyết tâm có thể viết các chương trình Fortran bằng bất kỳ ngôn ngữ nào.

từ các lập trình viên thực sự Đừng sử dụng Pascal

Nhiệm vụ của bạn là viết chương trình bằng ngôn ngữ lập trình bạn chọn, nhưng bạn chỉ được phép sử dụng ngôn ngữ khác. Đó là, vứt bỏ tất cả các quy ước mã hóa từ một ngôn ngữ và thay thế chúng bằng các quy ước mã hóa từ ngôn ngữ khác. Càng nhiều càng tốt. Làm cho chương trình của bạn trông như thể nó được viết bằng ngôn ngữ khác.

Ví dụ: người hâm mộ Python ghét Java có thể viết chương trình Python theo Java:

void my_function()                                                             {
    int i = 9                                                                  ;
    while(i>0)                                                                 {
        System.out.println("Hello!")                                           ;
        i = i - 1                                                              ;}}

Người đam mê Pascal buộc phải sử dụng C có thể viết điều này:

#define begin {
#define end }
#define then
#define writeln(str) puts(str)

if (i == 10) then
begin
    writeln("I hate C");
end

Bạn phải viết chương trình hoàn chỉnh. Chương trình không phải làm bất cứ điều gì hữu ích.

Chúc may mắn. Đây là một cuộc thi phổ biến vì vậy mã có nhiều phiếu nhất sẽ chiến thắng!


1
@ m.buettner tạo tập tin của bạn với phần mở rộng .litcoffee. Nó sẽ giúp.
Ismael Miguel

Một chút dài (và trước đó bằng văn bản; và không khép kín) cho một câu trả lời, nhưng: quét Postscript trong Postscript trong C .
luser droog 21/03 '

51
Tôi không nghĩ rằng bạn (hoặc phần lớn các câu trả lời) hiểu điểm của trích dẫn. Không phải là một Lập trình viên thực sự viết mã trông giống như Fortran mặc dù anh ta viết bằng Pascal hoặc LISP: anh ta áp dụng cách suy nghĩ của Fortran ngay cả khi viết bằng Pascal hoặc LISP; ví dụ: " Như tất cả các lập trình viên thực sự biết, cấu trúc dữ liệu hữu ích duy nhất là Mảng. " Câu trả lời tuyệt vời sẽ là mã thủ tục trong Prolog, mã chức năng trong C, mã hướng đối tượng trong Pascal.
Peter Taylor

1
Tôi hy vọng ai đó sẽ thực hiện một phương ngữ Lisp, tốt, bất cứ điều gì ngoại trừ một phương ngữ Lisp khác ...
itjeyd 21/03

6
@itsjeyd Quy tắc lập trình thứ mười của Greensasta : "Bất kỳ chương trình C hoặc Fortran nào đủ phức tạp đều chứa một chương trình đặc biệt, được chỉ định không chính thức, có lỗi, triển khai chậm một nửa CommonLisp."
Joshua Taylor

Câu trả lời:


142

C trong C ++

#include <stdio.h>

int main(int argc, char** argv)
{
        printf("Hello world!\n");
        return 0;
}

60
Tôi thấy những gì bạn đã làm ở đó;)
el.pescado

27
Chà, đó là một mánh khóe rẻ tiền, coi C ++ là 'tương thích ngược' với C.
Agi Hammerthief

5
@AlexM. Tôi nghĩ rằng sẽ có nhiều hơn trong tinh thần của câu hỏi nếu đây là một ví dụ (thủ tục) dài hơn sẽ có lợi rõ ràng từ việc sử dụng một số lớp và sử dụng các thành ngữ C khác trong đó một số tính tốt của STL sẽ hợp lý hơn nhiều (nói char*thay vì std::string).
Martin Ender

47
Hợp lệ trong C, C ++, Objective-C Objective-C ++! Thật là một câu trả lời tuyệt vời polyglot.
nneonneo

7
@BenJackson Psh, lập trình viên C thực sự sử dụng char *argv[]!
Thomas

122

lắp ráp x86 trong GNU C

Không, tôi không chỉ sử dụng asmtừ khóa, vì câu hỏi được đặt ra là dành cho các lập trình viên thực sự ... điều này sẽ chạy tốt trên ARM.

(Chỉ để chứng minh vấn đề, tôi hoàn toàn không "viết" hội thảo - đó là đầu ra do GCC Clang (503.0,38) tạo ra cho mã nhận xét ở đầu, được dịch một cách mù quáng thành macro.)

Điều này chỉ hoạt động trong chế độ 32 bit. Điều đó tốt vì các lập trình viên thực sự mã theo kích thước từ nào.

#include <stdio.h>
#include <stdint.h>
/*
int fac(int x) {
    if (x < 1) return 1; else return x * fac(x - 1);
}

int fib(int x) {
    if (x < 2) return x; else return fib(x - 1) + fib(x - 2);
}

int main(void) {
    int a = fib(10), b = fac(10);
    printf("%d %d\n", a, b);
    return 0;
}
*/

typedef union REG {
    intptr_t i; int _i; void * v; union REG * r;
} REG;

#define LPAREN (
#define RPAREN )
#define MACRO(N) ); N##_MACRO LPAREN

#define push MACRO(PUSH)
#define pop  MACRO(POP)
#define mov  MACRO(MOV)
#define sub  MACRO(SUB)
#define add  MACRO(ADD)
#define imul MACRO(IMUL)
#define cmp  MACRO(CMP)
#define jge  MACRO(JGE)
#define jmp  MACRO(JMP)
#define call MACRO(CALL)
#define ret  MACRO(RET) _
#define label MACRO(LABEL)

#define NO_OP(X) 

#define PUSH_MACRO(VAL) *(esp -= 4) = (REG)(VAL)
#define POP_MACRO(DST) (DST) = (typeof(DST))(esp->i); esp += 4
#define MOV_MACRO(VAL, DST) (DST) = (typeof(DST))((REG)VAL).i;
#define SUB_MACRO(VAL, DST) CMP_MACRO(VAL, DST); \
    (DST) = (typeof(DST))(((REG)DST).i - ((REG)VAL).i)
#define ADD_MACRO(VAL, DST) DST = (typeof(DST))(((REG)DST).i + ((REG)VAL).i); \
    ZF = ((REG)DST).i == 0; OF = 0; SF = ((REG)DST).i < 0
#define IMUL_MACRO(VAL, DST) DST = (typeof(DST))(((REG)DST).i * ((REG)VAL).i); \
    ZF = ((REG)DST).i == 0; OF = 0; SF = ((REG)DST).i < 0
#define CMP_MACRO(L, R) CMP_MACRO_(((REG)L).i, ((REG)R).i)
#define CMP_MACRO_(L, R) (OF = 0, ZF = L == R, SF = (R - L) < 0)
#define JGE_MACRO(TGT) if (SF == OF) { goto TGT; } else {}
#define JMP_MACRO(TGT) goto TGT;
#define CALL_MACRO(PROC) CALL_MACRO_(PROC, __COUNTER__)
#define CALL_MACRO_(PROC, CTR) PUSH_MACRO(CTR - STARTIP); \
    goto PROC; case CTR - STARTIP:
#define RET_MACRO(_) eip = esp->i; esp += 4; if (eip) { continue; } else { goto *finalreturn; }
#define LABEL_MACRO(NAME) NAME

#define MY_ASM(X) do { const int STARTIP = __COUNTER__; \
    switch(eip) { case 0: MY_ASM_1 X } } while (1);
#define MY_ASM_1(X) MY_ASM_2(NO_OP LPAREN 0 X RPAREN;)
#define MY_ASM_2(X) X

#define CAT(L, R) _CAT(L, R)
#define _CAT(L, R) L##R

#define callASM(F) callASM_(F, CAT(_TMP_, __COUNTER__))
#define callASM_(F, LABEL) (({ PUSH_MACRO(0); stackbase = esp; finalreturn = &&LABEL; \
    goto F; LABEL:; }), (intptr_t)eax)


const int STACKSIZE = 4096;
REG callstack[STACKSIZE], * stackbase;
REG * eax, * ecx, * edx, * ebx, * esi, * edi, * esp, * ebp;
int SF, ZF, OF, eip; void * finalreturn;

int main(void) {
    eax = ecx = edx = ebx = esi = edi = esp = ebp = &callstack[STACKSIZE - 1];
    eip = 0;
    finalreturn = &&TOP; TOP:

    PUSH_MACRO(10);
    int a = callASM(_fac);
    PUSH_MACRO(10);
    int b = callASM(_fib);

    printf("%d %d\n", a, b);
    return 0;


    MY_ASM((
    label _fac:                                   // @fac
        push ebp
        mov esp, ebp
        sub 24, esp
        mov 8[ebp], eax
        mov eax, (-8)[ebp]
        cmp 1, (-8)[ebp]
        jge LBB0_2
        mov 1, (-4)[ebp]
        jmp LBB0_3
    label LBB0_2:
        mov (-8)[ebp], eax
        mov (-8)[ebp], ecx
        sub 1, ecx
        mov ecx, *esp
        mov eax, (-12)[ebp]         // 4-byte Spill
        call _fac
        mov (-12)[ebp], ecx         // 4-byte Reload
        imul eax, ecx
        mov ecx, (-4)[ebp]
    label LBB0_3:
        mov (-4)[ebp], eax
        add 24, esp
        pop ebp
        ret

    label _fib:                                   // @fib
        push ebp
        mov esp, ebp
        sub 24, esp
        mov 8[ebp], eax
        mov eax, (-8)[ebp]
        cmp 2, (-8)[ebp]
        jge LBB1_2
        mov (-8)[ebp], eax
        mov eax, (-4)[ebp]
        jmp LBB1_3
    label LBB1_2:
        mov (-8)[ebp], eax
        sub 1, eax
        mov eax, *esp
        call _fib
        mov (-8)[ebp], ecx
        sub 2, ecx
        mov ecx, *esp
        mov eax, (-12)[ebp]         // 4-byte Spill
        call _fib
        mov (-12)[ebp], ecx         // 4-byte Reload
        add eax, ecx
        mov ecx, (-4)[ebp]
    label LBB1_3:
        mov (-4)[ebp], eax
        add 24, esp
        pop ebp
        ret
    ))
}

Chỉ cần nhìn vào tất cả các diễn viên. Casts có nghĩa là tôi là một lập trình viên thực sự hơn trình biên dịch, phải không?


8
+1, đó là ... xoắn. ;) Tôi thực sự thích cách bạn xử lý call, đặc biệt.
Ilmari Karonen

2
Ồ Đó là một công việc tuyệt vời.
Jack Aidley

Tôi đã có một trình biên dịch cho C64 hoạt động như thế này. Nó đã thêm các từ khóa BASIC cho tất cả các hướng dẫn 6510 và tôi nhớ bạn đã bao bọc for pass=1:3...nextnó. Thực hiện nó trong trình thông dịch BASIC đã lắp ráp nó.
Ben Jackson

5
Đây là thơ thuần túy.
Nicu Stiurca

1
Đây là người đàn ông khó khăn, trình biên dịch chắc chắn là ngạc nhiên.
Teh internets được làm bằng catz

102

Tiếng anh trong tiếng anh

#include <stdio.h>
#define This
#define program     int main() {
#define aims
#define to
#define output      printf(
#define some
#define example
#define text(a)     #a
#define the
#define screen      "\n");
#define it          
#define also
#define will
#define calculate   ;int a = 
#define result
#define of
#define and
#define print       ; printf("%d\n", a);
#define seriously   return 0; }

This program aims to output some example text (Hello) to the screen;
it also will calculate the result of 3 + 4 and print the result; seriously

Bất kỳ ý tưởng để loại bỏ ;?


18
Nghiêm túc đấy các bạn.
Kyle Strand

2
Tại sao định nghĩa thehai lần?
Joshua Taylor

16
an toàn tốt hơn xin lỗi ;-)
urzeit

20
Bây giờ làm cho nó một haiku.
Nicu Stiurca

1
Bạn có thể#define . ;
mbomb007

74

Brainfuck trong JavaScript

Javascript là một ngôn ngữ khó! Chúng ta hãy sử dụng Brainfuck, một ngôn ngữ dễ hiểu hơn: o)

eval(

//write your easy code below

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

//end of easy code

.replace(/\]/g,'}')
.replace(/\[/g,'while(a[i]){')
.replace(/\+/g,'a[i]++;')
.replace(/-/g,'a[i]--;')
.replace(/>/g,'i++;')
.replace(/</g,'i--;')
.replace(/\./g,'o+=String.fromCharCode(a[i]);')
.replace(/,/g,'a[i]=u.charCodeAt(j++);')
.replace(/^/,'var a=new Array(1000).join(\'0\').split(\'\'),i=500,o=\'\',u=prompt(\'Enter input if needed\'),j=0;')
.replace(/$/,'alert(o)')
)

Tôi đoán tôi đã viết một trình thông dịch brainfuck trong javascript.

Ví dụ trên chỉ đơn giản là ouputs Hello World!và bỏ qua đầu vào (không có ,ký hiệu).
Nhưng điều đó làm việc với đầu vào quá! Ví dụ: thử ,+>,+>,+>,+<<<.>.>.>.và gõ golfvào hộp thoại. Nó sẽ đưa ra các ký tự tiếp theo trong bảng ASCII:hpmg

EDIT : Giải thích ngắn cho những người không biết brainfuck.
Tưởng tượng một mảng vô hạn các số nguyên được akhởi tạo về 0 ở mọi nơi, một con trỏ trên một phần tử của mảng này ivà đầu vào của người dùng u.
Brainfuck thực sự dễ học nhưng khó viết:

  • + gia tăng giá trị hiện tại: a[i]++
  • - giảm nó: a[i]--
  • > làm cho con trỏ trỏ phần tử tiếp theo: i++
  • < trước đó : i--
  • []xác định một vòng lặp phá vỡ khi giá trị hiện tại bằng không:while (a[i]) { ... }
  • . in phần tử hiện tại: String.fromCharCode(a[i])
  • , đặt phần tử hiện tại với đầu vào của người dùng: u.charCodeAt(...)

22
+1 cho sự hài hước khi nói rằng brainfuck dễ hiểu hơn JavaScript.
Agi Hammerthief

Bạn có chắc chắn rằng các ký tự Brainfuck bên trong các replacecâu lệnh không ảnh hưởng đến chương trình không?
Fraxtil

3
@fra Tệp này không phải là chương trình brainfuck, đây là chương trình javascript chứa chương trình brainfuck được chuyển đổi thành javascript khi chạy.
undergroundmonorail

3
Chà, --inhanh hơn i--? Có vẻ sai từ nhiều năm: jsperf.com/decrementgolf .
Michael M.

4
Đây không chỉ là sự đệ trình rất sáng tạo cho cuộc thi, mà còn giải thích cú pháp brainfuck rất rõ ràng. +10 nếu tôi có thể!
SebastianH

74

Tôi nghĩ rằng Lennart Augowersson đã hai lần giành được điều này.

Đầu tiên, đây là một ví dụ về việc triển khai BASIC "hack cuối tuần" của anh ấy dưới dạng DSL đơn nguyên Haskell, từ năm 2009:

import BASIC

main = runBASIC' $ do

    10 LET I =: 1
    20 LET S =: 0
    30 LET S =: S + 1/I
    40 LET I =: I + 1
    50 IF I <> 100000000 THEN 30
    60 PRINT "Almost infinity is"
    70 PRINT S
    80 END

Nó hoạt động bằng cách quá tải loại số. Các số dòng thực sự là các hàm chấp nhận đối số. Phần còn lại của dòng là đối số cho hàm. Hàm trả về một đại diện của Cây Cú pháp Trừu tượng cho trình thông dịch BASIC đi làm.

Tôi cũng khuyên bạn nên xem bài dự thi của Augowersson trong Cuộc thi Obfuscated C quốc tế năm 2006, trong đó anh ấy đã cố gắng kiếm được 4k:

  • Một trình thông dịch mã byte, được viết trong một tập hợp con của C (mà ông gọi là Obfuscated C).
  • Một trình biên dịch Obfuscated C -> bytecode , được viết bằng mã byte.

Họ có thể chia sẻ cùng một tệp vì mã phụ được đặt bên trong các bình luận C.

Đã vài năm kể từ khi tôi theo dõi công việc của Augowersson, vì vậy có thể có những điều tuyệt vời khác mà anh ấy nghĩ ra kể từ đó ....


2
Đó là Augowersson, không phải Augowerssen.
Hans Lundmark

@HansLundmark Cảm ơn. Đã sửa nó.
Pitarou

71

PHP và Javascript

Đây là một đa âm:

Bạn có thể chạy mã này bằng cả hai ngôn ngữ:

if("\0"=='\0')
{
    function printf(){
        $b=Array();
        $a=$b['slice']['call'](arguments);
        $a=$a['join']('');
        console.log($a);
        return $a.length;
    };

    function strtoupper($s){return $s['toUpperCase']();}

    function count($a){return $a['length'];}
}

printf('this is cool!');

$c=Array('a','b','c','d');

for($i=0,$l=count($c);$i<$l;++$i)printf("\n",strtoupper($c[$i]));

Mẹo ở đây là Javascript sử dụng các chuỗi thoát trong chuỗi bắt đầu bằng '".
Mặt khác, PHP chỉ sử dụng các chuỗi thoát trong các chuỗi bắt đầu bằng "<<<.

Sau đó, chúng tôi khai báo hàm printf, tương tự printnhưng xuất ra một chuỗi được tạo thành trong PHP.

PHP yêu cầu các vars bắt đầu bằng $, trong khi Javascript chỉ đơn giản là cho phép.


Không ai sử dụng Array(…)trong JS và rõ ràng là array(…)trong PHP. […]sẽ tốt hơn nhiều;)!
Hố đen

12
Tôi không quan tâm nếu mọi người sử dụng Array()trong JS hay không: Tôi quan tâm rằng tôi có một polyglot TRUE . Tôi đang tạo ra một trong những tội ác tồi tệ nhất với mã này nhưng tất cả những gì tôi muốn là nó chạy và thực hiện chính xác cùng một thứ trong cả hai, nhưng trông giống như JS và PHP cùng một lúc.
Ismael Miguel

Và btw, [...]không hợp lệ trong PHP <5.4.0, điều này rất tệ ....... Nếu tôi ném cái này vào PHP 4, 5 hoặc Javascript, tôi hy vọng nó hoạt động, thay vì đưa ra lỗi cú pháp ở mọi nơi.
Ismael Miguel

2
Nếu bạn muốn mã của mình trông giống như JS, bạn phải sử dụng […], có vẻ như là tiêu chuẩn khá trong PHP và do đó, nó phù hợp với mục tiêu của bạn. Và nhân tiện, PHP <5,4? Đã đến lúc cập nhật, anh chàng
Blackhole

8
Khả năng tương thích quan trọng hơn "ngoại hình". Và Arraylà tên ĐÚNG của hàm tạo của đối tượng Array. Về cơ bản, sử dụng []là giống như Array(). Tôi không thấy bất cứ điều gì xấu với nó. Nhưng tôi có một câu hỏi đơn giản: Công trình? (btw, tôi phải sử dụng php 5.3.28 tại nơi làm việc.)
Ismael Miguel

55

Brainfuck trong JS

[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[
!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[
+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(
![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!
![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+
[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]
]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[
]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!!
[]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[
+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!
![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+
[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[
[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!!
[]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]
+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+
[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]
]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[
+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[
+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[]
)[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]
]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+
[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])()

12
Tôi không thấy bất kỳ bộ não nào ở đây. Thậm chí không có một char nào trong><,.-
Michael M.

8
@Michael: Ai nói đó không phải là một chương trình tạo ra một vòng lặp vô hạn?
Konrad Borowski

19
Đây có phải là JSF * ck không?

8
Làm thế nào trên trái đất nó làm điều đó ?
nandhp

4
Ôi. Ai đó cuối cùng đã làm điều này. Tôi đã dành một chút thời gian để cố gắng tìm ra cách viết một chương trình JS chỉ sử dụng các ký tự +! [] () Nhưng không bao giờ có thể tìm ra nó. Tôi cần phân tích điều này khi có thời gian ...
Matti Virkkunen

54

Đây là một trong những người chiến thắng IOCCC năm 2005 , một chương trình C, ngoại trừ bởi định nghĩa đó, trông giống như một chương trình java:

/*
 * Sun's Java is often touted as being "portable", even though my code won't
 * suddenly become uber-portable if it's in Java. Truth is, Java's one of
 * the most ugly, slow, and straitjacketed languages ever. It's popular
 * mainly because people hear the word "portable" and go "ewww".
 *
 * This program, then, is dedicated to bringing about the death of Java. We
 * good coders have been oppressed for too long by the lame language
 * decisions of pointy-haired bosses and academics who should know better. 
 * It's time we stand up against this junk, and bring back the fun in
 * programming! Viva La Revolution!
 */

#define aSet c
#define BufferedReader(x)1
#define byte Y[I][_^1]?do(:):_&1?do(.):do(`):8;++y;}
#define class int N=0,_,O=328,l=192,y=4,Y[80][64]={0},I;struct
#define do(c)a(#c "\b")
#define err c,c
#define getAllStrings(x));q()
#define if(x)b(#x)
#define IOException
#define line c
#define main(a)b(char*x){write(1,"\033[",2),null}main()
#define new
#define null a(x);}a(char*x){write(1,x,strlen(x));try;try;try;try;
#define out c,c
#define println(x)c
#define private int d(int
#define public short c;}c;typedef int BufferedReader;char*F="JF>:>FB;;BII";
#define return {return
#define static f(x){N=(N+x)%6,y--?f(0),f(1),f(4),f(1):++Y[(I=O+N[F]-66)
#define String
#define System c
#define this if(D):1,O=I,I/=16,l<_/32?if(B):l>_/32?if(A):2,l=_,_/=16,byte
#define throws
#define toArray(x)c
#define try for(;--c.c;)
#define void /16][(_=l+N[6+F]-66)/16]?O/=16,l/=32,O<I/16?if(C):O>I/16?this
#define while(k)if(2J),if(7;21H),f(0),f(4),f(4),if(H),/*

import java.io.*;
import java.util.*;

/**
 * A lame Java program.
 * @author  J. Random Worker
 */
class LameJavaApp
{

    /** The infamous Long-Winded Signature From Hell. */
    public static void main(String[] args)
        throws IOException
    {
        /* Don't get me started on this. */
        BufferedReader reader =
            new BufferedReader(new FileReader(args[0]));

        /* What, this long incantation just to print a string? */
        System.err.println("Hello world!");

        /* At least this is sane. */
        String line;
        while ((line = reader.readLine()) != null)
            System.out.println(line.length());
    }

    /**
     * Method with a needlessly long name.
     * @param   aSet        a set (!)
     */
    private String[] getAllStrings(Set<String> aSet)
    {
        /*
         * This dance is needed even in J2SE 5, which has type
         * templates. It was worse before that.
         */
        return aSet.toArray(new String[0]);
    }

}

3
Độ dài tốt nhất của nó.
qwr

39

C ++ trong C

OK, vậy bạn là lập trình viên C ++, nhưng bị buộc phải sử dụng C? Không có vấn đề gì, bạn chỉ cần viết một số tiêu đề bổ sung bị thiếu trong C. Ví dụ: đây là chương trình Hello World hợp lệ trong C:

Trong tệp tiêu đề bổ sung iostream, viết:

#include <stdio.h>

#define using volatile int
#define namespace message
#define std = 0
#define message(x) printf("%s\n",x)
#define cout 0
#define endl 0

Trong tập tin string, viết

#define string

Trong tệp helloworld.c(mã C thực tế của bạn), viết

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string message("Hello world");
  cout << message << endl;
  return 0;
}

Và khi biên dịch helloworld.cvới trình biên dịch C, hãy hướng dẫn trình biên dịch tìm kiếm <...>các tệp tiêu đề bất cứ nơi nào bạn lưu trữ các tệp iostreamstring, ví dụ, nếu bạn đang biên dịch bằng gcc và đặt các tệp iostreamstringtrong thư mục hiện tại, hãy biên dịch với

gcc helloworld.c -o helloworld -I.

Lưu ý: volatileTiêu đề trong iostreamcó ở đó để cho phép biên dịch không có cảnh báo ngay cả ở mức cảnh báo tối đa (đọc từ biến dễ bay hơi được coi là có hiệu lực).


3
Đây là một chút mã trolling, không phải nó.
Ông Lister

Chà, chương trình thực hiện chính xác những gì nó xuất hiện, phải không?
celtschk

8
Thật thú vị và ấn tượng hơn theo cách này so với C trong C ++.
Kyle Strand

Loại trình biên dịch nào cảnh báo nếu bạn không sử dụng volatileở đây và loại cảnh báo nào?
R. Martinho Fernandes

1
@KyleStrand Nhưng câu "C in C ++" phù hợp hơn với câu trích dẫn trong câu hỏi. Các lập trình viên thực sự lập trình trong C, ngay cả khi họ có trình biên dịch C ++.
Ông Lister

36

CQL - Ngôn ngữ truy vấn không chứa caffein

(hoặc "SQL trên Caffeine")

Điều này có thể đã hơi tham vọng quá mức. Đây là một nỗ lực để viết mã khai báo SQL (ish) trong CoffeeScript . Điều này đòi hỏi tính năng Proxy ECMAScript 6 . Bạn có thể kiểm tra nó trong nút với--harmony-proxies .

Hãy thiết lập một mẫu để xác định proxy. (Lấy từ nhận xét của Benvie về vấn đề này )

forward = (->
  _slice  = Array.prototype.slice
  _bind   = Function.prototype.bind
  _apply  = Function.prototype.apply
  _hasOwn = Object.prototype.hasOwnProperty

  Forwarder = (target) ->
    @target = target
    this

  Forwarder.prototype =
    getOwnPropertyNames: -> Object.getOwnPropertyNames(@target)
    keys: -> Object.keys(@target)
    enumerate: ->
      i = 0
      keys = []
      for value of @target
        keys[i++] = value
      keys
    getPropertyDescriptor: (key) ->
      o = @target;
      while o
        desc = Object.getOwnPropertyDescriptor o, key
        if desc
          desc.configurable = true;
          return desc;

        o = Object.getPrototypeOf o
    getOwnPropertyDescriptor: (key) ->
      desc = Object.getOwnPropertyDescriptor @target, key
      if desc
        desc.configurable = true
      desc
    defineProperty: (key, desc) -> Object.defineProperty @target, key, desc
    get: (receiver, key) -> @target[key]
    set: (receiver, key, value) ->
      @target[key] = value;
      true
    has: (key) -> key of @target
    hasOwn: (key) -> _hasOwn.call @target, key
    delete: (key) ->
      delete @target[key]
      true
    apply: (receiver, args) -> _apply.call @target, receiver, args
    construct: (args) -> new (_bind.apply @target, [null].concat args);

  forward = (target, overrides) ->
    handler = new Forwarder target;
    for k of Object overrides
      handler[k] = overrides[k]

    if typeof target is 'function'
      return Proxy.createFunction handler,
                                  -> handler.apply this, _slice.call arguments,
                                  -> handler.construct _slice.call arguments
    else
      return Proxy.create handler, Object.getPrototypeOf Object target

  forward
)();

Bây giờ hãy xác định một đối tượng proxy và một số biến và hàm toàn cầu đáng ngờ:

sql = forward {
  tables: {}

  finalize: ->
    if typeof @activeRows isnt 'function'
      @result = []
      for row in @activeRows
        @result.push (val for val, i in row when @activeTable.columns[i] in @activeColumns)
    delete @activeRows
    delete @activeColumns
    delete @activeTable

  run: (q) ->
    q.call(this)
    @finalize()
    result = @result
    delete @result
    if typeof result isnt 'function' then console.log result
    return result
}, {
  get: (o,name) ->
    if name of @target
      return @target[name];
    (args...) -> {
      name
      args
    }
}

int = Number
varchar = (l) -> String

TABLE = (x) -> x
INTO = (x) -> x
CREATE = (tableData) ->
  name = tableData.name
  table =
    columns: []
  column = tableData.args[0]
  table[column.name] = []
  table.columns.push(column.name)
  while column = column.args[1]
    table[column.name] = []
    table.columns.push(column.name)

  sql.tables[name] = table

  sql.result = "Created table '#{name}'"

INSERT = (table) -> sql.activeTable = sql.tables[table().name]
VALUES = (rows...) ->
  for row in rows
    for val, i in row
      column = sql.activeTable.columns[i]
      sql.activeTable[column].push val

  sql.result = "Inserted #{rows.length} rows"

FROM = (table) ->
  sql.activeTable = sql.tables[table().name]
SELECT = (columns...) ->
  sql.activeColumns = []
  for col in columns
    if typeof col is 'function'
      col = col()

    sql.activeColumns.push col.name

  sql.activeRows = []
  for val in sql.activeTable[sql.activeTable.columns[0]]
    sql.activeRows.push []

  for col in sql.activeTable.columns
    for val, i in sql.activeTable[col]
      sql.activeRows[i].push val

IN = (list) -> { op: 'in', list }
WHERE = (column) ->
  i = sql.activeTable.columns.indexOf(column.name)
  if column.args[0].op is 'in'
    list = column.args[0].list
    sql.activeRows = (row for row in sql.activeRows when row[i] in list)
  else
    console.log 'Not supported!'

ASC = 'asc'
DESC = 'desc'
BY = (x) -> x
ORDER = (column) ->
  i = sql.activeTable.columns.indexOf(column.name)
  order = if column.args[0] is sql.ASC then 1 else -1
  sql.activeRows.sort (a,b) ->
    if a[i] < b[i]
      return -order
    else if a[i] > b[i]
      return order
    else
      return 0

Vâng, đó là khá nhiều thiết lập! Nhưng bây giờ chúng ta có thể làm như sau (đầu vào / đầu ra theo kiểu bàn điều khiển):

> sql.run ->
    CREATE TABLE @books(
      @title varchar(255),
      @author varchar(255),
      @year int
    );

Create Table 'books'

> sql.run ->
    INSERT INTO @books
    VALUES ['The C++ Programming Language', 'Bjarne Stroustrup', 1985],
           ['Effective C++', 'Scott Meyers', 1992],
           ['Exceptional C++', 'Herb Sutter', 2000],
           ['Effective STL', 'Scott Meyers', 2001];

Inserted 4 rows

> sql.run ->
    SELECT @title, @year FROM @books
    WHERE @author IN ['Bjarne Stroustrup', 'Scott Meyers']
    ORDER BY @year DESC;

[ [ 'Effective STL', 2001 ],
  [ 'Effective C++', 1992 ],
  [ 'The C++ Programming Language', 1985 ] ]

Nó không phải là một polyglot thực tế, nhưng đó không thực sự là vấn đề. Tôi biết rằng nó @được sử dụng cho các biến trong SQL, nhưng tôi cần tất cả các tên @cho cột và tên bảng vì tôi chưa tìm được cách ủy quyền cho đối tượng toàn cầu (và tôi sẽ không ngạc nhiên nếu điều đó thực sự không thể - và cho Một lý do chính đáng).

Tôi cũng đã thay đổi một số dấu ngoặc đơn thành ngoặc (cụ thể là sau VALUESIN). Thật không may, những gì tôi không thể tìm ra là một cách để cho phép các điều kiện bình thường nhưyear > 2000 , bởi vì họ sẽ đánh giá một boolean ngay lập tức.

Tuy nhiên, điều này trông rất giống SQL và chắc chắn là khai báo nhiều hơn mệnh lệnh / chức năng / hướng đối tượng vì vậy nó phải đủ điều kiện độc đáo cho câu hỏi. Tôi thực sự nghĩ rằng nếu tôi đánh bóng mã một chút và hỗ trợ thêm một vài tính năng, đây có thể là một mô-đun CoffeeScript hữu ích.

Dù sao, điều này thật thú vị! :)

Đối với những người không quá quen thuộc với CoffeeScript, các truy vấn SQL sẽ biên dịch thành JavaScript sau:

sql.run(function() {
  return CREATE(
    TABLE(
      this.books(
        this.title(varchar(255), 
        this.author(varchar(255), 
        this.year(int)))
      )
    )
  );
});

sql.run(function() {
  INSERT(INTO(this.books));
  return VALUES([...], ['Effective C++', 'Scott Meyers', 1992], [...], [...]);
});

sql.run(function() {
  SELECT(this.title, this.year(FROM(this.books)));
  WHERE(this.author(IN(['Bjarne Stroustrup', 'Scott Meyers'])));
  return ORDER(BY(this.year(thisESC)));
});

Đó là khá nhiều thiết lập, nhưng có vẻ tốt. Tôi không phải là một lập trình viên CoffeeScript, nhưng nó trông rất tuyệt. Các @trong SQL được sử dụng cho các biến session.
Ismael Miguel

Tôi quyết định làm cho các từ khóa toàn cầu bây giờ. Bây giờ chỉ có @s cho tên cột và bảng.
Martin Ender

Bây giờ nó trông rất giống SQL! Bạn đã làm một công việc tốt đẹp với cái này!
Ismael Miguel

1
Tôi không quan tâm nhiều đến cà phê, nhưng điều này thật tuyệt vời.
KRyan

2
@tac cảm ơn, nhưng không, tôi chỉ hack nó cho thử thách này. Sự trùng hợp hài hước: làm lại điều này một cách sạch sẽ và đưa nó vào GitHub nằm trong danh sách các dự án mã hóa tiềm năng / dài hạn của tôi cho đến khi tôi gỡ bỏ nó chỉ sáng nay.
Martin Ender

27

Visual Basic 6 (bằng JavaScript)

'; Main sub-routine \
'; function Main() { ' \
Sub Main() '
    ' Do not throw any errors... \
    On Error Resume Next '; MsgBox = alert

    ' Show a message box... \
    MsgBox(1 / 0) '

    ' Show errors again... \
    On Error GoTo 0 '

    ' Show another message box... '
    MsgBox("Hello")
    ' ' } ' \
End Sub '

Main()

Nó cũng hoạt động trong VBScript.


1
Tài giỏi. Bạn thậm chí không cần hầu hết các dấu chấm phẩy.
js1568

@ js1568 Cảm ơn bạn! Bây giờ tôi đã loại bỏ các dấu chấm phẩy không cần thiết.
Bàn chải đánh răng

20

F # trong C ++

Thay vào đó là không lạm dụng và khó chịu lạm dụng tiền xử lý. Tôi nghĩ thật thú vị khi thay đổi C ++ để trông giống như một ngôn ngữ hoàn toàn không giống nhau thay vì sử dụng một vài bí danh để làm cho nó trông giống như Java hoặc PHP. Tôi không thực sự mong đợi điều này sẽ thu được hàng tấn upvote, đó là một mục chỉ để cho vui.

#define let int
#define args ( int __, char* args[] ) { int ___ 
#define println printf(
#define exit "\n" ); return 0; }
#include <stdio.h>

let main args =
    println "F# is better than C++"
    exit

Hãy thử nó ở đây .

Đáng buồn là viết một cái gì đó cho STDOUT là tất cả những gì nó có thể làm, mặc dù tôi chắc chắn nếu ai đó ném đủ phù thủy vào nó, họ có thể khiến nó làm được nhiều hơn.


2
Để dòng cuối cùng hoạt động trong F #, nó sẽ phải exit 0hoặc chỉ 0.
Jwosty

20

Python và ... không ai đoán được (chỉnh sửa: dc)

Đây là một số mã python hợp lệ, nhưng thực sự chương trình được viết bằng một ngôn ngữ rất khác:

# Initialize systems 1 and 2
# frame 1, divergency speed and divergency latency
f1ds, f1dl, z1 = [2,2,0]
# frame 2, divergency speed and divergency latency
f2ds, f2dl, z2 = [4,4,1]

# Set the most relevant value of ax (detected by low-energy collision)
ax = 42.424242

# Initialize list of successive energy states
s = [17.98167, 21.1621, 34.1217218, 57.917182]

# Most common value for nz parameter
# TODO: check if value from the article of A. Einstein is better
nz = 10

if z2>nz or ax in s:
  ax += 6
  f1ds = 8
  f2ds = 16
  z1 = 4
  z2 = 9

f1dl += z1
f2dl += z2

# main loop, iterate over all energy states
# Warning: hit Ctrl-C if nuclear explosion occurs and adjust either z or nz
for k in s:
  z = nz + k
  f1dl = f1ds + f2dl * z - z1 + 3.14
  f2dl = f2ds + f1dl * z - z2 + 10
  if k > 10 or z-2 in s:
    nz += 0xac  # hexadecimal coefficient found in famous article by E. Fermi

Mã này chạy trong cả hai ngôn ngữ không có lỗi.

Sự kết hợp rất điên rồ; Tôi sẽ rất vui khi đợi một hoặc hai ngày trước khi nói đó là ngôn ngữ khác; vui lòng để lại ý kiến ​​để đoán.

chỉnh sửa: Ngôn ngữ là ngôn ngữ dựa trên ngăn xếp từ dc. Bạn có thể thấy ở đây từ khóa nổi tiếng như for, if, or, in, nhưng chỉ có vấn đề các chữ cái! Cái ,không có nghĩa trong dc được chuyển thành một thanh ghi vì lần đầu tiên nó xuất hiện là sau chữ cái s(tương tự cho :).


1
Trừ khi mã làm điều tương tự trong cả hai ngôn ngữ, tôi cho rằng một ngôn ngữ như Befunge có thể thực hiện thủ thuật.
Thomas Eding

OK, tôi chỉnh sửa mã để đặt ngôn ngữ tôi thực sự đã chọn.
Thomas Baruchel

18

C ++ cho phép bạn viết mã giống như lisp, với thư viện InteLib:

(L|DEFUN, ISOMORPHIC, (L|TREE1, TREE2),
   (L|COND, 
     (L|(L|ATOM, TREE1), (L|ATOM, TREE2)),
     (L|(L|ATOM, TREE2), NIL),
     (L|T, (L|AND,
       (L|ISOMORPHIC, (L|CAR, TREE1), 
                      (L|CAR, TREE2)),
       (L|ISOMORPHIC, (L|CDR, TREE1), 
                      (L|CDR, TREE2))
 )))).Evaluate();

xem http://www.informatimago.com/articles/life-saver.html


4
Chào mừng bạn Chúng tôi yêu cầu người dùng gắn cờ bài đăng của họ là Community Wiki khi câu trả lời không phải là công việc của riêng họ. (Và đưa ra sự ghi nhận đúng đắn, nhưng bạn đã làm điều đó, vì vậy cảm ơn bạn!)
Jonathan Van Matre

Bản gốc hay không, bạn đã nhận được phiếu bầu của tôi :)
itjeyd

15

C # trong khoảng trắng

Được rồi, trước tiên hãy thử một trong những thứ này, vì vậy hãy xem mọi thứ diễn ra như thế nào.

using System; //very important  

namespace ConsoleApplication1  //namespace: name whatever you want      
{ 
 //start    
 class  Program  //class name:  also anything    
    {
    //main function 
    static void Main(string[] args) {
        for(int i=0;i<10;i++)   writeOutput(i); 
    } //end main    
    static void writeOutput(int i) { Console.WriteLine(i); }    //display output    


    } //class ends here         

}  //close namespace:   also very important     





//yay!

Và trong trường hợp định dạng trở nên khó khăn khi phải đặt bốn khoảng trắng ở phía trước của mỗi dòng, thì đây là một lần nữa với. cho không gian và # cho tab:

using.System;.//very.important#

namespace.ConsoleApplication1..//namespace:#name.whatever.you.want##
{.
.//start#
.class#Program..//class.name:#also.anything#.
#{
....//main.function#
#static.void.Main(string[].args).{
....#for(int.i=0;i<10;i++)#writeOutput(i);#
#}.//end.main#
#static.void.writeOutput(int#i).{.Console.WriteLine(i);.}#//display.output#

.
.#}.//class.ends.here.##

}..//close.namespace:#also.very.important#.#
.




//yay!

12

HTML và CSS

Không phải ngôn ngữ lập trình, nhưng tài liệu này là HTML CSS hợp lệ :

<!-- p{color:red} /* -->
<!Doctype html>
<title>This is HTML and CSS</title>
<p>Hi!</p>
<!-- */ -->
<!-- p{color:red} /* -->
<!Doctype html>
<title>This is HTML and CSS</title>
<p>Hi!</p>
<!-- */ -->

Điều này hoạt động, bởi vì các nhận xét HTML được cho phép trong biểu định kiểu vì lý do lịch sử. Ồ, và mọi tài liệu HTML hợp lệ cũng là một chương trình PHP hợp lệ, vì vậy đây cũng là PHP . :)


2
Điều đó khá buồn cười và tất cả nhưng đây không thực sự là một thử thách đa âm .
Martin Ender

CSS có thể được coi là hoàn thành , đây có thể là một câu trả lời hợp lệ.
Adam Davis

2
HTML và CSS không phải là ngôn ngữ lập trình :)
Jet

9

C ở Scala

Lớp cầu nối mô phỏng một kỷ nguyên lãng mạn hơn khi các chuỗi vẫn bị vô hiệu hóa các mảng byte.

// Scala is a dynamic language
import scala.language.{ dynamics, postfixOps }

val self = this

val argc = args.length
val argv = args.map(_.getBytes)

type char = Array[Byte]
object char extends Dynamic {
  // This program uses expanded memory
  val buffers = new scala.collection.mutable.LinkedHashMap[String, char]

  // Malloc char buffer
  def applyDynamic(name: String)(length: Int) =
    buffers(name) = new Array(length)

  def **(argv: Array[Array[Byte]]) = argv
}

object & extends Dynamic {
  // dereference char pointer
  def selectDynamic(name: String) = char.buffers(name)
}

def printf(format: String, buffers: char*) =
  println(
    (format /: buffers){ case (msg, buffer) =>
      // Read string until \0 terminator
      val value = new String(buffer.takeWhile(0 !=))
      // Replace next %s token
      msg.replaceFirst("%s", value)
    }
  )

def scanf(format: String, buffers: char*) =
  buffers foreach { buffer =>
    val line = Console.readLine()
    // Write string to char* buffer
    line.getBytes(0, line.length, buffer, 0)
    // Remember to always null terminate your strings!
    buffer(line.length) = 0
  }

val PATH_MAX = 4096

implicit class Argumenter(args: Pair[_, _]) {
  def apply[T](f: => T) = f
}

object int {
  // Passthrough
  def main[T](f: => T) = f
  def argc = self.argc
}

// terminates the string after the first character
// investigate switching to "xor eax, eax" instead of having a hardcoded 0
// might save 3 bytes and valuable CPU time with this trick
val initialize = (_: char)(1) = 0

def exit(value: Int) = sys.exit(value)
// ---HOMEWORK-ASSIGNMENT-START---

int main(int argc, char **argv) {
  if (argc != 0) {
    printf("This program does not take parameters!");
    exit(1);
  }

  // I've copy pasted this code from somewhere
  // Code reuse is essential if we want to be DRY
  char first(PATH_MAX + 1);
  char last(PATH_MAX + 1);

  printf("Enter your first and last name:\n");
  scanf("%s%s", &first, &last);

  // Still learning references, do I need these here?
  // I've performed benchmarks on printf and I think it's faster this way
  printf("Your full name is %s %s", &first, &last);

  initialize(&first);
  printf("Your signature is %s. %s", &first, &last);

  exit(0);
}

"This program does not take parameters!"đánh lừa ya
Erik the Outgolfer

8

sed và APL

Sếp của tôi muốn tôi viết kịch bản sed, nhưng tôi thích viết APL cả ngày. Tuy nhiên, anh ấy rất hài lòng với công việc của tôi vì các kịch bản như vậy chạy hoàn hảo với phiên bản sed của anh ấy:

i ← g ← 42
a ← d ← 10
s/s←2⊤42/s←2⊤43/g
s/s[01]*1/s⊣1/g
g

Bạn có thể thử nó trên trang web mới của tôi với permalink này . Nó là một phiên bản javascript của GNU APL. Bản phát hành cuối cùng sẽ là bản phát hành chính thức của GNU APL, câu 1.3, nhưng bạn hoàn toàn có thể sử dụng nó cho permalinks nếu bạn thích GNU APL.


7

C ở Haskell

import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Array
import Foreign.Ptr
import System.Environment
import System.Exit

-- The meat of the program

cmain :: (CInt, Ptr (Ptr CChar)) -> IO CInt
cmain(argc, argv) = do {
    putStr("hello, world\n");
    return 0;
}

-- Of course, the above function doesn't do anything unless we write a wrapper
-- around it.  This could have been done more simply, using higher-level library
-- functions, but where's the fun in that?

main :: IO ()
main = do {
    args <- getArgs;
    argPtrs <- sequence [do {
        argPtr <- mallocArray0(length(arg)) :: IO (Ptr CChar);
        pokeArray0(0)(argPtr)(map(castCharToCChar)(arg));
        return argPtr;
    } | arg <- args ];
    argv <- mallocArray(length(argPtrs)) :: IO (Ptr (Ptr CChar));
    pokeArray(argv)(argPtrs);

    exitCode <- cmain(fromIntegral(length(args)),argv);

    if (exitCode == 0) then do {
        exitWith(ExitSuccess);
    } else do {
        exitWith(ExitFailure(fromIntegral(exitCode)));
    };
}

Tất nhiên, vì cmainkhông làm gì với argchoặc argv, mã sắp xếp đối số không có hiệu lực và kể từ đócmain luôn trả về 0, nên nhánh "khác" của câu lệnh "if" đã chết. Nhưng tuyên bố "nếu" không làm gì cả.

Tất cả các dấu ngoặc nhọn và dấu chấm phẩy là không cần thiết, vì hầu hết các dấu ngoặc đơn và một số dotừ khóa. Câu lệnh "nếu" có thể được viết là if exitCode == 0 then exitWith ExitSuccess else exitWith (ExitFailure (fromIntegral exitCode)).


7

C ++ trong Forth

: #include ; : <iostream> ; : { ; : } ; : int ; : using ;
: namespace ; : std; ; : main() ; : cout ; : << ;
: "Hello,  ; : world!\n"; S" Hello, world!" type ; : return ; : 0; ;

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, world!\n";
}

Không phải là giải pháp linh hoạt nhất, nhưng nó hoạt động nếu được viết chính xác như được hiển thị.


7

Haskell trong Java

("vanilla" Java 7, không phải Java 8) (Vâng, tôi biết rằng quyền anh làm hỏng hiệu suất; và thậm chí cố gắng sử dụng các hàm bậc cao hơn cũng bị điên rồ: D)

Java có cú pháp rất cứng nhắc, vì vậy thay vì thay đổi cú pháp, tôi đã cố gắng tạo mã theo ngữ nghĩa giống với kiểu Haskell hơn.

Chỉnh sửa - thêm ứng dụng chức năng một phần.

import java.util.Iterator;

interface Function1<A, B> {
    A call(B arg);
}

interface Function2<A, B, C> {
    A call(B arg1, C arg2);
}

class Reduce<A> implements Function2<A, Function2<A, A, A>, Iterable<A>> {

    @Override
    public A call(Function2<A, A, A> arg1, Iterable<A> arg2) {
        final Iterator<A> i = arg2.iterator();
        A r = i.next();
        while (i.hasNext())
            r = arg1.call(r, i.next());
        return r;
    }
}

class Range implements Iterable<Integer> {

    private final int min;
    private final int max;

    public Range(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = min;

            @Override
            public boolean hasNext() {
                return i <= max;
            }

            @Override
            public Integer next() {
                return i++;
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }
}

public class Main {

    public static <A, B, C> Function1<A, C> applyPartial(final Function2<A, B, C> f, final B arg2) {
        return new Function1<A, C>() {
            @Override
            public A call(C arg) {
                return f.call(arg2, arg);
            }
        };
    }

    public static void main(String[] args) {

        final Function1<Integer, Iterable<Integer>> product = applyPartial(new Reduce<Integer>(), new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer arg1, Integer arg2) {
                return arg1 * arg2;
            }
        });

        final Function1<Integer, Integer> fact = new Function1<Integer, Integer>() {

            @Override
            public Integer call(Integer arg) {
                return product.call(new Range(1, arg));
            }
        };

        final Integer x = fact.call(6);

        System.out.println(x.toString());
    }
}

(Vâng, tất cả những gì điên rồ này làm là tính toán 6!)


6

COBOL trong AWK

Trong tinh thần của trích dẫn. AWK thuần túy, không bị biến đổi, vì nó có thể được viết bởi một lập trình viên COBOL.

Nhiệm vụ là đếm các hồ sơ trên một tập tin. Phiên bản phát triển ban đầu này đang được tính để thử nghiệm. Tệp chính xác sẽ được mã hóa cứng sau này khi được phát hành từ Kiểm tra đơn vị ...

Nếu tôi có thể làm nổi bật cú pháp để làm màu xanh huỳnh quang trên màu đen, thì thật tuyệt ...

Thậm chí có số cột đúng trên cái này, đó là bảy khoảng trống ở đầu mỗi dòng (chưa bao giờ được thực hiện trong awk trước đó) và phá vỡ các câu lệnh in dài ở cột 72.

   BEGIN { 
       PERFORM_000_INITIALISATION() 
       PERFORM_100_OPEN_FILES() 
       PERFORM_200_PROCESS_FILE() 
       PERFORM_300_CLOSE_FILES() 
       PERFORM_400_SHOW_THE_COUNTS() 
       exit 
   } 
   function PERFORM_000_INITIALISATION() { 
       INPUT_FILE_NAME = "COBOL.AWK" 
       RECORD_COUNT = 0 
   } 
   function PERFORM_100_OPEN_FILES() { 
   } 
   function PERFORM_200_PROCESS_FILE() { 
       PERFORM_210_PRIMING_READ() 
       PERFORM_220_PROCESS_INPUT_UNTIL_END() 
   } 
   function PERFORM_300_CLOSE_FILES() { 
   } 
   function PERFORM_400_SHOW_THE_COUNTS() { 
       print "COBOL.AWK: NUMBER OF RECORDS READ IS " RECORD_COUNT        
   } 
   function PERFORM_210_PRIMING_READ() { 
       PERFORM_900_READ_THE_FILE() 
       if ( FILE_STATUS < 0 ) { 
           print "COBOL.AWK ERR0001: INVALID FILE, HALTING, FILE N" \
                 "AME IS: " INPUT_FILE_NAME 
           exit 
           } 
       if ( FILE_STATUS == 0 ) { 
           print "COBOL.AWK ERR0002: NO RECORDS ON INPUT, HALTING," \
                 "FILE NAME IS: " INPUT_FILE_NAME 
           exit 
           } 
   } 
   function PERFORM_220_PROCESS_INPUT_UNTIL_END() {
       while ( FILE_STATUS != 0 ) { 
           INPUT_RECORD = $0 
           RECORD_COUNT = RECORD_COUNT + 1 
           PERFORM_900_READ_THE_FILE() 
           } 
   } 
   function PERFORM_900_READ_THE_FILE() { 
       FILE_STATUS = getline < INPUT_FILE_NAME 
   }        

6

Brainfuck (hoặc bất cứ thứ gì khác) trong Vợt

Mô-đun và hệ thống macro linh hoạt của vợt cho phép nó triển khai hỗ trợ mô-đun cho các ngôn ngữ hoàn toàn mới, cả mục đích cụ thể và mục đích chung. Có hỗ trợ ngoài hộp cho cả DatalogAlgol 60 , vì vậy đây là cả hai chương trình Vợt hợp lệ:

#lang datalog
edge(a, b). edge(b, c). edge(c, d). edge(d, a).
path(X, Y) :- edge(X, Y).
path(X, Y) :- edge(X, Z), path(Z, Y).
path(X, Y)?

#lang algol60
begin
  integer procedure SIGMA(x, i, n);
    value n;
    integer x, i, n;
  begin
    integer sum;
    sum := 0;
    for i := 1 step 1 until n do
      sum := sum + x;
    SIGMA := sum;
  end;
  integer q;
  printnln(SIGMA(q*2-1, q, 7));
end

Bạn cũng có thể thêm hỗ trợ cho các ngôn ngữ khác: ví dụ: xem mô tả của Danny Yoo về cách triển khai hỗ trợ cho Brainfuck, cho phép các chương trình Vợt như:

#lang planet dyoo/bf
++++++[>++++++++++++<-]>.
>++++++++++[>++++++++++<-]>+.
+++++++..+++.>++++[>+++++++++++<-]>.
<+++[>----<-]>.<<<<<+++[>+++++<-]>.
>>.+++.------.--------.>>+.

Và vì hỗ trợ được thêm vào ở cấp mô-đun đã biên dịch, có thể liên kết các mô-đun được viết bằng các ngôn ngữ khác nhau hoặc nhúng một đoạn của một ngôn ngữ bên trong mô-đun được viết bằng ngôn ngữ khác.


5

SML trong Java

Tôi vẫn còn một số mã cổ xưa từ khi tôi bắt đầu học Java và cố gắng sử dụng nó theo kiểu chức năng. Hơi sạch sẽ:

/**
 * Genericised ML-style list.
 */
public class FunctionalList<T> 
{
    private final T head;
    private final FunctionalList<T> tail;

    public FunctionalList(T x, FunctionalList<T> xs) {
        this.head = x;
        this.tail = xs;
    }

    public static <T> FunctionalList<T> cons(T x, FunctionalList<T> xs) {
        return new FunctionalList<T>(x, xs);
    }

    public static <T> T hd(FunctionalList<T> l) {
        return l.head;
    }

    public static <T> FunctionalList<T> tl(FunctionalList<T> l) {
        return l.tail;
    }

    public static int length(FunctionalList<?> l) {
        return len(l, 0);
    }

    private static int len(FunctionalList<?> l, int n) {
        return l == null ? n : len(tl(l), n + 1);
    }

    public static <T> FunctionalList<T> rev(FunctionalList<T> l) {
        return rev(l, null);
    }

    private static <T> FunctionalList<T> rev(FunctionalList<T> a, FunctionalList<T> b) {
        return a == null ? b : rev(tl(a), cons(hd(a), b));
    }

    public static <T> FunctionalList<T> append(FunctionalList<T> a, FunctionalList<T> b) {
        return a == null ? b : cons(hd(a), append(tl(a), b));
    }
}

5

Java bằng Perl

Có thể được coi là vi phạm quy tắc, nhưng tôi không quan tâm. Rõ ràng, nó dự định trông giống như chương trình Java. Nó in 20 số Fibonacci, trong trường hợp không rõ ràng.

Yêu cầu Inline :: mô-đun Java được cài đặt.

use Inline Java => <<'JAVA';
/**
 * @author  Konrad Borowski <x.fix@o2.pl>
 * @version 0.1.0
 */
class Fibonacci
{
    /**
     * Responsible for storing the number before last generated number.
     */
    private long beforeLastNumber = 0;

    /**
     * Responsible for storing the last generated number.
     */
    private long lastNumber = 1;

    /**
     * Receives the next Fibonacci number.
     * 
     * @return long integer that is the next Fibonacci number
      */
    public long next()
    {
        long temponaryLastNumber = lastNumber;
        lastNumber = beforeLastNumber + lastNumber;
        beforeLastNumber = temponaryLastNumber;
        return temponaryLastNumber;
    }

    /**
     * Outputs the Fibonacci number to standard output.
     */
    public void printFibonacci()
    {
        System.out.println(next());
    }

    /**
     * Outputs the Fibonacci number to standard output given number of
     * times.
     * 
     * @param times number of times to print fibonacci number
     */
    public void printFibonacciTimes(int times)
    {
        int i;
        for (i = 0; i < times; i++) {
            printFibonacci();
        }
    }

    /**
     * Constructor for Fibonacci object. Does nothing.
     */
    public Fibonacci()
    {
        // Do nothing.
    }
}
JAVA

###
 # The executable class that shows 20 Fibonacci numbers.
 ##
package OutputFibonacci
{
    ###
     # Shows 20 Fibonacci numbers. This method is public,
     # static, and returns void.
     ##
    sub main()
    {
        # In Perl, -> is object method separator, not a dot. This is stupid.
        new Fibonacci()->printFibonacciTimes(20);
    }
}

# Perl doesn't automatically call main method.
OutputFibonacci::main();

4

J và ... không ai đoán được (chỉnh sửa: dc)

Đây là mục thứ hai của tôi; đây là một đoạn mã J hợp lệ, trả về 1:

10 o. 1 r. 2 i. 4 [ ( 0:`1: @. (2&|)) ] 8 #: *:@+: 42

Tôi đang đợi một hoặc hai ngày trước khi nói đó là ngôn ngữ khác đang chạy cùng một đoạn mã không có lỗi. Chỉ cần để lại ý kiến ​​để cố gắng đoán.

chỉnh sửa: Ngôn ngữ khác là ngôn ngữ dựa trên ngăn xếp từ máy tính Unix rất cổ xưa.


3
Nó chạy không có lỗi trong GolfScript, BF, HQ9 +, ...
Peter Taylor

OK, tôi đã không biết rằng nhiều ngôn ngữ có thể làm điều đó. Tôi chỉnh sửa mã để đặt ngôn ngữ tôi thực sự đã chọn.
Thomas Baruchel

@ ב ž ž runs nó chạy không có lỗi trong các ngôn ngữ đó vì những ngôn ngữ đó không có lỗi hoặc không có lỗi áp dụng cho mã này. Ví dụ. Brainfuck bỏ qua tất cả các nhân vật không có trong .,+-<>[]chương trình của bạn tương đương với ...[.]+trong brainfuck, đây là một chương trình hợp lệ nhưng vô nghĩa. AFAIK một chương trình brainfuck chỉ có thể không hợp lệ bằng cách không khớp [].
Immibis

@immibis. Điều này là sai. dc là một máy tính cũ và tôi có thể đảm bảo rằng việc thay đổi một thứ trong mã của tôi sẽ gây ra lỗi. Tôi đã dành nhiều thời gian cho một số phần của mã để tìm ra một số cách khó khăn để đặt các chữ cái theo đúng thứ tự. Đoạn mã của tôi Postcript / dc khá cực đoan: không có lỗi nhưng thay đổi bất cứ điều gì sẽ khiến nó bị lỗi. dc không liên quan gì đến "những ngôn ngữ đó"; dc lớn hơn "những ngôn ngữ đó" khoảng 20 hoặc 30 năm; nó thường được cài đặt trên bất kỳ bản phân phối Linux nào. Xin vui lòng, duyệt một chút nếu bạn chưa nghe về nó.
Thomas Baruchel

1
@ בבכאלכאל bạn hiểu nhầm - Tôi đã nói về brainfuck, HQ9 +, golfscript, v.v. - không phải dc.
Immibis

4

dc chạy tập tin PostScript

dc có thể chạy đoạn mã sau mà không gặp lỗi:

10 10 10 10 10 42 32 10 10
stop % first send a stop
0 0 srand rand
le pop pop 3.14 sin
lt 2 3 lt and pop
le 2 10 le xor
pop pop pop 1 0 0
<< /sox 2 >> [ exch begin sox end ] aload
3.14 floor

3

ML / (Nghiêm) Haskell trong Java

Đây là từ một dự án thực tế. Nó sử dụng các cấu trúc dữ liệu bất biến liên tục và sử dụng đệ quy ngay cả khi không cần thiết. Trên thực tế, nó giống với Kore (ngôn ngữ mà dự án triển khai) trong Java, nhưng về cơ bản thì phong cách giống như ML. Nhưng triết lý của Kore là tác giả không nên định dạng mã của mình, vì vậy không có mã Java nào được định dạng (nó được tự động định dạng bằng nhật thực).

thả n phần tử từ danh sách :

  public static <T> List<T> drop(List<T> l, Integer n) {
    return n == 0 ? l : drop(l.cons().tail, n - 1);
  }

Trong ML / Haskell, nơi bạn khớp mẫu để trích xuất phần đầu và đuôi, ở đây bạn nói list.cons().xlist.cons().tail.

chèn một phần tử trong danh sách :

  public static <T> List<T> insert(List<T> l, Integer i, T x) {
    if (i == 0)
      return cons(x, l);
    return cons(l.cons().x, insert(l.cons().tail, i - 1, x));
  }

Danh sách được định nghĩa theo nghĩa đen của kiểu dữ liệu đại số sẽ được định nghĩa. Đây là một phiên bản với bản tóm tắt được tạo ra nhật thực:

public final class List<T> {

  public static final class Nil<T> {
  }

  public static final class Cons<T> {
    public final T x;
    public final List<T> tail;

    public Cons(T x, List<T> tail) {
      if (x == null)
        throw new RuntimeException("null head");
      if (tail == null)
        throw new RuntimeException("null tail");
      this.x = x;
      this.tail = tail;
    }
  }

  private final Nil<T> nil;
  private final Cons<T> cons;

  private List(Nil<T> nil, Cons<T> cons) {
    this.nil = nil;
    this.cons = cons;
  }

  public boolean isEmpty() {
    return nil != null;
  }

  public Nil<T> nil() {
    if (nil == null)
      throw new RuntimeException("not nil");
    return nil;
  }

  public Cons<T> cons() {
    if (cons == null)
      throw new RuntimeException("not cons");
    return cons;
  }

  public static <T> List<T> cons(Cons<T> cons) {
    if (cons == null)
      throw new RuntimeException("constructor received null");
    return new List<T>(null, cons);
  }

  public static <T> List<T> nil(Nil<T> nil) {
    if (nil == null)
      throw new RuntimeException("constructor received null");
    return new List<T>(nil, null);
  }
}

Dưới đây là một cấu trúc dữ liệu bản đồ được thực hiện trong điều khoản của một Trie :

public final class Map<K, V> {
  private final Tree<Character, Optional<Pair<K, V>>> tree;
  // keys are sorted in reverse order so entrySet can use cons instead of append
  private final Comparer<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> comparer =
      new PairLeftComparer<Character, Tree<Character, Optional<Pair<K, V>>>>(
          new ReverseComparer<Character>(new CharacterComparer()));

  private Map(Tree<Character, Optional<Pair<K, V>>> tree) {
    this.tree = tree;
  }

  public static <K, V> Map<K, V> empty() {
    return new Map<K, V>(new Tree<Character, Optional<Pair<K, V>>>(
        OptionalUtils.<Pair<K, V>> nothing(),
        ListUtils
            .<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> nil()));
  }

  public Optional<V> get(K k) {
    Tree<Character, Optional<Pair<K, V>>> t = tree;
    for (char c : k.toString().toCharArray()) {
      Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
      if (t2 == null)
        return nothing();
      t = t2;
    }
    if (t.v.isNothing())
      return nothing();
    return some(t.v.some().x.y);
  }

  public Map<K, V> put(K k, V v) {
    return new Map<K, V>(put(tree, k.toString(), v, k));
  }

  private Tree<Character, Optional<Pair<K, V>>> put(
      Tree<Character, Optional<Pair<K, V>>> t, String s, V v, K k) {
    if (s.equals(""))
      return new Tree<Character, Optional<Pair<K, V>>>(some(Pair.pair(k, v)),
          t.edges);
    char c = s.charAt(0);
    Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
    if (t2 == null)
      return new Tree<Character, Optional<Pair<K, V>>>(
          t.v,
          sort(
              cons(
                  pair(
                      c,
                      put(new Tree<Character, Optional<Pair<K, V>>>(
                          OptionalUtils.<Pair<K, V>> nothing(),
                          ListUtils
                              .<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> nil()),
                          s.substring(1), v, k)), t.edges), comparer));
    return new Tree<Character, Optional<Pair<K, V>>>(t.v, sort(
        replace(pair(c, put(t2, s.substring(1), v, k)), t.edges), comparer));
  }

  private List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> replace(
      Pair<Character, Tree<Character, Optional<Pair<K, V>>>> edge,
      List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> edges) {
    if (edges.cons().x.x.equals(edge.x))
      return cons(edge, edges.cons().tail);
    return cons(edges.cons().x, replace(edge, edges.cons().tail));
  }

  // I consider this O(1). There are a constant of 2^16 values of
  // char. Either way it's unusual to have a large amount of
  // edges since only ASCII chars are typically used.
  private Tree<Character, Optional<Pair<K, V>>> getEdge(
      Tree<Character, Optional<Pair<K, V>>> t, char c) {
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> p : iter(t.edges))
      if (p.x.equals(c))
        return p.y;
    return null;
  }

  public Map<K, V> delete(K k) {
    return new Map<K, V>(delete(tree, k.toString()).x);
  }

  private Pair<Tree<Character, Optional<Pair<K, V>>>, Boolean> delete(
      Tree<Character, Optional<Pair<K, V>>> t, String k) {
    if (k.equals(""))
      return pair(
          new Tree<Character, Optional<Pair<K, V>>>(
              OptionalUtils.<Pair<K, V>> nothing(), t.edges), t.edges.isEmpty());
    char c = k.charAt(0);
    Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
    if (t2 == null)
      return pair(t, false);
    Pair<Tree<Character, Optional<Pair<K, V>>>, Boolean> p =
        delete(t2, k.substring(1));
    List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> edges = nil();
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> e : iter(t.edges))
      if (!e.x.equals(c))
        edges = cons(e, edges);
    if (!p.y)
      return pair(
          new Tree<Character, Optional<Pair<K, V>>>(t.v, cons(pair(c, p.x),
              edges)), false);
    boolean oneEdge = t.edges.cons().tail.isEmpty();
    return pair(new Tree<Character, Optional<Pair<K, V>>>(t.v, edges), oneEdge
        && t.v.isNothing());

  }

  public static class Entry<K, V> {
    public Entry(K k, V v) {
      this.k = k;
      this.v = v;
    }

    public final K k;
    public final V v;

  }

  public List<Entry<K, V>> entrySet() {
    return entrySet(ListUtils.<Entry<K, V>> nil(), tree);
  }

  private List<Entry<K, V>> entrySet(List<Entry<K, V>> l,
      Tree<Character, Optional<Pair<K, V>>> t) {
    if (!t.v.isNothing()) {
      Pair<K, V> p = t.v.some().x;
      l = cons(new Entry<K, V>(p.x, p.y), l);
    }
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> e : iter(t.edges))
      l = entrySet(l, e.y);
    return l;
  }
}

Các loại bắt đầu chiếm nhiều không gian như mã. Ví dụ, theo cách đặt , phương thức có 302 ký tự loại và 343 ký tự mã (không tính khoảng trắng / dòng mới).


2

CƠ BẢN trong Ruby

Thực hiện điều này từ lâu. Các nguồn là trên GitHub . Lấy cảm hứng từ một điều tương tự trong Scala

Thiết lập

#!/usr/bin/env ruby

if caller.empty? && ARGV.length > 0
  $file = ARGV[0]
else
  $file = caller.last.split(':').first
end

require 'pp'

class String
  def %(other)
    self + other.to_s
  end
end

class RBaysick
  @@variables = {}
  @@code = []
  @@line = 0

  def initialize(contents)
    $DONT_RUN = true # To avoid endless loops.

    contents.gsub!(/( |\()'([^\W]+)/, '\1:\2 ')

    contents.gsub!(/(^| |\()(:[^\W]+)/, '\1GET(\2)')

    contents.gsub!(/ IF (.*) THEN (.*)/, ' IF { \1 }.THEN { GOTO \2 }')
    contents.gsub!(/LET *\(([^ ]+) *:= *(.*)\)/, 'LET(\1) { \2 }')
    contents.gsub!(/(LET|INPUT)(\(| )GET\(/, '\1\2(')
    contents.gsub!(/ \(/, '(')

    contents.gsub!(/^(\d+) (.*)$/, 'line(\1) { \2 }')

#    contents.gsub!(/(\)|\}|[A-Z]) ([A-Z]+)/, '\1.\2')

    contents.gsub!(/ END /, ' __END ')
    contents.gsub!(/^RUN/, '__RUN')

    puts contents if $DEBUG
    eval contents
  end

  def __RUN
    while @@line > -1
      puts "#{@@line}: #{@@code[@@line].inspect}" if $DEBUG
      unless @@code[@@line].nil?
        @@increment = true
        @@code[@@line].call
        next unless @@increment
      end
      @@line += 1
    end
  end

  class If < Struct.new(:value)
    def THEN
      yield if value
    end
  end

  def method_missing(name, *args)
    puts "Missing: #{name.to_s}(#{args.map(&:inspect).join(', ')})" if $DEBUG
  end

  def variables
    @@variables
  end

  def line(line, &block)
    @@code[line] = block
  end

  def add(line, cmd, *args)
    puts "DEBUG2: #{cmd.to_s}(#{args.map(&:inspect).join(', ')})" if $DEBUG
    @@code[line] = send(cmd, *args)
  end

  def IF
    ::RBaysick::If.new(yield)
  end

  def PRINT(str)
    puts "PRINT(#{str.inspect})" if $DEBUG
    puts str
    true
  end

  def LET(name, &block)
    puts "LET(#{name.inspect}, #{block.inspect})" if $DEBUG
    @@variables[name] = block.call
  end

  def GET(name)
    puts "GET(#{name.inspect}) #=> #{@@variables[name].inspect}" if $DEBUG
    @@variables[name]
  end

  def INPUT(name)
    puts "INPUT(#{name.inspect})" if $DEBUG
    LET(name) { $stdin.gets.chomp.to_i }
  end

  def ABS(val)
    puts "ABS(#{val.inspect}) #=> #{val.abs.inspect}" if $DEBUG
    val.abs
  end

  def GOTO(line)
    @@increment = false
    @@line = line
  end

  def __END
    exit
  end
end

RBaysick.new(open($file).read) unless $DONT_RUN || ($0 != __FILE__)

Mã cơ bản

#!./rbaysick.rb

10 PRINT "Welcome to Baysick Lunar Lander v0.0.1"
20 LET ('dist := 100)
30 LET ('v := 1)
40 LET ('fuel := 1000)
50 LET ('mass := 1000)

60 PRINT "You are a in control of a lunar lander."
70 PRINT "You are drifting towards the surface of the moon."
80 PRINT "Each turn you must decide how much fuel to burn."
90 PRINT "To accelerate enter a positive number, to decelerate a negative"

100 PRINT "Distance " % 'dist % "km, " % "Velocity " % 'v % "km/s, " % "Fuel " % 'fuel
110 INPUT 'burn
120 IF ABS('burn) <= 'fuel THEN 150
130 PRINT "You don't have that much fuel"
140 GOTO 100
150 LET ('v := 'v + 'burn * 10 / ('fuel + 'mass))
160 LET ('fuel := 'fuel - ABS('burn))
170 LET ('dist := 'dist - 'v)
180 IF 'dist > 0 THEN 100
190 PRINT "You have hit the surface"
200 IF 'v < 3 THEN 240
210 PRINT "Hit surface too fast (" % 'v % ")km/s"
220 PRINT "You Crashed!"
230 GOTO 250
240 PRINT "Well done"

250 END

RUN

2

Haskell trong các mẫu C ++

Tôi đã tạo FizzBuzz này trong các mẫu C ++ một vài tháng trước đây. Đây là một triển khai mã Haskell sau đây, tất cả trong các mẫu C ++. Trong thực tế, ngay cả số học số nguyên cũng được thực hiện lại ở cấp độ --- lưu ý rằng không có mẫu nào sử dụng tham số int!

Mã Haskell:

import Control.Monad

m `divides` n = (n `mod` m == 0)

toFizzBuzz n
    | 15 `divides` n = "FizzBuzz"
    |  5 `divides` n = "Buzz"
    |  3 `divides` n = "Fizz"
    |      otherwise = show n

main = mapM_ putStrLn $ take 100 $ map toFizzBuzz [1..]

và phiên bản siêu lập trình mẫu C ++:

//  
//  Lazy compile-time fizzbuzz computed by C++ templates,
//  without conditionals or the use of machine arithmetic.
//
//         -- Matt Noonan (mnoonan@grammatech.com)

#include <iostream>

using namespace std;

//
//  The natural numbers: Nat = Zero | Succ Nat
//

template <typename n>
struct Succ
{
  typedef Succ eval;
  static const unsigned int toInt = 1 + n::toInt;
  static void print(ostream & o) { o << toInt; }
};

struct Zero
{
  typedef Zero eval;
  static const unsigned int toInt = 0;
  static void print(ostream & o) { o << toInt; }
};

//
//  Arithmetic operators
//    Plus Zero n = n
//    Plus Succ(n) m = Plus n Succ(m)
//    Times Zero n = Zero
//    Times Succ(n) m = Plus m (Times n m)
//

template <typename a, typename b>
struct Plus
{
  typedef typename Plus<typename a::eval,
                        typename b::eval>::eval eval;
};

template <typename M>
struct Plus <Zero, M>
{ typedef typename M::eval eval; };

template <typename N, typename M>
struct Plus <Succ<N>, M>
{ typedef typename Plus<N, Succ<M> >::eval eval; };

template <typename a, typename b>
struct Times
{
  typedef typename Times<typename a::eval,
                         typename b::eval>::eval eval;
};

template <typename M>
struct Times <Zero, M>
{ typedef Zero::eval eval; };

template <typename N, typename M>
struct Times <Succ<N>, M>
{ typedef typename Plus<M,
                        typename Times<N,M>::eval
                        >::eval eval; };

//
//  Lists
//

struct Nil
{
  typedef Nil eval;
  static void print(ostream & o) { }
};

template <typename x, typename xs>
struct Cons
{
  typedef Cons eval;
  static void print(ostream & o) {
    x::eval::print(o); o << endl; xs::eval::print(o);
  }
};

//
//  Take the first n elements of a list
//

template <typename, typename> struct Take;

template <typename _> struct Take<Zero,_>
{ typedef Nil eval; };

template <typename n, typename x, typename xs>
struct Take<Succ<n>, Cons<x,xs> >
{
  typedef Cons<x, Take<n, xs> > eval;
};

template <typename a, typename b>
struct Take
{
  typedef typename Take<typename a::eval,
                        typename b::eval>::eval eval;
};

//
//  Iterate f x0 makes the infinite list
//  x0, f(x0), f(f(x0)), ...
//

template <template<typename> class f, typename x0> struct Iterate
{
  typedef Cons<x0, Iterate<f, f<x0> > > eval;
};

//
//  Map a function over a list
//

template <template<typename> class a, typename b> struct Map
{ typedef typename Map<a,
                       typename b::eval>::eval eval;
};

template <template<typename> class f>
struct Map<f, Nil>
{ typedef Nil eval; };

template <template<typename> class f, typename x, typename xs>
struct Map<f, Cons<x,xs> >
{
  typedef Cons<f<x>, Map<f,xs> > eval;
};

//
//  Some useful things for making fizzes and buzzes
//

struct Fizz
{ static void print(ostream & o) { o << "Fizz"; } };

struct Buzz
{ static void print(ostream & o) { o << "Buzz"; } };

struct FizzBuzz
{ static void print(ostream & o) { o << "FizzBuzz"; } };

//
//  Some useful numbers
//

typedef Succ<Zero> One;
typedef Succ<One> Two;
typedef Succ<Two> Three;
typedef Plus<Two, Three> Five;
typedef Times<Two, Five> Ten;
typedef Times<Three, Five> Fifteen;
typedef Times<Ten, Ten> OneHundred;

//
//  Booleans
//

struct True {};
struct False {};

//
//  If/then/else
//

template <typename p, typename t, typename f>
struct If
{
  typedef typename If<typename p::eval, t, f>::eval eval;
  static void print(ostream & o) { eval::print(o); }
};

template <typename t, typename _>
struct If<True, t, _>
{
  typedef t eval;
};

template <typename _, typename f>
struct If<False, _, f>
{ typedef f eval; };

//
//  Testing if x divides y
//

template <typename a, typename b, typename c>
struct _Divides
{
  typedef typename _Divides<typename a::eval,
                            typename b::eval,
                            typename c::eval>::eval eval;
};

template <typename _, typename __>
struct _Divides<_, __, Zero> { typedef False eval; };

template <typename a>
struct _Divides<a, Zero, Zero> { typedef True eval; };

template <typename a, typename b>
struct _Divides<a, Zero, b>
{
  typedef typename _Divides<a, a, b>::eval eval;
};

template <typename _, typename n, typename m>
struct _Divides<_, Succ<n>, Succ<m> >
{
  typedef typename _Divides<_, n, m>::eval eval;
};

template <typename a, typename b>
struct Divides
{
  typedef typename _Divides<a, a, b>::eval eval;
};

//
//  "Otherwise" sugar
//

template <typename a>
struct Otherwise
{
  typedef typename a::eval eval;
  static void print(ostream & o) { a::eval::print(o); }
};

//
//  Convert a number to fizzes, buzzes as appropriate
//

template <typename n>
struct toFizzBuzz
{
  typedef typename
    If< Divides<Fifteen, n>, FizzBuzz,
    If< Divides<   Five, n>,     Buzz,
    If< Divides<  Three, n>,     Fizz,
    Otherwise<                   n
    > > > >::eval eval;
};

int main(void)
{
  // Make all of the natural numbers
  typedef Iterate<Succ, One> Naturals;

  // Apply fizzbuzz rules to every natural number
  typedef Map<toFizzBuzz, Naturals> FizzBuzzedNaturals;

  // Print out the first hundred fizzbuzzed numbers
  Take<OneHundred, FizzBuzzedNaturals>::eval::print(cout);

  return 0;
}
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.