騎士の動きに取り組む


16

六角形のチェスは、セルが従来の正方形ではなく六角形であるボードでプレイされるチェスのバリエーションのファミリーを表します。そのようなバリアントは多数あります。この課題では、最も一般的なGlińskiのバリアントに焦点を当てます。

ボードは3色で構成され(同じ色が端を共有しないように)、六角形の端がプレイヤーに面しています。ボードは、文字でマークされた11個のファイルが、持っていal(文字がj(ファイルで60°を曲げ使用されていない)、および11のランクf)。ランク1を介して6各11個の細胞を含む、ランクが79つのセルを有し、ランクは87を有している、というように。ランク11には1つのセルf11のみが含まれます。(それが役立つ場合は、各ランクを非常に幅の広い「V」字型にすると考えてください。)

これは、中央のセルに騎士がいるボードの例です。ドットでマークされたセルは、この特定のナイトの合法的な動きです。騎士は「通常の」チェスと同様の方法で2ダウン1オーバーで動きます。六角形のチェスの用語では、それは(エッジを横切る)直交方向の動きであり、次に同じ方向(同じ色に最も近い動き)の斜め方向の動きです。例えば、ナイトが下にある場合、ライトブラウンまでの「上」への直交移動は、最も近いライトブラウンへの「上」と「上」または「左」の斜めの動きを伴います。

グリスキの変種騎士

https://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svgを介してパブリックドメインから

この騎士はf6に位置しているため、法的な動きは

c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5

入力

ナイトの開始セルを提供する単一の入力。これは、1つの文字列としてすることができ"b6"2つの文字列として、"b", "6"など、任意の便利な形式で。入力文字は大文字でも小文字でも構いません。

出力

その場所の騎士が行うことができる有効な動きのリスト。これは、文字列の配列、明確で一貫した区切り文字を持つ単一の文字列、改行で区切られた文字列など、最も便利なものであれば何でもかまいません。出力は必ずしもソート順である必要はなく、大文字または小文字のいずれでもかまいません(任意)。

ルール

  • ボード上に他のピースが存在しないか、動きに干渉しないと仮定します。私たちは騎士だけに焦点を合わせています。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人がコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

b6
a3, c4, d5, d9, e7, e8

f6
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5

f11
d8, e8, g8, h8

i1
f2, f3, g4, h4, l2, k3

12
この座標系は悪魔の働きです。
マーティンエンダー

2
@MartinEnderポイントヘキサゴニーでそれを行う場合:)
アウトゴルファーのエリック

2つの軸を水平および60度の対角線に再定義して、これを別のベクトル空間に変換し、通常の動きを使用してから線形代数を使用して元に戻すことができるように感じますが、それは複雑すぎます:P座標系は、このサイトで私がここで見た中で最も邪悪なものであることに同意します。:P
HyperNeutrino

回答:


11

JavaScript(ES6)、184バイト

ファイルを取る Fを文字として、ランクRをカリー化構文の整数として使用します(F)(R)。文字列の配列を返します。

F=>R=>[...'100124566542'].map((X,i)=>(X-=3-(x=(s='abcdefghikl').search(F)))-7<(Y=('9641001469'[i]||10)-(A=Math.abs)(x-5)+17-2*R)&X+Y>3&X+16>Y&X+Y<27&&s[X]+(22-Y-A(X-5))/2).filter(n=>n)

どうやって?

ステップ#1:ファイル/ランクをデカルト座標に変換する

我々は、デカルト座標に六角形のチェス座標変換(X、Y)X[0 ... 10]及びY[0 ... 20]

      00 01 02 03 04 05 06 07 08 09 10
   +----------------------------------
00 |                f11                     F = file (letter)
01 |             e10   g10                  R = rank in [1 .. 11]
02 |          d09   f10   h09               
03 |       c08   e09   g09   i08            F | a b c d e f g h i k l
04 |    b07   d08   f09   h08   k07         --+-----------------------
05 | a06   c07   e08   g08   i07   l06      x | 0 1 2 3 4 5 6 7 8 9 10
06 |    b06   d07   f08   h07   k06         
07 | a05   c06   e07   g07   i06   l05      y = 22 - |x - 5| - 2R
08 |    b05   d06   f07   h06   k05   
09 | a04   c05   e06   g06   i05   l04
10 |    b04   d05   f06   h05   k04   
11 | a03   c04   e05   g05   i04   l03
12 |    b03   d04   f05   h04   k03   
13 | a02   c03   e04   g04   i03   l02
14 |    b02   d03   f04   h03   k02   
15 | a01   c02   e03   g03   i02   l01
16 |    b01   d02   f03   h02   k01   
17 |       c01   e02   g02   i01      
18 |          d01   f02   h01         
19 |             e01   g01            
20 |                f01               

ステップ#2:移動ベクトルを適用する

以下は、デカルトシステムでの移動ベクトルのリストです。

(-2, +4), (-1, -5), (+3, +1),
(-3, +1), (+1, -5), (+2, +4),
(-3, -1), (+2, -4), (+1, +5),
(-2, -4), (+3, -1), (-1, +5)

それらのそれぞれをソース座標(x、y)に適用し、ターゲット座標(X、Y)のリストを取得します

ステップ#3:ターゲット座標をテストする

次に、実際にボード内にあるターゲット座標を確認する必要があります。これは、X + YおよびX-Yをテストすることにより行われます。

X / Y

以下のすべての比較が当てはまる場合、座標は有効です。

  • X + Y> 3
  • X + Y <27
  • X-Y <7
  • X-Y> -17

X[0 .. 10]にあることも確認する必要があります定義されていない場合s[X]未定義であるため、これは明示的に行われず、最終的には偽の値がフィルタリングされます。

ステップ#4:六角形のチェス座標に戻す

最後に、有効なターゲット座標は、ステップ#1で説明した式の逆を使用して、六角形のチェス座標に変換されます。

テストケース


ああ、それは六角形の座標系を回避する本当に賢い方法です。いいね!
-AdmBorkBork

4

バッチ。403バイト

@echo off
set j=a b c d e f g h i k l
set f=0
for %%f in (%j%)do set/af+=1&if %%f==%1 goto l
:l
set j=j%j: =%
set/a"r=6-f,r*=r>>31,r+=%2
for %%s in ("-3 -2" "-3 -1" "-2 1" "2 -1" "3 1" "3 2")do call:c %%~s
exit/b
:c
call:l %2 %1
:l
set/ag=f+%1,s=r+%2,t=g-s
if %g% geq 1 if %g% leq 11 if %s% geq 1 if %s% leq 11 if %t% geq -5 if %t% leq 5 set/a"t=6-g,s-=t*=t>>31"&call echo %%j:~%g%,1%%%%s%%

@Arnauldの答えとは異なる方法ですが、座標系を調整します。cサブルーチンは、各移動の鏡面反射を試みることによって対称性を利用しています。(回転も試みましたが、バイト数が多すぎました。)


3

JavaScript(ES6)、184バイト

(s,t,j=' abcdefghikl',f=j.search(s),r=f<6?t:t+f-6)=>[...'120405..162645'].map((c,i)=>[(i>>1)-3+f,c-3+r]).filter(([f,r])=>f>0&f<12&r>0&r<12&f-r<6&r-f<6).map(([f,r])=>j[f]+(f<6?r:r+6-f))

私はそれがあることを期待していなかった...私はそれは比較方法を確認するためにES6にポートに私のバッチソリューションをしようと思いましたその近くに...


3

CJam、77

1Z2W2Z]_Wf*+2/_Wf%+[r('a-_9>-_6-We>@~+]f.+{_~m5++B,-!},{~1$6-We>-\_8>+'a+\S}/

オンラインで試す

概要:

私は左側にa..fと1..6のような座標系を使用しており、曲げずに拡張し、文字を数字に置き換え、0ベースに変更しました(b3→[1 2]、g1 →[6 1]、k3→[9 6])。このシステムでの相対的な動きは[1 3]、[2 -1]、[2 3]およびそれらの反射(負とスワップ、例えば[1 3]→[-1 -3]、[3 1]、[- 3 -1])。結果の[xy]位置は、[xyz]⊂[0 1 .. 10]の場合に有効です。ここで、z = x-y + 5です。


面白い。それでは、入力をその座標系に変換し、計算を実行してから、逆に変換しますか?きちんとした。
AdmBorkBork

@AdmBorkBorkええ、ええ
aditsu

1

Dyalog APL、72バイト

(6=|×/t,-/t←↑j[a⍳⊂⍞]-j←⊃,/i,¨¨↓∘i¨i-6)/a←⊃,/(11⍴⎕a~'J'),∘⍕¨¨⍳¨5+i⌊⌽i←⍳11

試してみる

aすべての有効なセルのリストを作成します。'A1' 'A2' ... 'L6'

a 入力と出力の両方に使用されます

x軸がyに沿ったシステムでj、対応する座標のリストを作成しますaA6-L1F1-F11

想像上の3番目の座標は最初の2つの差です

入力セルが座標0 0 0に変換される場合、ナイトは座標の積が6または-6であるセルに移動できます


0

Python 3.6、149

H='abcdefghikl'
lambda f,r:[H[i]+str(j)for i,j in[(H.find(f)+p%4*s,int(r)+p//4)for p in[9,6,-1,-5,-11,-10]for s in(1,-1)]if 0<i<11if 0<j<12-abs(6-i)]

ファイルとランクの2つの文字列で呼び出される匿名関数。文字列のリストを返します。

ゴルフをしていない:

def h(f,r):
    H='abcdefghikl'

    A = []
    for p in[9,6,-1,-5,-11,-10]:
        for s in(1,-1):
            i = H.find(f) + p%4*s
            j = int(r) + p//4
            A.append(i, j)

    B = []
    for i,j in A:
        if 0 < i < 11 and 0 < j < 12 - abs(6 - i):
            B.append(H[i] + str(j))

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