Ruby、Rev B 121バイト
提出は無名関数からを引いたものf=です。使用方法を説明するためにテストプログラムに示されています。
f=->n{["~mK)\7","}uYwQO"][l=n%2].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m/2*257>>j&255==126-t&&t+j%2!=119&&l=m}}}
l}
puts g=f[gets.to_i]
puts
[7,6,5,
8,0,4,
1,2,3].each{|i|print g>>i&1; puts if i/3==1}
中央の正方形を最上位ビットではなく最下位ビットにすることで節約された2バイト(の/2代わりに削除されます%256。)許容可能な移動のテーブルの再編成による残りの節約。Xの総数ではなく、中央の正方形の空き/占有として整理すると、より簡単なテストが可能になります。また、配列には2つの文字列しかないため、%w{string1 string2}構文は破棄され、構文が優先され["string1","string2"]ます。これにより、印刷不可能な文字\7を含めることができます。これにより、の126-t代わりに、より単純なエンコーディングを使用できます(36-t)%120。
Ruby、Rev A 143バイト
->n{l=r=("%b"%n).sum%8
%w{$ %5 - I+Wy Q S#}[r].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m%256*257>>j&255==(t-36)%120&&t+j%2!=43&&l=m}}}
l}
これは無名関数です。入力/出力フォーマットは開いたままにしていたので、9ビットの2進数を使いました。512のビットは中心を表し、残りのビットはその周りをらせん状にしています(1のビットはコーナーと見なされます)。
許容可能な出力よりもはるかに多くの可能な入力があるため、アルゴリズムはすべての動きを試み、許容可能な出力パターンに適合するものを見つけることです。Xの数ごとに許容される出力パターンはハードコーディングされています。
中央の正方形に関する情報は取り除かれ、残りの8ビットはそれらを複製するために257で乗算されます。このパターンは、右シフトによって許容可能なパターンを超えて回転されます。
パターンが検出されてもループは終了しないため、返されるパターンは最後に検出された許容可能なパターンになります。このため、好ましいパターン(好みがある場合)はリストの後半にあります。
「騎士の動き」戦略を考えると、パターンが45度回転するかどうかはあまり重要ではありません。非ゴルフバージョンは騎士の移動戦略に従うため、コーナースクエアとエッジスクエアを区別する必要はありません。
ただし、次のトリックがあるため、これが常に最良の戦略であるとは限りません。あなたの対戦相手が最初に行き、センターを取るなら、彼は勝つべきです。しかし、彼の2番目の手で、彼は2x2の正方形を作ることができるという間違いを犯します。これにより、彼は3つ続けて作るように強制することができます。これはゴルフバージョンで実装されます。この1つのインスタンスでは、コーナーにある3つのX(敵を強制的に失う)と1つのエッジに沿った3つのX(即時自殺)を区別するために、少し余分なコードが必要です。
テストプログラムに含まれていない
非ゴルフバージョンは、質問で表現されたロジックに従います。
ゴルフバージョンでは[[0],[1,17],[9],[37,7,51,85],[45],[47,119]]、ケースに対してわずかに異なる動作を実装するようにテーブルがわずかに変更されていますr=3。次に、印刷可能なASCIIに圧縮されます(デコードが必要です(t-36)%120)。テーブルエントリ7の場合、コーナーの3つのXとエッジに沿った3つのXを区別するには、追加のロジックビットが必要です。&&t+j%2!=43
f=->n{l=r=("%b"%n).sum%8 #convert input to text, take character checksum to count 1's(ASCII 49.)
#0 is ASCII 48, so %8 removes unwanted checksum bloat of 48 per char.
#l must be initialised here for scoping reasons.
[[0],[1,17],[9],[11,13,37,51,85],[45],[47,119]][r].each{|t| #according to r, find the list of acceptable perimeter bitmaps, and search for a solution.
9.times{|i|(m=n|1<<i)==n|| #OR 1<<i with input. if result == n, existing X overwritten, no good.
#ELSE new X is in vacant square, good. So..
8.times{|j|m%256*257>>j&255==t&&l=m}} #%256 to strip off middle square. *257 to duplicate bitmap.
#rightshift, see if pattern matches t. If so, write to l
}
l} #return l (the last acceptable solution found) as the answer.
#call function and pretty print output (not part of submission)
puts g=f[gets.to_i]
puts
[6,7,0,
5,8,1,
4,3,2].each{|i|print g>>i&1; puts if i<3}
テストプログラムの出力
これは、コンピュータが自分自身を再生するときに起こります。
C:\ Users \ steve> ruby tictac.rb
0
256
000
010
000
C:\ Users \ steve> ruby tictac.rb
256
384
010
010
000
C:\ Users \ steve> ruby tictac.rb
384
400
010
010
100
C:\ Users \ steve> ruby tictac.rb
400
404
010
010
101
C:\ Users \ steve> ruby tictac.rb
404
436
010
110
101
C:\ Users \ steve> ruby tictac.rb
436
444
010
110
111
ゲーム分析が最初に
これは実際には非常に単純で線形です。
最初にプレイするときは、真ん中の正方形が常に最初に占める正方形になります。
r = 0
... binary representation 0
.X.
...
r = 2
X.. binary representation 1001=9
.XX
...
r = 4
X.. binary representation 101101=45
.XX
XX.
ゲームが終わっていない状態で、ボード上の中央の正方形を含む5つのXを使用する方法は(対称性まで)1つだけです。中央の正方形にXがあり、各対角線に1つ(互いに90度)と、水平/垂直の各中心線に1つ(互いに90度)です。エッジ全体を占めることができないため、上記の唯一のものです。可能な配置。他のプレーヤーは次の手で負けなければなりません。
ゲーム分析プレイングセカンド
他のプレイヤーが真ん中のマスを選んだかどうかによって、プレーはかなり異なります。
r = 1
真ん中の正方形
.X. X.. binary representation 1
.X. .X.
... ...
ミドルスクエア無料
X.. .X. binary representation 10001=17
... ...
..X .X.
r = 3
真ん中の四角が占有、他のプレイヤーが最後のXに隣接してプレイする場合以下のように、騎士の移動をプレイすることが、ゴルフされていないバージョンでサポートされています
XX. .XX binary representation 1011=11
.X. XX. or mirror image 1101=13
X.. ...
ただし、上記は最善の動きではなく、ゴルフバージョンではサポートされていません。最善の動きは次のとおりであり、次のターンで勝利を強制します。
XX. binary representation 111=7. XXX
XX. Only to be used where j is odd. .X.
... Even j would look like image to right. ...
他のプレイヤーが最後のXに対して90度または135度でプレイする場合、真ん中の正方形が占有されます(ナイトの移動でプレイします)。
X.X .X. binary representation 100101=37
.X. .XX
.X. X..
ミドルスクエアフリー
X.X .X. XX. binary representations:
... X.X ... 1010101=85 (first two)
X.X .X. .XX and 110011=51 (last one)
r = 5
中央の正方形が占有されています。上記のr = 4で述べた理由により、4つの可能な手がありますが、すべて負けです。101111 = 47の1つのみがサポートされています。
中央の広場は無料です。次のように、対称性に達する可能性のあるボードは1つだけです。他のプレイヤーは次の手で負けなければならないので、r> 5をサポートする必要はありません。
XX. binary representation 1110111=119
X.X
.XX