はじめに
こんにちは。marilです。
今回は、AiScReam言語で簡易的なCLI版璃奈ちゃんボードを実装してみます。
この記事は、AiScReam言語を作るにあたって初めてBrainf**kに触れた初心者が書いていますので、誤り等ありましたらご容赦ください。
AiScReam言語とは
https://github.com/marukun712/aiscream-lang
AiScReam言語は、「愛♡スクリ~ム!」の歌詞をソースコードとしたプログラミング言語です。
たとえば、Hello World!
を出力するプログラムは以下のようになります。
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃんルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんルビィちゃん歩夢ちゃんアイスクリーム!アイスクリーム!アイスクリーム!アイスクリーム!四季ちゃん何が好き?ルビィちゃん歩夢ちゃんルビィちゃん歩夢ちゃんルビィちゃん四季ちゃんルビィちゃんルビィちゃん歩夢ちゃんはーいアイスクリーム!何が好き?アイスクリーム!四季ちゃん何が好き?ルビィちゃんルビィちゃん叫びましょルビィちゃん四季ちゃん四季ちゃん四季ちゃん叫びましょ歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん叫びましょ叫びましょ歩夢ちゃん歩夢ちゃん歩夢ちゃん叫びましょルビィちゃんルビィちゃん叫びましょアイスクリーム!四季ちゃん叫びましょアイスクリーム!叫びましょ歩夢ちゃん歩夢ちゃん歩夢ちゃん叫びましょ四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん叫びましょ四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん叫びましょルビィちゃんルビィちゃん歩夢ちゃん叫びましょルビィちゃん歩夢ちゃん歩夢ちゃん叫びましょ
イミワカンナイ!
とってもヨミヅライブですね。
AiScReam言語の書き方
AiScReam言語は、Brainf**kという言語を元に作成されています。
Brainf**kは、8つの命令しか持たない、いわゆる難解プログラミング言語というやつです。
長い配列があり、その配列の数値をいじることで文字などを出力します。
+ ポインタの指す値をインクリメント
- ポインタの指す値をデクリメント
> ポインタを右に移動
< ポインタを左に移動
[ ポインタが指す値が 0 なら、対応する ] の直後にジャンプする
] ポインタが指す値が 0 でないなら、対応する [ の直後にジャンプする
, 入力から1バイト読み込む
. ポインタの指す値を出力する
たとえば、「A」という文字を出力したいとき、AのASCIIコードは65なので、配列の0番目の要素の値を65回インクリメントして、出力すればよいです。
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
+++++
.
詳しくは、以下の資料などをご覧ください。
https://www.slideshare.net/slideshow/brainfck/26016080
AiScReam言語は、この文字を歌詞に置き換えたものです。
歩夢ちゃん ポインタの指す値をインクリメント
四季ちゃん ポインタの指す値をデクリメント
ルビィちゃん ポインタを右に移動
アイスクリーム! ポインタを左に移動
はーい ポインタが指す値が 0 なら、対応する 何が好き? の直後にジャンプする
何が好き? ポインタが指す値が 0 でないなら、対応する はーい の直後にジャンプする
あ・な・た 入力から 1 バイト読み込む
叫びましょ ポインタの指す値を出力する
なので、Aを出力するコードは以下のようになります。
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん
叫びましょ
ループなどを使って短くする方法もありますが、今回は割愛させていただきます。
璃奈ちゃんボードを作る
今回作成する璃奈ちゃんボードは、入力値によって別の顔文字を出力するシンプルなものです。
JSで書いてみましょう。(入力の取得部分は省略します)
if(input === 0){
console.log(`
# #
v
`)
}else if(input === 1){
console.log(`
> <
~
`)
}
シンプルですね。
これをAiScReam言語で実装したいのですが、困ったことにAiScReam言語にはif文がありません。
なので、AiScReam言語で使用できるループを使い、if文を実装してあげる必要があります。
なんと、if-else文の実装もこちらの資料に載っています。
https://www.slideshare.net/slideshow/brainfck/26016080
この資料を参考に、入力が1以上なら実行される処理をBrainf**kで書いてみましょう。
,
------------------------------------------------
[>
+++++[>+++++++<-]>.<
>---.<
>+++.<
+++++[>-----<-]>.<
+++[>+++++++<-]>+.<
+++++++[>++++++++++++<-]>++.<
.
<
[-]
]
このコードでは、まず入力を文字コードから数値に変換するため、入力から0のASCIIコードである48を引きます。
その後、ループに入ります。Brainf**kのループは、ポインタが指している値が0以上であれば実行されます。
ループ開始後に顔文字を出力した後、ポインタの値が0になるまで引き続けることで、入力が1以上の時に一度だけ実行される処理を実装しています。
顔文字の出力コードに関しては、こちらのサイトを使用させていただきました。
http://mikecat.usamimi.info/jstool/bfgen/
AiScReam言語に変換すると以下のようになります。
あ・な・た四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんアイスクリーム!四季ちゃん何が好き?ルビィちゃん叫びましょアイスクリーム!ルビィちゃん四季ちゃん四季ちゃん四季ちゃん叫びましょアイスクリーム!ルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん叫びましょアイスクリーム!歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃん四季ちゃんアイスクリーム!四季ちゃん何が好き?ルビィちゃん叫びましょアイスクリーム!歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんアイスクリーム!四季ちゃん何が好き?ルビィちゃん歩夢ちゃん叫びましょアイスクリーム!歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんはーいルビィちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃん歩夢ちゃんアイスクリーム!四季ちゃん何が好き?ルビィちゃん歩夢ちゃん歩夢ちゃん叫びましょアイスクリーム!叫びましょアイスクリーム!はーい四季ちゃん何が好き?何が好き?
if文が実装できたので、次にelse文を実装します。
,
------------------------------------------------
>+<
[>>
+++++[>+++++++<-]>.<
>---.<
>+++.<
+++++[>-----<-]>.<
+++[>+++++++<-]>+.<
+++++++[>++++++++++++<-]>++.<
.
<<
>-<
[-]
]
>
[
>>
++++++[>++++++++++<-]>++.<
+++++[>------<-]>.<
++++[>+++++++<-]>.<
+++++[>----------<-]>.<
+++[>+++++++<-]>+.<
+++++++[>+++++++++++++<-]>+++.<
.
<<
-]
elseチェック用にもう一つセルを用意して、一回目のループで0番目とelseチェック用のセルの値を0にします。
二番目のループの前に>
を入れることで、一回目のループが実行されなかった場合はは二回目のループのみが実行されます。
これで、if文とelse文を実装することができました。
最終的に装飾などを追加したしてAiScReam言語に変換したコードは以下になります
https://raw.githubusercontent.com/marukun712/aiscream-lang/refs/heads/master/rinachan_board.aiscream
0と1以上を入力した場合で、璃奈ちゃんボードの表情が変わります。
このコードはAiScReam言語のリポジトリにサンプルとして含まれているので、ぜひお試しください。
おわりに
今回は、AiScReam言語を使って、簡易的な璃奈ちゃんボードを実装してみました。
if-else文の実装がここまで複雑だと、普段書いているプログラミング言語のありがたみを感じられると思います。
今後は、表情のバリエーションを増やす方法を探してみようと思います。
以上、marilでした。