お気に入りの言語で別の言語でプログラムを書く[終了]


168

本物のプログラマーは、Fortranプログラムを任意の言語で作成できます。

本物のプログラマからのパスカルを使用しないでください

あなたの仕事は、選択したプログラミング言語でプログラムを書くことですが、別の言語のみを使用することが許可されています。つまり、1つの言語のすべてのコーディング規則を破棄し、それらを他の言語のコーディング規則に置き換えます。より良い。プログラムを別の言語で書かれているように見せます。

たとえば、Javaを嫌うPythonファンは、Javaで次のPythonプログラムを作成できます。

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

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。役立つかもしれません。
イスマエルミゲル14年

回答には少し長い(そして以前に作成された、自己完結型ではありません)が、Cの PostscriptのPostscriptスキャナー
luserのドローグ

51
あなた(または回答の大半)が引用の要点を理解していないと思います。本物のプログラマがPascalやLISPで書いているにもかかわらず、Fortranのように字句的に見えるコードを書いているわけではありません。PascalやLISPで書いているときでも、Fortranの考え方を適用します。例:「すべての本物のプログラマが知っているように、唯一の有用なデータ構造は配列です。」すばらしい答えは、Prologの手続き型コード、Cの機能コード、Pascalのオブジェクト指向コードです。
ピーターテイラー14年

1
私は、誰かのつもりでも、中のLisp方言、何でもやる願うのLisp方言...
itsjeyd

6
@itsjeyd Greenspunのプログラミングの第10規則:「十分に複雑なCまたはFortranプログラムには、CommonLispの半分の、アドホックで、非公式に指定された、バグに乗った、遅い実装が含まれています。」
ジョシュアテイラー14年

回答:


142

C ++のC

#include <stdio.h>

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

60
あなたがそこで何をしたかわかります;)
el.pescado 14年

27
まあ、それはC + +がCと「後方互換性」であるため、安価なトリックです。
Agi Hammerthief 14年

5
@AlexM。これがいくつかのクラスを使用することから明らかに恩恵を受け、STLの良さがより合理的である他のCイディオムを使用するより長い(手続き型)例であった場合、それは質問の精神にあると思います(例えば、char*代わりにstd::string)。
マーティンエンダー14年

47
C、C ++、Objective-Cの、で有効のObjective-C ++!なんて素晴らしい多言語回答でしょう。
nneonneo 14年

7
@BenJackson Psh、本物の Cプログラマーが使用しますchar *argv[]
トーマス

122

GNU Cのx86アセンブリ

いいえ、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
    ))
}

それらすべてのキャストを見てください。私は平均キャストrealer右、コンパイラよりもプログラマ?


8
+1、それは...ねじれています。;)call特にあなたの扱い方がとても好きです。
イルマリカロネン14年

2
ワオ。それは素晴らしい仕事です。
ジャックエイドリー14年

私はC64用のアセンブラーを持っていて、それはこのように機能していました。6510のすべての命令にBASICキーワードを追加しましたがfor pass=1:3...next、それを包み込んだことは覚えています。BASICインタプリタで実行すると、組み立てられました。
ベンジャクソン14年

5
これは純粋な詩です。
ニクスティウルカ14年

1
これはタフな男であり、コンパイラーはきっと驚くでしょう。
インターネットはcatzで作られています14年

102

Cの英語

#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
真剣に、皆さん。
カイルストランド14年

2
なぜthe2回定義するのですか?
ジョシュアテイラー14年

16
申し訳ありませんが安全です;-)
urzeit 14年

20
それを俳句にしましょう。
ニクスティウルカ14年

1
できます#define . ;
-mbomb007

74

JavaScriptのBrainfuck

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でbrainfuckインタプリタを書いたと思います。

上記の例は、単にHello World!入力し、入力を無視します(,記号なし)。
しかし、それは入力でも機能します!たとえば、ダイアログに,+>,+>,+>,+<<<.>.>.>.入力golfしてみてください。ASCIIテーブルの次の文字を出力します。hpmg

編集:brainfuckを知らない人々のための短い説明。どこでもゼロに初期化された
整数の無限配列、aこの配列の1つの要素へのポインターi、およびユーザー入力を想像してくださいu
Brainfuckは本当に簡単に学べますが、書くのは難しいです:

  • + 現在の値に増分します: a[i]++
  • - それを減らす: a[i]--
  • > ポインタが次の要素を指すようにします: i++
  • < 以前 : i--
  • [そして]、現在の値がゼロのときに中断するループを定義します:while (a[i]) { ... }
  • . 現在の要素を印刷する: String.fromCharCode(a[i])
  • , ユーザー入力で現在の要素を設定します: u.charCodeAt(...)

22
BrainfuckはJavaScriptよりも理解しやすいと述べるユーモアのために+1。
アギハマーシーフ14年

replaceステートメント内のBrainfuckキャラクターがプログラムに影響を与えないと確信していますか?
Fraxtil

3
@fraこのファイルはbrainfuckプログラムではなく、実行時にjavascriptに変換されるbrainfuckプログラムを含むjavascriptプログラムです。
地下

3
まあ、--iより速いi--?年以来間違っているようです:jsperf.com/decrementgolf
マイケルM. 14年

4
これは、コンテストへの非常に創造的な投稿であるだけでなく、ブレインファックの構文を非常に明確に説明しています。できれば+10!
SebastianH 14年

74

華麗なレナート・オーガストソンはすでにこれを2回獲得しています。

最初に、2009年からのHaskell Monadic DSLとしてのBASICの「週末ハック」実装の例を以下に示します。

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

数値型をオーバーロードすることで機能します。行番号は、実際には引数を受け取る関数です。行の残りは関数の引数です。この関数は、BASICインタープリターが作業を開始するための抽象構文ツリーの表現を返します。

また、2006年の国際難読化CコンテストへのAugustssonのエントリーをチェックすることをお勧めします。

  • Cのサブセット(難読化されたCと呼ばれる)で記述されたバイトコードインタープリター。
  • バイトコードで記述された難読化されたC->バイトコードコンパイラ。

byetecodeはCコメント内に配置されているため、同じファイルを共有できます。

オーガストソンの作品をフォローしてから数年が経ちました。それ以来、彼が思いついた他の素晴らしいものがあるかもしれません。


2
アウグストセンではなく、アウグスソンです。
ハンスランドマーク14年

@HansLundmarkありがとう。それを修正しました。
ピタロウ14年

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

ここでの秘isは、Javascriptが'およびで始まる文字列でエスケープシーケンスを使用すること"です。
一方、PHPは、"およびで始まる文字列でエスケープシーケンスのみを使用します<<<

次に、関数を宣言しますprintf。これはprint、PHPでフォーマットされた文字列に似ていますが、出力されます。

PHP では varsがで始まる必要があります$Javascriptは単に許可します。


Array(…)JSで使用している人はいませんし、明らかarray(…)にPHP でも使用しています。[…]はるかに良いでしょう;)!
ブラックホール14年

12
私は人々Array()がJSで使用するかどうかは気にしません:私はTRUEポリグロットを持っていることを気にします。私はこのコードで最悪のJS犯罪の1つを作っていますが、私が望むのは両方で実行され、まったく同じことを行いますが、同時にJSとPHPのように見えます。
イスマエルミゲル14年

そして、ところで、[...]PHP <5.4.0では無効です。これは悪いことです.......これをPHP 4、5またはJavascriptにスローすると、どこでも構文エラーを出すのではなく、動作するはずです。
イスマエルミゲル14年

2
コードをJSのように見せたい場合、を使用する必要あります[…]。これはPHPでかなり標準的であるため、目標には適しています。ところで、PHP <5.4?更新の時間、男…
ブラックホール14年

8
互換性は「見た目」よりも重要です。そして、ArrayオブジェクトのコンストラクターArray正しい名前です。基本的に、使用方法[]はと同じArray()です。悪いことは何もありません。しかし、1つの簡単な質問があります:Works?(ところで、私仕事でphp 5.3.28を使用する必要があります。)
イスマエルミゲル14年

55

JSのBrainfuck

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

12
ここにはブレインファックはありません。単一の文字でさえない><,.-
マイケルM. 14年

8
@Michael:無限ループを作るプログラムではないと言ったのは誰ですか?
コンラッドボロスキー14年

19
これはJSF * ckですか?

8
いったいどうやってそれをするの
nandhp 14年

4
おー 誰かがついにこれをやった。文字+![]()のみを使用してJSプログラムを作成する方法を理解しようとして少し時間を費やしましたが、まったく理解できませんでした。私は...私は時間があるとき、これを分析する必要がある
マッティVirkkunen

54

これは、2005年のIOCCCの受賞者の1つです。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 14年

39

CのC ++

さて、あなたはC ++プログラマですが、Cの使用を余儀なくされていますか?問題ありません。Cで欠落している補足ヘッダーを記述するだけです。たとえば、Cで有効なHello Worldプログラムを次に示します。

補足ヘッダーファイルに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

file 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でコンパイルしてファイルiostreamstring現在のディレクトリに配置する場合は、

gcc helloworld.c -o helloworld -I.

注:volatileinヘッダーiostreamは、最大警告レベル(揮発性変数からの読み取りは効果があると見なされます)でも警告なしのコンパイルを有効にするためにあります。


3
これはちょっとしたコードのトローリングですよね。
ミスターリスター14年

まあ、プログラムはそれがするように見えることを正確に行いますよね?
celtschk 14年

8
このようにC ++のCよりもずっと面白くて印象的です。
カイルストランド14年

volatileここで使用しない場合、どのようなコンパイラが警告しますか?
R.マルティーニョフェルナンデス14年

1
@KyleStrandしかし、「C ++ in C ++」の方が質問の引用とより調和しています。C ++コンパイラを使用している場合でも、実際のプログラマはCでプログラムします。
ミスターリスター14年

36

CQL-カフェインクエリ言語

(または「カフェインのSQL」)

これはやや野心的すぎるかもしれません。CoffeeScriptで SQL(ish)宣言コードを記述しようとしています。これには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では、セッション変数のために使用されています。
イスマエルミゲル14年

私は今、キーワードをグローバルにすることにしました。現在@、列名とテーブル名にはs のみがあります。
マーティンエンダー14年

今ではSQLによく似ています!これでいい仕事をしました!
イスマエルミゲル14年

1
私はコーヒーをあまり気にしませんが、これは素晴らしいです。
KRyan 14年

2
@tacに感謝しますが、いいえ、このチャレンジのために一緒にハッキングしました。面白い偶然:これをクリーンな方法でやり直してGitHubに載せることは、今朝削除するまで、潜在的/長期的なコーディングプロジェクトのリストに載っていました。
マーティンエンダー

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 14年

@ js1568ありがとう!不要なセミコロンを削除しました。
歯ブラシ

20

C ++のF#

プリプロセッサの想像力に欠けた厄介な乱用ではありません。いくつかのエイリアスを使用してJavaやPHPのように見せずに、C ++を完全に異なる言語のように変更するのは楽しいと思いました。私はこれが多くの賛成票を集めることを本当に期待していない、それはただの楽しみのエントリーだ。

#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ます。
ジョースティ14年

20

Pythonと...誰も推測しないだろう(編集:dc)

有効なpythonコードを次に示しますが、実際にはプログラムは非常に異なる言語で記述されています。

# 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

コードはエラーなしで両方の言語で実行されます。

組み合わせは非常にクレイジーです。1日か2日待ってから、他の言語を教えてください。推測のためにコメントを残してください。

編集:言語はdcのスタックベースの言語でした。あなたは次のようにここでは、よく知られているキーワードが表示されることがありforiforin、しかし、唯一の文字は問題では!,それが最初に表示するときは、文字の後であるため、直流では意味を持たないが、レジスタになっているs(も同じ:)。


1
コードが両方の言語で同じことをしない限り、Befungeのような言語がそのトリックを実行できると思います。
トーマスエディング14年

OK、実際に選択した言語を入れるためにコードを編集します。
トーマスバルチェル14年

18

C ++では、InteLibライブラリを使用してlispのようなコードを作成できます。

(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
ようこそ!答えが自分の仕事ではない場合は、ユーザーに自分の投稿にコミュニティWikiとしてフラグを立てるようお願いします。(そして、適切な帰属を与えてください、しかし、あなたはすでにそうしました、ありがとう!)
ジョナサンヴァンマトレ14年

オリジナルかどうか、あなたは私の投票を得た:)
itsjeyd 14年

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!

また、各行の先頭に4つのスペースを配置する必要があるためにフォーマットが厄介になった場合、ここでも同様です。スペース用とタブ用#:

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コメントが許可されているためです。ああ、すべての有効なHTMLドキュメントも有効なPHPプログラムなので、これもPHPです。:)



CSSはチューリング完了と見なすことができるため、これは有効な答えかもしれません。
アダムデイビス

2
HTMLとCSSはプログラミング言語ではありません:)
Jet 14年

9

ScalaのC

ブリッジングレイヤーは、文字列がまだnullで終了するバイト配列であったロマンチックな時代をエミュレートします。

// 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!"だまされて屋
エリックアウトゴルファー

8

sedおよびAPL

私の上司はsedスクリプトを書くことを望んでいますが、私は一日中APLを書くのが好きです。それでも、彼のバージョンのsedではこのようなスクリプトが完全に実行されるため、彼は私の仕事に非常に満足しています。

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

このパーマリンクを使用して、私の新しいウェブサイトで試すことができます。これは、GNU APLのjavascriptバージョンにコンパイルされています。最終リリースは、GNU APL v。1.3の公式リリースとともに後日リリースされますが、GNU APLを楽しんでいる場合はパーマリンクに完全に使用できます。


7

HaskellのC

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

もちろん、or でcmain何もしargcないargvので、引数マーシャリングコードは効果がなく、cmain常に0を返すため、「if」ステートメントの「else」ブランチは無効になります。しかし、「if」ステートメントはとにかく何もしません。

ほとんどの括弧と一部のdoキーワードと同様に、すべての中括弧とセミコロンは不要です。「if」ステートメントはとして記述できますif exitCode == 0 then exitWith ExitSuccess else exitWith (ExitFailure (fromIntegral exitCode))


7

ForthのC ++

: #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

JavaでのHaskell

( "バニラ" Java 7ではなくJava 7)(はい、ボクシングはパフォーマンスを損なうことを知っています。高階関数を使用しようとしても、非常に冗長になります: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

AWKのCOBOL

引用の精神で。純粋で純粋なAWK。COBOLプログラマーによって作成される場合があります。

タスクは、ファイルのレコードをカウントすることです。この初期開発バージョンは、テストのためにそれ自体をカウントしています。正しいファイルは、単体テストからリリースされたときにハードコードされます...

シンタックスハイライトを取得して、黒に燐光の緑色を表示できれば、素晴らしいでしょう...

これで列番号が正しくなりました。これは各行の先頭に7つの空白があり(以前は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の柔軟なモジュールおよびマクロシステムにより、ドメイン固有および汎用の両方のまったく新しい言語のモジュールサポートを実装できます。DatalogAlgol 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

他の言語のサポートを追加することもできます。たとえば、次のようなラケットプログラムを許可するBrainfuckのサポートを実装する方法についてのDanny Yooの説明を参照してください。

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

また、サポートはコンパイルされたモジュールレベルで追加されるため、異なる言語で記述されたモジュールをリンクしたり、別の言語で記述されたモジュール内にある言語のスニペットを埋め込むことができます。


5

Javaの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

PerlのJava

ルール違反としてカウントされる場合がありますが、私は気にしません。明らかに、Javaプログラムのように見えることを意図しています。明らかでない場合に備えて、20個のフィボナッチ数を出力します。

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 and ...誰も推測しないだろう(編集:dc)

これは私の2番目のエントリです。有効なJコードの一部を次に示します。これは1を返します。

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

まったく同じコードをエラーなしで実行している他の言語を特定する前に、1〜2日待っています。推測しようとしてコメントを残してください。

編集:他の言語は、非常に古いUnix電卓dcのスタックベースの言語です。


3
それはGolfScript、BF、HQ9でエラーなしで実行+、...
ピーター・テイラー

わかりました、私はそのような多くの言語がそれをすることができることを知りませんでした。実際に選択した言語を配置するためにコードを編集します。
トーマスバルチェル14年

@ברוכאלこれらの言語にはエラーがないか、このコードに該当するエラーがないため、これらの言語でエラーなしで実行されます。例えば。Brainfuckは、入っていないすべての文字を無視する.,+-<>[]ため、プログラムは...[.]+有効ですが無意味なプログラムであるbrainfuckに相当します。私の知る限り、brainfuckプログラムは、一致しない場合にのみ無効になります[]
イミビス14年

@immibis。これは誤りです。dcは古い計算機であり、コードの1つを変更するとエラーが発生することを保証できます。文字を正しい順序に並べるトリッキーな方法を見つけるために、コードの一部に多くの時間を費やしました。私のコードPostscript / dcは非常に極端です。エラーはありませんが、何かを変更するとエラーになります。dcは「これらの言語」とは関係ありません。dcは、「これらの言語」よりも20〜30年古いです。通常、Linuxディストリビューションにインストールされます。聞いたことがない場合は、少しブラウズしてください。
トーマスバルチェル14年

1
@ברוכאלあなたは誤解されました-私はBrainfuck、HQ9 +、golfscriptなどについて話していました-DCではありません。
イミビス14年

4

PostScriptファイルを実行するdc

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

JavaのML /(Strict)Haskell

これは実際の実際のプロジェクトからのものです。永続的な不変のデータ構造を使用し、必要でない場合でも再帰を使用します。実際には、JavaのKore(プロジェクトが実装する言語)に似ていますが、スタイルは基本的に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().xandと言いますlist.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);
  }
}

以下は、トライの観点から実装されたマップデータ構造です。

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

型は、コードと同じくらいのスペースを占有し始めます。たとえば、putでは、メソッドにはタイプの302文字とコードの343文字があります(スペース/改行はカウントしません)。


2

RubyのBASIC

これはずっと前に実装されました。ソースはGitHubの上にありますScalaの同様のものに触発された

セットアップ

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

C ++テンプレートのHaskell

このFizzBu​​zzを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.