#第8回 [Sum of digits & Prime number]#
[問題]
1 以上 1000 未満の整数が1つ入力される
各位の和が素数なら、"P\n" を出力し、そうでないなら何も表示しない
いずれの場合も実行時エラーを起こさず終了する
[入力 |例1]
124
[出力 |例1]
P\n
[入力 |例2]
125
[出力 |例2]
[入力 |例3]
976
[出力 |例3]
[入力 |例4]
977
[出力 |例4]
P\n
[入力 |例5]
1
[出力 |例5]
[入力 |例6]
2
[出力 |例6]
P\n
[期間]
11/27(土)22:00 ~ 12/4(土)21:59
[hr]
=結果=
投稿数 7件(5人)
1位 (63B)
五反田 さん
main(i){scanf("%d",&i)&9054380>>i/100+i/10%10+i%10&&puts("P");}
2位 (67B)
a5ua さん
main(x){scanf("%d",&x);(1>c)%2&&puts("P");}
*1位1番乗り
五反田 さん
[hr]
★解説
今回のポイントは次の3つです。
数値をどう受け取るか
scanf を使う方法と、3位のコードで使われている3ケタの数値を1文字ずつ受け取る方法、
今回は差が生じませんでしたが、入力が4ケタ、5ケタと増えると、後者が有利になります。
埋め込み
今回みんなが使っている「9054380」は何者なのでしょうか?
9054380 を2進数になおして、素数を降順に並べた数列と比較すると正体がわかります。
9054380 → 0000100010100010100010101100
[table=width:50%;border:1px solid #cccccc;][tr=text-align:center;][td=border:1px solid #cccccc;]27[/td][td=border:1px solid #cccccc;]26[/td][td=border:1px solid #cccccc;]25[/td][td=border:1px solid #cccccc;]24[/td][td=border:1px solid #cccccc;]23[/td][td=border:1px solid #cccccc;]22[/td][td=border:1px solid #cccccc;]21[/td][td=border:1px solid #cccccc;]20[/td][td=border:1px solid #cccccc;]19[/td][td=border:1px solid #cccccc;]18[/td][td=border:1px solid #cccccc;]17[/td][td=border:1px solid #cccccc;]16[/td][td=border:1px solid #cccccc;]15[/td][td=border:1px solid #cccccc;]14[/td][td=border:1px solid #cccccc;]13[/td][td=border:1px solid #cccccc;]12[/td][td=border:1px solid #cccccc;]11[/td][td=border:1px solid #cccccc;]10[/td][td=border:1px solid #cccccc;]9[/td][td=border:1px solid #cccccc;]8[/td][td=border:1px solid #cccccc;]7[/td][td=border:1px solid #cccccc;]6[/td][td=border:1px solid #cccccc;]5[/td][td=border:1px solid #cccccc;]4[/td][td=border:1px solid #cccccc;]3[/td][td=border:1px solid #cccccc;]2[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][/tr]
[tr=text-align:center;][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]1[/td][td=border:1px solid #cccccc;]0[/td][td=border:1px solid #cccccc;]0[/td][/tr][/table]
n が素数のとき、右から n ビット目が1になっています。
9054380 を n ビット右シフトさせると、n が素数のとき、右端のビットが 1 になるということです。
このように、短い true / false の配列は、int 型のデータの中に埋め込むことができます。
ちょっとずるいかもしれませんが、Code Golf は短くするためなら何をしてもOKなのです。
ちなみにですが、
ideyan さんが埋め込みを使わない、27 以上の素数にも対応した方法(74B)を考えてくれたので紹介します。
a,c;main(b){while(a=getchar()+1)c+=a-49;for(;c%++b&&c-1;);c-b||puts("P");}
関数の戻り値を利用
1位のコードは
9054380>>i/100+i/10%10+i%10&1&&puts("P");
の下線部分を、scanf が変換された引数の個数(この場合は 1 )を返すことを利用して、さらに短くしています。
興味が出てきたら、コミュニティ「Code Golf を楽しもう」まで!
初心者歓迎、参戦&観戦いつでもお待ちしています!
http://dixq.net/forum/viewforum.php?f=52
第9回の投稿受付中です。
今回の問題は
http://dixq.net/forum/blog.php?u=527&b=729
bitter_fox さんのデスクトップの壁紙から。
[hr]
コミュメンバーからの出題企画について
来年からこのコミュで、メンバーからの出題をオープンにしていきます。
ということで、まずはメンバーの出題でコミュを運営する、お試し期間を設けてみます。
その一環として、以前のお知らせどおり、今回の問題の上位3人へ出題をお願いする
・・・ということでしたが、
それでは物足りないので、
今回は、投稿してくださった5人全員に出題をお願いしたいと思います。わーい!
担当する問題は、
・第11回(12/18出題)
・第12回(12/25出題)
・第13回(1/1出題)
・第14回(1/8出題)
・第15回(1/15出題)
・第16回(1/22出題)
・第17回(1/29出題)
・第18回(2/5出題)
・第19回(2/12出題)
から選ばれます。
出題は
・問題作成([問題]・[入出力例]・[投稿の目安])のみを担当
・問題管理(問題作成に加え、投稿受付・中間発表・結果発表)を担当
のどちらで携わるかを選べます。
今回対象者の方:
五反田 さん、a5ua さん、ideyan さん、roxion1377 さん、沖 滉均 さん
は、プライベートメッセージ(PM) にて
① 出題をするか
② 担当したい問題の時期(第 XX 回)を第3希望まで
③ 問題の担当方法(作成のみ or 全部管理)
を、12月中にコミュ主までご連絡ください。質問・ご意見もうけたまわります。
今回は出題を希望しないという場合は、連絡をくださらなくてもOKです。
.
第8回 mixC++ Code Golf 結果報告
- あーる@Reputeless
- 記事: 84
- 登録日時: 15年前
- 住所: 千葉
第8回 mixC++ Code Golf 結果報告
最後に編集したユーザー あーる@Reputeless on 2010年12月04日(土) 22:06 [ 編集 1 回目 ]
Re: 第8回 mixC++ Code Golf 結果報告
猛スピードで確認に
ビット演算が難しすぎて無理でした(笑)
0が必要な理由がわかって感動しますね
それと今回の問題の「シェルピンスキーのギャスケット」の中間発表は2回ぐらいできますか?
さすがに1回ではみんながどのくらいのコードを書くのかわかり難いものですから^^;
(というかあれを表示するプログラムをかけるかが危うい
ビット演算が難しすぎて無理でした(笑)
0が必要な理由がわかって感動しますね
それと今回の問題の「シェルピンスキーのギャスケット」の中間発表は2回ぐらいできますか?
さすがに1回ではみんながどのくらいのコードを書くのかわかり難いものですから^^;
(というかあれを表示するプログラムをかけるかが危うい
- あーる@Reputeless
- 記事: 84
- 登録日時: 15年前
- 住所: 千葉
Re: 第8回 mixC++ Code Golf 結果報告
> roxion1377 さん
第9回はいつもより長めのコードになりそうですね。
目安を 180B 以下と設定しましたが、うまく書ければそこそこ短くできそうです。
まずは、うまく描くアルゴリズムから!
Wikipedia の「シェルピンスキーのギャスケット」のページにヒントがあるかもしれません。
中間発表の回数は投稿の様子を見て考えてみます (╹◡╹
第9回はいつもより長めのコードになりそうですね。
目安を 180B 以下と設定しましたが、うまく書ければそこそこ短くできそうです。
まずは、うまく描くアルゴリズムから!
Wikipedia の「シェルピンスキーのギャスケット」のページにヒントがあるかもしれません。
中間発表の回数は投稿の様子を見て考えてみます (╹◡╹
最後に編集したユーザー あーる@Reputeless on 2010年12月04日(土) 22:18 [ 編集 1 回目 ]
Re: 第8回 mixC++ Code Golf 結果報告
あぁあああああああああああああああああ、よく見たら馬鹿なことしてるorz
c;main(a){while(a=getchar()+1)c+=a-49;(9054380>>c)%2&&puts("P");}
こうしておけば65byteで済んだじゃないかw
c;main(a){while(a=getchar()+1)c+=a-49;(9054380>>c)%2&&puts("P");}
こうしておけば65byteで済んだじゃないかw
- あーる@Reputeless
- 記事: 84
- 登録日時: 15年前
- 住所: 千葉
Re: 第8回 mixC++ Code Golf 結果報告
> ideyan さん
でしたね。大会明け等、忙しい中のご参加ありがとうございました。
でしたね。大会明け等、忙しい中のご参加ありがとうございました。
Re: 第8回 mixC++ Code Golf 結果報告
あのヒントから結構同列に並ぶのかとも思ったのですが、意外と一位を取れてしまいましたね。
演算子の優先順位的にカッコは結構外せるみたいですね。
演算子の優先順位的にカッコは結構外せるみたいですね。
- bitter_fox
- 記事: 607
- 登録日時: 14年前
Re: 第8回 mixC++ Code Golf 結果報告
来てみたら本当に問題になってたwww。正直冗談だと思ってました(笑)
こうして問題になると嬉しいような恥ずかしいような、、、
180kbyte難しそうですね。
[hr]
自分では思いつきません。(涙)
こうして問題になると嬉しいような恥ずかしいような、、、
180kbyte難しそうですね。
[hr]
うーん、ビット演算もここまで来ると芸術ですね。あーる さんが書きました: 9054380 → 0000100010100010100010101100
n が素数のとき、右から n ビット目が1になっています。
9054380 を n ビット右シフトさせると、n が素数のとき、右端のビットが 1 になるということです。
自分では思いつきません。(涙)
最後に編集したユーザー bitter_fox on 2010年12月04日(土) 23:29 [ 編集 2 回目 ]
- あーる@Reputeless
- 記事: 84
- 登録日時: 15年前
- 住所: 千葉
Re: 第8回 mixC++ Code Golf 結果報告
> 五反田 さん
ヒントが出される前に、まじめに素数を計算されていた方が、
力尽きてしまったのかもしれません。ご大儀さまでした (╹◡╹;;;
見事にカッコなしの数式になりましたね!
> bitter_fox さん
はい。やっちゃいました。
掲載されたコードは技術の宝庫です。どうぞいろいろ持っていってください。
お代はいりません。
ヒントが出される前に、まじめに素数を計算されていた方が、
力尽きてしまったのかもしれません。ご大儀さまでした (╹◡╹;;;
見事にカッコなしの数式になりましたね!
> bitter_fox さん
はい。やっちゃいました。
掲載されたコードは技術の宝庫です。どうぞいろいろ持っていってください。
お代はいりません。
Re: 第8回 mixC++ Code Golf 結果報告
埋め込み…そういうことだったのか
しかし…金曜・土曜とやる時間が合ったのにビット演算が見たくなかった私ですorz
しかし…金曜・土曜とやる時間が合ったのにビット演算が見たくなかった私ですorz
- あーる@Reputeless
- 記事: 84
- 登録日時: 15年前
- 住所: 千葉
Re: 第8回 mixC++ Code Golf 結果報告
> 沖 滉均 さん
そういうことでした。
>> ^ | ~ << & えいえいっ!
そういうことでした。
>> ^ | ~ << & えいえいっ!