Codeへの愛とCuriosity

CodeIQ への出題・解説解題・その周辺について、思いつくままに。

長くなるように、増え続けるように

CodeIQ に「長くなるように、増え続けるように」という問題
https://codeiq.jp/ace/nabetani_takenori/q957
を出した。

面白い問題だと思うんだけど、泥臭さがなさすぎて、どこかでまったく同じ問題が出てるんじゃないかと疑っている。

今のところ、まだ「ああ xxx で出た問題と同じだ」という声は聞こえてきていない。

私自身はプログラミングコンテストに参加したことはないんだけど、プログラミングコンテスト風の問題になっているような気がしている。どうだろう。

CodeIQ に出した「JavaScriptじゃんけん大会!」の解説・解題

CodeIQ に「JavaScriptじゃんけん大会!」( https://codeiq.jp/ace/nabetani_takenori/q888 )という問題を出した。
挑戦の募集はすでに締めきっている。
というわけで、解説・解題。

で。
まずは問題

問題

■問題
JavaScript によるじゃんけん大会を行います。
じゃんけんプログラムを作成し、優勝を目指して下さい。

■ルールの詳細
・挑戦者全員で総当り戦を行います。
・各プレイヤーは、自分以外のすべてのプレイヤーと1回ずつ戦います。この戦いを「マッチ」と呼びます。
・1回の「マッチ」は、100回の「じゃんけん」によって構成されます。
 ※ あいこも1回のじゃんけんに数えます。
・じゃんけんの結果、グーで勝つと17点、グー以外で勝つと10点の得点が入ります。
・あいこと負けの場合は得点が入りません。
・100回じゃんけんを行い、得点の合計が多いほうが「マッチ」の勝者となります。
・「マッチ」に勝つと、30010点の勝ち点が入ります。
 引き分けは10001点、負けは0点です。
・勝ち点の合計を競います。勝ち点の合計が最も多いプレイヤーが優勝です。

■じゃんけんのインターフェース
WebWorker の仕組みから呼ばれます。
「マッチ」が始まると WebWorker が newされ、「マッチ」が終了すると terminate されます。
「じゃんけん」のたびに、postMessage されますので、addEventListener に登録した関数で受けて、postMessage で返して下さい。
渡ってくるデータは "GCPGCP,PPGGPP" のような文字列で、addEventListener に登録した関数 の引数の data プロパティに格納されています。
文字列の形式は
 あなたが今まで出した手 + ", " + 相手が今まで出した手
です。G がグー、Cがチョキ、Pがパー を示します。
あなたが出す手を決めたら self.postMessage( "G" ) のような形で通知し、即座に関数を抜けて下さい。

■実行方法とサンプルコード
jangkeng.zip をディレクトリ付きで展開し、Firefox 29 で jangken_runner.html を開くと、総当り戦が実行されます。
Your Code.js の中身を書き換えて勝てそうなプレイヤーを作って下さい。
Your Code.js 以外にもサンプルコードが入ってますので、それも参考にして下さい。

■詳細と注意事項
・複数回投稿した場合、最後のものが有効になります。
・締め切り前でも投稿内容を公開して構いません。
  ※もちろん、他のプレイヤーが対策可能になるので本番用とは別のものを公開することをお勧めします。
・実行は Firefox 29 で行います。
・何度実行しても同じ結果が出るようなプログラムを書いて下さい。日付(Date)や JavaScript に組み込まれた乱数(Math.random) 等を利用してはいけません。
・じゃんけんの勝敗の数や、得失点差は順位に影響を与えません。勝ち点のみで評価します。
・ネットワークへのアクセス、DOMへのアクセス、他のプレイヤーのソースコードや結果へのアクセス、ファイルシステムへのアクセスは禁止します。
 つまり、importScripts や XMLHttpRequest などは禁止です。
・あまりにも可読性が低い場合(難読化/minify されている場合など)は、失格とします。
・処理時間があまりにも長い場合は失格とするかもしれません。
・失格にならなかったコードは、コメントや挑戦者名とともに拙ブログ( http://nabetani.hatenablog.com ) や http://nabetani.sakura.ne.jp/codeiq/jsjangkeng/ で 全て公開されます。

■解答形式
あなたの書いた JavaScript のコードを下記フォームに入力し、送信して下さい。
jangkeng.zip に同梱されている「Your Code.js」の形式に従い、JavaScript のコメント内に以下の項目を書いて下さい。
・プレイヤー名
・感想など

こんな感じ。

この問題を出した時点では Firefox 29 だったんだけど、今は Firefox の最新版は 30。もちろんそれでも問題ない。

続きを読む

勝ち点の不自然な値

JavaScriptじゃんけん大会! ( https://codeiq.jp/ace/nabetani_takenori/q888 ) 。
勝ち点が

勝利 30010ポイント
引き分け 10001ポイント
負け 0ポイント

となっている。

今回は、なぜこの値にしたのかの解説。

このルールは

  • 勝ったら勝ち点3。
  • 引き分けで勝ち点1。
  • 勝ち点が並んだら、勝ち数の多い方が上位

というルールと同値になっている。
参加者が1000人を超えると同値じゃなくなるかもしれないんだけど、今回は 100人なので大丈夫。

で。

それだけなら 3001 と 1000 でいいんだけど、 30010 と 10001 にしたので、勝ち点の値を見るだけで、だいたい引き分けの数も勝ちの数もわかるようになっている。

つまり。
引き分けが10回未満なら、一の位が引き分け、十の位から上に3桁見ると勝ち数になる。
例えば勝ち点が 160051 だったとすると、5勝1分けだとわかる。

じゃんけん大会のブラウザ

JavaScriptじゃんけん大会! ( https://codeiq.jp/ace/nabetani_takenori/q888 ) 。

ブラウザが Firefox になっているのは、

  • Windows / Linux / Mac のいずれでも使えること
  • ローカルファイルの JavaScript を難なく実行できること

という2つの条件をみたすものが Firefox しかなかったから。

ブラウザを限定したほうが挑戦者も楽になるだろうという考えもちょっとあったり。

というわけで、挑戦者募集中。
われこそはと思う方もそれほどでもない方も是非。

じゃんけん大会

というわけで、JavaScriptじゃんけん大会! ( https://codeiq.jp/ace/nabetani_takenori/q888 ) が公開された。

随時(たぶん、1〜3日 に1度ぐらいのペースで)挑戦者の勝敗の表・勝ち点・順位 を
http://nabetani.sakura.ne.jp/codeiq/jsjangkeng/
にアップロードしていこうと思ってる。

今のところ3名挑戦して、2勝/1勝/0勝 という具合になっている。
再挑戦可能・最後の投稿のみを採用 という方針なので、まずは軽い気持ちでいい加減なのを突っ込んで様子を見るのもいいと思う。

なんだかすごく楽しいんだけど、自分自身が参戦できないのがちょっと残念。

週明けに問題出るよ

週明け 5/19 AM8:00 に、CodeIQ に問題が公開される。
URL書いちゃってもいいような気がしてるんだけど、まあ公開を待つことにして。

公開されたら
https://codeiq.jp/ace/nabetani_takenori
から辿れるようになる(これを書いている時点ではメンテナンス中だけど)

ジャンルはゲーム。
ジャンルがゲームになっている問題としては、今までで一番ゲームらしいと思う。

今まで出した問題とは似てない感じ。

お楽しみに。

CodeIQ に出した「4つの数と四則と括弧」の解説・解題

CodeIQ に「4つの数と四則と括弧」( https://codeiq.jp/ace/nabetani_takenori/q820 )という問題を出した。
挑戦の募集はすでに締めきっている。
というわけで、解説・解題。

で。
まずは問題

問題

■問題
4つの数と四則演算と括弧を使って数を作るというゲームがあります。
例えば、2, 3, 7, 8 なら、34, 24, 60, 12, 65 などの数を

  • 238÷7 = 34
  • 8÷(7÷3-2) = 24
  • (8-2)×(7+3) = 60
  • 72÷8+3 = 12
  • 28+37 = 65

などの方法で作ることができます。

しかし、54 や 95 などの数は、2, 3, 7, 8 を使って作ることができません。

以上をふまえて、2, 3, 7, 8 と 四則演算・括弧をどう組み合わせても作ることができない正の整数で、100より小さいものをすべて挙げて下さい。

■詳細と注意事項

  • 2, 3, 7, 8 の4つの数は、すべて一度ずつ使わなくてはいけません。二度以上使ってはいけませんし、使わない数があってもいけません。
  • 演算子や括弧は何度でも使うことができます。
  • 使える演算子は四則( +, -, ×, ÷ )のみです。指数や剰余は使えません。
  • 例の通り、複数の数字を並べてひとつの数を作ることができます。たとえば、2 と 3を並べて 23 や 32 を作ることができます。
  • 3÷2 は 1 ではなく、2分の3 です。
  • 解答欄には、作ることができない整数で、1〜99 の範囲内のものを書いて下さい。
  • 実装に使用する言語は自由ですが、ruby, C, C++, Java, JavaScript, groovy 以外の言語を使用した場合、惜しいかどうかの判断を諦めることがあります。

こんな感じ。

続きを読む