第17回 mixC++ Code Golf 結果報告

アバター
あーる@Reputeless
記事: 84
登録日時: 15年前
住所: 千葉

第17回 mixC++ Code Golf 結果報告

投稿記事 by あーる@Reputeless » 14年前

#第17回[Bitwise rotation]#

[問題]
入力された int 型の値に対し、ビット列を左シフト方向に回転させ、1周するまでその値を表示する

[入力 |例1]
8

[出力 |例1]
8\n
16\n
32\n
64\n
128\n
256\n
512\n
1024\n
2048\n
4096\n
8192\n
16384\n
32768\n
65536\n
131072\n
262144\n
524288\n
1048576\n
2097152\n
4194304\n
8388608\n
16777216\n
33554432\n
67108864\n
134217728\n
268435456\n
536870912\n
1073741824\n
-2147483648\n
1\n
2\n
4\n
8\n

[入力 |例2]
-1

[出力 |例2]
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n
-1\n

[入力 |例3]
753124320

[出力 |例3]
753124320\n
1506248640\n
-1282470016\n
1730027265\n
-834912766\n
-1669825531\n
955316235\n
1910632470\n
-473702356\n
-947404711\n
-1894809421\n
505348455\n
1010696910\n
2021393820\n
-252179656\n
-504359311\n
-1008718621\n
-2017437241\n
260092815\n
520185630\n
1040371260\n
2080742520\n
-133482256\n
-266964511\n
-533929021\n
-1067858041\n
-2135716081\n
23535135\n
47070270\n
94140540\n
188281080\n
376562160\n
753124320\n

[期間]
1/29(土)22:00 ~ 2/ 5(土)21:59

[hr]
=結果=

投稿数12件(7人)

1位 (64B)
みけCAT さん
c=33;main(i){for(scanf("%d",&i);c--;i=i*2|i<0)printf("%d\n",i);}

nissy さん
n;main(a){for(scanf("%d",&a);n++<33;a=a<0|a*2)printf("%d\n",a);}

kimuchi さん
i;main(n){for(scanf("%d",&n);33-i++;n=n<0|n*2)printf("%d\n",n);}

*1位1番乗り
みけCAT さん

[hr]
★解説

今回のポイントは次の2つです。

*2 か左シフトか
Q3 では、2の累乗を得るために << 演算子を使いました。
今回も、問題文に左シフトと書いてあるので << 演算子を使いたくなるかもしれません。
しかし、n<<1 という演算からは、一番左のビットの情報を得ることができません。
int 型の値に対しては、オーバーフローを考慮しても、左シフトと *2 が等価に作用することを利用し、1位のコードの形にするのが最短でした。
なお、右シフトと /2 は互換ではありません。

比較式の結果は 0 か 1
比較式が真のときは 1、偽のときは 0 を返すことを利用しましょう。

Code Golf に興味が出てきたら、コミュニティ「Code Golf を楽しもう」まで!
初心者歓迎、参戦&観戦いつでもお待ちしています!
http://dixq.net/forum/viewforum.php?f=52

第18回の投稿受付中です。
[hr]
最後に編集したユーザー あーる@Reputeless on 2011年2月05日(土) 22:04 [ 編集 1 回目 ]

xxx
記事: 26
登録日時: 15年前

Re: 第17回 mixC++ Code Golf 結果報告

投稿記事 by xxx » 14年前

うげー3人もかー
あと1Bだったのに・・・

CODE:

i;main(n){scanf("%d",&n);printf("%d\n",n);i++>31?:main(n*2|n<0);}

アバター
あーる@Reputeless
記事: 84
登録日時: 15年前
住所: 千葉

Re: 第17回 mixC++ Code Golf 結果報告

投稿記事 by あーる@Reputeless » 14年前

> roxion1377 さん
最近僕は main 再帰じゃないと1位になれない問題を作らないよう、苦心・・・してはいません(´ω`*

アバター
五反田
記事: 21
登録日時: 15年前

Re: 第17回 mixC++ Code Golf 結果報告

投稿記事 by 五反田 » 14年前

CODE:

i;main(n){scanf("%d",&n);i++>32?:main(n*2|n<!printf("%d\n",n));}
roxion1377さんのコードを少し改良すればmain再帰でも同率一位取れますね。
66Bがでしゃばってすいません。

実行結果
http://ideone.com/A83hd

アバター
あーる@Reputeless
記事: 84
登録日時: 15年前
住所: 千葉

Re: 第17回 mixC++ Code Golf 結果報告

投稿記事 by あーる@Reputeless » 14年前

> 五反田さん
あー! printf の戻り値利用だ。
やられた /(^o^)\