feature image

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

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

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

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

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

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

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

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

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

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

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

雑に難解言語生やせ(は?

— はぎあ (@hagyu_aya) August 31, 2019

は?

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 icon
この記事を書いた人
0214sh7

きいろこーだー アルゴリズム班の班長さんです

この記事をシェア

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

関連する記事

ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】 feature image
2018年11月3日
ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】
Azon icon Azon
2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2023年4月27日
Vulkanのデバイスドライバを自作してみた
kegra icon kegra
2022年9月26日
競プロしかシラン人間が web アプリ QK Judge を作った話
tqk icon tqk
2022年9月16日
5日でゲームを作った #tararira
Komichi icon Komichi
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記