推しアイデア
INTERCALでおみくじが引けるよ!
INTERCALでおみくじが引けるよ!
ルーレットで出たので
PythonでわざわざINTERCALで表示したい文字列を計算するコードを書いた
去年作ったもの https://topaz.dev/projects/07848f7ccefc79e18a72
TWOやTHREEのように数字を入れるとおみくじが引ける ただそれだけ
# ./omikuji DAIKICHIKICHITYUKICHISHOKICHI TWO KICHI # ./omikuji DAIKICHIKICHITYUKICHISHOKICHI THREE TYUKICHI # ./omikuji DAIKICHIKICHITYUKICHISHOKICHI FOUR SHOKICHI

世界最古の難解プログラミング言語(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
とか実行すると

いいね
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
終わり!