Just $ A sandbox

プログラミングと計算機科学とかわいさ

2.ショートコーディングC[コラッツ予想]

今回はコラッツ予想のショートコーディングをしてみましょう。コラッツ予想を知らない方はコチラ→コラッツの問題 - Wikipedia

まずは愚直に

何も考えずに組んだプログラムが以下になります。
2から順に全ての数の、コラッツ予想の手順に沿って数を出力するプログラムになります。

int main(){
    int i,n;
 
    for(n=2;;n++){
        printf("%d",n);
        for(i=n;i>1;){
            if(i%2==0) i/=2;
            else i=3*i+1;
            printf("->%d",i);
        }
        printf("\n");
    }
    
    return 0;
}

ではこれを短くしましょう。

ショートコード

// 77B
i;main(n){
    for(i=++n;i>1;printf("%d->",i),i=i%2?3*i+1:i/2);
    puts("1"),main(n);
}

// 75B
main(n,i){
    for(;i=++n;puts("1"))
        for(;i>1;printf("%d->",i),i=i%2?3*i+1:i/2);
}

上はmain再帰を用いたバージョン、下はそうでないバージョンです。
今回はputs()*1関数を使っています。ショートコーディングで大事なのは、puts()関数は文字列リテラルの表示を行い、その後自動的に改行を挟んでくれるということですね。
今回は
2->1
3->10->5->16->8->4->2->1
4->...
のように一つの数字に関して調べたら改行を挟む、という風にしているのでputs()関数を利用しています。

備考

色々考えましたが結局これ以上短くは出来なかったので良い案があれば教え(ry
このプログラムは単純に出力を見るだけでもとても面白いので是非自分でも動かしてみることをお勧めしますよ!

*1:今回はコチラを使いましたが、あとはprintln()関数なるものもあるので、機会があれば使うことになるのかもしれませんね