BrainFuck Part.3 <[+-.,]>

■ このスレッドは過去ログ倉庫に格納されています
2009/01/08(木) 12:09:18
BrainFuckとは
 難解プログラミング言語の一つ。
 オシシメサイトはhttp://www.google.co.jp/

以下俺的見解
 ・スレッドタイトルに全命令が入る素敵な言語。
 ・1レス内に全命令のリファレンスが入る素敵な言語。
  > ポインタをインクリメント
  < ポインタをデクリメント
  + ポインタが示すメモリ位置のデータをインクリメント
  - ポインタが示すメモリ位置のデータをデクリメント
  . ポインタが示すメモリ位置のデータを出力
  , ポインタが示すメモリ位置のデータに入力
  [ ポインタが示すメモリ位置のデータがヌルなら対応する]までジャンプ
  ] ポインタが示すメモリ位置のデータがヌルじゃないなら対応する[までジャンプ

前スレ: BrainFuck Part.2 <[+-.,]>
http://pc11.2ch.net/test/read.cgi/tech/1177988460/

過去スレ: BrainFuck <[+-.,]>
http://pc11.2ch.net/test/read.cgi/tech/1036013915/
2009/01/08(木) 12:11:32
Brainfuck(ブレインファック)はプログラミング言語の一つ。
名称が良いものではないため、Brainf*ckと呼称するのが一般的。

開発者Urban Müllerがコンパイラがなるべく小さくなる言語として考案した。
実際、Müllerが開発したコンパイラのサイズは123バイト(キロバイトではない!)、
インタプリタは98バイトとなっている。

処理系には十分なサイズのbyte型配列とその要素のひとつを指すポインタがある。
ポインタを「>」「<」命令で移動させながら、そのポインタが指す値を増減させて
処理を進めていく(Hello world参照)。

実用性はほとんど無いように思われるが、これだけでチューリングマシンで実行可能な
あらゆるプログラムが記述できる(チューリング完全である)とされている。
2009/01/08(木) 12:20:32
<>参考サイト
ttp://ja.wikipedia.org/wiki/Brainfuck
ttp://vipprog.net/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E/Brainfuck.html

<>実行環境等
Cソースに変換するコンパイラ(超高速)
ttp://esoteric.sange.fi/brainfuck/impl/compilers/BF2C.c

JavaScript版インタプリタ(超低速)
ttp://cfs.maxn.jp/neta/onlineBrainFuck.html

VHDLで書かれたBF-CPU(BIOS付き)
ttp://www.clifford.at/bfcpu/bfcpu.html

<>例
Hello world!
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.

>>1
++++++++[>++++++++<-]>--..-------------.<+++++[>++++++<-]>.+++++.+.
2009/01/08(木) 12:25:23
<>亜種

長門有希
(リンク先行方不明)

neko mimi Fu**
ttp://d.hatena.ne.jp/tokuhirom/20041015/p14

Misa
ttp://homepage2.nifty.com/kujira_niku/okayu/misa.html

あえぎ声記述言語
ttp://vipprog.tumblr.com/post/35257076/brainf-ck

※置換ネタは無意味なので控えましょう
5デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:14:46
こんな本が出てるらしい

ttp://book.mycom.co.jp/book/978-4-8399-2784-4/978-4-8399-2784-4.shtml
> あなたは「+-><.,[]」の8つの記号しかないプログラミング言語や、
> 空白だけで構成されるプログラミング言語があるのをご存じだろうか。
> 本書では、そんな奇妙な言語(Esoteric Language)を題材に
> プログラミング言語の作り方を解説します。
6デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:15:32
1-2 サンプルプログラムに特化した言語、HQ9+
1-3 8つの命令ですべてを記述する言語、Brainf*ck
1-4 決して印刷できない言語、Whitespace
2-1 きらめく星空のような言語、Starry
2-2 Unicodeを悪ノリした言語、Bolic
付録 Esoteric Language傑作選
 新次元のプログラミング言語、Befunge
 文字を一種類しか使わない言語、Wierd
 英文学的プログラミング言語、Shakespeare
 数値を「調理」する言語、Chef
 関数だけでできている言語、Unlambda
 ちょっと草植えときますね型言語、Grass
 1キロバイトでコンパイラが書ける言語、False8
 0次元のプログラミング言語、NULL
 A, AAA言語、AAAAAAAAAAAAAA!!!!
 普通の言語に似て非なる言語、INTERCAL
 地獄から来た言語、Malbolge
 風にたなびく煙のような言語、KEMURI
 データをドライブする言語、Taxi4
2009/01/08(木) 13:19:17
Amazon.co.jp: Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~: 原 悠: 本
ttp://www.amazon.co.jp/dp/4839927847
ttp://images-jp.amazon.com/images/P/4839927847.09.MZZZZZZZZZ.jpg

>内容紹介
>あなたは「+-><.,[]」の8つの記号しかないプログラミング言語や、空白だけで構成されるプログラミング言語があるのをご存じだろうか。
>本書では、そんな奇妙な言語(Esoteric Language)を題材にプログラミング言語の作り方を解説します。

[esobook] Brainf*ckとWhitespaceの本を書きましたwwww - Greenbear Diary (2008-12-08)
ttp://mono.kmc.gr.jp/~yhara/d/?date=20081208#p01

> 第一部ではHQ9+から始まり、Brainf*ck、Whitespaceを題材にインタプリタ・VM方式の処理系を作る
> 第二部では本書オリジナル言語であるStarry、Bolicを題材に新しいプログラミング言語の作り方を解説
> 付録では本編で取り上げられなかった13個のEsoteric Languageをちょっとずつ紹介 (Grassもあるよ!)
8デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:21:41
punctfuck.rb

$___,@_,@__,$_=(@@__="")=~//,?#=~/$/,->(_){_<(__="####"=~/$/)**__&&(@@__<<
_;@__[_+@_])},[*$<]*@@__;@__[$___];$____,$_,@___,$__,@__=$_[@_+($_+?!=~/!/
)..-@_],$`,[],[],->(_){(__=$_[_];__=~/[><+\-\.,]/?$__<<$_[_]:__==?[?(@___,
$__=$__,[]):__==?]?$__=@___<<$__:__==$\?$\:_)&&@__[_+@_]};@__[$___];@___,
$_,@@_,@__=[],[],$___,->(_){$_[@@_]||=$___;({?>=>->{@@_+=@_},?<=>->{@@_-=
@_},?+=>->{$_[@@_]+=@_},?-=>->{$_[@@_]-=@_},?.=>->{$><<@@__[$_[@@_]]},?,=>
->{$____=~/^./&&($____=$';$_[@@_]=@@__=~/#{((__,=[*?/..?:]&[$&];__)||(__,=
[*?@...?[]&[$&];__)||(__,=[*?`...?{]&[$&];__))&&__!=?{?$&:'\\'+$&}/)},$\=>
->{$\}}[$__[_]]||->{$_[@@_]!=$___&&(@___<<[$__,_-@_];$__=$__[_];@__[$___]
*@___,($__,_)=@___);""})[]&&@__[_+@_]};@__[$___]

■[Ruby] 記号だけで brainfuck インタプリタ
http://d.hatena.ne.jp/ku-ma-me/20080626/p1
9デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:24:43
今までに作ったソフト - Nintendo DSでプログラミング
http://void-main.org/dsprogram/index.php?%E4%BB%8A%E3%81%BE%E3%81%A7%E3%81%AB%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%BD%E3%83%95%E3%83%88
10デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:34:15
ttp://www.esolangs.org/wiki/Quantum_brainfuck
11デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:36:49
ttp://hoznas.blogspot.com/2008/06/brainfukexcel.html
ttp://unkun.ikaduchi.com/excel_bf/index.html
12デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:42:24
ttp://www.hevanet.com/cristofd/brainfuck/

ttp://jp.youtube.com/watch?v=GcDshWmhF4A

#…今指すメモリに西暦の上2桁入力
 次のメモリに下2桁
 次のメモリに月入力
 次のメモリに日入力
#
> >[> > >+<<<-]> > >+[<+++++++++++++>-]+++++<[> >+>+<<<-]> > >[<<<+> > >-]<<[>>
+>+<<<-]> > >[<<<+> > >-]<<[->-> >-<<[[>+<-]> >+<<]>[<+>-]>[<<<<[> >+>+<<<-]> >
>[<<<+> > >-]> >+<+]<<<]>[>+<-]<<[>+>+<<-]>[<+>-]> >[<->-]> >[<<<<+> > > >-]<<<
[-]<<<<<<++[> > > > >+<<<<<-]> >+++++[> > >+<<<-]> > > >+++++++<[> >+>+<<<-]> >
>[<<<+> > >-]<<[> >+>+<<<-]> > >[<<<+> > >-]<<[->-> >-<<[[>+<-]> >+<<]>[<+>-]>[
<<<<[> >+>+<<<-]> > >[<<<+> > >-]> >+<+]<<<]>[>+<-]<<[>+>+<<-]>[<+>-]> >[<->-]>
>[<<<<+> > > >-]<<++++++++[<++++++>-]<.

今日の曜日を計算
0…月曜日 1…火曜日 ・・・ 6…日曜日

閏年の厳密な計算が面倒だったので2008〜2011までしか通用しないのと、
除算は前スレの誰かのを流用しただけなので、もっと短くできる。(メモリを破壊してもいいので)
13デフォルトの名無しさん
垢版 |
2009/01/08(木) 13:47:25
ttp://lab.moyo.biz/garage/brainfuck/index.xsp

ttp://brainfuck.sourceforge.net/results0.html

ttp://jp.youtube.com/watch?v=pP1yTDEtiDE

ttp://www.jmuk.org/diary/2007/03/01/0
>shebang 行の解釈は execve(2)、つまりカーネルが行なう。
>やったことがないなら man execve してみるといいと思う。ちゃんと解説してあります。

だと。シェルはカーネルに丸投げするだけみたいだ。
つまり、1行目を除いてからアプリに投げるカーネルを作ってやれば、おk(違
#勉強になった。
2009/01/08(木) 13:58:25
ttp://groups.google.co.jp/group/brainfunck?hl=ja


>++++++++++[>+++++
+++>+++++++++++>++
++++++++++[<]>-]>--
.>>---.<--..<++.>+++.
2009/01/08(木) 13:59:38
module brainfuck;
const(ubyte)[] brainfuck(const(char)[] code)(in const(ubyte)[] input = []) {
ubyte[] output, mem = new ubyte[100];
uint ptr, readptr;
mixin(_brainfuck(code));
return output;
}
private const(char)[] _brainfuck(const(char)[] code) {
char[] o = "".dup;
foreach(c; code) {
switch(c) {
case '>': o ~= "if(++ptr >= mem.length) mem.length = mem.length * 2;"; break;
case '<': o ~= "--ptr;"; break;
case '+': o ~= "++mem[ptr];"; break;
case '-': o ~= "--mem[ptr];"; break;
case '.': o ~= "output ~= mem[ptr];"; break;
case ',': o ~= "mem[ptr] = readptr < input.length ? input[readptr++] : 0;"; break;
case '[': o ~= "while(mem[ptr] != 0) {"; break;
case ']': o ~= "}"; break;
default: break;
}
}
return o;
}
unittest {
assert(brainfuck!("+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.") == cast(ubyte[])"Hello, world!");
}
2009/01/08(木) 14:00:38
>++++++++++[>+>+++>++++++++++++[<]>-]> > >++++........<<+++.---.> >..<++..
..>...<<+++.---.> >..<....>...<..................>..<.............>...<.................>..<<+++.---.>
>.......<...>..<..>..<..>.....<..................>..<............>.....<..>..<..>..<<+++.---.> >..<..
..>..<..>....<...>..<...>..<...>..<.>..<.>....<..>......<.>..<...>..<.>..<...>..<.>..<.>..<<++
+.---.> >..<.....>..<.>..<......>......<...>..<.>...<...>..<...>..<...>..<...>..<.>..<......>...<<
+++.---.> >..<....>...<.>..<.....>..<...>..<...>..<.>..<....>..<...>..<...>..<...>..<.>..<...>..
<.>..<.>..<<+++.---.> >........<..>..<......>....<.>...<.>..<.>..<....>..<...>..<....>.....<...>
.....<..>..<...>..
17デフォルトの名無しさん
垢版 |
2009/01/08(木) 14:02:02
ttp://www.nishiohirokazu.org/blog/2007/02/grinedit_6.html
2009/01/08(木) 14:05:00
GZip+Base64

H4sICFJPkEYAAIGfdzVLMjdCRnIyAJWV63ECMQyE/9/MVSKUCjRuxOP+28jntc6CC0wSAcaWVmu9
Dlprj9YM6bFWX9J88I7wfplrRS6zQeDdIh5C2XksimIRg8doXR+z4ikqAJZsHBC0HpLzYJFvlw1O
1g4QlsCJ2xciMAhkOsILTJ9QCHk1jE/hGTYL//vSfVQGEMygz4PMuH7lwd4b6SDAbVTGlS9kYCc4
PcE7O4UeM0YREztwpaM4MyXkusDHVLUsCQifBNMGYJQQ44apQgmDstTdLz1hpzKUecJsS1dnOkFm
WJGNHChzLobi037sC4d/bth5fGhZ9YsVk4dr2SvxbnS7vNY87j7da9VupZLVohAAoiCpPo89eYS8
mjA3su6aIcqAwCZN8gxobrdzhJF7ew5BGFs8bB5EOldpsICpTZZljRvkXeO35xHBVW/rpnN1Evv7
7lXPLLtvegrL9e4mYtdFsBrqbLdY8AMsV2nkAIrpGQswiVCqMkAmCBG9UkAgpb96iVlgdLkXC1ln
nXZ98utDld7U6Pl6Zf1aiIoI+wX9T9wwVuRycLmjgQIVekuFiJbOpcn5cDSzplINPYU2/aoW9bOd
gkkpOslnf3R7ISZ1wGL1zFwV8szWfv6OKY0vNa+odF7Su2HSPD5++ZsZ31FFeUKKBgAA
2009/01/08(木) 14:13:48
= で式の終了。q でプログラムの終了。
プログラムが終了しないときは = → 実行 → q → 実行 で終了するはず。

123+45 * 6+ (200+ 12 *( 99 -90) / 4 )*77 *=

を入れたらちゃんと17872を出すからバグはないと信じたい。



なんか凄いな、Brainfuck。C言語で
int main(){char a;scanf("%c",&a);a++;printf("%c",a);return 0;}
っていうプログラムも、BFにかかれば、
,+.
になっちまうんだもんな。すごいよBrainfuck。すごいよUrban Muller。

あ、あとBrainfuckをBrainf*ckって言ってるサイトが多いから、
Brainfでぐぐっても結構引っ掛かるんだよな。
だから、Brainfっていう呼び方を推奨する。
因みに日本語訳は、”魚の骨”だ。解説は要らないと思う。
2009/01/08(木) 14:24:15
>>1
+++++++++[>+++[>+++++<-]<-]>>++.<++++++[>+++++++<-]>.
2009/01/08(木) 15:49:57
すみませんoctaveのプログラムについて聞きたいのですが・・・
どこで聞いたらいいでしょうか??この板にくるのは初めてなもんでorz
スレチですみません、誰か心やさしい人教えてください
2009/01/08(木) 15:57:11
データ解析ツールoctaveを語ろう
http://pc11.2ch.net/test/read.cgi/unix/1086016412/
2009/01/08(木) 16:15:31
>>22
ありがとうございます!
2009/01/08(木) 21:44:16
前スレでBFの出力すぐ見たいっていう話があったので
ブックマークレット作ってみることにした
2009/01/08(木) 22:27:07
無限ループ判断をどうするかで悩んだら凡人決定
2009/01/08(木) 23:12:08
テストコード
+++++++++++++++++++++++++++++++++++++++++++++++++.
2009/01/08(木) 23:13:19
テストコード
,[.>,]
2009/01/09(金) 00:06:51
BFコードが無限ループする前にJavaScriptが無限ループしてます orz
2009/01/09(金) 00:17:41
無限ループするかどうか判定するブックマークレット
2009/01/09(金) 00:34:13
無限ループする無限ループするかどうか判定するブックマークレット
2009/01/09(金) 00:41:51
無限ループするかどうか判定するブックマークレットが無限ループするか判定させてみよう
2009/01/09(金) 01:45:02
javascript:(function(bf){a='........\t.\r..\n.................. !"#$%&\'
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmn
opqrstuvwxyz{|}~........................................................
...........................................................................';
p='';m=0;b=[0];i=0;s=[];o=[];c='';z=1;d=function(e){r=e+'\n('+c+') at '+i+
'\ns: '+s.join(',')+'\nm: '+m+'\nb['+b.join(',')+']\n'+o.join('');if(z){if
(!confirm(r)){z=0;}}else{alert(r);}};if(confirm('このコードは '+bf.length+
' 文字あります ( loop 除く )\n実行に時間がかかる場合がございます')){while
(i<bf.length){c=bf.charAt(i);if(c==','){p=prompt('入力(とりあえず1文字目のみ
有効)','');b[m]=(p&&p.length)?p.charAt(0).charCodeAt():0;}else if(c=='.')
{o.push(a.charAt(b[m] % 256));}else if(c=='['){if(!b[m]){k=0;j=i+1;while
(j<bf.length){f=bf.charAt(j);if(f=='['){k++;}else if(f==']'){if(!k){i=j+1;
continue;}else{k--;}}j++;}if(j>=bf.length){return d('対応する]が見つかりません');
}}else{s.push(i);}}else if(c==']'){if(!b[m]){s.pop();}else{i=s.pop();continue;}}
else if(c=='<'){if(--m<0){return d('未定義メモリ参照');}}else if(c=='>'){if
(++m>=b.length){b.push(0);}}else if(c=='+'){b[m]++;}else if(c=='-'){b[m]--;}
else if(c!=' '&&c!='\t'&&c!='\r'&&c!='\n'){return d('未定義命令');}if(z){d
('debug');}i++;}return d('正常終了');}})(document.selection?document.selection
.createRange().text:document.getSelection());
2009/01/09(金) 01:47:57
ブックマークを作成してURLに上の改行取り除いたものをまるごと保存してください
その後BFコードを選択してブックマークを選ぶと実行されます
デフォルトでデバッグモードで起動しますがデバッグをキャンセルすると
その場所から残りをリアルタイムで実行されます

とりあえず FireFox3 では動いた
IE6 だと JavaScript 単体では動くがブックマークレットにすると動かない
たぶんどこかの文字をエスケープする必要があると思う
2009/01/09(金) 01:49:00
コントロールキャラクタ等は全部「.」表示されます
2バイトコードは試したけどまだうまくいっていないので
同様に「.」表示されます
2009/01/09(金) 07:26:31
すげーけど使い勝手悪いね
2009/01/09(金) 07:39:02
alertのpopupじゃなくてwindowのpopupしようとしたら
popupブロックに引っ掛かったのでとりあえずalertにした感じ

改良予定としてはpopupじゃなく画面分割でデバッグ出来て
ここみたいに
ttp://cfs.maxn.jp/neta/onlineBrainFuck.html
実行位置が目視で判るようにしつつワークレジスタも表示出来るといいですね

FireFoxだと動いてIEで動かないときってFireBugでデバッグ出来ないから困りますね orz
2009/01/09(金) 07:41:34
FizzBuzzとか時間掛かるコードだと無限ループしてなくても
FireFoxのwatchdogにつかまって警告でてワロス
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況