2019年9月2日 | ブログ記事

難解言語「お理工だけじゃダメなんだ」(仮)の紹介

0214sh7

こんにちは。algorithm班のすくです。

この記事は2019年夏のブログリレーのn日目の記事です。

皆さん、「お理工だけじゃダメなんだ。」というフレーズを聞いたことがありますか?

東工大がいつぞやに繰り出したリーフレットのメッセージですね。
https://www.titech.ac.jp/news/2019/044257.html

今回は「お理工」「だけじゃ」「ダメなんだ」と空白の4つによってプログラミングができる言語(というほど大層なものでもない)を作ってみたのでご紹介します。

(⚠️注意⚠️)この言語は後述の邪悪な提案により1日で作られたもので、未完成です。

なんでこんなの作ったの?

特に書きたいネタもないのに夏のブログリレーにエントリーしちゃったからです。

前日になって書くネタに困っていたところ…

は?

FFTを書く案もあったけど僕自身のFFTの理解度でブログを書くのもアレなんで1日でできる範囲で難解言語を生やすことにしました。
そこでネタを考えた所お理工だけじゃダメなんだ。になりました。

言語の概要

コンパイラを1から書く元気も時間もないし、提案者が過去に制作した難解言語「ちょくだい」を参考にC++でインタプリタを書きました。これでAtCoderにも提出できるぞ!

実際のコード
生のコードをここに貼ると長すぎるのでリンク先を見てね

お理工だけじゃダメなんだで書いたコードをこのコードのcommandに代入することで動作します。

この言語では「お理工」「だけじゃ」「ダメなんだ」のいずれかをいくつか並べたものが予めコマンド(後述)として定義されており、スペース区切りの文字列としてソースコードに埋め込んでおくことで動かします。

コマンド集にない文字列が入力されると何もしません。コメントアウトとして使用できます。また、コマンドが最後までいくと自動で終了します。

言語仕様

言語としては、
・整数型の配列
・文字型の配列
・ブーリアン型の配列
・整数型配列のポインタ2つ
・文字型配列のポインタ
・ブーリアン型のポインタ
・ループの始点とスコープ

が0で初期化された上で予め用意されるのでそれを使ってプログラミングができます。

配列は最初のサイズは100,000ですが必要に応じてresizeされます。
ポインタは最初は全て0(配列の先頭)を指していて、コマンドで前後にずらすことができます。0を指している状態で-1しようとすると何もしません。

アクセス

現在のところアクセスするだけで何も起こりません。2コマンドで連携するコマンドができたら使われると思います。

参照ずらし

ポインタの値が1ずれて、参照するアドレスが変わります。

標準入力

標準入力から入力を受け取り、対応する型のポインタが指してるアドレスに格納します。
文字列を入力する時は、現在指してる文字配列のアドレスを先頭に、文字列長分後ろに文字が格納されます。さらに、整数型配列の先頭に文字列長が代入されます。

標準出力

対応する型の配列の現在指してるアドレスの中身を出力します。文字列を出力したい時はループと組み合わせます。また空白や改行を出力する機能もついています。(標準エラー出力は今の所)ないです。

演算

整数型のポインタ1の指す変数をa、ポインタ2の指す変数をb、演算子を・(=,+,-,*,/,%が該当)としたとき、a・bを計算してポインタ1の指すアドレスに格納します。

ループ

整数型の配列の先頭要素をNとして、”整数回ループ”から”ループおわり”までのコマンドをN回ループします。Nが0以下だった場合"ループおわり"に行きます。

その他

途中でreturnする機能がありますが今の所if文がないため半ば死に機能です。活用可能ではありますが…

実際に問題を解いてみた!

AtCoderにおけるチュートリアル的な問題であるWelcome to AtCoderをお理工だけじゃダメなんだを使って解いていこうと思います。

この問題を要約すると、
整数a,b,cと文字列sが与えられるのでa+b+cとsをスペース区切りで答える
となります。なので大まかにやるべきことは
・a,b,cを入力する
・sを入力する
・a+b+cを計算しaに代入する
・aを出力する
・sを出力する
になります。

まずaを整数の配列(以下、Aとする)の1番目に格納します。ポインタの初期値は0番目なので、"ダメなんだお理工お理工ダメなんだ"で1番目に動かしてから"だけじゃお理工"で整数を入力します。同様に2番目にbを,
3番目にcを入力します。

次に"だけじゃダメなんだ"を使ってsを入力します。今回はこのまま文字配列(以下、Bとおく)の0番目に入力します。またここでA[0]に|s|が入りました。

足し算の準備をします。"ダメなんだお理工だけじゃダメなんだ"を3回使って整数のポインタ2をA[3]を指すようにし、"ダメなんだお理工お理工だけじゃ"を2回使ってA[3]を指してるポインタ1をA[1]に指させます。

足し算をします。"お理工お理工だけじゃ"でA[1]がa+cになりました。さらに"ダメなんだお理工だけじゃだけじゃ"でポインタ2がA[2]を指すようにしたあとさらに足し算をすることでA[1]がa+b+cになりました。

a+b+cを出力しましょう。ポインタ1はA[1]を指しているのでこのまま"だけじゃお理工お理工"でA[1]を出力します。その後"だけじゃだけじゃお理工"でスペースを出力します。

A[0]は文字列長が入っています。この回数だけループして文字列を出力しましょう。ループ開始の"ダメなんだだけじゃ"と終了の"ダメなんだダメなんだ"で「現在指してる文字を出力」する"だけじゃお理工だけじゃ"と「文字のポインタを後ろに一つずらす」"ダメなんだだけじゃだけじゃ"を挟んでこれを文字列長回繰り返すことで文字列が出力できます。

最後に"だけじゃだけじゃだけじゃ"で改行を出力して"ダメなんだダメなんだダメなんだ"でreturnしていますが、ここは別になくてもいいです。

これでこの問題が解けました。最終的なコードは

ダメなんだお理工お理工ダメなんだ 
だけじゃお理工 
ダメなんだお理工お理工ダメなんだ 
だけじゃお理工 
ダメなんだお理工お理工ダメなんだ 
だけじゃお理工 

だけじゃダメなんだ 

ダメなんだお理工だけじゃダメなんだ 
ダメなんだお理工だけじゃダメなんだ 
ダメなんだお理工だけじゃダメなんだ 
ダメなんだお理工お理工だけじゃ 
ダメなんだお理工お理工だけじゃ 

お理工お理工だけじゃ  
ダメなんだお理工だけじゃだけじゃ 
お理工お理工だけじゃ  
ダメなんだお理工だけじゃだけじゃ 

だけじゃお理工お理工 
だけじゃだけじゃお理工 

ダメなんだだけじゃ 
だけじゃお理工だけじゃ 
ダメなんだだけじゃだけじゃ
ダメなんだダメなんだ 

だけじゃだけじゃだけじゃ 
ダメなんだダメなんだダメなんだ

となります。なんのこっちゃ。

問題点

if文が使えない

アホですね。早急に実装します。

二重・多重ループが書けない

これは実装するつもりです

複数の文字列が扱いにくい

これも頑張っていきたい

ユーザーが関数を作れない

helloworldを書きにくい

これは直すつもりは(今の所)ないです。暇だったらやるかも

文字列を入力した時整数型配列の先頭に文字列長が格納されるなど謎な仕様が多い

わかる。

コマンド集

コピペしたい場合はこちらからどうぞ。
表を貼り付けられなかったから画像でいきます ごめんね

Screenshot_20190902-123821
Screenshot_20190902-123832

おわりに

作ってて楽しかった(小並感)
まだまだ機能も少ないですが改善して、上記の問題点を解決したバージョンをらん☆ぷろか何かで公開できればいいと思います。

この記事を書いた人
0214sh7

あおこーだー

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2019年8月26日
ゲームを作ろう!
Kanagu
2019年11月13日
顔認識で推す
Fogrex
2019年11月1日
6つの記号でjavascript【アドベントカレンダー2019 2日目】
Koube
2019年9月24日
夏のブログリレーエンディング
HF
2019年9月23日
ヒダッカソンに参加しました
oribe
2019年9月22日
ベクターレイヤーを使おう
Sigma1023

活動の紹介

カテゴリ

タグ