奇声言語

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

その他実装例

特に指定がない限り、このサイトのコンテンツには次のライセンスが適用されます: Creative Commons Attribution-ShareAlike 3.0 License