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/09/23(水) 19:51:53
>>193
それはbfが関数型言語じゃないから
純粋とか言う問題じゃないんじゃないか
2009/09/23(水) 21:26:57
BFのシンプルな体系を壊さずに拡張する方法としては
負の方向のメモリマッピングにコンソール(.,)以外の
I/Oを割り当てることかな
[-1]に数値をストアしておいて
[-2]の位置で+-すると[-1]の回数beepとか
[-3][-4]に数値をストアしておいて
[-5]の位置で+-すると[-3][-4]の座標の白黒が反転するとか
2009/09/24(木) 01:22:24
入出力命令をin,outにすればいい
>+++++++++[-<++++++++++>]<++++++, //in 60h
197185
垢版 |
2009/09/24(木) 02:13:09
>>168 の提案した奴を作ってみたけど、面白い使い方がなかなか見つからないなあ。
実際のリスト構造はともかくとして、いろいろ遊んでみると、メモリ空間がL-UとR-Uの
2次元になった、という印象。可能性はすごく感じるので、なんとかしたいのだが。
198168
垢版 |
2009/09/24(木) 05:53:17
消費メモリが定数なアルゴリズムだとBTBFの有り難味はないかもね。
実行中にバンバンnewするようなプログラムや複数の可変長配列を使うアルゴリズムが
いくらか書きやすくなるんじゃないかとは思ってる。
あと、関数コールの機構もBFで実装するのはきつくても
BTBFならもしかしたらBFよりずっと楽にいけんじゃね?
2009/09/24(木) 21:05:22
実装は既存のBF処理系に
L: p*=2;
R: p=p*2+1;
U: p/=2
を付け加えて、ptrの初期値を1に修正するだけだな
2009/09/27(日) 23:03:26
ところで、2分木を綺麗にグラフィカルに表示するライブラリって何かいいのある?
2009/09/27(日) 23:20:15
BFスレでその話題を振るココロは?
2009/09/27(日) 23:43:25
>>168をもうちょっと見やすくしたくて。


2009/09/27(日) 23:56:13
そもそもBFで書かれたライブラリなんて存在するのか?
2009/09/27(日) 23:57:21
まずbfはライブラリを作ること自体困難だろ
2009/09/28(月) 01:51:09
まずは整数の四則演算ライブラリからだな
ライブラリというかコードスニペットレベル?
2009/09/28(月) 07:02:38
前スレであったみたいに
どこのメモリに数値を入れて
どこのメモリに答えが返ってくる
って感じにすると良いんじゃない?
2009/09/29(火) 02:17:13
call
2009/09/29(火) 02:31:22
任意のシステムコールさえ呼べれば何とでもなる
敢えて関数呼び出し機構を命令に加える必要はない
2009/09/29(火) 03:23:00
文字列やポインタを渡さなくちゃならないシステムコールはどうするんだ
2009/09/29(火) 09:22:16
システムコールとシリアル通信すればいいよ
2009/09/29(火) 10:00:05
VRAMの上で走るBFを、
標準入出力から他のBFプロセスで制御すればいいんじゃね…?
212デフォルトの名無しさん
垢版 |
2009/09/29(火) 12:15:04
それをBFの機能と言えるかが問題だな
バイナリデータですらシステムコールが可能と言えてしまうぞ
2009/09/29(火) 18:41:29
BFのデータセグメントをVRAMに置けっ場解決するのか?
ダブるバッファリングは無理か
2009/09/29(火) 19:54:18
もうbf用のOS作ったら?
2009/09/29(火) 20:22:16
OSにBF向けのインターフェースがあればいいわけだな
0番地に+すると1番地の番号のシステムコールを2,3,4,...番地の値を引数にして呼び出すみたいな
2009/09/29(火) 20:26:54
そうすればハードディスクとかメモリとかにアクセスできるな
解析とかも簡単になるんじゃない?
2009/09/29(火) 22:14:03
まずはリンカとローダだろ。
2009/09/30(水) 02:09:42
コード空間とメモリ空間が分離されてるからリンカやロダは不要
2009/11/11(水) 22:18:35
何で
2009/11/19(木) 23:41:50
brainfuckって英語でどういう意味ですか?
2009/11/20(金) 00:06:17
のーみそこねこね
2009/12/03(木) 18:18:34
       ___
     /      \
    /   ⌒   ⌒\
  /     ,(⌒) (⌒)、\  ひとりSMセット買ったお
  |     /// (__人__)/// |     今夜は楽しむおww
  \      ` ヽ_ノ   /   
    ヽ    , __ , イ
    /       |_"____
   |   l..   /l SMグッズ l
   ヽ  丶-.,/  |_________|
   /`ー、_ノ /      /
       ::                .|ミ|
        ::               .|ミ|           ::::::::
         :::::     ____ |ミ|          ::::
           :: ,. -'"´      `¨ー 、       ::
   ::        /   ,,.-'"      ヽ  ヽ、    ::
   ::     ,,.-'"_  r‐'"     ,,.-'"`     ヽ、 ::
   ::   /    ヾ (    _,,.-='==-、ヽ         ヽ、
   ::   i へ___ ヽゝ=-'"/    _,,>         ヽ 
   ::   ./ /  > ='''"  ̄ ̄ ̄               ヽ 
  ::   / .<_ ノ''"       ヽ               i
  ::   /    i   人_   ノ              .l
  ::  ,'     ' ,_,,ノエエエェェ了               /
    i       じエ='='='" ',              / ::
    ',       (___,,..----U             / ::
     ヽ、         __,,.. --------------i-'"  ::
      ヽ、_   __ -_'"--''"ニニニニニニニニヽ   ::
         `¨i三彡--''"´              ヽ  ::  
          /                      ヽ ::              ┼ヽ  -|r‐、. レ |
         /                     ヽ::            d⌒) ./| _ノ  __ノ
2009/12/03(木) 20:02:48
あるある
2009/12/04(金) 05:07:08
perlでBrainfuckの処理系書いてみたんだが、
Brainfuckのプログラム書くより簡単でなんだか複雑な気分だ…
2009/12/04(金) 22:07:52
次はBrainfuckでperlの…
2009/12/04(金) 23:22:03
Brainfuckで日本語が扱えるようにはならないものか
2009/12/04(金) 23:35:38
そーすに記述したいってんでもあるまいし、扱えないことはないだろう?
2009/12/05(土) 00:08:59
ShiftJISなりUTF-8なりのバイト列を吐けばいいだけだよな
2009/12/05(土) 09:33:31
例えば、
: で、ポインタの指している値とその次のポインタの値を2バイト文字として出力する。
; で、2バイト文字を入力して、ポインタの指している値とその次のポインタの値に代入する。

ってのはどうよ?
2009/12/05(土) 11:01:11
.>.<と,>,<で十分じゃないか
231229
垢版 |
2009/12/05(土) 16:21:32
とりあえず実行してみた。

>++++++++++[<+++++++++++++>-]
+++[>+++++<-]>[<++++++++++++>-]<--->
>++++++++++[<+++++++++++++>-]
>++++[>++++<-]>[<+++[<+++++>-]>-]<<+>
>++++++++++[<+++++++++++++>-]
>++++++++++++++[<++++++++++++++>-]<+++++>
>++++++++++[<+++++++++++++>-]
>++++++++++++++[<++++++++++++++>-]<----->
>++++++++++[<+++++++++++++>-]
>++++++++++++++[<++++++++++++++>-]<+++++++++>
>++++++++++++[<++++++++++++>-]
>+++++++++++++[<+++++++++++++>-]<------->
>++++++++++++[<+++++++++++>-]<++++++>
>++++++++[<++++++++>-]<+++++>
>++++++++++[<+++++++++++++>-]<->
>++++++++[<+++++++++>-]<+
<<<<<<<<<<<<<<<
:>>:>>:>>:>>:>>:>>:>>:>>:


メモリに"こんにちは世界!"を表わす
82,B1,82,F1,81,C9,81,BF,82,CD,90,A2,8A,45,81,49
がメモリに積まれて、最後の方の":"命令で、Shift-JIS形式の文字が表示される。

作ってから思ったけど、これって既出?
2009/12/05(土) 17:03:48
うん。
2009/12/05(土) 17:46:50
>>229
Shift-JISを使うために新命令は必要ないってことわかってる?
入出力は1byteずつでも、解釈はまとめてやればいい。
実際そうしてShift-JISを扱えるBF処理系も存在する。
234デフォルトの名無しさん
垢版 |
2009/12/05(土) 22:50:53
馬鹿だなぁ
:>
が顔に見えるってギャグだろどうせ
2009/12/06(日) 10:05:30
海外風な顔文字か。
[:<]<
2009/12/06(日) 23:24:24
BFで : を .>.< に置き換えるBFプロプロセッサ書けばいいよ
2009/12/08(火) 12:47:34
まだBFなんてやってんのかよだっせー
時代は純粋関数型言語Unlambdaだぜ
2009/12/09(水) 03:11:58
>>237
そんなこと言うならBrainfuckユーザが容易にUnlambdaへ移行できるように
Brainfuck-to-UnlambdaトランスレータをUnlambdaで書いてくれw
2009/12/09(水) 18:02:48
bfユーザが理解できるようにトランスレータはbfで書こうぜ
2009/12/22(火) 13:47:48
#defineしまくればCでも書けるかな
2010/01/02(土) 17:42:21
esotope-bfcって凄いな
自分で作る気が失せる出来
2010/01/02(土) 17:58:44
>>241
見てきた
なんじゃあのオプティマイズ
2010/01/03(日) 00:13:20
まだまだだな
例示のプログラムのmやpはいらん
2010/01/03(日) 08:07:28
そのへんは削除するようにする(した)って書いてるよ
2010/01/09(土) 00:17:46
#include <stdio.h>

int main(int argc, char *argv[])
{
int c;

while ((c=getchar()) != EOF) {

while (c) {
putchar('+');
c--;
}
puts(".>");
}
}
2010/01/09(土) 02:25:08
俺にもHello Worldが作れた!
247245
垢版 |
2010/01/09(土) 19:43:17
修正
#include <stdio.h>

int main(int argc, char *argv[]){
int c,d;
int l = 0;

while ((c=getchar()) != EOF) {
d = c-l;
if (d>0) {
while (d--) {
putchar('+');
}
} else {
while (d++) {
putchar('-');
}
}
puts(".");
l = c;
}
}
2010/01/10(日) 04:01:44
最適化されたBFのソースを吐くなら、まだ修正する意味もあるかもしれないな。
2010/01/15(金) 16:34:45
最小ブレインファック問題の計算複雑性ってどの程度?
250デフォルトの名無しさん
垢版 |
2010/01/16(土) 09:18:43
http://d.hatena.ne.jp/KeisukeNakano/20070626/1182879045

凄いんだが、何を行ってるのか分からない( ´∀`)ハハハ
2010/01/16(土) 17:09:01
>>249
直感的には、NP完全
2010/01/16(土) 20:19:33
>>249
計算不可能な問題だと思う
2010/01/17(日) 12:19:05
>>252
実質不可能って意味ではそうかもしれんが。
現実的でない時間をかけてもいいのなら、短いものから順にブルートフォースするといつかはたどり着くわけだから計算は可能。
254253
垢版 |
2010/01/17(日) 12:23:29
いや、計算不可能かもしれない。ごめん。

無限ループかと思えるくらいに長い時間をかけて、最小BFとなるパターンと、単なる無限ループを区別するには
停止可能性の判定が必要になってくる。
2010/01/17(日) 19:49:19
プログラムの等価性判定って計算不可能だよね?
だとすれば、最小BFが計算できればその最小BF同士の比較によって等価性判定ができちゃうので計算不可能だと思う。
256245
垢版 |
2010/01/20(水) 22:10:00
short bf_opt1(char *bfcode, char *optbfcode)
{
int prevcode;
int deletecode;
/*ここに最適化処理を書きます。*/

/*1 ムダなコードの取り除き*/
while (*bfcode) {
if (prevcode == '>' && *bfcode == '<') {
*bfcode = *(-1 +bfcode) = ' ';
deletecode = deletecode+2;
}
if (prevcode == '+' && *bfcode == '-') {
*bfcode = *(-1 +bfcode) = ' ';
deletecode = deletecode+2;
}
prevcode = *bfcode++;
}
strcpy(optbfcode, bfcode);
return deletecode = deletecode+2;
}
2010/02/21(日) 14:34:22
2010/02/21(日) 18:32:02
スーパーpre記法のシンタックス・ハイライトが Brainfuck, Clojureに対応しました - はてなダイアリー日記
http://d.hatena.ne.jp/hatenadiary/20100219/1266571864
2010/02/22(月) 17:35:51
何やってんだw
2010/02/27(土) 15:51:14
bfがインタプリタ作るのが簡単な言語とはよく言われていたが、
シンタックスハイライト作るのも簡単ってのは斜め上だなぁ。気づかなかった。
2010/03/03(水) 16:39:55
プログラマーが仕事をサボっている兆候一覧

「Dvorakでもかなり早く打てるようになってきたぞ」
「念のためうちのサーバーでもGopherをサポートできるようにしときました」
「XHTML、HTML、さらにHAIKUにも準拠しています」
「brainfuckのシンタックスハイライトに対応しました」 ← new!
2010/04/10(土) 11:57:14
+[+] //まだまだ終わらせないコード
2010/04/14(水) 01:57:52
そのコードいずれオーバーフローして止まるぞ
2010/04/14(水) 02:03:54
+[-+]
2010/04/14(水) 09:13:58
ニコニコだけど、BFのインタプリタを作ってる動画
http://www.nicovideo.jp/watch/sm10384056
2010/04/14(水) 16:52:59
>>265
2010/04/14(水) 17:08:11
今日じゃねえかwww
2010/05/13(木) 00:26:54
一ヶ月前だ
2010/05/13(木) 16:03:27
今となっては昔のことだが
2010/05/19(水) 23:22:02
Brainfuckというものがあったそうな
2010/05/20(木) 00:20:07
湯水のごとく記号を使い、小さなプログラムを組んではスレに納めていたそうな
2010/05/24(月) 15:35:19
ttp://twitter.com/YewShmz/status/14212364028
2010/05/29(土) 04:23:28
2日前からBrainfuckプログラミング初めた
ようやくHelloWorldできた
>>>++++++++++[<+<<+>>>-]<[<++++>>++++++>++++++++++<<-]+++++
+++++>>[<<+>>>>+<<-]++++[>+++++<-]>>[<+<+>>-]>+++++[<++++++
+>-]<.<<<<-----.+++++.>>-.<<--.>>>---.<+.+.>>---.<<<.>>--.+
.<-.+++++.<<+++.<++++++.>>>-.<++.<<<.>>>>+.<<-.>>>.>.<<<<-.
>>--------.<<----.+++++.<------.+.<.>>>>>+++++++.<<<<<.>>>>
>>....<<<<++.++.---------.+++++.>>>-------.<+++++.<<<-.----
--.>>>++.---.<<--..+++.>>>>.<+++.<<<.+++.------.>>-.>>+.-<<
--------.<<++.<.+++++++.>>---.<<<.>>>>>>....<<<<++++.>>++++
+++++.>---.+.<<<.----.>>>>.<<<<<+++++++.>>.<<<.>>>>>++++++++.
2010/05/29(土) 07:48:52
うわぁ・・・
いまどき文字列出力くらいは拡張命令でやるのが常識だぞ
いくらなんでも非効率的に過ぎる

#!/bin/bf
printf("HelloWorld\n")
2010/05/29(土) 11:43:29
>>274
BFなんて実用目的に使うものじゃなくて、パズル感覚で遊ぶものなんだから
そっちの方が邪道だろw
2010/05/29(土) 13:01:04
音は出ないの?
2010/05/29(土) 16:20:38
任意のアドレスに割り当て
+-で操作して
.で鳴らす

とか考えたけどハードというか実装依存だね
2010/05/29(土) 16:24:55
出力したら音が鳴るインタプリタ作ってやろうかと思ったけど
よく考えたらそんな技術無かった。
2010/05/29(土) 16:33:02
楽な方法なら
三角波でド〜↑のドまでの単音ファイルを用意して
数値によって再生
2010/05/30(日) 03:33:27
出力からmidiを鳴らすインタプリタ半分完成した
音の長さや音色、テンポ、スケール、和音なんかを扱える仕様を考えてる
今日はもう寝るがな
281デフォルトの名無しさん
垢版 |
2010/05/30(日) 03:42:12
>>280
ソースきぼん
2010/05/30(日) 03:53:02
>>281
javaだけど、思い出しつつ調べつつ書いた汚いソースだぞ
すぐには見せられんわ
文字コードを音階に対応させて再生してるだけだし

一応スクリーンショット
蛙の歌を再生中
http://www.dotup.org/uploda/www.dotup.org924517.png
283282
垢版 |
2010/05/30(日) 20:14:49
とりあえず動くものが出来ました!
中のtxtをソフトの左の欄にはっつけてrunしてみて下さい!
XPなら動くと思います。
midi音源にMicrosoft GS Wavetable SW Synthを使用してます。

http://www.dotup.org/uploda/www.dotup.org925971.zip

あ、もちろん実行は自己責任で。
284282
垢版 |
2010/05/30(日) 22:07:16
反応無いけどバージョンアップだよ\(^o^)/
命令の数を4096個まで実行可能にしたよ。
スペランカーフルだよ。

http://www.dotup.org/uploda/www.dotup.org926263.zip
285デフォルトの名無しさん
垢版 |
2010/05/31(月) 01:46:40
あなたは神様ですか?
2010/05/31(月) 03:05:01
とんでもねえ、あたしゃ神様だよ
2010/05/31(月) 12:48:23
win7だと何も起きないのね
ちなみにwindowCloseイベントくらい処理してほしかったなぁ
288282
垢版 |
2010/05/31(月) 12:52:12
>>287
何も起きないってどういうことですか?
ちゃんとクローズしますよ!初期化に失敗すると閉じないのかなぁ?

休日をそれで潰しちゃったのでツケを払うのに今忙しいんです。
ごめんね><
289282
垢版 |
2010/05/31(月) 17:58:07
一応(遅いですが)仕様を連ねておこうと思います。

■インターフェイス編
・画面左欄がソース、右欄がアウトプット
・runすると同時にsetされます
 set状態ではソースの変更は出来ません
 set/unsetボタンで解除できます
・下の欄がインプットです
 ','でインプット欄の文字が1文字読み込まれます
・stepボタン右のlabelにはプログラムカウンタが表示されます(正直あまり意味ない)
・アウトプット欄には通常のbrainfuckで出力される文字のみが表示されます
■MIDI編
・MIDI出力には標準で"Microsoft GS Wavetable SW Synth"を使用しています
 一応、引数により任意のデバイスを使えます 例 brainmidi.jar "Java Sound Synthesizer"
 起動時にSystem.out.printでコンピュータ内のデバイス名をコンソールに列記してますが、私はjar実行ファイルでのコンソール出力を知るすべを知りません\(^o^)/
・デバイスのオープンに失敗してもエラーはでません
・文字コードどmidi出力の対応表です
 33〜123 : 音を出す
 1 + 引数 : テンポを引数に設定



動作報告がない
290282
垢版 |
2010/05/31(月) 18:09:47
ごめんなさい途中で送ってしまいました。。。

 2 + 引数 : 引数の音数を同時に発するように設定します
 3 + 引数 : 音の長さを設定します 引数は0〜5までそれぞれ16分音符、8分音符、4分音符、3分音符、2分音符、全音符に対応します

 * + 引数 の表記は*を出力した後引数を出力するという意味です

走り書きでごめんなさい
そして、見直すべき所がいっぱいですね

動作報告や反応がないのでどうしていいやら^^;
もうそんな下らないものはいいというのであれば去ります
もっと改良してというのであれば頑張ります

長文すいませんでした
2010/05/31(月) 19:39:12
>>282
Win7+JDK6だとbrainmidi.jarをダブルクリック
×ボタン(WindowClose)をクリック
無反応になるのよ


あとサンプルのsperanka.txtをエディタで開いて左ペインに貼り付けてからrunをすると
ウィンドウがすべてグレー(選択不可)になっているにも関わらず何もおきない(CPUも食わない)
になる

音源ってJavaからのアクセスのために特別な設定が何か必要だったっけ?

きれいじゃなくてもいいからソースがあれば手伝えるのだけど、さすがにjarだけだとめんどくさいんだ
292282
垢版 |
2010/05/31(月) 20:05:34
>>291
原因が分かりました
デバイスオープンに失敗するとデバイスアクセス時に固まるようです
私はwin7は持っていないのですが、Microsoft GS Wavetable SW Synthが入っていないのでしょう
>>291さんのPCに入っているmidi音源を第一引数として指定し実行すれば動くと思います。(必ずダブルクオーテーションで挟むように)

>音源ってJavaからのアクセスのために特別な設定が何か必要だったっけ?
特に必要はないはずです

ソースは仕様見直し、ブラッシュアップ後にうpしようと思います
おそらく数時間後
2010/05/31(月) 22:15:53
>Microsoft GS Wavetable SW Synth
普通に考えてコレが入ってないのあり得ないと思うんだが
デフォルトのMIDI音源だよね?
294282
垢版 |
2010/05/31(月) 22:39:06
バージョンうp
ソースと引数指定用バッチファイル同梱です!
ttp://www.dotup.org/uploda/www.dotup.org928595.zip

>>293
確かに入ってないとおかしいですよね。
ほかに原因があるような気がしてきた・・・

>>289の追伸ですが
文字コード32(スペース)は音の鳴らない空ノートを示します
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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