気が付いたら春でした

来年は頑張るって書いた次が5ヶ月後ってどうなのさ自分。
でも書いてなかっただけでこそこそやってたんだよ!ほんとだよ!
ということでAOJでゴルフが行われていたらしい0006と0015をやったのでコードをぺたり。
いつの間にか普通に提出しても+2Bされなくなってたのが地味に嬉しい。

0006 Reverse Sequence

逆順で出力するなら再帰でやるのがいいんじゃないかな、と思ってmain再帰で挑んだ。
入力が1行の場合しか正しく動作しないケース依存の解き方で56B。
1文字取ってくる系はreadでやった方が短くなる場合が多いと思うけど、今回のケースはgetcharの方が短くなった。
後はreturnが削れれば・・・

main(i)
{
  return i - 10 && main(getchar()) & putchar(i-1 ? i : 10);
}

最初に通した65Bもおまけでぺたり。
若干めんどくさいことしてたなあ。

main(i)
{
  i + 1 && i != 10 ? main(getchar()), putchar(i - 1 ? i : 10) : 0;
  return 0;
}

0015 National Budget

最初は何をやってもWrong Answerが帰ってきたので、どんだけ自分駄目なんだとおもいっきりへこんでた。
やけくそになってコード変えたら普通にAccept。なん・・・だと・・・?
問題になってた部分はここ。

for(i = 0; i < j; i++) puts(a[i]); //aには答えが入ってる

答えを最後にまとめて出力するんじゃなかったのか・・・
一番詰まったのがここだったので、似たような問題を解く時は気を付けよう。
Acceptされてから縮み始めて268Bまで縮んだけど、今のところここからあまり縮む気がしない。
トップの方のコードは一体どうなってるんだろう。

char a[99], o[99], t[99];
p, q, c, n, l;
main(i)
{
  for(scanf("%d", &i); i--; *a = 49, puts(strlen(a + !c) > 80 | l ? "overflow" : a + !c))
    for(c = !scanf("%s\n%s", o, t), p = strlen(o), q = strlen(t), l = p > q ? p : q, memset(a, 0, 99); l < 81 && l; a[l--] = n % 10 + 48)
      n = (--p > -1 & --q > -1 ? o[p] - 48 + t[q] : p > -1 ? o[p] : t[q]) - 48 + c, c = n / 10;
}

やってることは文字コードを数値に直して1桁1桁足し算してるだけ。
だけど、最後に答えの文字列の先頭に1を入れてるので、答えを出力する時に最後の1桁を計算した結果
桁上がりが発生していない場合、ポインターを1個進めてやらないと余計な1が出力されちゃう。


途中で書いた292Bのコードもとりあえずぺたり。
これからこっちを短くしてもいいんじゃないかなと思う。

b[];
char a[99], o[99], t[99];
p, q, c, n, l;

main(i)
{
  for(scanf("%d", &i); i--; puts(strcpy(a, l < 1 & c | l < 0 ? "overflow" : c ? strcat(b, a) : a)))
    for(scanf("%s\n%s", o, t), p = strlen(o), q = strlen(t), c = 0, l = 80, *b = 49, memset(a, 0, 99); p-- > 0 | q-- > 0; l--)
      n = (p > -1 & q > -1 ? o[p] - 48 + t[q] : p > -1 ? o[p] : t[q]) - 48 + c, c = n / 10, n % =10, a[p > q ? p : q] = n + 48;
}

書いてて思った。strcpyいらなくね?
あばばばば。