golf004

CodeIQに新しい問題が公開された。
https://codeiq.jp/ace/ozy4dm/q1376
https://codeiq.jp/ace/ozy4dm/q1376

さっそく昨日の夜にチャレンジ。

まずはいつものようにExcel先生にご助力を乞い、出力結果のパターン探し。
ループを行ったり来たりさせるのは無いだろうと思い、検討して切り捨てた対数と2のべき乗を特定の条件で加算するコードを作成。
書いたもののどーも、出力結果に対してコードが長すぎる。85byteもかかるはずない。

そう思いつつも、一旦提出して順位から推測しようとしたら、案の定全然見当違いの順位。
もう一度問題と、与えられた数字と出力する数字をよく観察したところ、何のこっちゃないO(1)の単純計算と判明。

そんなわけで今日時点で一気に縮めて再提出。
Ozyさんのブログでは1位はそれなりの(変態的な)テクニックがあるようなので、(http://d.hatena.ne.jp/Ozy/20150310
まあ上位に入ったとしても1位は無理だろうとも思う。

とりあえず明日の中間で何位に上がったかで、さらに寿命を縮めるか考えます。

(2015/03/19追記)

ついに1位タイ、ゲット!
ポイントは3つ

・ド・モルガンの法則
A & B = ~(~A | ~B)
A | B = ~(~A & ~B)

・ネガティブとビット反転
-n = ~n + 1 = ~(n – 1)
~n = -n – 1 = -(n + 1)

・引数省略テクニック
main(){gets()・・・
scanf(“%d”,&a);vprintf();

もう縮まない。と思う。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)