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

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

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

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

#第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です。
.
最後に編集したユーザー あーる@Reputeless on 2010年12月04日(土) 22:06 [ 編集 1 回目 ]

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

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

投稿記事 by xxx » 14年前

猛スピードで確認に
ビット演算が難しすぎて無理でした(笑)
0が必要な理由がわかって感動しますね

それと今回の問題の「シェルピンスキーのギャスケット」の中間発表は2回ぐらいできますか?
さすがに1回ではみんながどのくらいのコードを書くのかわかり難いものですから^^;
(というかあれを表示するプログラムをかけるかが危うい

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

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

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

> roxion1377 さん
第9回はいつもより長めのコードになりそうですね。
目安を 180B 以下と設定しましたが、うまく書ければそこそこ短くできそうです。

まずは、うまく描くアルゴリズムから!
Wikipedia の「シェルピンスキーのギャスケット」のページにヒントがあるかもしれません。

中間発表の回数は投稿の様子を見て考えてみます (╹◡╹
最後に編集したユーザー あーる@Reputeless on 2010年12月04日(土) 22:18 [ 編集 1 回目 ]

アバター
ideyan
記事: 2
登録日時: 15年前

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

投稿記事 by ideyan » 14年前

あぁあああああああああああああああああ、よく見たら馬鹿なことしてるorz

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 結果報告

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

> ideyan さん
でしたね。大会明け等、忙しい中のご参加ありがとうございました。

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

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

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

あのヒントから結構同列に並ぶのかとも思ったのですが、意外と一位を取れてしまいましたね。
演算子の優先順位的にカッコは結構外せるみたいですね。

アバター
bitter_fox
記事: 607
登録日時: 14年前

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

投稿記事 by bitter_fox » 14年前

来てみたら本当に問題になってたwww。正直冗談だと思ってました(笑)
こうして問題になると嬉しいような恥ずかしいような、、、

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 結果報告

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

> 五反田 さん
ヒントが出される前に、まじめに素数を計算されていた方が、
力尽きてしまったのかもしれません。ご大儀さまでした (╹◡╹;;;
見事にカッコなしの数式になりましたね!

> bitter_fox さん
はい。やっちゃいました。
掲載されたコードは技術の宝庫です。どうぞいろいろ持っていってください。
お代はいりません。

アバター
沖 滉均
記事: 237
登録日時: 14年前

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

投稿記事 by 沖 滉均 » 14年前

埋め込み…そういうことだったのか
しかし…金曜・土曜とやる時間が合ったのにビット演算が見たくなかった私ですorz

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

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

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

> 沖 滉均 さん
そういうことでした。
>> ^ | ~ << & えいえいっ!