ゲーム
Nimは数学的な戦略ゲームで、2人のプレイヤーが順番に、異なるヒープからアイテムを取ります。自分のターンでは、少なくとも1つのアイテムを取る必要があり、1つのヒープからのみ取得するという条件で、必要な数だけアイテムを取得できます。最後のアイテムを取るプレイヤーが勝ちます!これは解決済みのゲームです。戦略に入る前に、こちらでオンラインでプレイしてみてください。
戦略
勝利の戦略は、このリンクで非常に明確かつ簡単に説明されています。もう少し専門的な用語を使って説明します。このゲームに勝つには、binary-digital-sumが常に0になるように、常にできるだけ多くのアイテムを取ることです。次のボードについて考えてみます。
*
* *
* * *
* * * *
* * * * *
1 2 3 4 5
このボードのbinary-digital-sumを見つけるには、次のことを行う必要があります。
各行の数値をバイナリに変換します。したがって、001、010、011、100、101があります。
すべての数字を一緒に追加し、キャリーは無視します。
001
010
011
100
+101
----
001
各数値をビット単位でxorすることもでき、これにより同じ結果が得られます。
現在、この現在の構成の合計が001の場合、これは(まだ)勝利ボードではありません。しかし、あなたはそれを勝利ボードにすることができます!1列目、3列目、または5列目から1つのアイテムを取り出すと、合計は0になります。これは勝利ボードです。つまり、ミスをしなければ、次に移動するプレーヤーが負けます。したがって、常に勝利ボードでターンを終了する必要があります。列5から1つの項目を削除するとします。ボードは次のようになります。
* *
* * *
* * * *
* * * * *
1 2 3 4 5
あなたが失敗しない限り、あなたは保証された勝利を持っています。対戦相手があなたを止めるためにできることは何もありません。列5からすべての項目を取得するとします。
*
* *
* * *
* * * *
1 2 3 4 5
次にどこに行きますか?まだ下にスクロールしないで、自分でそれを理解してみてください。
現在、合計は100です。最良の動き(そして勝った動きのみ)は、列4からすべてを取り出すことです。これにより、ボードは次のようになります。
*
* *
* * *
1 2 3 4 5
そして、このような合計
001
010
+011
----
000
つまり、あなたは勝利ボードにいるということです!わーい!
チャレンジ
nimボードが与えられた場合に、勝つ手か、勝つ手がない場合は誤った値を返すプログラムまたは関数を記述する必要があります。
あなたの入力:
言語のネイティブリスト形式になります。リストの各項目は、指定された列の項目数に対応しています。たとえば、入力{4、2、1、0、3}は次のnimボードに対応します。
*
* *
* * *
* * * *
1, 2, 3, 4, 5
(オプション)行の数。(C / C ++のような言語の場合、これはリスト自体からはわかりません。)
あなたの出力:
STDOUTに進むか、関数から戻ることができます
2つの数値でなければなりません。1)削除する列(列には0からインデックスが付けられることに注意してください)と2)その行から削除するアイテムの数です。これは、2項目の配列、2つの数値の文字列などになる可能性があります。答えが2桁を超える可能性があることに注意してください。 「列11から1つのアイテムを削除」または「列1から11のアイテムを削除」を意味します。「1,11」または「11,1」はどちらも使用できます。
答えがない場合は、偽の値を返すか印刷します。言語が1種類の変数(ここでもC / C ++など)しか返せない場合は、列に負の数、または削除する数値に0以下を指定すると、どちらも誤った値になります。
列番号または削除する番号が大きすぎる場合、これは無効な出力と見なされます。
入力/出力の例
[1, 2, 3, 4, 5]---> [0, 1]または[4, 1]または[2, 1]
[1, 3, 5, 6]---> [0, 1]または[1, 1]または[2, 1]
[1, 2, 0, 0, 5] ---> [4, 2]
[1, 2, 3] ---> ERROR
完全なプログラムの代わりに関数を実行することを選択した場合、関数の動作を示す完全なプログラムを作成する必要があります。これはあなたのフルスコアにカウントされません。また、プログラムは妥当な時間内に実行されることが期待されています。極端に大きな入力を入力するつもりはありません。プログラムがゲームツリー全体に対してブルートフォース検索を実行していない限り、問題はありません。
いつものように、これはコードゴルフなので、標準のループホールが適用され、回答はバイト単位でカウントされます。
リーダーボード
これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。
回答が確実に表示されるようにするには、次のMarkdownテンプレートを使用して、見出しから回答を始めてください。
# Language Name, N bytes
N提出物のサイズはどこですか。スコアを向上させる場合は、古いスコアを打ち消すことで見出しに残すことができます。例えば:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=52356;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>