AOJ難しい
id:incrementさんがYes, I have a numberでゴルフしていたのを見て、ひょっとしたらもっと縮められるかもと思ってやってみました。
が、ことごとくWrong Answerという結果にorz
anarchy golfだったら通ってそうなコードは全部駄目。
通らねえコードはただの文字列だ。うぐぐ。
惨敗したのでやったことだけ残しておこう・・・
追記
空白が連続した場合に0と出力する。
っていうケースを全く考慮してなかったので、通らないのは当たり前でしたorz
意図せず空白が連続した場合に0と出力する場合もあるけど、改行の後に空白が連続したりすると正しく動かない。
なので、以下完全敗北したログになります。ちくしょおおお。
main(i) { for(; i; i == 'DNE' ? i = 0 : printf("%d", strlen(&i))) scanf("%s",&i); }
まずはscanfとstrlenの組み合わせ。
%sで読み込むとスペース区切りで読み込んでくれるのでこの問題にはぴったり。ただ、見ての通り改行できない。
改行コードも読み飛ばされてしまうので、改行する場所の判定ができないという悲しい結果に。
サンプルテストケースと同じテストだといいなと祈りつつ、無理やり改行するようにしてみても当然通らない。
結局欠陥が大きいのでこのコードはボツ。短くなりそうだったんだけどな・・・
j; main(i) { for(; i; i == 69 ? i = 0 : i == 32 | i == 10 ? printf(i == 32 ? "%d" : "%d\n", j), j = 0 : j++) scanf("%c", &i); }
anarchy golfだったら通ってそうなコード。
END OF INPUTのEだけ狙い撃ちして通そうと思った。けど無理でしたorz
NとDも試したけどWrong Answer。コードサイズを大きくして\nEやEN、NDなども試してもWrong Answer。
92Bが狙えただけ落胆も大きい。がっくり・・・
j, k; main(i) { for(; i; i == 32 | i == 10 ? printf( i == 32 ? "%d" : "%d\n", j), j = 0 : (j++, k = (k << 8) + i, (k & 'ooo') == 'END' && i = 0)) scanf("%c",&i);}
上のコードを改良して、形振り構わず通すことだけを考えたコード。
ビットシフトしながら文字を連結して4文字まで保存できるようにしてみた。
我ながらちょっとかっこいいコードが書けたかなとうっとりしてたら通らなかった。あばば。
小文字のoがいい感じのビットマスクに使えそうだったのでENDの取り出しに使う。
何・・・?ENDで終了してもWrong Answer・・・だと・・・?
判定厳しいっすねorz
他にもstrtokやstrchrも試してみるも、これもまた改行が判定できなかったり改行を判定するとコードが大きくなったりしてボツ。
AOJでゴルフするのは難しい。anarchy golfとは別のテクニックが必要だなあ。
正答率が高いか100%正解を返すコードを書きつつ短縮するのは凄い。
答えを埋め込んだりして縮めるのが好きな自分的には中々厳しい環境です・・・