brainfuck⇔奇声言語 対応表
| brainfuck | 奇声言語 |
|---|---|
| + | ンエッ |
| - | オ"↓オ↑"オ↑↑ |
| > | ぐえー |
| < | ぐぼぁっ |
| [ | スボョウ |
| ] | ギギャーッ |
| , | ふにゃ~ |
| . | ビィ~ |
コマンドの仕様はbrainfuckを調べてください。
brainfuck ⇒ 奇声言語変換
brainfuck SCP foundation
+++++[>++<-]+++[>[>+>+>>+<<<<-]>>>>[<<<+<+>>>>-]<<<<<-]>[>>>>>+>+<<<<<<-]>>>>>[>[>+<<<+<+>>>-]>[<+>-]<<-]>[>++<<<+>>-]++++[>[>+<<<+>>-]>[<+>-]<<-]<+++.<<<<+++++++.>>>>---.<<<++.>++.>+.++++++.-------.<--.---.>++++++.<++++++++.>-----.-.
奇声言語起動
奇声言語 SCP foundation
ンエッンエッンエッンエッンエッスボョウぐえーンエッンエッぐぼぁっオ"↓オ↑"オ↑↑ギギャーッンエッンエッンエッスボョウぐえースボョウぐえーンエッぐえーンエッぐえーぐえーンエッぐぼぁっぐぼぁっぐぼぁっぐぼぁっオ"↓オ↑"オ↑↑ギギャーッぐえーぐえーぐえーぐえースボョウぐぼぁっぐぼぁっぐぼぁっンエッぐぼぁっンエッぐえーぐえーぐえーぐえーオ"↓オ↑"オ↑↑ギギャーッぐぼぁっぐぼぁっぐぼぁっぐぼぁっぐぼぁっオ"↓オ↑"オ↑↑ギギャーッぐえースボョウぐえーぐえーぐえーぐえーぐえーンエッぐえーンエッぐぼぁっぐぼぁっぐぼぁっぐぼぁっぐぼぁっぐぼぁっオ"↓オ↑"オ↑↑ギギャーッぐえーぐえーぐえーぐえーぐえースボョウぐえースボョウぐえーンエッぐぼぁっぐぼぁっぐぼぁっンエッぐぼぁっンエッぐえーぐえーぐえーオ"↓オ↑"オ↑↑ギギャーッぐえースボョウぐぼぁっンエッぐえーオ"↓オ↑"オ↑↑ギギャーッぐぼぁっぐぼぁっオ"↓オ↑"オ↑↑ギギャーッぐえースボョウぐえーンエッンエッぐぼぁっぐぼぁっぐぼぁっンエッぐえーぐえーオ"↓オ↑"オ↑↑ギギャーッンエッンエッンエッンエッスボョウぐえースボョウぐえーンエッぐぼぁっぐぼぁっぐぼぁっンエッぐえーぐえーオ"↓オ↑"オ↑↑ギギャーッぐえースボョウぐぼぁっンエッぐえーオ"↓オ↑"オ↑↑ギギャーッぐぼぁっぐぼぁっオ"↓オ↑"オ↑↑ギギャーッぐぼぁっンエッンエッンエッビィ~ぐぼぁっぐぼぁっぐぼぁっぐぼぁっンエッンエッンエッンエッンエッンエッンエッビィ~ぐえーぐえーぐえーぐえーオ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑ビィ~ぐぼぁっぐぼぁっぐぼぁっンエッンエッビィ~ぐえーンエッンエッビィ~ぐえーンエッビィ~ンエッンエッンエッンエッンエッンエッビィ~オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑ビィ~ぐぼぁっオ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑ビィ~オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑ビィ~ぐえーンエッンエッンエッンエッンエッンエッビィ~ぐぼぁっンエッンエッンエッンエッンエッンエッンエッンエッビィ~ぐえーオ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑オ"↓オ↑"オ↑↑ビィ~オ"↓オ↑"オ↑↑ビィ~
オリジナルBrainfuck生成エンティティ
使い方
下記の様なコードでインスタンスを作ります。
var originalBFI = new OriginalBF();
メソッド
上記のインスタンスは下記のメソッドを持ちます。
- checkCommand
- set
- command
- analyse
- manualrun
- run
- convert
- reconvert
それぞれの意味を説明します。
checkCommand
引数: なし
返値: String
現在設定されているオリジナルBrainfuckの対応表を出力します。
set
引数: Object
返値: Boolean
オリジナルBrainfuckの起動時の設定を行います。下記のプロパティを持つオブジェクト、もしくは一部のプロパティを持つオブジェクトを引数に渡してください。
| プロパティ名 | 型 | 概要 |
|---|---|---|
| maxbit | Number | メモリに納める数値の最大(初期値65535) |
| runingspan | Number | コマンドを起動する間隔(ms) |
| response | Function | 1コマンド起動した時のコールバック関数 |
| autostop | Boolean | プログラムにエラーが起きた際、自動で停止するか |
| manualstop | Boolean | プログラムにエラーが起きた際停止するか |
コード例:
var originalBFI = new OriginalBF();
var BFsetting = {
maxbit:65535,
runingspan:5,
response: function(result){console.log(result.Char)},
autostop:true,
manualstop:false
}originalBFI.set(BFsetting);
返値では引数の型が適切である場合はtrueを、そうでない場合はfalseを返します。
responseについて
このプロパティは複雑な仕様を持っている為、独立して説明します。
このプロパティに渡す関数には引数を1つ設定してください。その実引数には下記のプロパティが付与されます。
| プロパティ名 | 型 | 意味 |
|---|---|---|
| success | Boolean | コマンド起動の成否 |
| pointer | Number | 参照中のメモリのアドレス |
| readpoint | Number | 起動したコマンドのソースコード中の位置 |
| nextRead | Number | 次に読み込むコマンドの位置 |
| skip | Number | [コマンドによる読み飛ばし発生(0=無,1=有) |
| Char | String | 参照中メモリの文字コード解釈による出力結果 |
| Num | Number | 参照中メモリの値を出力結果 |
| End | Boolean | プログラム終了判定 |
Char及びNumは"."(ドット、出力コマンド)を起動していない場合は下記の値を格納しています。
| プロパティ名 | 型 | 値 |
|---|---|---|
| Char | String | 空文字列 |
| Num | Number | 0 |
command
引数: Object
返値: Boolean
Brainfuckの対応表となるオブジェクトを渡して起動すると、Brainfuckのコマンドの仕様が置き換わります。
var originalBFI = new OriginalBF();
var BFcommand = {
"+":"ンエッ",
"-":'オ"↓オ↑"オ↑↑',
">":"ぐえー",
"<":"ぐぼぁっ",
"[":"スボョウ",
"]":"ギギャーッ",
",":"ふにゃ~",
".":"ビィ~"
}
originalBFI.command(BFcommand);
ただし、このBrainfuckのコマンドは各コマンドを前方一致で検索し解析します。その為、書き換えるBrainfuckのコマンドの中に、他のコマンド名が前方に含まれるコマンドがある場合、正常に動作しません。
良い例:
">":"newCommand1",
"<":"newCommand2",
悪い例:
">":"newCommand",
"<":"newCommand223",
返値では引数の型が適切である場合はtrueを、そうでない場合はfalseを返します。
analyse
引数: String
返値: Boolean
引数として渡された文字列をオリジナルのBrainfuckのコードとして解釈し、通常のBrainfuckのコードとして内部に格納します。また、このメソッドを起動した際は、プログラム実行用の状態変数が初期化されます。
返値ではコード解析が正常に終了した場合はtrueを、なんらかのエラーが発生した場合はalert()を起動した後、falseを返します。
manualrun
引数: なし
返値: なし
analyseで解析したコードを実行します。一度プログラムを起動した後、analyseを再起動しない状態で再びmanualrunを起動した場合、プログラム実行用の状態変数が初期化されていない為正常に動作しない恐れがあります。
run
引数: String
返値: なし
analyseを起動した後にmanualrunが起動します。analyseでコードで解析が失敗すると、そこで動作が停止します。
convert
引数: String
返値: Object
BrainfuckのコードをオリジナルBrainfuckのコードに変換します。返値のオブジェクトは以下のプロパティを持ちます。
| プロパティ名 | 型 | 意味 |
|---|---|---|
| success | Boolean | 変換に成功したか否か |
| code | String | 変換後ソースコード |
reconvert
引数: String
返値: Object
オリジナルBrainfuckのコードを純粋なBrainfuckのコードに変換します。返値のオブジェクトは以下のプロパティを持ちます。
| プロパティ名 | 型 | 意味 |
|---|---|---|
| success | Boolean | 変換に成功したか否か |
| code | String | 変換後ソースコード |
ソースコード
ライセンス
作者: C-take
名称: OriginalBF
ソース: http://shitake-crude-production.wikidot.com/hoby:kisei
クリエイティブ・コモンズ・ライセンス-表示-継承 3.0(CC-BY-SA)
呼び出し用コード
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/hoby:kisei/code/1"></script>
Jsコード
//==================================== //Author: C-take //ProjectName:OriginalBF //Source:http://shitake-crude-production.wikidot.com/hoby:kisei //CC-BY-SA //==================================== function OriginalBF(){ var BFcommand = { "+":"+", "-":"-", ">":">", "<":"<", "[":"[", "]":"]", ",":",", ".":"." } var BFsetting = { maxbit:65535, runingspan:5, response: function(hikisu){}, autostop:true, manualstop:false } var runningState = { pointer:0, readpoint:0, nextRead:0, skip:0 } function commandCustom(obj){ return customSettingBase(BFcommand,obj); } function commandSet(obj){ return customSettingBase(BFsetting,obj); } function customSettingBase(program,user){ if(getValueType(user) != "object"){ return false; } for(var i in user){ if(program[i] != undefined){ if(getValueType(user[i]) == getValueType(program[i])){ program[i] = user[i]; } } } return true; } var commandLine = new Array(); var runningTimes = new Array(); var memories = [0]; var loopHeader = new Array(); function autoRunInner(sentence){ var check = analyseBFInner(sentence); if(!check)return { success:false, pointer:0, readpoint:0, nextRead:0, Char:"", Num:0, End:true }; runningBF(); } function analyseBFInner(sentence){ if(getValueType(sentence) != "string"){ alert("引数の型が不正です。\n型:"+getValueType(sentence)); return false; } for(var i in runningState){ runningState[i] = 0; } commandLine = new Array(); showCommandLine = new Array(); runningTimes = new Array(); memories = [0]; loopHeader = new Array(); var prev = ""; var read = false; while(sentence.length > 0){ registerCommandLine(); if(!read){ alert("コードが不正です:\n"+sentence); return false; } } return read; function registerCommandLine(){ read = false; var isSimplification = false; for(var i in BFcommand){ if(sentence.indexOf(BFcommand[i]) == 0){ Rprev = i; sentence = sentence.substring(BFcommand[i].length,sentence.length); if((prev == i) && ((i == "+")||(i == "-")||(i == ">")||(i == "<"))){ isSimplification = true; } if(isSimplification){ runningTimes[runningTimes.length-1]++; }else{ commandLine.push(i); runningTimes.push(1); } read=true; prev = i; break; } } } } function runningBF(){ var resultObj = { success:true, pointer:0, readpoint:0, nextRead:0, skip:0, Char:"", Num:0, End:false } if(BFsetting.runingspan <= 0){ var zeroResult = spanZeroRuning(); resultbj.Char = zeroResult.Char; resultbj.success = zeroResult.success; return resultbj; } var cRR = runCommand(); customSettingBase(resultObj,cRR); customSettingBase(resultObj,runningState); var isRuning = true; if(!resultObj.success){ if(BFsetting.autostop || (!BFsetting.autostop && BFsetting.manualstop)){ isRuning = false; } } if(runningState.nextRead >= commandLine.length){ resultObj.End = true; isRuning = false; } BFsetting.response(resultObj); if(isRuning){ setTimeout(runningBF,BFsetting.runingspan); } return resultObj; } function spanZeroRuning(){ var outputResult = ""; while(runningState.nextRead < commandLine.length){ var commandRun = runCommand(); if(!commandRun.success){ return { success:false, Char:outputResult } } outputResult += commandRun.Char; } return { success:true, Char:outputResult } } function runCommand(){ var success = true; var Coutput = ""; var Noutput = 0; runningState.readpoint = runningState.nextRead; runningState.nextRead++; switch(commandLine[runningState.readpoint]){ case "+": if(runningState.skip == 0){ memories[runningState.pointer] += runningTimes[runningState.readpoint]; if(memories[runningState.pointer] > BFsetting.maxbit){ //オーバーフロー memories[runningState.pointer] %= (BFsetting.maxbit+1); } } break; case "-": if(runningState.skip == 0){ memories[runningState.pointer] -= runningTimes[runningState.readpoint]; if(memories[runningState.pointer] < 0){ //アンダーフロー memories[runningState.pointer] = (BFsetting.maxbit+1) - ((memories[runningState.pointer] * -1)% (BFsetting.maxbit+1)); memories[runningState.pointer] %= (BFsetting.maxbit+1); } } break; case ">": if(runningState.skip == 0){ runningState.pointer += runningTimes[runningState.readpoint]; } break; case "<": if(runningState.skip == 0){ if(runningState) runningState.pointer -= runningTimes[runningState.readpoint]; if(runningState.pointer < 0){ success = false; } } break; case "[": if(memories[runningState.pointer] > 0 && runningState.skip == 0){ loopHeader.push(runningState.readpoint+1); }else{ runningState.skip++; } break; case "]": if(runningState.skip == 0){ if(loopHeader.length > 0){ if(memories[runningState.pointer] > 0){ runningState.nextRead = loopHeader[loopHeader.length-1]; }else{ loopHeader.pop(); } }else{ success = false; } }else{ runningState.skip--; } break; case ",": if(runningState.skip == 0){ var inputC = prompt("ユーザ入力(最初の1文字目のみ有効)"); if(inputC != null){ if(inputC.length > 0){ memories[runningState.pointer] = (inputC.charCodeAt(0) % (BFsetting.maxbit+1)); }else{ memories[runningState.pointer] = 0; } }else{ memories[runningState.pointer] = 0; } } break; case ".": if(runningState.skip == 0){ var charFm = String.fromCharCode(memories[runningState.pointer]); Coutput = charFm; Noutput = memories[runningState.pointer]; } break; } while(runningState.pointer >= memories.length){ memories.push(0); } return { sucess:success, Char:Coutput, Num:Noutput }; } function getValueType(target){ var types = typeof(target); if(types != "object"){ return types; } if(Array.isArray(target)){ return "array"; } var types = Object.prototype.toString(target); types = types.split("[object ").join("").split("]").join(""); return types.toLowerCase(); } function checkCommand(){ var output = ""; for(var i in BFcommand){ output += i + ":" + BFcommand[i] + "\n"; } return output; } function debugActualCommand(){ var output = commandLine.join(""); return output; } function debugRunningTimes(){ var output = runningTimes.join(","); return output; } function convertOriginalBF(sentence){ sentence = sentence.split("\r\n").join("\n"); sentence = sentence.split("\n").join(""); var resultObj = { success:false, code:"" } var result = ""; var read = false; while(sentence.length > 0){ read = false; for(var i in BFcommand){ if(sentence.indexOf(i) == 0){ result += BFcommand[i]; sentence = sentence.substring(1,sentence.length); read = true; break; } } if(!read){ result = "エラー:" + sentence.charAt(0) + "\n" + result; resultObj.code = result; resultObj.success = read; return resultObj; } } resultObj.code = result; resultObj.success = read; return resultObj; } function reconvertOriginalBF(sentence){ var resultObj = { success:false, code:"" } var result = ""; var read = false; while(sentence.length > 0){ for(var i in BFcommand){ if(sentence.indexOf(BFcommand[i]) == 0){ result += i; sentence = sentence.substring(BFcommand[i].length,sentence.length); read = true; break; } } if(!read){ result += "エラー:" + sentence.charAt(0) + "\n" + result; resultObj.code = result; resultObj.success = read; return resultObj; } } resultObj.code = result; resultObj.success = read; return resultObj; } this.reconvert = reconvertOriginalBF; this.convert = convertOriginalBF; this.debugActualCommandLine = debugActualCommand; this.debugTimesLine = debugRunningTimes; this.checkCommand = checkCommand; this.set = commandSet; this.command = commandCustom; this.analyse = analyseBFInner; this.run = autoRunInner; this.manualrun = runningBF; }
奇声言語
奇声言語設定
var BFcommand = { "+":"ンエッ", "-":'オ"↓オ↑"オ↑↑', ">":"ぐえー", "<":"ぐぼぁっ", "[":"スボョウ", "]":"ギギャーッ", ",":"ふにゃ~", ".":"ビィ~" }
奇声言語実行用html
奇声言語インタプリタ
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"/> <meta http-equiv="Content-Style-Type" content="text/css"/> <meta http-equiv="content-language" content="ja,jp-ja"/> <meta charset="UTF-8"/> <style type="text/css"> @import url(http://scp-jp.wdfiles.com/local--files/japanese-syntax/scp-WikidotCss.css); </style> <script type="text/javascript" src="http://shitake-crude-production.wikidot.com/hoby:kisei/code/1"></script> <script type="text/javascript" src="http://shitake-crude-production.wikidot.com/hoby:kisei/code/2"></script> <script type="text/javascript"> var kiseGengo = new OriginalBF(); kiseGengo.command(BFcommand); var originalRes = new Object(); originalRes.response = function(result){ var outputArea = document.getElementById("abababa"); outputArea.value += result.Char; document.getElementById("runP").innerHTML = result.pointer; document.getElementById("readP").innerHTML = result.readpoint; if(result.End){ isRun = false; outputArea.value += "\n動作終了"; } }; kiseGengo.set(originalRes); var isRun = false; function runKise(){ if(isRun)return; var sentence = document.getElementById("uhyouhyo").value; if(!kiseGengo.analyse(sentence)){ return; } document.getElementById("abababa").value = "====================\n奇声解析開始!\n====================\n"; isRun = true; kiseGengo.manualrun(); } </script> <title>奇声言語</title> </head> <body> <b style="font-size:120%;">入力</b> <textarea style="border:solid #A32 1px;padding:2px;width:95%;height:200px;display:block;margin:auto;" id="uhyouhyo"></textarea> <button onclick="runKise()" style="cursor:pointer;">起動</button><br /> <b style="font-size:120%;">出力</b> <textarea style="background-color:#000;color:#DDD;padding:1px;border:solid #EEE 2px;width:95%;height:200px;display:block;margin:auto;" id="abababa" readonly></textarea> Pointer:<span id="runP"></span><br /> ReadPoint:<span id="readP"></span> </body> </html>
Brainfuck⇒奇声言語 変換用html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"/> <meta http-equiv="Content-Style-Type" content="text/css"/> <meta http-equiv="content-language" content="ja,jp-ja"/> <meta charset="UTF-8"/> <style type="text/css"> @import url(http://scp-jp.wdfiles.com/local--files/japanese-syntax/scp-WikidotCss.css); </style> <script type="text/javascript" src="http://shitake-crude-production.wikidot.com/hoby:kisei/code/2"></script> <script type="text/javascript"> function tra(){ var orig = document.getElementById("BF").value; var out = ""; for(var i = 0;i < orig.length;i++){ out += BFcommand[orig.charAt(i)]; } document.getElementById("Kise").value = out; } </script> <title>奇声言語</title> </head> <body> <textarea style="border:solid #A32 1px;padding:2px;width:95%;height:200px;display:block;margin:auto;" id="BF"> </textarea> <button onclick="tra()">変換</button> <textarea style="border:solid #A32 1px;padding:2px;width:95%;height:200px;display:block;margin:auto;" id="Kise"> </textarea> </body> </html>




.png)


