Short Coding を買った

Short Coding ~職人達の技法~

Short Coding ~職人達の技法~

Ozy さんが書かれたショートコーディングのための本。
前から興味があったのだけど、店頭に並んでいるところを見たことがなかったので今まで買わずにきたのだが、昨日偶然並んでいるのを見つけて購入した次第。
冒頭で POJ というものが紹介されていた。
Welcome To PKU JudgeOnline
今まで全然知らなかった。これは面白そう。
自力で解かずにこの本を読むよりも、解いてみてから読んだ方が面白うだろうというわけで、ある程度解いてから読むことにした。
とりあえず今日は 1000 - 1004 を解いてみた。
1001 はさすがに GCC でやる気にはなれなかった。。。JavaBigDecimal に逃げました。すみません。


1002 をがんばってみた。結果は 375B。そのコードをインデントして貼ってみる。

c(int *a, int *b) {
  return *a - *b;
}
i;
j;
d;
main(n) {
  int *m;
  char b[99];
  scanf("%d", &n);
  m = calloc(n, 4);
  for (gets(b); gets(b); i++)
    for (j = 0; b[j]; j++)
      b[j] > 81 && b[j]--, m[i] = isupper(b[j]) ? 10*m[i]+(b[j]-65)/3+2 : isdigit(b[j]) ? 10*m[i]+b[j]-48 : m[i];
  qsort(m, n, 4, c);
  for (i = j = 0; i < n; i++) {
    for (d = 1; i < n && m[i] == m[i+1]; d++, i++);
    j = d-1 ? printf("%03d-%04d %d\n", m[i]/10000, m[i]%10000, d) : j;
  }
  j || puts("No duplicates.");
}

まぁ当然のごとく warning でまくりで GCC 先生大激怒。
各番号を十進で7桁の数値に変えた後、sort | uniq -c を地で行ったようなコード。
同様の方法でこれ以上短く書くのは俺にはちょっと無理そう。。。さらに短くするには根本的に方法を変えるべきか。

追記

scanf(3)をやめてatoi(3)使ったらさらに短くなって 366B。