あまりにもイイネ!だったのでお借りしました。
例文
input:
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!シエリイェス!ダァイェス!!
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァイェス!!ダァダァ!!ダァダァ!!
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァイェス!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
イェスダァ!イェスダァ!イェスダァ!
シエリシエリ!イェスシエリ!ダァイェス!!シエリダァ!!ダァイェス!!ダァダァ!!ダァダァ!!シエリダァ!!
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!シエリダァ!!シエリダァ!!ダァダァ!!ダァダァ!!ダァダァ!!シエリダァ!!ダァイェス!!シエリシエリ! シエリダァ!!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリダァ!!イェスダァ! ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!シエリダァ!!
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリダァ!!ダァダァ!!ダァダァ!!ダァダァ!!シエリダァ!!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリダァ!!
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリダァ!!ダァイェス!!ダァダァ!!シエリダァ!!
output:
Hello, world!
解説
基本的にBrainfuckの命令が書き換わっただけ。
> ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」
< ポインタをデクリメントする。C言語の「ptr--;」に相当。
+ ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
- ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
. ポインタが指す値を出力する。C言語の「putchar(*ptr);」に相当。
, 1バイトを入力してポインタが指す値に代入する。C言語の「*ptr=getchar();」に相当。
[ ポインタが指す値が0なら、対応する ] の直後までジャンプする。C言語の「while(*ptr){」に相当。
] ポインタが指す値が0でないなら、対応する [ にジャンプする。C言語の「}」に相当。
↓↓↓↓こうなる↓↓↓↓
ダァイェス >
イェスダァ <
ダァダァ +
シエリシエリ -
ダァシエリ , //+ptr=getchar();
シエリダァ . //putchar(*ptr);
シエリイェス [
イェスシエリ ]
解読してみる。
途中で作っている数字は、実際はAsciiコード表の文字に対応する。
画像の「10進」というところの数字と対応する文字を作っていると考えて良い。
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//ダァダァで1つ足す。+9された
シエリイェス!
//While(9){ 、 現在+9なので、Whileのループに入る。9のところが0だったら飛ぶイェスシエリの後まで飛ぶ
ダァイェス!!
//ポインタが隣へ移動
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//+8した。
ダァイェス!!
//ポインタが隣へ移動。
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//+11した。
ダァイェス!!
//ポインタが隣へ移動。
ダァダァ!! ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//+5した。
イェスダァ!イェスダァ!イェスダァ!
//ポインタが3つ前へ
シエリシエリ!
//最初に+9になったところの値を-1する。中身は8になった。
イェスシエリ!
//While(条件){ 動作 } ←の「 } 」に相当。つまりシエリイェス(2行目)からここまでをあと8回繰り返す。
(省略、8回繰り返しました)。
最後は、
While(1)の1の部分が
0となるので、飛ばされてダァイェス!の行へ移動する
ダァイェス!!
//ポインタが隣へ移動、Hに対応する72をポインタが指す
シエリダァ!!
//ポインタが指す内容を表示、Hが出力される。
ダァイェス!!
//ポインタが移動。eの領域を指した。中身は99でeを示すには2足りない。
ダァダァ!!ダァダァ!!
//+2した。中身は101になった。eを作ることができた。
シエリダァ!!
//「 e 」が表示された。
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//そのまま中身を+7するので108になった。「e」から「l」になった。
シエリダァ!!シエリダァ!!
//「l」を2回表示、これで「Hell」までが表示された。
ダァダァ!!ダァダァ!!ダァダァ!!
//そのまま中身を+3した。中身は111となり、「l」から「o」に変化した。
シエリダァ!!
//「o」が表示。ここまででやっと「Hello」が表示されたことになる。
ダァイェス!!
//ポインタが隣へ移動。中身は45を示している。「,」(カンマ)は44で1多い。
シエリシエリ!
//やっぱり中身を-1した。44となり、カンマが作られた。
シエリダァ!!
//カンマが表示、「Hello,」まで表示されたことになる。次はスペース(空白)を表示しなければならない。空白は32で、現在44なので12引かなければならない。
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!
//やはり12ひいた。中身は32となり、これはスペース(空白)を表す。
シエリダァ!!
//空白文字を表示。これで「Hello, 」が表示されたことになる。
イェスダァ!
//ポインタが後ろへ移動。中身は111を示している。ここから「w」を表示させるには+8しなければならない。
ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!
//中身を+8した。これで「o」(111)から「w」(118)になった。
シエリダァ!!
//「w」を表示。これで「Hello, w」が表示された。次はまた「o」を表示する
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!
//-8した。「w」(118)から「o」(111)に内容が変わった。
シエリダァ!!
//「o」が表示された。これで「Hello, wo」が表示された。次は「r」(114)なので、+3する。
ダァダァ!!ダァダァ!!ダァダァ!!
//+3された。「o」(111)から「r」(114)になった。
シエリダァ!!
//「r」が表示された。これで「Hello, wor」が表示された。次はまた「l」(108)なので-6する。
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!
//-6された。「r」(114)から「l」(108)になった。
シエリダァ!!
//「l」が表示された。これで「Hello, worl」が表示された。次は「d」(100)なので、-8する
シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!シエリシエリ!
//-8された。「l」(108)から「d」(100)になった。
シエリダァ!!
//「d」を表示。これで「Hello, world」までが表示された。次は「!」(33)
ダァイェス!!
//ポインタが隣へ移動。中身は空白文字(32)で、+1すれば「!」になる。
ダァダァ!!
//+1された。
シエリダァ!!
//「!」を表示、これで「Hello, world!」が表示された。
whileなどをつかわずに、単純に値の増減だけで文字を表示させたいならば、このプログラムをコンパイルすれば、自動的に生成してくれる。
#include
int main(){
unsigned char text[256];
int i=0,j,pos=0;
printf("表示させたい文字を入力してください(255文字まで)\n");
scanf("%[^\n]",text);
while(text[i]!='\0'){
if(pos
}
}else{
for(j=pos;j>text[i];j--){
printf("シエリシエリ");
}
}
pos=j;
printf("シエリダァ");
i++;
}
printf("\n");
return 0;
}
このプログラムで作ると、まったく最適化されないので、Hello, world!を表示させようと思うと。
ダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァシエリダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァシエリダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァシエリダァシエリダァダァダァダァダァダァダァシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァダァシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァダァダァダァダァダァダァシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリシエリダァ
こんなに長くなる。
ちなみに、KQ言語からC言語に移植するとこうなる。やってることはこれだけ。
#include
main(){
int i=0,w1=0,w2=0,w3=0;
i=9;
while(i--){
w1+=8;
w2+=11;
w3+=5;
}
printf("%c",w1);
w2+=2;
printf("%c",w2);
w2+=7;
printf("%c",w2);
printf("%c",w2);
w2+=3;
printf("%c",w2);
w3-=1;
printf("%c",w3);
w3-=12;
printf("%c",w3);
w2+=8;
printf("%c",w2);
w2-=8;
printf("%c",w2);
w2+=3;
printf("%c",w2);
w2-=6;
printf("%c",w2);
w2-=8;
printf("%c",w2);
w3+=1;
printf("%c",w3);
}