これは負けた広場ですか?


19

チェス盤でプレイされるGet Homeというゲームがあります。このゲームでは、両方のプレイヤーが順番に動かす単一のピースがあります。ピースの移動方法にはいくつかのルールがあります。ターンでは、プレイヤーは正のnに対して次のいずれかの動きをしなければなりません。

  • n個のスペース

  • 左側にn個のスペース

  • n間隔で左上(対角線)

ボードの左上隅にピースを移動したプレイヤーがゲームに勝ちます。

次に、負けた正方形の概念を定義します。で、このビデオ(私はアイデアを得たところから)負け広場は、自分のターンを開始する任意のプレイヤーは自分の対戦相手が勝利を強制できるように行動を起こすことを余儀なくされる上の正方形として定義されます。負けた正方形の最も単純な例は、(1,2)の正方形です。(1,2)のピースは、次のいずれかの場所に移動できます。

図

これらはすべて、次のプレーヤーの勝利への直接の道を持っています。

また、負けたマスへの移動パスが1つあるマスは、そのマスから開始するプレイヤーが勝ちを勝ち取ることができます。これは、負けた正方形から1つ離れていない正方形も負けた正方形であることを意味します。

これにより、負けた正方形のこのかなりきちんとした定義に導かれます。

負けたマスとは、他の負けたマスに移動できないマスであり、(0,0)は負けたマスです。

仕事

任意のサイズのチェス盤上の正方形の座標を考えると、それが負けた正方形かどうかを判断します。2つの値を出力します。1つは正方形を失い、もう1つは他の正方形を失います。

これはため、回答はバイト単位でスコアリングされ、バイト数が少ない方が優れています。

テストケース

これは、通常の8 x 8チェス盤(0でマーク)の負けたマスです。

0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 0
1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1

これは、黒でマークされた正方形を失った100 x 100ボードの画像です(各正方形は2ピクセルx 2ピクセルです)。

100 x 100ボード


2
パターンを見つけるのに十分なテストケースがあるとは思わない。で10, 7負け平方?ありますか10, 8?どう15, 11
DJMcMayhem

1
@WheatWizard画像を少し大きくしてもよろしいですか?
エリックアウトゴルファー

1
@WheatWizard私はより大きなピクセルを意味しました...例えば1x1の代わりに5x5ピクセルあまり難しくない場合はおそらくグリッドも(100x100のおかげで)
Erik the Outgolfer

2
関連(最適な移動を返すか、位置が失われていることを示す信号)。
Zgarb

1
私は...でも、任意の大きな整数機能を妨げるパフォーマンスにポイントの不正確さを浮動できるように、通常のだと思う
ジョナサン・アラン

回答:


8

Pythonの3112の 50 46 42バイト

ジョナサンアランのおかげで-4バイト!

xnorのおかげで-2バイト!

lambda r,c:abs(r-c)*(3+5**.5)//2==max(r,c)

オンラインでお試しください!

Wythoffのゲームのコールドポジションの式に基づいており、明示的な式を生成するためにいくつかの変更を行います。公式を導き出すための適切な方法論を実際に完成させたら、説明を受信します。


1バイトまたは2バイトに変更0<=xx>0て保存できませんでしたか?
ジョナサン

@JonathanFrech positionを含めるには、<=または>=positionを含める必要があります0, 0
notjagan

あなたは正しい、1バイトしか保存できません。
ジョナサンフレッチ

1
同じの異なる実装の一つ少ないバイト:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
ジョナサン・アラン

1
/2//1と同じに見えます//2
XNOR

5

ゼリー、8 バイト

ạ/×ØpḞ⁼Ṃ

オンラインでお試しください!、または左上の60 x 60をグリッドとして表示します。

どうやって?

Wythoffのゲームのコールドポジションは負けポジションです。座標[n,m]は、自然数、n = floor(kφ) = floor(mφ) - mまたは黄金比、または黄金比のとき、または冷たい位置を与えます。前者は、が未満の場合に成立します。後者がより小さい場合(両方ともで保持)。m = floor(kφφ) = ceil(nφ) = n + kkφnmmn0,0

k絶対差ことであるnmし、もしfloor(abs(n-m)φ)=min(n,m)条件が満たされているが。

ạ/×ØpḞ⁼Ṃ - Link: list, c ([n,m])
 /       - reduce c by:
ạ        -   absolute difference = abs(n-m)
   Øp    - golden ratio yield
  ×      - multiply
     Ḟ   - floor
       Ṃ - minimum of c = min(n,m)
      ⁼  - equal?

2

JavaScript(ES6)、64バイト

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&(y/p%p-x*p%++p)**2<1e-9

これは最良の手法ではないことがわかりましたが、このページを読み込んだ直後にインターネットを失ったため、自分で考え出さなければなりませんでした。(これらのインターネットの問題がなければ、しばらく前に投稿したでしょう...)

完璧な世界では、浮動小数点の精度は問題にならず、9バイト節約できます。

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&y/p%p==x*p%++p

JSがPythonの比較チェーンをサポートしている場合、さらに6バイトを節約できます。

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p==x*p%++p<1

0

Pyth、39バイト

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh

これを名前付き関数(ew)で作成しましたが、ゴルフには非常に不精でした。今晩遅くにかなりのバイトをゴルフオフする計画

True / Falseを交互に行うことを意図した、独自に生成されたテストを使用して、オンラインで試してください

説明:

OEIS A005206で繰り返される数値のシーケンスに従って、ソリューションマトリックスの対角線には負けた正方形があります。L通じ;定義するための非常に簡単ポーランド記法ですy(b)=b-y(y(b-1))

説明の残りの部分は次のとおりです

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh    Full program, take stdin as [x, y], output True or False to stdout
=SQ                                        Sort input
   L?!b0-byytb;                            Named lambda as explained above
                    +0.f                   Make sequence of first max(x, y) numbers, starting with 0, 
                        qy y               For which are equal 
                          Z tZ             each element and the previous are equal
                myd                        Map this sequence to the y(index), not just index numbers
             q                             Check if are equal 
              @                  )-F_Q     the x-yth element of sequence (x-y represents which diagonal) 
                                     h(Q)  and the lower of [x,y] (Q is added by the interpreter to fix arity issues

0

バッチ、204バイト

@if %1 lss %2 %0 %2 %1
@if %1==0 exit/b0
@set/au=l=i=0
:g
@set/au+=2+i%%2,l+=1+i%%2
@if %1==%n% if %2==%m% exit/b0
@if %1 leq %n% exit/b1
:l
@set/a"k=3*i^2*i^i,i+=1
@if %k%==0 goto g
@goto l

終了コードを介して戻ります。説明:Batchには整数演算のみがあるため、純粋に算術的な解決策を考案する必要がありました。0,0エントリを除き、負けた二乗座標のペアは次のルールに従います。次の11フリーの2進数が偶数の場合はadd、3,2そうでない場合はadd 2,1です。11フリーの2進数のテストは、3を掛けたときにキャリーがない場合、つまり(i*2)+i==(i*2)^i。以下に、最初のいくつかの11フリーな2進数とその座標を示します。

   0     2,1  + 3,2 =  5,3
   1     5,3  + 2,1 =  7,4
  10     7,4  + 3,2 = 10,6
 100    10,6  + 3,2 = 13,8
 101    13,8  + 2,1 = 15,9
1000    15,9  + 3,2 = 18,11
1001    18,11 + 2,1 = 20,12
1010    20,12 + 3,2 = 23,14

不思議なことに、このルールはシーケンスを補完するのに十分です。その後、より大きな座標に到達するまでシーケンスを計算し続け、その時点で正方形が失われているかどうかを判断できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.