เขียนโปรแกรมในภาษาที่คุณชื่นชอบในภาษาอื่น [ปิด]


168

Real Programmer ที่กำหนดสามารถเขียนโปรแกรม Fortran ในภาษาใดก็ได้

จากโปรแกรมเมอร์จริงอย่าใช้ Pascal

งานของคุณคือการเขียนโปรแกรมด้วยภาษาโปรแกรมที่คุณเลือก แต่คุณได้รับอนุญาตให้ใช้ภาษาอื่นเท่านั้น นั่นคือทิ้งการประชุมการเข้ารหัสทั้งหมดจากภาษาหนึ่งและแทนที่ด้วยอนุสัญญาการเข้ารหัสจากภาษาอื่น ยิ่งมากยิ่งดี ทำให้โปรแกรมของคุณดูราวกับว่ามันถูกเขียนในภาษาอื่น

ตัวอย่างเช่นแฟนงูหลามที่เกลียดชัง Java สามารถเขียนโปรแกรม Python ต่อไปนี้ใน Java:

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

คนที่กระตือรือร้น Pascal บังคับให้ใช้ C สามารถเขียนสิ่งนี้:

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

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

คุณต้องเขียนโปรแกรมที่สมบูรณ์ โปรแกรมไม่จำเป็นต้องทำอะไรที่มีประโยชน์

โชคดี. นี่คือการประกวดความนิยมเพื่อให้รหัสที่มีคะแนนโหวตมากที่สุดชนะ!


1
@ m.buettner .litcoffeeสร้างไฟล์ที่มีนามสกุล มันอาจช่วย
Ismael Miguel

เล็ก ๆ น้อย ๆ ยาว (และก่อนหน้านี้เขียนและไม่ได้อยู่ในตัวเอง) สำหรับคำตอบ แต่: สแกนเนอร์ Postscript ใน Postscript ใน C
luser droog

51
ฉันไม่คิดว่าคุณ (หรือคำตอบส่วนใหญ่) เข้าใจจุดอ้างอิง ไม่ใช่ Real Programmer ที่เขียนโค้ดที่มีลักษณะเหมือนฟอร์แทรนแม้ว่าเขาจะเขียนใน Pascal หรือ LISP: เขาใช้ฟอร์แทรนในการคิดแม้ว่าจะเขียนใน Pascal หรือ LISP ก็ตาม เช่น " ตามที่โปรแกรมเมอร์จริงทุกคนรู้โครงสร้างข้อมูลที่มีประโยชน์เพียงอย่างเดียวคืออาเรย์ " คำตอบที่ดีคือรหัสโพรซีเดอร์ใน Prolog, รหัสฟังก์ชันใน C, โค้ดเชิงวัตถุใน Pascal
Peter Taylor

1
ฉันหวังว่าจะมีคนกำลังพูดภาษา Lisp อยู่ดีอะไรก็ได้นอกจากภาษา Lisp อื่น ...
itsjeyd

6
กฎข้อที่สิบของ @itsjeyd Greenspun : " โปรแกรม C หรือ Fortran ใด ๆ ที่ซับซ้อนพอสมควรมี ad-hoc, ad-hoc ที่ระบุอย่างไม่เป็นทางการ
Joshua Taylor

คำตอบ:


142

C ใน C ++

#include <stdio.h>

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

60
ฉันเห็นสิ่งที่คุณทำที่นั่น;)
el.pescado

27
นั่นเป็นกลอุบายที่ถูกเพราะเห็นว่า C ++ นั้น 'เข้ากันได้ย้อนหลัง' กับ C.
Agi Hammerthief

5
@AlexM ฉันคิดว่ามันจะมีมากขึ้นในจิตวิญญาณของคำถามว่านี่คืออีกต่อไป (ขั้นตอน) ตัวอย่างที่ชัดเจนจะได้รับประโยชน์จากการใช้บางชั้นเรียนและใช้สำนวนอื่น ๆ C ที่บางความดี STL จะเหมาะสมมากขึ้น (พูดchar*แทนstd::string)
Martin Ender

47
ใช้ได้ใน C, C ++, Objective-C และ Objective-C ++! ช่างเป็นคำตอบที่ยอดเยี่ยมมาก
nneonneo

7
@BenJackson Psh โปรแกรมเมอร์ C จริงใช้char *argv[]!
โทมัส

122

x86 ชุดประกอบใน GNU C

ไม่ฉันไม่เพียง แต่ใช้asmคำหลักเนื่องจากคำถามที่สร้างขึ้นนี้มีไว้สำหรับโปรแกรมเมอร์จริง ๆ ... สิ่งนี้ควรทำงานได้ดีบน ARM

(เพียงเพื่อพิสูจน์ประเด็นฉันไม่ได้ "เขียน" การชุมนุมเลย - เป็นผลลัพธ์ที่ผลิตโดยGCC Clang (503.0.38) สำหรับโค้ดที่ใส่ความเห็นที่ด้านบนแปลมาเป็นมาโครแบบสุ่ม)

ใช้งานได้ในโหมด 32 บิตเท่านั้น ที่ปรับตั้งแต่จริงรหัสโปรแกรมเมอร์ขนาดคำต่อไป

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

เพียงแค่ดูที่ปลดเปลื้องเหล่านั้นทั้งหมด Casts หมายถึงฉันrealerโปรแกรมเมอร์กว่าคอมไพเลอร์ใช่มั้ย?


8
+1 นั่นคือ ... บิด ;) ฉันชอบวิธีที่คุณจัดการเป็นcallพิเศษ
Ilmari Karonen

2
ว้าว. นั่นเป็นงานชิ้นใหญ่
Jack Aidley

ฉันมีแอสเซมเบลอร์สำหรับ C64 ที่ทำงานแบบนี้ มันเพิ่มคำหลักพื้นฐานสำหรับคำแนะนำทั้งหมด 6510 และฉันจำได้ว่าคุณล้อมfor pass=1:3...nextรอบมัน การดำเนินการในตัวแปลภาษาเบสิกได้ประกอบเข้าด้วยกัน
เบ็คแจ็คสัน

5
นี่คือบทกวีบริสุทธิ์
Nicu Stiurca

1
นี่คือคนแกร่งคอมไพเลอร์แน่ใจว่าประหลาดใจ
internets ทำจาก catz

102

ภาษาอังกฤษในภาษาซี

#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

ความคิดใดที่จะกำจัด;?


18
อย่างจริงจังพวกคุณ
Kyle Strand

2
ทำไมต้องกำหนดtheสองครั้ง
Joshua Taylor

16
ปลอดภัยกว่าดีกว่าขออภัย ;-)
urzeit

20
ตอนนี้ทำให้มันเป็นไฮกุ
Nicu Stiurca

1
คุณสามารถ#define . ;
mbomb007

74

Brainfuck ใน JavaScript

Javascript เป็นภาษาที่ยาก! ให้เราใช้ Brainfuck เป็นภาษาที่เข้าใจได้มากกว่า: 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)')
)

ฉันเดาว่าฉันเขียนล่ามสมองใน javascript

ตัวอย่างข้างต้นเป็นเพียงแค่ ouputs Hello World!และละเว้นอินพุต (ไม่มี,สัญลักษณ์)
แต่นั่นใช้ได้กับอินพุตด้วย! ตัวอย่างเช่นลอง,+>,+>,+>,+<<<.>.>.>.พิมพ์golfในช่องโต้ตอบ มันจะใส่ตัวละครตัวต่อไปในตาราง ASCII:hpmg

แก้ไข : คำอธิบายสั้น ๆ สำหรับคนที่ไม่รู้จัก brainfuck
ลองนึกภาพอาร์เรย์ที่ไม่มีที่สิ้นสุดของจำนวนเต็มaเริ่มต้นให้เป็นศูนย์ทุกตัวชี้ในองค์ประกอบหนึ่งของอาร์เรย์นี้และการป้อนข้อมูลของผู้ใช้i Brainfuck เป็นเรื่องง่ายที่จะเรียนรู้ แต่เขียนยาก: u

  • + การเพิ่มขึ้นของมูลค่าปัจจุบัน: a[i]++
  • - ลดลงมัน: a[i]--
  • > ทำให้ชี้ไปที่องค์ประกอบต่อไป: i++
  • < ก่อนหน้า : i--
  • [และ]กำหนดลูปที่แบ่งเมื่อค่าปัจจุบันเป็นศูนย์:while (a[i]) { ... }
  • . พิมพ์องค์ประกอบปัจจุบัน: String.fromCharCode(a[i])
  • , ตั้งองค์ประกอบปัจจุบันด้วยการป้อนข้อมูลของผู้ใช้: u.charCodeAt(...)

22
+1 สำหรับอารมณ์ขันในการระบุว่า brainfuck นั้นเข้าใจได้ง่ายกว่า JavaScript
Agi Hammerthief

คุณแน่ใจหรือว่าตัวละคร Brainfuck ที่อยู่ในreplaceข้อความสั่งไม่ส่งผลกระทบต่อโปรแกรม?
Fraxtil

3
@fra ไฟล์นี้ไม่ได้เป็นโปรแกรม brainfuck มันเป็นโปรแกรมจาวาสคริปต์ที่มีโปรแกรม brainfuck ที่ถูกแปลงเป็นจาวาสคริปต์ที่รันไทม์
undergroundmonorail

3
ดี--iกว่าเร็วกว่าi--ไหม ดูเหมือนเท็จตั้งแต่ปีjsperf.com/decrementgolf
Michael M.

4
สิ่งนี้ไม่เพียง แต่เป็นความคิดสร้างสรรค์ที่ส่งผลต่อการประกวดเท่านั้น +10 ถ้าฉันทำได้!
SebastianH

74

ฉันคิดว่าLennart Augustsson ที่ยอดเยี่ยมได้รับรางวัลนี้มาแล้วสองครั้ง

อันดับแรกนี่คือตัวอย่างของการใช้งาน "การแฮ็ควันหยุดสุดสัปดาห์" ของเขาในการใช้งาน BASIC ในฐานะ Haskell Monadic DSL จากปี 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

มันทำงานได้โดยการบรรทุกประเภทจำนวนมากเกินไป หมายเลขบรรทัดเป็นฟังก์ชันที่รับอาร์กิวเมนต์จริงๆ บรรทัดที่เหลือเป็นอาร์กิวเมนต์ของฟังก์ชัน ฟังก์ชันส่งคืนการแทนทรีบทคัดย่อของไวยากรณ์สำหรับล่ามพื้นฐานเพื่อไปทำงานต่อ

ฉันขอแนะนำให้คุณตรวจสอบรายการของ Augustsson ในการประกวด C International Obfuscated C ซึ่งเขาสามารถบีบให้เป็น 4k:

  • bytecode ล่ามเขียนในส่วนย่อยของ C (ซึ่งเขาเรียกว่า Obfuscated C)
  • ปกปิด C -> bytecodeคอมไพเลอร์เขียนใน bytecode

พวกเขาสามารถแชร์ไฟล์เดียวกันได้เพราะ byetecode ถูกวางไว้ในคอมเม้นท์ C

ไม่กี่ปีที่ผ่านมาตั้งแต่ฉันติดตามงานของ Augustsson ดังนั้นอาจมีสิ่งที่ยอดเยี่ยมอื่น ๆ ที่เขาคิดขึ้นมาหลังจากนั้น ....


2
มันคือ Augustsson ไม่ใช่ Augustssen
Hans Lundmark

@HansLundmark ขอบคุณ ซ่อมมัน.
Pitarou

71

PHP และ Javascript

นี่คือรูปหลายเหลี่ยม:

คุณสามารถเรียกใช้รหัสนี้ในทั้งสองภาษา:

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

เคล็ดลับที่นี่คือ Javascript ใช้ลำดับหนีในสตริงที่เริ่มต้นด้วยและ' บนมืออื่น ๆ , PHP เพียงใช้ลำดับหนีในสตริงที่เริ่มต้นด้วยและ"
"<<<

จากนั้นเราประกาศฟังก์ชั่นprintfซึ่งคล้ายกับprintแต่ส่งออกสตริงที่จัดรูปแบบใน PHP

PHP ต้องการให้ vars เริ่มต้นด้วย$, ในขณะที่ Javascript อนุญาตให้ทำได้


ไม่มีใครใช้Array(…)JS และมันชัดเจนarray(…)ใน PHP […]จะดีกว่า;)!
Blackhole

12
ฉันไม่สนใจว่าคนใช้Array()ใน JS หรือไม่: ฉันสนใจว่าฉันมีพูดได้หลายภาษาTRUE ฉันทำอย่างใดอย่างหนึ่งที่เลวร้ายที่สุดอาชญากรรม JS ด้วยรหัสนี้ แต่ทั้งหมดที่ฉันต้องการก็คือว่ามันจะทำงานและไม่แน่นอนสิ่งเดียวกันในทั้งสอง แต่มองเช่น JS และ PHP ในเวลาเดียวกัน
Ismael Miguel

และ btw, [...]ไม่ถูกต้องใน PHP <5.4.0, ซึ่งไม่ดี ....... ถ้าฉันโยนมันลงใน PHP 4, 5 หรือ Javascript, ฉันคาดว่ามันจะทำงานได้, แทนที่จะให้ข้อผิดพลาดทางไวยากรณ์ทุกที่
Ismael Miguel

2
หากคุณต้องการให้โค้ดของคุณดูเหมือน JS คุณต้องใช้[…]ซึ่งดูเหมือนจะเป็นมาตรฐานที่ดีใน PHP ดังนั้นจึงเป็นไปได้สำหรับเป้าหมายของคุณ และยังไงก็ตาม PHP <5.4? ถึงเวลาอัปเดตแล้ว…
Blackhole

8
ความเข้ากันได้สำคัญกว่า "รูปลักษณ์" และArrayเป็นชื่อที่ถูกต้องของตัวสร้างวัตถุของอาร์เรย์ โดยทั่วไปใช้เป็นเช่นเดียวกับ[] Array()ฉันไม่เห็นอะไรเลวร้ายกับมัน แต่ฉันมีคำถามง่ายๆคำถามหนึ่ง: ใช้ได้ไหม (btw ฉันต้องใช้ php 5.3.28 ในที่ทำงาน)
Ismael Miguel

55

Brainfuck ใน JS

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

12
ฉันไม่เห็น brainfuck ใด ๆ ที่นี่ ไม่แม้แต่ตัวอักษรเดี่ยวใน><,.-
Michael M.

8
@Michael: ใครบอกว่ามันไม่ใช่โปรแกรมที่สร้างวงวนไม่สิ้นสุด?
Konrad Borowski

19
JSF * ck นี้คืออะไร

8
วิธีบนโลกที่มันไม่ทำว่า ?
nandhp

4
Oo ในที่สุดก็มีคนทำเช่นนี้ ฉันใช้เวลาพยายามหาวิธีเขียนโปรแกรม JS โดยใช้เฉพาะอักขระ +! [] () แต่ไม่สามารถคิดออกได้เลย ฉันจำเป็นต้องวิเคราะห์สิ่งนี้เมื่อฉันมีเวลา ...
Matti Virkkunen

54

นี่คือหนึ่งในผู้ชนะ IOCCC ในปี 2005ซึ่งเป็นโปรแกรม C ที่ยกเว้นการกำหนดจำนวนมากนั้นดูเหมือนโปรแกรม 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
คำฟุ่มเฟื่อยที่ดีที่สุด
qwr

39

C ++ ใน C

ตกลงดังนั้นคุณเป็นโปรแกรมเมอร์ C ++ แต่ถูกบังคับให้ใช้ C? ไม่มีปัญหาคุณต้องเขียนหัวข้อเสริมที่หายไปใน C ตัวอย่างเช่นโปรแกรม Hello World ที่ถูกต้องใน C:

ในไฟล์ส่วนหัวเสริมiostreamเขียน:

#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

ในไฟล์stringเขียน

#define string

ในไฟล์helloworld.c(รหัส C จริงของคุณ) เขียน

#include <iostream>
#include <string>

using namespace std;

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

และเมื่อคอมไพล์helloworld.cด้วยคอมไพเลอร์ C สั่งให้คอมไพเลอร์มองหา<...>ไฟล์ส่วนหัวทุกที่ที่คุณเก็บไฟล์iostreamและstringเช่นถ้าคุณกำลังคอมไพล์ด้วย gcc และวางไฟล์iostreamและstringในไดเรกทอรีปัจจุบันให้คอมไพล์ด้วย

gcc helloworld.c -o helloworld -I.

หมายเหตุ: volatileส่วนหัวiostreamอยู่ที่นั่นเพื่อเปิดใช้งานการคอมไพล์แบบไม่มีคำเตือนแม้ในระดับการเตือนสูงสุด (การอ่านจากตัวแปรระเหยจะถือว่ามีผล)


3
นี่คือการหมุนรหัสเล็กน้อยใช่ไหม
Mr Lister

โปรแกรมทำสิ่งที่ดูเหมือนจะทำใช่มั้ย
celtschk

8
สนุกสนานและน่าประทับใจกว่านี้ใน C ++
Kyle Strand

คอมไพเลอร์ชนิดใดที่เตือนถ้าคุณไม่ได้ใช้volatileที่นี่และคำเตือนประเภทใด
R. Martinho Fernandes

1
@ KyleStrand แต่ "C ใน C ++" มีความสอดคล้องกับคำพูดในคำถาม โปรแกรมโปรแกรมเมอร์จริงใน C แม้ว่าพวกเขาจะมีคอมไพเลอร์ C ++
Mr Lister

36

CQL - ภาษาของแบบสอบถามที่มีคาเฟอีน

(หรือ "SQL บน Caffeine")

สิ่งนี้อาจมีความทะเยอทะยานมากเกินไป นี่คือความพยายามที่จะเขียน SQL (ish) รหัสที่เปิดเผยในCoffeeScript นี้ต้องใช้คุณลักษณะพร็อกซี ECMAScript 6 --harmony-proxiesคุณสามารถทดสอบในโหนดกับ

มาตั้งค่าเทมเพลตสำหรับกำหนดพร็อกซี (นำมาจากความคิดเห็นของ Benvie เกี่ยวกับปัญหานี้ )

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

ตอนนี้กำหนดวัตถุพร็อกซีและตัวแปรและฟังก์ชั่นทั่วโลกที่น่าสงสัย

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

นั่นมันค่อนข้างเซ็ตอัพมาก! แต่ตอนนี้เราสามารถทำสิ่งต่อไปนี้ (อินพุต / เอาต์พุตในสไตล์คอนโซล):

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

มันไม่ได้เป็นภาษาพูดได้จริง แต่นั่นไม่ใช่ประเด็น ฉันรู้ว่า@ใช้สำหรับตัวแปรใน SQL แต่ฉันต้องการ@ชื่อคอลัมน์และตารางทั้งหมดเนื่องจากฉันไม่พบวิธีที่จะใช้พร็อกซีออบเจกต์ร่วม (และฉันจะไม่แปลกใจถ้ามันเป็นไปไม่ได้จริง ๆ - และสำหรับ เหตุผลที่ดี)

ฉันยังเปลี่ยนวงเล็บบางส่วนเป็นวงเล็บปีกกา (โดยเฉพาะหลังจากVALUESและIN) น่าเสียดายที่สิ่งที่ฉันไม่สามารถหาได้ทั้งหมดเป็นวิธีที่จะอนุญาตให้มีเงื่อนไขปกติเช่นyear > 2000เพราะพวกเขาจะประเมินเป็นบูลีนทันที

ยังคงมีลักษณะเช่น SQL และมีความชัดเจนมากกว่าความจำเป็น / หน้าที่ / เชิงวัตถุดังนั้นจึงควรมีคุณสมบัติเหมาะสมสำหรับคำถาม ฉันคิดจริงๆถ้าฉันขัดรหัสเล็กน้อยและรองรับคุณสมบัติเพิ่มเติมอีกสองสามครั้งนี่อาจเป็นโมดูล CoffeeScript ที่มีประโยชน์

อย่างไรก็ตามมันสนุกมาก! :)

สำหรับผู้ที่ไม่คุ้นเคยกับ CoffeeScript คำสั่ง SQL จะรวบรวมไปยัง JavaScript ต่อไปนี้:

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

นั่นค่อนข้างมากในการตั้งค่า แต่ดูดี ฉันไม่ใช่โปรแกรมเมอร์ CoffeeScript แต่มันก็ดูดี ใช้@ใน SQL สำหรับตัวแปรเซสชัน
Ismael Miguel

ฉันตัดสินใจที่จะทำให้คำหลักเป็นสากลในขณะนี้ ขณะนี้มีเพียง@ชื่อคอลัมน์และตาราง
Martin Ender

ตอนนี้มันดูเหมือน SQL! คุณทำได้ดีมากกับอันนี้!
Ismael Miguel

1
ฉันไม่สนใจกาแฟมากนัก แต่มันยอดเยี่ยมมาก
KRyan

2
@tac ขอบคุณ แต่ไม่มีฉันเพิ่งแฮ็คมันด้วยกันสำหรับความท้าทาย เรื่องบังเอิญที่ตลก: การทำซ้ำในวิธีที่สะอาดและวางไว้บน GitHub คือรายการโครงการเขียนโค้ดที่อาจเกิดขึ้น / ระยะยาวของฉันจนกว่าฉันจะลบออกเมื่อเช้านี้
Martin Ender

27

Visual Basic 6 (ใน 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()

มันยังทำงานใน VBScript


1
ฉลาด. คุณไม่ต้องการเซมิโคลอนส่วนใหญ่
js1568

@ js1568 ขอบคุณ! ตอนนี้ฉันได้ลบเซมิโคลอนที่ไม่ต้องการออกแล้ว
แปรงสีฟัน

20

F # ใน C ++

ค่อนข้างผิดเพี้ยนและน่ารังเกียจของ preprocessor ฉันคิดว่ามันสนุกที่จะเปลี่ยน C ++ ให้ดูเหมือนภาษาที่แตกต่างอย่างสิ้นเชิงแทนที่จะใช้นามแฝงสองสามตัวเพื่อทำให้ดูเหมือน Java หรือ PHP ฉันไม่ได้คาดหวังว่าสิ่งนี้จะได้รับ upvotes มากมายมันเป็นรายการที่สนุกสนาน

#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

ลองมันนี่

การเขียนสิ่งที่น่าเศร้าให้กับ STDOUT เป็นเรื่องเกี่ยวกับสิ่งที่ทำได้แม้ว่าฉันจะแน่ใจว่าถ้ามีใครขว้างปาคาถามากพอที่จะทำมันได้มากกว่านี้


2
สำหรับบรรทัดสุดท้ายในการทำงานใน F # มันจะอย่างใดอย่างหนึ่งจะต้องมีหรือเพียงแค่exit 0 0
Jwosty

20

Python และ ... ไม่มีใครคาดเดาได้ (แก้ไข: dc)

นี่คือรหัสไพ ธ อนที่ถูกต้อง แต่จริงๆแล้วโปรแกรมเขียนด้วยภาษาที่แตกต่างกันมาก:

# 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

รหัสทำงานในทั้งสองภาษาโดยไม่มีข้อผิดพลาด

การรวมกันนั้นบ้ามาก ฉันยินดีที่จะรอสักวันหรือสองวันก่อนจะบอกว่าเป็นภาษาอื่น กรุณาแสดงความคิดเห็นเพื่อคาดเดา

แก้ไข:ภาษาเป็นภาษาที่ใช้สแต็กจาก dc คุณอาจจะดูที่นี่คำหลักที่รู้จักกันดีเช่นfor, if, or, inแต่ตัวอักษรที่สำคัญ! สิ่ง,ที่ไม่มีความหมายใน dc ถูกเปลี่ยนเป็นรีจิสเตอร์เนื่องจากครั้งแรกที่ปรากฏคือหลังจากตัวอักษรs(เหมือนกันสำหรับ:)


1
ยกเว้นว่ารหัสจะทำสิ่งเดียวกันทั้งสองภาษาฉันคิดว่าภาษาอย่าง Befunge สามารถทำเคล็ดลับได้
Thomas Eding

ตกลงฉันแก้ไขรหัสเพื่อใส่ภาษาที่ฉันเลือกจริง
โทมัสบารูเชล

18

C ++ ช่วยให้คุณสามารถเขียนโค้ดที่คล้ายเสียงกระเพื่อมกับไลบรารี 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();

cf เลย http://www.informatimago.com/articles/life-saver.html


4
ยินดีต้อนรับ! เราขอให้ผู้ใช้ตั้งค่าสถานะโพสต์เป็น Community Wiki เมื่อคำตอบไม่ใช่งานของตนเอง (และให้การแสดงที่เหมาะสม แต่คุณทำไปแล้วขอขอบคุณ!)
Jonathan Van Matre

เดิมหรือไม่คุณมีคะแนนของฉัน :)
itsjeyd

15

C # ในช่องว่าง

โอเคลองดูหนึ่งในสิ่งเหล่านี้ก่อนดังนั้นเรามาดูกันว่ามันจะเป็นอย่างไร

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!

และในกรณีที่การจัดรูปแบบเป็นเรื่องใหญ่มากโดยไม่ต้องใส่ช่องว่างสี่ช่องที่ด้านหน้าของแต่ละบรรทัดนี่ก็เป็นอีกครั้งด้วย สำหรับ space และ # สำหรับแท็บ:

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 และ CSS

ไม่ใช่ภาษาโปรแกรม แต่…เอกสารนี้เป็น HTML และ CSS ที่ถูกต้อง:

<!-- 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>
<!-- */ -->

ใช้งานได้เนื่องจากความคิดเห็น HTML ได้รับอนุญาตในสไตล์ชีทด้วยเหตุผลทางประวัติศาสตร์ Oh, และทุกเอกสาร HTML ที่ถูกต้องเป็นโปรแกรม PHP ที่ถูกต้องมากเกินไปดังนั้นนี้ยังเป็นPHP :)


2
ที่ค่อนข้างตลกและทั้งหมดแต่นี้ไม่ได้จริงๆเป็นความท้าทายที่พูดได้หลายภาษา
Martin Ender

เนื่องจากCSS อาจถือว่าเป็นการทำให้สมบูรณ์ดังนั้นนี่อาจเป็นคำตอบที่ถูกต้อง
Adam Davis

2
HTML และ CSS ไม่ใช่ภาษาการเขียนโปรแกรม :)
Jet

9

C ในสกาลา

bridging layer เลียนแบบยุคโรแมนติกยิ่งขึ้นเมื่อสตริงยังคงเป็นอาร์เรย์ที่ถูกยกเลิกค่าเป็นไบต์

// 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!"
fooled

8

sed และ APL

เจ้านายของฉันต้องการให้ฉันเขียนสคริปต์แบบสบาย ๆ แต่ฉันชอบที่จะเขียน APL ตลอดทั้งวัน อย่างไรก็ตามเขามีความสุขมากกับงานของฉันเพราะสคริปต์ดังกล่าวทำงานอย่างสมบูรณ์แบบกับรุ่นของเขา:

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

คุณสามารถลองบนเว็บไซต์ใหม่ของฉันด้วยลิงก์นี้ มันเป็นคอมไพล์ใน GNU รุ่นจาวาสคริปต์ การเปิดตัวสุดท้ายจะมาพร้อมกับ GNU APL, v. 1.3 อย่างเป็นทางการ แต่คุณสามารถใช้งานได้อย่างสมบูรณ์แบบสำหรับ Permalinks ของคุณหากคุณสนุกกับ 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)));
    };
}

แน่นอนเนื่องจากcmainไม่ได้ทำอะไรกับargcหรือargvรหัสอาร์กิวเมนต์ -marshaling ไม่มีผลและเนื่องจากcmainส่งกลับ 0 เสมอสาขา "อื่น" ของคำสั่ง "ถ้า" จะตาย แต่คำสั่ง "ถ้า" ไม่ได้ทำอะไรเลย

การจัดฟันและเครื่องหมายอัฒภาคทั้งหมดไม่จำเป็นเช่นเดียวกับวงเล็บและdoคำหลักบางคำ ว่า "ถ้า" if exitCode == 0 then exitWith ExitSuccess else exitWith (ExitFailure (fromIntegral exitCode))คำสั่งจะได้รับการเขียนเป็น


7

C ++ ใน 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";
}

ไม่ใช่โซลูชันที่ยืดหยุ่นที่สุด แต่ใช้ได้ถ้าเขียนตามที่แสดง


7

Haskell ใน Java

("วานิลลา" Java 7 ไม่ใช่ Java 8) (ใช่ฉันรู้ว่าประสิทธิภาพของซากปรักหักพังชกมวยและแม้กระทั่งการพยายามใช้ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นจะทำให้ verbose บ้า: D)

Java มีไวยากรณ์ที่เข้มงวดมากดังนั้นแทนที่จะเปลี่ยนไวยากรณ์ฉันพยายามทำให้โค้ดมีความคล้ายคลึงกับสไตล์ Haskell มากกว่า

แก้ไข - เพิ่มแอปพลิเคชั่นฟังก์ชั่นบางส่วน

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

(ใช่ทุกอย่างที่ความบ้าคลั่งนี้กำลังคำนวณ6!)


6

COBOL ใน AWK

ในจิตวิญญาณของคำพูด บริสุทธิ์ AWK ที่ไม่บริสุทธิ์ตามที่เขียนโดยโปรแกรมเมอร์ภาษาโคบอล

ภารกิจคือการนับระเบียนในไฟล์ เวอร์ชันการพัฒนาก่อนหน้านี้กำลังนับตัวเองสำหรับการทดสอบ ไฟล์ที่ถูกต้องจะถูกฮาร์ดโค้ดในภายหลังเมื่อออกจากการทดสอบหน่วย

หากฉันได้รับการเน้นไวยากรณ์เพื่อทำเรืองแสงสีเขียวบนสีดำมันจะดีมาก ...

แม้จะมีหมายเลขคอลัมน์ที่ถูกต้องในที่นี้นั่นคือเจ็ดช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัด (ไม่เคยทำมาก่อนหน้านี้ใน awk) และทำลายงบพิมพ์ยาวที่คอลัมน์ 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 (หรืออะไรก็ได้) ใน Racket

โมดูลและระบบยืดหยุ่นของแร็คเก็ตของแร็กเก็ตอนุญาตให้ใช้การสนับสนุนโมดูลสำหรับภาษาใหม่ทั้งหมดทั้งในส่วนของโดเมนและสำหรับวัตถุประสงค์ทั่วไป มีการสนับสนุนนอกกรอบสำหรับทั้งDatalogและAlgol 60ดังนั้นต่อไปนี้เป็นโปรแกรม Racket ที่ถูกต้อง:

#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

นอกจากนี้คุณยังสามารถเพิ่มการสนับสนุนสำหรับภาษาอื่น ๆ เช่นดูคำอธิบายของDanny Yoo เกี่ยวกับวิธีการใช้การสนับสนุน Brainfuck ซึ่งอนุญาตให้โปรแกรม Racket เช่น:

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

และเนื่องจากการสนับสนุนถูกเพิ่มในระดับโมดูลที่คอมไพล์แล้วจึงเป็นไปได้ที่จะเชื่อมโยงโมดูลที่เขียนในภาษาที่แตกต่างกันหรือฝังตัวอย่างของภาษาหนึ่งในโมดูลที่เขียนในอีกภาษาหนึ่ง


5

SML ใน Java

ฉันยังมีรหัสโบราณบางส่วนตั้งแต่เมื่อฉันเริ่มเรียนรู้ Java และพยายามที่จะใช้มันในรูปแบบการทำงาน ทำความสะอาดขึ้นเล็กน้อย:

/**
 * 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 ใน Perl

อาจนับเป็นการละเมิดกฎ แต่ฉันไม่สนใจ เห็นได้ชัดว่ามันดูเหมือนโปรแกรม Java มันพิมพ์ตัวเลข 20 Fibonacci ในกรณีที่ไม่ชัดเจน

ต้องการติดตั้งโมดูลInline :: Java

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 และ ... ไม่มีใครจะเดาได้ (แก้ไข: dc)

นี่คือรายการที่สองของฉัน นี่คือโค้ด J ที่ถูกต้องซึ่งส่งคืน 1:

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

ฉันรอหนึ่งหรือสองวันก่อนจะบอกว่าเป็นภาษาอื่นที่ใช้โค้ดเดียวกันกับไม่มีข้อผิดพลาด เพียงแสดงความคิดเห็นเพื่อพยายามเดา

แก้ไข:ภาษาอื่น ๆ เป็นภาษาที่ใช้สแต็คจากเครื่องคิดเลข Unix โบราณ dc


3
มันทำงานโดยไม่มีข้อผิดพลาดใน GolfScript, BF, HQ9 + ...
ปีเตอร์เทย์เลอร์

ตกลงฉันไม่ทราบว่าหลายภาษาสามารถทำได้ ฉันแก้ไขรหัสเพื่อใส่ภาษาที่ฉันเลือก
โทมัสบารูเชล

@ ברוכאלมันทำงานโดยไม่มีข้อผิดพลาดในภาษาเหล่านั้นเพราะภาษาเหล่านั้นไม่มีข้อผิดพลาดหรือไม่มีข้อผิดพลาดที่ใช้กับรหัสนี้ เช่น. Brainfuck ละเว้นอักขระทั้งหมดที่ไม่ได้อยู่ใน.,+-<>[]โปรแกรมของคุณเทียบเท่ากับ...[.]+brainfuck ซึ่งเป็นโปรแกรมที่ถูกต้อง แต่ไม่มีประโยชน์ AFAIK โปรแกรม brainfuck []เท่านั้นที่สามารถไม่ถูกต้องโดยมีที่ไม่ตรงกัน
immibis

@immibis นี่เป็นเท็จ dc เป็นเครื่องคิดเลขเก่าและฉันสามารถมั่นใจได้ว่าการเปลี่ยนสิ่งหนึ่งในรหัสของฉันจะทำให้เกิดข้อผิดพลาด ฉันใช้เวลาส่วนหนึ่งของรหัสเพื่อหาวิธีวางจดหมายตามลำดับที่ถูกต้อง โค้ดของฉัน Postscript / dc ค่อนข้างสุดขีด: ไม่มีข้อผิดพลาด แต่การเปลี่ยนแปลงอะไรจะทำให้มันผิด dc ไม่มีส่วนเกี่ยวข้องกับ "ภาษาเหล่านั้น" dc มีอายุมากกว่า 20 ปีหรือมากกว่า 30 ปีที่ "ภาษาเหล่านั้น" มันถูกติดตั้งโดยทั่วไปในการกระจาย Linux ใด ๆ โปรดเรียกดูเล็กน้อยถ้าคุณยังไม่เคยได้ยิน
โทมัสบารูเชล

1
@ ברוכאלคุณเข้าใจผิด - ฉันกำลังพูดถึง brainfuck, HQ9 +, golfscript, ฯลฯ - ไม่ใช่ dc
immibis

4

dc กำลังเรียกใช้ไฟล์ PostScript

dc สามารถเรียกใช้โค้ดต่อไปนี้โดยไม่มีข้อผิดพลาด:

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 / (เข้มงวด) Haskell ใน Java

นี่คือจากโครงการจริงจริง มันใช้โครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบถาวรและใช้การเรียกซ้ำแม้ว่าจะไม่จำเป็นก็ตาม ที่จริงแล้วมันเป็นเหมือน Kore (ภาษาที่ใช้ในโครงการ) ใน Java แต่สไตล์นั้นเหมือนกับ ML แต่ปรัชญาของ Kore ก็คือผู้เขียนไม่ควรจัดรูปแบบรหัสของเขาดังนั้นจึงไม่มีการจัดรูปแบบโค้ด Java ใด ๆ (มันถูกจัดรูปแบบอัตโนมัติโดย eclipse)

ปล่อยองค์ประกอบ n จากรายการ :

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

ใน ML / Haskell ที่คุณควรที่จะตรงกับรูปแบบที่จะดึงหัวและหางที่นี่คุณพูดและlist.cons().xlist.cons().tail

แทรกองค์ประกอบในรายการ :

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

รายการจะถูกกำหนดอย่างแท้จริงว่าจะกำหนดประเภทข้อมูลเกี่ยวกับพีชคณิตอย่างไร นี่คือเวอร์ชันที่นำแผ่นสร้างที่สร้างโดย eclipse ออก:

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

นี่คือโครงสร้างข้อมูลแผนที่ที่นำมาใช้ในแง่ของ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;
  }
}

ประเภทเริ่มใช้พื้นที่มากพอ ๆ กับรหัส ตัวอย่างเช่นในการใส่วิธีการมี 302 ตัวอักษรประเภทและ 343 ตัวอักษรของรหัส (ไม่นับพื้นที่ / ขึ้นบรรทัดใหม่)


2

พื้นฐานในทับทิม

ใช้งานมานานแล้ว แหล่งที่มาอยู่บน GitHub แรงบันดาลใจจากสิ่งที่คล้ายกันในสกาล่า

ติดตั้ง

#!/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__)

รหัสพื้นฐาน

#!./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 ในเทมเพลต C ++

ฉันสร้าง FizzBuzz นี้ในเทมเพลต C ++ เมื่อไม่กี่เดือนที่ผ่านมา มันค่อนข้างใช้งานของรหัส Haskell ต่อไปนี้ทั้งหมดในแม่แบบ C ++ ในความเป็นจริงแม้แต่เลขคณิตเลขจำนวนเต็มถูกนำมาใช้ใหม่ที่ระดับประเภท - สังเกตว่าไม่มีแม่แบบใดใช้พารามิเตอร์ int!

รหัส 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..]

และเวอร์ชันเทมเพลตการเขียนโปรแกรม 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.