Programı başka bir dilde favori dilinize yazın


168

Belirlenen Gerçek Programcı Fortran programlarını herhangi bir dilde yazabilir.

Gerçek Programcılardan Pascal Kullanmıyor

Göreviniz, seçtiğiniz programlama dilinde program yazmaktır, ancak yalnızca başka bir dil kullanmanıza izin verilmektedir. Diğer bir deyişle, tüm kodlama sözleşmelerini bir dilden uzaklaştırın ve bunları başka bir dilin kodlama sözleşmeleri ile değiştirin. Ne kadar çok, o kadar iyi. Programınızın başka bir dilde yazılmış gibi görünmesini sağlayın.

Örneğin, Java'dan nefret eden Python hayranı, Java'daki Python programını izleyerek yazabilir:

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

C kullanmaya zorlanan Pascal meraklısı bunu yazabilir:

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

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

Programın tamamını yazmalısınız. Programın yararlı bir şey yapması gerekmiyor.

İyi şanslar. Bu bir popülerlik yarışması yani en fazla oy alan kod kazanıyor!


1
@ m.buettner dosyanızı uzantı ile oluşturun .litcoffee. O yardımcı olabilir.
Ismael Miguel,

Bir cevap için biraz uzun (önceden yazılmış ve bağımsız), ancak: C’deki Postscript’teki Postscript tarayıcısı .
kullanıcı

51
Sizin (ya da cevapların çoğunluğunun) teklifin amacını anladığını sanmıyorum. Gerçek bir Programcının Pascal veya LISP'de yazsa bile Fortran'a benzeyen bir kod yazması değildir: Pascal veya LISP'de yazarken bile bir Fortran düşünme biçimini uyguladığını; örn. " Tüm Gerçek Programcıların bildiği gibi, tek kullanışlı veri yapısı Dizidir. " Büyük cevaplar Prolog'daki prosedürel kod, C'deki fonksiyonel kod, Pascal'daki nesneye yönelik kod olacaktır.
Peter Taylor

1
Ben birileri de, bir Lisp lehçesi ama bir şey yapmak umut başka Lisp lehçesi ...
itsjeyd

6
@itsjeyd Greenspun'un Onuncu Kuralı Programlama Kuralı : "Yeterince karmaşık olan herhangi bir C veya Fortran programı, CommonLisp'in yarısının geçici, gayri resmi olarak belirlenmiş, böcek basması, yavaş uygulanmasını içerir."
Joshua Taylor

Yanıtlar:


142

C ++ 'da C

#include <stdio.h>

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

60
Orada ne yaptığını görüyorum;)
el.pescado

27
Evet, bu ucuz bir numara, C ++ 'in C ile' geriye doğru uyumlu olduğunu 'görmek
Agi Hammerthief

5
@AlexM. Bazı STL iyiliğinin çok daha makul olacağı (bunun char*yerine söylenecek std::string) başka C deyimlerini kullanan daha uzun (usule dayalı) bir örnek olsaydı, bu sorunun özünde daha fazla olacağını düşünüyorum .
Martin Ender

47
C, C ++, Objective-C ve Objective-C ++ ile geçerlidir! Ne harika bir çok dilli cevap.
nneonneo

7
@ BenJackson Psh, gerçek C programcıları kullanıyor char *argv[]!
Thomas

122

GNU C’de x86 montajı

Hayır, sadece asmanahtar sözcüğü kullanmadım , çünkü bu soruyu doğruladı. programcılar ... ARM üzerinde iyi vermeli.

(Sadece noktayı ispatlamak için, montajı hiç "yazmadım" - GCC tarafından üretilen çıktı. üstte yorumlanan kod için Clang (503.0.38) kör olarak makrolara çevrilen çıktı.)

Bu sadece 32 bit modunda çalışır. Her şey yolunda, gerçek programcılar zaten kelime büyüklüğüne kod yazıyor.

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

Sadece şu yayınlara bakın. Yayınlar derleyiciden daha iyi bir programcı olduğum anlamına geliyor , değil mi?


8
+1, bu ... bükülmüş. ;) callÖzellikle nasıl idare edildiğini gerçekten seviyorum .
Ilmari Karonen

2
Vay. Bu harika bir iş.
Jack Aidley

C64 için böyle çalışan bir montajcı vardı. Tüm 6510 talimatları için BASIC anahtar kelimeleri ekledi ve etrafına sarıldığını hatırlıyorum for pass=1:3...next. BASIC yorumlayıcısında uygulamak onu bir araya getirdi.
Ben Jackson

5
Bu saf şiir.
Nicu Stiurca

1
Bu zor bir adam, derleyici kesinlikle hayrete düşürüyor.
internets,

102

C dilinde İngilizce

#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

Ortadan kaldırmak için herhangi bir fikir ;?


18
Cidden, millet.
Kyle Strand

2
neden theiki kere tanımla ?
Joshua Taylor

16
üzgünüm daha iyi güvenli ;-)
urzeit

20
Şimdi haiku yap.
Nicu Stiurca

1
Can#define . ;
mbomb007

74

JavaScript'te Brainfuck

Javascript zor bir dildir! Daha anlaşılır bir dil olan Brainfuck'ı kullanalım: 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)')
)

Sanırım javascript'te bir beyin avcısı tercümanı yazdım.

Yukarıdaki örnek basitçe Hello World!girişi keser ve yok sayar ( ,sembol yok ).
Ancak bu girdilerle de çalışır! Örneğin, denemek ,+>,+>,+>,+<<<.>.>.>.ve yazın golfiletişim içinde. ASCII tablosundaki sonraki karakterleri çıkarır:hpmg

EDIT : Beyin hasarı bilmeyen insanlar için kısa açıklama. Her yerde sıfır olarak başlatılmış
sonsuz bir tamsayı adizisi i, bu dizinin bir elemanı üzerinde bir işaretçi ve bir kullanıcı girişi hayal edin u.
Brainfuck gerçekten öğrenmesi kolay fakat yazması zor:

  • + mevcut değere yapılan artışlar: a[i]++
  • - azaltır: a[i]--
  • > işaretçiyi bir sonraki öğeye işaret eder: i++
  • < önceki : i--
  • [ve ]mevcut değer sıfır olduğunda kırılan bir döngü tanımlayın:while (a[i]) { ... }
  • . geçerli öğeyi yazdır: String.fromCharCode(a[i])
  • , akım elemanını kullanıcı girişi ile ayarlar: u.charCodeAt(...)

22
Beyin fırtınasının JavaScript'ten daha anlaşılır olduğunu belirten mizah için +1.
Agi Hammerthief

replaceİfadelerin içindeki Brainfuck karakterlerinin programı etkilemediğinden emin misiniz ?
Fraxtil

3
@ Bu dosya bir beyin fırtınası programı değil, çalışma zamanında javascript dönüştürülmüş bir beyin fırtınası programı içeren bir javascript programı.
undergroundmonorail

3
Peki, --idaha hızlı i--? Yıllardan beri yanlış görünüyor: jsperf.com/decrementgolf .
Michael M.

4
Bu sadece yarışmaya yaratıcı bir sunum değil, aynı zamanda beyin çarpması sözdizimini de çok net bir şekilde açıklıyor. Yapabilseydim +10!
SebastianHM

74

Bence mükemmel Lennart Augustsson bunu iki kez kazandı.

İlk olarak, BASIC'in Haskell Monadic DSL olarak "haftasonu hack" uygulamasının bir örneği:

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

Sayı türünü aşırı yükleyerek çalışır. Satır numaraları gerçekten argümanları kabul eden fonksiyonlardır. Satırın geri kalanı, fonksiyonun argümanlarıdır. İşlev, üzerinde çalışmak üzere BASIC yorumlayıcısının Özet Sözdizimi Ağacının bir gösterimini döndürür.

Ayrıca Augustsson’un 4k’ya sıkıştırmayı başardığı 2006 Uluslararası Gizli C Yarışması’na girişini de incelemenizi tavsiye ederim:

  • C alt kümesinde yazılmış bir bayt kodu yorumlayıcısı (buna Obfuscated C adını veriyor).
  • Bir Bayıltılmış C -> bytecode derleyicisi, bytecode ile yazılmış.

Bytecode C yorumunun içine yerleştirildiği için aynı dosyayı paylaşabilirler.

Augustsson'un çalışmasını takip ettiğimden bu yana birkaç yıl geçti, o zamandan beri ortaya çıktığı diğer parlak şeyler olabilir.


2
Augustsson, Augustssen değil.
Hans Lundmark

@HansLundmark Teşekkürler. Onu düzeltti.
Pitarou

71

PHP ve Javascript

Bu bir poliglot:

Bu kodu her iki dilde de çalıştırabilirsiniz:

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

Buradaki hile Javascript'in 've ile başlayan dizgelerde kaçış dizileri kullanmasıdır ".
Öte yandan, PHP sadece "ve ile başlayan karakter dizilerinde kaçış dizileri kullanır <<<.

Daha sonra PHP'ye biçimlendirilmiş bir dizgeye printfbenzer printfakat çıktısı olan işlevi bildiririz.

Javascript basitçe izin verirken PHP , varsların başlamasını gerektirir$ .


Kimse Array(…)JS'de kullanmıyor ve açıkça array(…)PHP'de. […]çok daha iyi olurdu;)!
Karadelik

12
İnsanların Array()JS'de kullanıp kullanmamaları umurumda değil: Bir TRUE polyglot'a sahip olmam umrumda . Bu kodla en kötü JS suçlarından birini yapıyorum, ancak tek istediğim çalıştırdığı ve yaptığı. tam hem de aynı şeyi, ama aynı zamanda JS ve PHP gibi bakıyor.
Ismael Miguel,

Ve btw, [...]PHP <5.4.0'da geçersiz, bu da kötü bir şey ....... Bunu PHP 4, 5 veya Javascript içine atarsam, her yerde sözdizimi hataları vermek yerine çalışmasını bekliyorum.
Ismael Miguel

2
Kodunuzun JS gibi görünmesini istiyorsanız, […] , PHP'de oldukça standart görünen ve bu nedenle hedefinize uygun görünen, kullanmanız gerekir . Ve bu arada, PHP <5.4? Güncelleme zamanı, adam…
Blackhole

8
Uyumluluk "görünümden" daha önemlidir. Ve Arrayolan SAĞ Dizi nesnesinin yapıcısı adı. Temel olarak, kullanarak []aynıdır Array(). Kötü bir şey görmüyorum. Ama basit bir sorum var: Çalışır mı? (Btw, ben var işte php 5.3.28 kullanmak.)
Ismael Miguel

55

JS'de Brainfuck

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

12
Burada hiç beyin hastası görmüyorum. Tek bir karakter bile yok><,.-
Michael M.

8
@Michael: Kim sonsuz döngü yapan bir program olmadığını söyledi?
Konrad Borowski,

19
Bu JSF * ck nedir?

8
Nasıl yeryüzünde yapar o ?
nandhp

4
Oo. Sonunda biri bunu yaptı. Bir JS programının sadece +! [] () Karakterlerini kullanarak nasıl yazılacağını bulmaya çalışarak biraz zaman harcadım.
Zamanım

54

Bu, 2005 IOCCC kazananlarından biri, bu tanımlamalar haricinde bir java programına benzeyen bir C programı:

/*
 * 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
Ayrıntı en iyi şekilde.
qwr

39

C ++ 'da C

Tamam, öyleyse sen bir C ++ programcısın, ama C kullanmak zorunda mı? Hiç sorun değil, sadece C’de eksik olan bazı ek başlıklar yazmanız gerekir. Örneğin, C’de geçerli bir Hello World programı:

Ek başlık dosyasına şunu iostreamyazın:

#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

Dosyaya stringyaz

#define string

Dosyaya helloworld.c(gerçek C kodunuz) yazın

#include <iostream>
#include <string>

using namespace std;

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

Ve helloworld.cbir C derleyicisi ile derlerken , derleyiciye ayrıca <...>dosyaları depoladığınız her yerde başlık dosyalarını aramasını iostreamve stringörneğin, gcc ile derleyip dosya koymak iostreamvestring geçerli dizine

gcc helloworld.c -o helloworld -I.

Not: volatileBaşlık iostream, maksimum uyarı seviyesinde bile uyarı içermeyen bir derlemeyi etkinleştirmek için vardır (geçici bir değişkenden okunan bir etkiye sahip olduğu kabul edilir).


3
Bu biraz kod trolling, değil mi?
Bay Lister

Program tam olarak göründüğü gibi yapıyor, değil mi?
celtschk

8
C ++ 'ta C den çok daha komik ve daha etkileyici.
Kyle Strand

volatileBurada kullanmazsanız ne tür bir derleyici uyarır ve ne tür bir uyarı?
R. Martinho Fernandes

1
@KyleStrand Ancak "C ++ 'da C ++" sorusu alıntıyla uyumludur. C ++ 'da gerçek programcılar, C ++ derleyicileri olsa bile.
Bay Lister

36

CQL - Kafeinli Sorgu Dili

(veya "Kafeinde SQL")

Bu biraz fazla hırslı olabilir. İşte CoffeeScript'te SQL (ish) bildirim kodunu yazma girişimi . Bu ECMAScript 6 Proxy özelliğini gerektirir . İle düğümde test edebilirsiniz--harmony-proxies .

Proxy'leri tanımlamak için bir şablon hazırlayalım. ( Benvie'nin bu konuda yaptığı yorumdan alınmıştır )

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

Şimdi bir proxy nesnesini ve bazı şüpheli global değişkenleri ve fonksiyonları tanımlayın:

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

Peki bu oldukça kurulum oldu! Ancak şimdi aşağıdakileri yapabiliriz (konsol tarzında giriş / çıkış):

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

Gerçek bir polyglot değil, ama asıl mesele bu değil. Bunun SQL'deki @değişkenler için kullanıldığını biliyorum , ancak hepsine ihtiyacım var.@ sütun ve tablo adları için var çünkü global nesneyi proxy'ye sokacak bir yol bulamadım (ve eğer gerçekten mümkün değilse şaşırmam - ve iyi bir neden).

Ayrıca bazı parantezleri parantez içine aldım (özellikle VALUESve sonra IN). Ne yazık ki, tam olarak çözemediğim şey, normal şartlara izin vermenin bir yolu.year > 2000 , çünkü hemen bir boole olarak değerlendireceklerdi.

Yine de bu, SQL'e çok benziyor ve zorunlu / işlevsel / nesne yönelimli olmaktan kesinlikle daha açıklayıcıdır, bu nedenle soru için güzel bir şekilde nitelendirilmesi gerekir. Aslında, kodu biraz cilalarsam ve birkaç özelliği daha destekliyorsam, bunun faydalı bir CoffeeScript modülü olabileceğini düşünüyorum.

Neyse, bu eğlenceliydi! :)

CoffeeScript'e fazla aşina olmayanlar için, SQL sorguları aşağıdaki JavaScript'i derler:

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

Bu oldukça fazla kurulum, ama iyi görünüyor. Ben bir CoffeeScript programcısı değilim, ama harika görünüyor. @SQL oturum değişkenleri için kullanılır.
Ismael Miguel,

Anahtar kelimeleri şimdi küresel yapmaya karar verdim. Şimdi sadece @sütun ve tablo adları için s var .
Martin Ender

Şimdi SQL'e çok benziyor! Bununla güzel bir iş çıkardın!
Ismael Miguel,

1
Kahve umrumda değil, ama bu harika.
KRyan

2
@ teşekkürler, ama hayır ben sadece bu meydan okuma için birlikte hack. Komik tesadüf: bunu temiz bir şekilde tekrar yapmak ve GitHub'a koymak, bu sabah çıkana kadar potansiyel / uzun vadeli kodlama projeleri listemdeydi.
Martin Ender

27

Visual Basic 6 (JavaScript'te)

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

Aynı zamanda VBScript'te de çalışır.


1
Zeki. Noktalı virgüllerin çoğuna bile ihtiyacınız yok.
js1568

@ js1568 Teşekkürler! Şimdi gerekli olmayan yarı-kolonları kaldırdım.
Diş fırçası

20

C ++ 'da F #

Öncül işlemcinin oldukça yaratıcı olmayan ve kötü suiistimali. Java veya PHP gibi görünmesi için birkaç takma ad kullanmak yerine tamamen farklı bir dil gibi görünmek için C ++ 'ı değiştirmenin eğlenceli olacağını düşündüm. Bunun bir ton yükseltmeler kazanmasını beklemiyorum, bu sadece eğlence amaçlı bir giriş.

#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

Burada dene .

Ne yazık ki STDOUT'a bir şeyler yazmak, yapabileceği her şeyle ilgili, ancak yeterince büyücülük yapan birisinin daha fazlasını yapmasını sağlayabildiğinden eminim.


2
F # 'da çalışacak son satırın olması exit 0ya da sadece olması gerekirdi 0.
Jwosty

20

Python ve ... kimse tahmin edemez (değiştir: dc)

İşte bazı geçerli python kodu, ancak aslında program çok farklı bir dilde yazılmış:

# 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

Kod her iki dilde de hatasız çalışıyor.

Kombinasyon çok çılgın; Diğer dilin hangisi olduğunu söylemeden önce bir iki gün beklemekten mutlu olurum; Lütfen tahmin için yorumlarınızı bırakın.

edit: Dil, dc'den yığın temelli dildi. Sen gibi burada tanınmış anahtar kelimeleri görebilirsiniz for, if, or, in, fakat sadece harf kullanımının önemi! ,Göründüğü ilk kez harfinden sonra çünkü dc hiçbir anlamı yoktur hangi bir kayıt çevrildiğinde s(aynı :).


1
Kod her iki dilde de aynı şeyi yapmazsa, Befunge gibi bir dilde bu işi yapabilir.
Thomas Eding,

Tamam, seçtiğim dili koymak için kodu düzenlerim.
Thomas Baruchel

18

C ++, InteLib kütüphanesinde lisp benzeri bir kod yazmanıza izin verir:

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

bakınız http://www.informatimago.com/articles/life-saver.html


4
Hoşgeldiniz! Kullanıcıların, cevap kendi çalışmaları olmadığında gönderilerini Topluluk Wiki olarak işaretlemelerini istiyoruz. (Ve uygun bir atıfta bulunun, ama bunu zaten yaptınız, bu yüzden teşekkür ederim!)
Jonathan Van Matre

Orijinal ya da değil, oyumu aldım :)
itsjeyd

15

Boşlukta C #

Tamam, ilk önce bunlardan birini deneyin, hadi nasıl gittiğini görelim.

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!

Biçimlendirme işleminin her satırın önüne dört boşluk koymak zorunda kalmaması durumunda, yine burada. boşluk için ve sekme için #:

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 ve CSS

Dilleri değil, ancak… bu belge geçerli HTML ve CSS'dir:

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

Bu işe yarıyor, çünkü HTML açıklamalarına tarihsel nedenlerle stil sayfalarında izin veriliyor. Oh, ve her geçerli HTML belgesi de geçerli bir PHP programı, yani bu da PHP . :)



Yana CSS tam turing düşünülebilir , bu geçerli bir cevap olabilir.
Adam Davis

2
HTML ve CSS programlama dilleri değildir :)
Jet

9

Scala'da C

Köprüleme katmanı, dizeleri hala boş sonlandırılmış bayt dizileri olduğunda, daha romantik bir dönem öykünür.

// 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!"aldatmasın ya
Outgolfer Erik

8

sed ve APL

Patronum benden betiği yazmamı istiyor, ama ben bütün gün APL yazmayı seviyorum. Yine de işimden çok memnun çünkü bu senaryolar sed versiyonuyla kusursuz çalışıyor:

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

Bu kalıcı web sitesiyle yeni web sitemde deneyebilirsiniz . GNU APL'nin javascript versiyonunun bir derlemesidir. Son sürüm GNU APL'nin v. 1.3'ün resmi sürümüyle verilecek. Ancak GNU APL'den hoşlanıyorsanız, kalıcı bağlantılarınız için kullanabilirsiniz.


7

Haskell'de 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)));
    };
}

Elbette, ya da cmainile hiçbir şey yapmadığından , argüman-marshaling kodunun bir etkisi olmaz ve her zaman 0 döndürdüğünden, "if" ifadesinin "else" dalı ölür. Ancak "if" ifadesi zaten hiçbir şey yapmaz.argcargvcmain

Parantez ve noktalı virgüllerin tümü, parantezlerin ve bazı doanahtar kelimelerin çoğunda olduğu gibi gereksizdir . "İf" ifadesi olarak yazılmış olabilir if exitCode == 0 then exitWith ExitSuccess else exitWith (ExitFailure (fromIntegral exitCode)).


7

İleride 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";
}

En esnek çözüm değil, ancak gösterildiği gibi yazıldığında çalışır.


7

Java'da Haskell

("vanilya" Java 7 değil, Java 8) (Evet, boksun performansı bozduğunu biliyorum ve hatta daha üst düzey işlevler kullanmaya çalışmanın bile delice geldiğini biliyorum: D)

Java'nın çok katı sözdizimi olduğundan, sözdizimini değiştirmek yerine, kodu Haskell stiline anlamsal olarak daha benzer hale getirmeye çalıştım.

Düzenle - kısmi işlev uygulaması eklendi.

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

(Evet, bu deliliğin yaptığı tek şey bilgi işlemdir 6!)


6

AWK’da COBOL

Alıntı ruhu içinde. Bir COBOL programcısı tarafından yazılabileceğinden, saf, düzenlenmemiş AWK.

Görev bir dosyadaki kayıtları saymaktır. Bu erken geliştirme sürümü test için kendini sayıyor. Doğru Test, daha sonra Ünite Testinden çıkarıldığında kodlanır ...

Siyah üzerine fosforlu-yeşil yapmak için sözdiziminin altını çizebilirsem, harika olurdu ...

Bu konuda sütun numaralarını bile doğruladıysanız, her satırın başlangıcındaki yedi boşluk (daha önce hiç awk yapılmadı) ve sütun 72'deki uzun basılı açıklamaları kırmak.

   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

Racket'te Brainfuck (veya başka bir şey)

Racket'in esnek modülü ve makro sistemi, hem alana özgü hem de genel amaçlı tamamen yeni diller için modül desteği uygulamasına olanak tanır. Orada her ikisi için kutu desteği dışında Datalog ve Algol 60 , bu nedenle aşağıdaki her ikisi de geçerli Raket programları şunlardır:

#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

Başka diller için destek de ekleyebilirsiniz: örn. Danny Yoo'nun Brainfuck için desteğin nasıl uygulanacağına ilişkin açıklamasına bakın ; bu, aşağıdaki gibi Raket programlarına izin verir:

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

Destek, derlenmiş modül düzeyinde eklendiğinden, farklı dillerde yazılmış modülleri birbirine bağlamak veya başka bir dilde yazılmış bir modülün içine bir dilin snippet'ini gömmek mümkündür.


5

Java’da SML

Java öğrenmeye başladığımda ve onu işlevsel bir tarzda kullanmaya çalıştığım zamandan beri hala eski kodlarım var. Hafifçe temizlenir:

/**
 * 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'de Java

Kural kırma olarak sayılabilir, ama umrumda değil. Açıkçası, Java programına benzemesi amaçlanıyor. Net olmadığı takdirde 20 Fibonacci numarası basar.

Yüklenecek satır içi :: Java modülünü gerektirir .

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 ve ... kimse tahmin etmeyecek (değiştir: dc)

Bu benim ikinci girişim; İşte 1 döndüren geçerli bir J kodu parçası:

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

Bir ya da iki gün önce, hangi dilin aynı kod parçasını hatasız çalıştığını söylemekten önce bekliyorum. Sadece tahmin etmeye çalıştığınız için yorum bırakın.

düzenleme: Diğer dil çok eski Unix hesap makinesi dc gelen yığın tabanlı dildir.


3
GolfScript, BF, HQ9 +, hatasız çalışır ...
Peter Taylor

Tamam, bu kadar çok dilin yapabileceğinin farkında değildim. Seçtiğim dili koymak için kodu düzenlerim.
Thomas Baruchel

@ ברוכאל bu dillerde hata yapmadan çalışır, çünkü bu dillerde hata yoktur veya bu kod için geçerli hata yoktur. Örneğin. Brainfuck .,+-<>[], ...[.]+içinde bulunmayan tüm karakterleri yok sayar, böylece programınız geçerli ama anlamsız bir program olan beyin fırtınası ile eşdeğerdir . AFAIK bir beyin fırtınası programı ancak yanlış eşleştirilerek geçersiz olabilir [].
immibis

@immibis. Bu yanlış. dc eski bir hesap makinesidir ve kodlarımdaki bir şeyi değiştirmenin bir hataya neden olacağına emin olabilirim. Harfleri doğru sıraya koymanın zor yollarını bulmak için kodun bazı kısımlarına çok zaman harcadım. Kod parçam Postscript / dc oldukça aşırı: hiçbir hata yok ama herhangi bir şeyi değiştirmek hatalı yapacaktır. dc'nin "bu dillerle" ilgisi yoktur; dc, "bu dillerden" yaklaşık 20 veya 30 yaş daha büyüktür; genellikle herhangi bir Linux dağıtımına kurulur. Lütfen, duymadıysanız, biraz göz atın.
Thomas Baruchel

1
@ Misוכאל yanlış anladın - beyinböceği, HQ9 +, golfscript, vb. Hakkında konuşuyordum - dc değil.
immibis

4

PostScript dosyası çalıştıran dc

dc aşağıdaki kod parçasını hatasız çalıştırabilir:

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 / (Sıkı) Java'da Haskell

Bu gerçek bir projeden. Kalıcı değişken veri yapılarını kullanır ve gerekli olmasa bile özyinelemeyi kullanır. Aslında, Java'da Kore'ye (projenin uyguladığı dil) benziyor, ancak stil temelde ML ile aynı. Fakat Kore'nin felsefesi, yazarın kodunu biçimlendirmemesi gerektiğidir, bu nedenle Java kodlarından hiçbiri biçimlendirilmemiştir (otomatik olarak biçimlendirilmiştir).

listedeki n öğelerini bırak :

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

Eğer baş ve kuyruk ayıklamak için desen maçı ediyorum ML / Haskell, olarak, burada diyorsunuz list.cons().xve list.cons().tail.

listeye bir öğe ekle :

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

Liste olduğu belirlenen cebirsel veri türü tanımlanmış olacağını anlamıyla nasıl. Tutulma tarafından üretilen kazan plakasının kaldırıldığı bir versiyon:

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

İşte bir trie açısından uygulanan bir harita veri yapısı :

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

Türler kod kadar alan kaplar. Örneğin, koymak , yöntem türlerinden 302 karakter ve kod 343 karakter (boşluk / yeni satır hariç) sahiptir.


2

Ruby'de TEMEL

Bunu uzun zaman önce uyguladı. Kaynak GitHub'dan üzerindedir . Scala'da benzer bir şeyden esinlenildi

Kurmak

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

TEMEL kod

#!./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 ++ şablonlarında Haskell

Bu FizzBuzz'ı birkaç ay önce bir lark üzerinde C ++ şablonlarında yaptım. Hemen hemen tüm C ++ şablonlarında aşağıdaki Haskell kodunun bir uygulamasıdır. Aslında, tamsayı aritmetiği bile tür düzeyinde yeniden düzenlenir --- şablonların hiçbirinin int parametrelerini kullanmadığına dikkat edin!

Haskell kodu:

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

ve C ++ şablonunda metaprogramlama sürümü:

//  
//  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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.