シクシク素数アドベントカレンダー whitespace(?) 編


# はじめに

この記事は，「シクシク素数アドベントカレンダー Advent Calendar 2018」の 13 日目です．
https://qiita.com/advent-calendar/2018/4949prime-series

シクシク素数・問題文はアドベントカレンダーを参照してください．

# ソースコード

Ideone
https://ideone.com/vVEFoR

命令セット風に可視化したコード
https://gist.github.com/buyoh/b2b50884e2defe829b4805d8c6d3aa3a

こちらにも載せます．`S`がスペース，`T`がタブ，`L`が改行(LF)です．

```
SSSTSLSSSTSSSLTTSSSSTTLSSSTSSSLTTSLSLSLLSSSTSLLTSSTTLSLTLSSSTTLSLLLTLLSSSTSSLLTT
STSTLSLTLSSSTSTLSLLLTLLSSSTTSLLTSSTTTLSLSLTSSTTTLSLLSSSTLLTLLSSSTTTLSLLSSSLLTLLS
SSTSSSLLTSSTSSTLSLLSSSTLLTLLSSSTSSTLLTSSTSTSLSSSTLLTLLSSSTSTSLSSSLLTLLSSSLLSLSTS
SSTLLSSSTSSSSLSSSTSLTTTSSSTTLTTTSLSSSSTSLSLTTTSSSSTLTSSSSSSTTLSLTTTSSSSTSSLSLTTT
SSSSTSTLSSSLSSSTSLTTTTSSSTTSSSSTSTLTTTSLTTTSSSSTSSLTTTLSSSTSSTSLSSSTLSSSLSSSLSSS
TSLTTTTSSSTTTSSSLTSSTLSTSTSLLTSSTSSTTLSSSLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSLT
LLSSSTSSTTLLSSSTSTSSLSSSTLSSSLSSSLSSSTSLTTTTSSSTTTSSSTSTSLTSTTSSSTSSLTSSTLSTSTSL
SSSTLSSSLSSSLSSSTSLTTTTSSSTTTSSSTSTSLTSTTSSSTSSTLTSSTLSTSTSLLSTSTSSSLLTSSTSTSTLS
SSTLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSLTLLSSSTSTSTLSSSLSSSTSLTTTTSSSTTTSSSTSTS
LTSTSLSTSTSSSSLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSLTLSSSTSLTTTSSSTTLSLTTTSSSSTS
LSLTTTSSSSLLTLLSSSTSSSTLLSLSTSTTTLLSSSTSTTSLSSSTSLTTTSSSTTLTTTSLSSSSTSLSLTTTSSSS
TSLTSSSSSSTTLSLTTTSSSSTSSLSLTTTSSSSTSTLSSSLSSSTSLTTTTSSSTTSSSSTSTLTTTSLTTTSSSSTS
SLTTTLSSSTTSSSLSSSTLSSSLSSSLSSSTSLTTTTSSSTTTSSSTSLTSSTLSTSTSLLTSSTTSSTLSSSTLSLTS
SSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSLTLLSSSTTSSTLLSSSTTSTSLSSSTLSSSLSSSLSSSTSLTTTTSS
STTTSSSTSLTSTTSSSLTSSTLSTSTSLLTSSTTSTTLSSSLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSL
TLLSSSTTSTTLSSSTLSSSTSLTTTTSSSSSSLTSSSSSSTTLTTSLSSSTTTSSLSSSLSSSTLSSSTLSSSTSLTTT
TSSSTTTSSSTLSSSTSLTTTTSSSTTTTSSLSSSLSSSTSLTTTTSSSTTTSLTTSSTLSTSTSSLLTSSTTTSTLLSS
STTTTSLSSSTLSSSLSSSLSSSTSLTTTTSSSTTTSSSTLSSSTSLTTTTSSSTTTTSTTSSSLTSSTLSTSTSLLTSS
TTTTTLSSSLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSLTLLSSSTTTTTLSSSTLSSSTSLTTTTSSSSLS
SLSTTTSSSTSLTSSSTTSTTTSLLLSLSTTTSSLLSSSTTTSTLSSSTLSLTSSSTSLTTTSSSTTLSLTTTSSSSTSL
SLTTTSLTLSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTTTSSSSLLTLLSSSTSTTTLLSLSTSSSSTLLSSSTSSSSS
LSSSTSLTTTSSSTTLTTTSLSSSSTSLSLTTTSSSSTSTTTLTSSSSSSTTLSLTTTSSSSTSSLSLTTTSSSSTSTLS
SSLSSSTSLTTTTSSSTTSSSSTSTLTTTSLTTTSSSSTSSLTTTSSSTSTSTLSSSTSLTTTTSSSSSSLTSSSSSTTL
TTSSSSTSTTSLSSSTSLTTTTSSSSSSLTSSSSSSTTSSSSLTTSLSSSTSSSTSLSSSTLSSSLSSSLSSSTSLTTTT
SSSTTTSSSLSLTTSSTLSTSTSSLLTSSTSSSTTLSSSTLSSSTSLTTTTSSSSSSTSTSTLSSSTSLTTTTSSSSLSS
LSTTTSSSTLTSSSTTSTTTTSSSSLSSSSLSSSTSLTTTTSSSTTTSSSTSTSLTSTTTTSTTTSLLSSSLSSSTSLTT
TTSSSSLSSLSTTTSSSTSTSLTSTSTTSTTTSLLLSLSTSSSTSLLSSSTSSSTTLLSSSTSSTSSLSSSLSSSTLSSS
TSTSTLSSSTSLTTTTSSSTTTSSSLTSSTLSTSTSSLLTSSTSSTSTLSSSTSTTSLSSSTSLTTTTSSSTTTSSSTLS
SSTSLTTTTSSSSSSTSTSTLSSSTSLTTTTSSSTTTTSSSTTTTSSSSLSTLSSSLLSSSTSTSTLSSSTSLTTTTSSS
SLSSLSTTTSSSTLTSSTTTSTTTSLLLSLSTSSTSSLLSSSTSSTSTLSSSTSLTTTSSSTTLSLTTTSSSSTSLSLTT
TSSSSLLTLLSSSTSSSSTLLSLSTSSTTTLLSSSTSSTTSLSSSTSLTTTSSSTTLTTTSLSSSSTSLSLTTTSSSSTS
LTSSSSSSTTLSLTTTSSSSTSSLSLTTTSSSSTSTLSSSTLSSSTSLTTTTSSSTTSSSSTSTLTTTSLTTTSSSSTST
LTTTSSTTLTSSSSLTTTSSSSTSSLTTTSSSLSSSTSLTTTTSSSTTTTTTLSTSTSSSSSLSLLSSSLSSSTSLTTTT
SSSSLSSLSTTTSSSTLTSSSTTSTTTSLLLSSSTSTSSSLSSSTLSSSLSSSLSSSTSLTTTTSSSTTTSSSTLSSSTS
LTTTTSSSTTTTSSTLSTSTSSLLTSSTSTSSTLSSSTSTTSSLSLSTLSSSLLSSSLSSSTSLTTTTSSSTTTTTTLST
STSSSSSLSLLSSSLSSSTSLTTTTSSSSLSSLSTTTSSSTLTSSSTTSTTTSLLLSLSTSTSSSLLSSSTSTSSTLSSS
TSLTTTSSSTTLSLTTTSSSSTSLSLTTTSSSSLLTLLSSSTSSTTTLLSLSTSTSTTLLSSSTSTSTSLSSSTSLTTTS
SSTTLTTTSLSSSSTSLSLTTTSSSSTTSSTTTLTSSSSSSTTLSLTTTSSSSTTSSTSTLSSSTSLTTTTSSSSLSSSS
LTSSSSSSTSSTTLTTSSSSTLTSSSSSSLTTSSSSTTSSTSSLSSSTSLTTTTSSSSLSSSSTSSLTLTTSSSTSSLTT
TTTSTTTSLLLSSSTSTTSSLSSSTLSSSLSSSTTSSTTSLSSSTSLTTTTSSSTTTSSSTTSSTSSLSSSTSLTTTTSS
STTTTSSTLSTSTSSLLTSSTSTTSTLLSSSTSTTTSLSSSTTSSTSTLSSSTSLTTTTSSSTTTLSTSTSTTSLSSSTT
SSTSTLSSSTSLTTTTSSSTTTLSTSTSSSSLLSTSTTSLLTSSTSTTTTLSSSLSSSTSLTTTTSSSSSSTTSSTTSLS
SSTSLTTTTSSSTTTTSSSSLSSSSTTSSTSTLSSSTSLTTTTSSSTTTTTSTTTSLLSSSTTSSTTSLSSSTSLTTTTS
SSSLSSLSTTTSSSTLTSSSTTSTTTSLLLSSSTSTTTTLSSSTTSSTSTLSSSTSLTTTTSSSSLSSLSTTTSSSTLTS
SSTTSTTTSLLLSLSTSTTSSLLSSSTSTTSTLSSSLSSSTSLTTTTSSSSSSLSSSTSLTTTTSSSSSSTTSSTSSLSS
STSLTTTTSSSTTTTSSSLSTSTSSTTSLSLLSSSTSTSLSLSTLSSSLLSSSTSLTTTSSSTTLSLTTTSSSSTSLSLT
TTSSSSLLTLLSSSTSTSTTLLSTSTSTSTSLLLL
```

# メモ

whitespaceを直接書いたわけではなく，9月頃に作った，[独自言語からwhitespaceに変換するコンパイラ](http://shonen.hateblo.jp/entry/2018/09/26/201205)を使っています[^1]．

下のコードを上のwhitespaceにコンパイルしています．

[^1]: ひょっとしたら，この場合はwhitespaceではなく独自言語になるかもしれませんが，独自言語は誰も書かないはずなのでレギュレーションには違反していないはず…．

```
func: sikusiku(x){
    if (x == 0){
        return: 0;
    }
    if (x%10 == 4 || x%10 == 9){
        return: 1;
    }
    return: sikusiku(x/10);
}

# x >= 2
func: isprime(x){
    if (x == 2){
        return: 1;
    }
    if (x%2 == 0){
        return: 0;
    }
    let: d(3);
    while (d*d <= x){
        if (x%d == 0){
            return: 0;
        }
        d += 2;
    }
    return: 1;
}

# x > 0
func: print_number(x){
    let: stack[20], i(-1);
    let: zero('0');
    while (x > 0){
        stack[i += 1] = x%10;
        x /= 10;
    }
    while (i >= 0){
        __putc(zero + stack[i]);
        i -= 1;
    }
}

func: print_array(begin, end){
    print_number(*begin);
    begin += 1;
    while (begin < end){
        __putc(',');
        print_number(*begin);
        begin += 1;
    }
}

func: main(){
    let: results[100];
    let: cnt, val(19), i(0);
    cnt = __geti();

    while(i < cnt) {
        if (isprime(val) && sikusiku(val)){
            results[i] = val;
            i += 1;
        }
        val += 1;
    }

    print_array(&results, &results + cnt);
    __putc('\n');
}
```