カメヲラボ

主にプログラミングとお勉強全般について書いてます

Digital Roots(1)

  • さらに短縮62B

変態的に削るために、良い子は書いちゃいけない処理系依存しまくりのコードを書かねばならない。
といわけで、ある程度短くなったらあとはPKUのシステムを想定して、脳内コーディングを行う。まず、一桁の数字を表示するだけなので、出力関数にはprintf,puts,putcharの中から最適なものを選ばなければならないのだが、putcharだと改行が入れ辛いので今回は使えない。putsは自動的に改行を入れてくれるので出来るだけコイツを使いたい。どうしても無理な場合はprintfを使う。
一文字出力+改行は、putsを使う場合

s=ASCIIコード
puts(&s);

で可能だ。改行を入れたくない場合、printf(&s)でも可能だがputchar(s)と文字数が一緒なのでputcharで良いだろう。

次に、出力後に変数を初期化する処理であるが、これは関数が何らかの値を返すことが多いので、s=!func()のような形にする技が良く使われる。今回も出力後に変数を0で初期化したいのでs=!puts(&s)のように書きたいところだが、これは罠だ。Linux等でコードを書く場合、puts()は常に10を返す場合が多いのだがPKUのシステムでは0が返ってくるようだ。これは好都合で、わざわざ!を書く必要がなくなり1バイト削れることになる。

そんなこんなで、結局このようなコードで落ち着いた。もうちょっとスッキリさせたいのだが、私にはコレが限界だ。もう少し縮める方法があれば、コメント等で教えてほしい。

s;main(){for(;s+=getchar()-48;s=s<0?s+=86,puts(&s):s-s/10*9);}