naiの日記

ソフトウェアエンジニアから放射線科診断医にジョブチェンジしました。趣味のことを書きます。

293.char pyramid

http://golf.shinh.org/p.rb?char+pyramid
(ようやく)終了しました。

Cのトップはnnさんと私で、ともに89B。
Statisticsが結構違ったのが気になりましたが、まあだいたい同じコードだろうと思って見たら全然違いました。

  • nnさん
i,j;main(n,b){for(b+=n=read(0,b,12);i=i++?i:--j,printf("%*.1s",i%j?2:n-~j,i?b+i:"\n"););}
  • nai
p;main(i,s)char*s;{for(s[!gets(s)]&&main(i+1,s+1);printf("%*c",p?2:i,*s?:10)**s++;p=*s);}

こうして見ると、やっていること自体はだいたい同じなのですが、用いている手法が全然違うことがわかります。
私はmain再帰で長さiを1ずつ増やしながら最後まで突っ切ったのち、逆順に出力する方法。
対してnnさんはreadで入力+長さの取得を同時に行った後はうまくfor一個で回しきり、main再帰も、"char"さえも(!)使わずに出力できています。
printf書式に"%*c"でなく"%*.1s"を用いることでcharをとっぱらうことができ、同時に終了処理まで行うことができているのですが、これは完全に盲点でした。やられた! という気持ちです。

コード公開で他人のソースが見られるようになったら、案外お互い別の部分で短縮していて、合わせたらもっと短くなることが良くあるものですが、この問題の場合共通部分がなさすぎてそれも難しそうです。
私の方のコードはもう鼻血も出ません。main再帰+forループの90BをSubmitした後はもうずっとその方法しか考えていませんでしたが、結局1Bしか縮みませんでした(もう少し別の方法も考えるべきでした)。
ちなみに縮んだ部分はs[!gets(s)]だったりします。!gets()大活躍。

それにしても、こんなにも違うアルゴリズムでお互いに短縮した結果、どちらも89Bで並ぶとは面白い。なにやら運命的なものを感じます。良い問題でした。
皆さん、お疲れ様でした。