INTERCAL Omikuji

https://github.com/thirdlf03/INTERCAL-omikuji

Python

INTERCALでおみくじが引けるよ!

さどるふ

推しアイデア

INTERCALでおみくじが引けるよ!

作った背景

ルーレットで出たので

推し技術

PythonでわざわざINTERCALで表示したい文字列を計算するコードを書いた

プロジェクト詳細

去年作ったもの https://topaz.dev/projects/07848f7ccefc79e18a72

どんなふうに動くの

TWOやTHREEのように数字を入れるとおみくじが引ける ただそれだけ

# ./omikuji DAIKICHIKICHITYUKICHISHOKICHI TWO KICHI # ./omikuji DAIKICHIKICHITYUKICHISHOKICHI THREE TYUKICHI # ./omikuji DAIKICHIKICHITYUKICHISHOKICHI FOUR SHOKICHI

きっかけ

image

INTERCALとは?

世界最古の難解プログラミング言語(Esolang)らしい 1972年にプリンストン大学の学生2人によって、「既存の言語(FORTRANやCOBOLなど)のあらゆる要素に似ていない言語」として作られた

ふむ

HELLO WORLD

DO ,1 <- #13 PLEASE DO ,1 SUB #1 <- #234 DO ,1 SUB #2 <- #112 DO ,1 SUB #3 <- #112 DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 PLEASE DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #214 PLEASE READ OUT ,1 PLEASE GIVE UP

ref: https://ja.wikipedia.org/wiki/INTERCAL

手元で動かしてみる

Homebrewで入れようとしたらIntel Macじゃないと動かないらしい。 ので、コード引っ張ってきてビルドする

curl -O http://www.catb.org/~esr/intercal/intercal-0.30.tar.gz tar -xzf intercal-0.30.tar.gz cd intercal-0.30 ./configure make sudo make install

上記のコマンドを実行して、

ick -V

とか実行すると image

いいね

hello.i

DO ,1 <- #13 PLEASE DO ,1 SUB #1 <- #234 DO ,1 SUB #2 <- #112 DO ,1 SUB #3 <- #112 DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 PLEASE DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #214 PLEASE READ OUT ,1 PLEASE GIVE UP

hello.iをコンパイルしようとすると

ick hello.i
ICL079I PROGRAMMER IS INSUFFICIENTLY POLITE ON THE WAY TO 17 CORRECT SOURCE AND RESUBNIT 日本語訳 ICL079I プログラマは礼儀が足りない 17 に向かう途中 ソースを修正し、再提出

やかましいわ

PLEASE付け足したら動くらしい

PLEASE DO ,1 <- #13 PLEASE DO ,1 SUB #1 <- #238 DO ,1 SUB #2 <- #108 DO ,1 SUB #3 <- #112 PLEASE DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #162 PLEASE READ OUT ,1 PLEASE GIVE UP

これでコンパイルしようとすると

ick hello.i

成功!実行してみると

❯ ./hello 0s✨   01:03 zsh: segmentation fault ./hello

どうやらarmのmacではnull point出て動かせないらしい

docker で実行用のコンテナを用意して動かすと

ick hello.i 35s✨   01:24 Hello, world!

動いた

おみくじを引けるようにする

INTERCALには、(直前に出力した数字 - 出力する数字) mod 256 の値のビット列表現を反転した値を出力するってルールがある。

計算だるすぎたので、pythonで変換するコードを書いた

def convert_intercal_number( intercal_val: int = 1, text: str = "hello", handover: int = 0 ): before_rev = handover result = [] for char in text: str_ascii = ord(char) current_rev = int(format(str_ascii, "08b")[::-1], 2) answer = (before_rev - current_rev) % 256 result.append(answer) before_rev = current_rev print(f"DO ,{intercal_val} <- #{len(result)}") for i in range(len(result)): if i % 4 == 0: print(f"PLEASE DO ,{intercal_val} SUB #{i + 1} <- #{result[i]}") else: print(f"DO ,{intercal_val} SUB #{i + 1} <- #{result[i]}") return before_rev handover = 0 num = int(input("rep num: ")) for i in range(num): intercal_val = int(input("intercalの変数名を指定してね!1から65535: ")) text = input("変換したい文字列を入力してね!(ex: hello): ") handover = convert_intercal_number(intercal_val, text, handover)

↑これを使うと

DO ,1 <- #8 DO ,1 SUB #1 <- #222 DO ,1 SUB #2 <- #160 DO ,1 SUB #3 <- #240 DO ,1 SUB #4 <- #192 PLEASE DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #208 DO ,1 SUB #7 <- #176 DO ,1 SUB #8 <- #128 DO ,2 <- #5 PLEASE DO ,2 SUB #1 <- #192 DO ,2 SUB #2 <- #64 DO ,2 SUB #3 <- #208 DO ,2 SUB #4 <- #176 DO ,2 SUB #5 <- #128 DO ,3 <- #8 DO ,3 SUB #1 <- #104 DO ,3 SUB #2 <- #144 DO ,3 SUB #3 <- #240 DO ,3 SUB #4 <- #216 DO ,3 SUB #5 <- #64 DO ,3 SUB #6 <- #208 DO ,3 SUB #7 <- #176 DO ,3 SUB #8 <- #128 DO ,4 <- #8 DO ,4 SUB #1 <- #200 DO ,4 SUB #2 <- #184 DO ,4 SUB #3 <- #32 DO ,4 SUB #4 <- #32 DO ,4 SUB #5 <- #64 DO ,4 SUB #6 <- #208 DO ,4 SUB #7 <- #176 DO ,4 SUB #8 <- #128

こんな感じに出力されるので、これをREAD OUTすると

DAIKICHIKICHITYUKICHISHOKICHI

やったね

あとは、制御構文を書く。

なぜか、制御構文がうまくいかなかった WRITE INでユーザーの入力を受け取って、あとは DO (行番号) NEXTで移動していくが、想像通りに動かなかったため冒頭のコードでは大吉が出せていない。 また、 制御構文書く前に一旦全ての変数READ OUTしないと,2 や ,3の変数をうまく構文内でREAD OUT できなかったので、DAIKICHIKICHITYUKICHISHOKICHI TWO こんな感じになってる。悲しい

(10) PLEASE WRITE IN .1 DO (40) NEXT PLEASE READ OUT ,4 PLEASE GIVE UP (40) DO (50) NEXT PLEASE READ OUT ,3 PLEASE GIVE UP (50) DO (60) NEXT PLEASE READ OUT ,2 PLEASE GIVE UP (60) DO (6) NEXT PLEASE READ OUT ,1 PLEASE GIVE UP (6) PLEASE RESUME .1

終わり!

さどるふ

@thirdlf03