カメヲラボ

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

DNA Sorting

  • 粘る

さらにhinoeさんの超絶短縮で163Bになりました。(前回のコメントで変数等の消し忘れをすべて処理すると163B)。で、hinoeさんはさらに161Bまで短縮しています。メモリの使用量から考えるとtを1次元配列、pをchar[]型で宣言しているのだと思います。ということは1次元配列で何やら良さげなてくにーくを使ってらっしゃるかもしれません。私も161Bで通していますが、かなり泥臭い方法で縮めました。おそらくコードは違うものかと思われます。

char*q,*r,p[621];
t[621][7];

main(j,o,i,s)
{
  for(gets(q=s);j=gets(q);t[o][++p[o]]=j)
    for(o=1;i=*q++;)
      for(r=q;*r;)o+=i>*r++;
  for(;i<621;)
    p[i]<++j?j=!++i:puts(t[i][j]);
}

C/GCCでもはや必須のテクニックとなっているものですが、文字列を読み込む場合にmain関数の第2引数を利用するというやつです。この問題の場合、第2引数にsを配置するとRuntime Errorになるのですがこれはよくあること。第3引数以降でも変数の書式はメモリ上の何処かを指している場合があり、そこが読み書き可能な領域であれば通ることもあります。これは実際にどのようなバイナリが生成されるのか正確にはわからないので、運まかせです。今までは第2〜第5引数くらいまで試してダメだったのですが、hinoeさんのコードだとGCCで第4引数にsを置いたときに通りました。Cでは無理でした。アイデアが乏しいときにこうやって試してみるのも良いかもしれません。

160越えが見えてきました。