三流プログラマの戯言

プログラミング初心者が気になったことを書き綴るだけ。主にc#

素数を計算する

何を思ったかよくわからない言語に手を出してしまった。

とりあえず練習がてら素数を求めるプログラムを書いてみる。

出来上がったのがこち

f:id:unidentifiedexe:20170610202705j:plain

う~ん気持ち悪い。

言語はBefunge。
この言語の特徴は実行方向が4方向に変わること。^v<>で単純な方向転換。
|が縦方向条件分岐、_が横方向条件分岐。最初は左上から始まって実行方向は右。
で、普通のプログラムは最終行まで来たら終わるように作られるものだけど、この言語端まで行くと反対側に出てくるという謎仕様…どうやってプログラムを終えるかというと@がプログラムを終了する命令。この仕様何が問題って、最初に空白行を入れてしまうとその時点で無限ループ。何も書かなくても(おそらく)無限ループ。
ざっくりした流れを示すとこんな感じ

f:id:unidentifiedexe:20170610204008j:plain

う~ん分かりにくい。#は次の命令を飛ばすから#v_vを右に読むと条件に応じて右のvで下に行くか左のvで下に行く。多分コレを利用すればこのプログラムも2行でかけると思う。

プログラムの構造的には

for(int num = 3; num<5*5*4; num++){

    for(int j = 2;j*j<=num){

        if(num%2 == 0) goto cont;

    }

    printf("%d ",num);

    cont:

}

といった感じ。goto文使うなって追われるかもしれないけど、プログラム内容的にgoto文の方が正しいかなって。

だいぶ文字数少なくしたけど、縦方向の移動が少ないから、まだまだ改善できるのかなって思うけど、それをはじめると大変そう。