読者です 読者をやめる 読者になる 読者になる

1〜10を表示させるプログラミング

プログラミングを少しかじった方なら、1〜10を表示させるプログラミングはとても簡単だと思います。
for文使って、1行ごとアウトプットするだけなので、
以下のプログラムになるというのが予想されると思います。

#include<stdio.h>

int main(int argc, char* argv[]) {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d\n", i + 1);
    }
    return 0;
}

何のことはない、出力結果

1
2
3
4
5
6
7
8
9
10

を表示するだけのプログラムです。
このプログラムをいろいろと書き換えていくだけの遊びです。
※あくまで趣味であって現用で動かすプログラムとかに書かないでください。

数字とアルファベット、スペースを出来るだけ避ける

まずは変数を「_」に変更し、スペースを排除。

#include<stdio.h>

int main() {
    int _;
    for(_=0;_<10;_++){
        printf("%d\n",_+1);
    }
    return 0;
}


次に数字は使いたくないので別のものを用意します。
初期化されてない変数自分自身比較すれば、true(1)が返ってくるよね!
いや、心配なら必ず0が返ってくるfalse(0)を使用して初期化しましょう。

#include<stdio.h>

int main() {
    int _;
    for(_=_!=_;_<10;_++){
        printf("%d\n",_+(_==_));
    }
    return 0;
}

はい、この時点で初期化式で「???」となる人が出てきそうですね。
演算子の優先順位とかあるので、比較した結果を使う場合は十分注意を。


まだ、10が残っています。これをどうするかは方針しだいです。
この問題にだけ対応するならいい方法があります。
(int)'\n' == 10ということを利用すると・・・

#include<stdio.h>

int main() {
    int _;
    for(_=_!=_;_<10;_++){
        printf("%d%c",_+(_==_),10);
    }

}

と書き直せます。


ここで10を生成する方法を考える。
単純にもう一個変数用意して「$='\n'」というのも安直。
どうせなら10の値を計算して出しましょう。
まずは単純に行きます。

#include<stdio.h>

int main() {
    int _=_==_; // 1
    int $=_+_+_+_+_+_+_+_+_+_; // 10
    for(_=_!=_;_<$;_++){
        printf("%d%c",_+(_==_),$);
    }
    return _!=_;
}


しかし、1を10回足したら10になるってのも面白くないですね。
でも、このためだけにfor文は使いたくないです。
・・・では、どうするか。ならばビット演算だ。

#include<stdio.h>

int main() {
    int _=_==_; // 1
    int $=_<<(_+_+_)|_<<_; // 10
    for(_=_!=_;_<$;_++){
        printf("%d%c",_+(_==_),$);
    }
    return _!=_;
}

大分すっきりしました。(ぇ
とりあえず、プログラミング初学者へのアンチコードとして、
こういうのを提示して遊ぶと楽しいかもしれません。
ちなみに、動きます→http://ideone.com/dU1KT


とまぁ、こんな感じでいろいろと制約つけてプログラムすると楽しいですよ。
そして最終的にはこんな感じにまでなります。

#include<stdio.h>
main(_,$){for($|=($=-~(_/=_))<<$;_<=$;printf("%d%c",_++,$));}

これも、警告出しますが動きます。→https://ideone.com/nuu9u


現実逃避に最適!