Knight hareketlerim üzerinde çalışmak


16

Altıgen satranç , hücrelerin geleneksel kareler yerine altıgenler olduğu bir tahtada oynanan satranç çeşitleri ailesini tanımlar. Böyle birçok varyant vardır; bu meydan okumada Gliński'nin en yaygın olan varyantına odaklanacağız.

Tahta üç renkten oluşur (böylece aynı renk bir kenarı paylaşmaz), altıgenlerin kenarları oyunculara bakacak şekilde. Tahta harflerle işaretlenmiş 11 dosya daha vardır aaracılığıyla l(harf jkullanılmaz) ve (dosyasına ° 60 eğmek 11 sıralarında f). Sıralamalar 1boyunca 6her 11 hücre içeren, seviye 79 hücreleri vardır, seviye 87 vardır ve böyle devam eder. Sıralama 11tam olarak bir hücre içerir: f11 . (Eğer yardımcı olursa, her bir sıralamayı çok geniş bir "V" şekli yapmak olarak düşünün.)

İşte şövalye orta hücrede olan tahta örnek bir resmi. Nokta ile işaretlenmiş hücreler bu şövalyenin yasal hareketleridir. Şövalye, "normal" satranca benzer şekilde hareket ediyor, iki aşağı ve bir kez. Altıgen satranç terimleriyle, dik bir hareket (bir kenar boyunca), daha sonra aynı yönde bir çapraz hareket (aynı renge en yakın hareket). Örneğin aşağıdaki şövalyede, açık kahverengiye "yukarı" dikey bir harekete, en yakın açık kahverengiye "yukarı ve sağa" veya "yukarı ve sola" çapraz bir hareket eşlik eder.

Gliński'nin varyant şövalyesi

Kamusal alandan https://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svg

Bu şövalye f6'ya yerleştirildi ve yasal hamleler

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

Giriş

Şövalyemizin başlangıç ​​hücresini veren tek bir giriş. Bu, herhangi bir uygun biçimde tek bir dize "b6", iki dize "b", "6", vb. Olabilir . Giriş harfleri büyük veya küçük harf olabilir.

Çıktı

O şövalyenin bir şövalyenin yapabileceği geçerli hareketlerin bir listesi. Bu, bir dizi dizisi, açık ve tutarlı bir sınırlayıcıya sahip tek bir dize, dizeleri yeni satırlara göre ayırabilir, vb. Çıktının sıralı sıraya sahip olması gerekmez ve seçiminiz büyük veya küçük harf olabilir.

kurallar

  • Tahtada başka hiçbir parçanın olmadığını veya hareketlere müdahale etmediğini varsayın. Sadece şövalyeye odaklanıyoruz.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Mümkünse, diğer kişilerin kodunuzu deneyebilmesi için lütfen bir çevrimiçi test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Örnekler

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
Bu koordinat sistemi şeytanın işidir.
Martin Ender

2
@MartinEnder Eğer Hexagony içinde yaparsanız Puanlar :)
Outgolfer Erik

İki ekseni yatay ve 60 derece diyagonal olarak yeniden tanımlayarak bunu başka bir vektör alanına dönüştürebileceğimi hissediyorum ve sonra sadece düzenli hareketler kullanın ve sonra doğrusal cebir kullanarak geri çevirin, ama bence bu çok karmaşık şeyler: P Ve ayrıca Koordinat sisteminin, bu sitede gördüğüm en kötü şey olduğunu kabul ediyorum. : P
HyperNeutrino

Yanıtlar:


11

JavaScript (ES6), 184 bayt

Dosyayı Fbir karakter Rolarak alırken, sözdizimini körüklemede bir tamsayı olarak alır (F)(R). Bir dizgi dizisi döndürü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)

Nasıl?

Adım # 1: Dosya / Sırayı Kartezyen Koordinatlara Dönüştürün

Biz Kartezyen koordinatlarında altıgen satranç koordinatları dönüştürmek (x, y) ile x içinde [0 .. 10] ve y de [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.Adım: Hareket vektörlerini uygulayın

Kartezyen sistemdeki hareket vektörlerinin listesi aşağıdadır:

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

Her birini kaynak koordinatlarına (x, y) uyguluyoruz ve hedef koordinatların (X, Y) bir listesini alıyoruz .

3.Adım: Hedef koordinatları test edin

Şimdi, hangi hedef koordinatların aslında pano içinde bulunduğunu kontrol etmemiz gerekiyor. Bu, X + Y ve X - Y test edilerek yapılır :

X / Y

Aşağıdaki karşılaştırmaların tümü doğruysa koordinatlar geçerlidir:

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

Biz de doğrulamalısınız X'in olduğunu [0 .. 10] . Bu açıkça yapılmaz s[X], çünkü eğer tanımlanmamışsa , sonuçta filtrelenen bir falsy değeri ile sonuçlanır.

4.Adım: Altıgen satranç koordinatlarına geri dönün

Son olarak, geçerli hedef koordinatlar, 1. adımda açıklanan formüllerin tersi kullanılarak, altıgen satranç koordinatlarına dönüştürülür.

Test senaryoları


Ah, bu altıgen koordinat sistemini aşmanın gerçekten akıllıca bir yolu. Güzel!
AdmBorkBork

4

Toplu. 403 bayt

@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'un cevabından farklı bir şekilde olmasına rağmen koordinat sistemini ayarlar. cAltyordamı her hamlenin ayna yansıması deneyerek simetri yararlanır. (Ben de döndürmeyi denedim ama bu çok fazla bayt aldı.)


3

JavaScript (ES6), 184 bayt

(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))

Nasıl karşılaştırıldığını görmek için Toplu çözümümü ES6'ya taşıyacağımı düşündüm ... Bu kadar yakın olmasını beklemiyordum ...


3

CJam, 77

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

Çevrimiçi deneyin

Genel bakış:

Sol tarafta a..f ve 1..6 gibi görünen, eğilmeden uzatılmış, harflerle sayılarla değiştirilmiş ve 0 tabanlı (b3 → [1 2], g1 olarak değiştirilmiş) bir koordinat sistemi kullanıyorum → [6 1], k3 → [9 6]). Bu sistemdeki bağıl hareketler [1], [2 -1], [2] ve yansımalarıdır (negatif ve yer değiştirmişlerdir, örneğin [1 3] → [-1 -3], [3 1], [- 3 -1]). Ortaya çıkan bir [xy] pozisyonu, z = x-y + 5 olduğunda geçerlidir.


İlginç. Yani girdiyi bu koordinat sistemine çevirirsiniz, hesaplamaları yaparsınız ve sonra geri çevirir misiniz? Temiz.
AdmBorkBork

@AdmBorkBork hemen hemen, evet
aditsu çıkın çünkü SE EVIL

1

Dyalog APL, 72 bayt

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

Deneyin

atüm geçerli hücrelerin bir listesini oluşturur :'A1' 'A2' ... 'L6'

a hem giriş hem de çıkış için kullanılır

x ekseninin ve y boyunca olduğu bir sistemde jkarşılık gelen koordinatların bir listesini oluştururaA6-L1F1-F11

hayali bir üçüncü koordinat ilk ikisinin farkıdır

eğer giriş hücresi kordlara çevrilirse 0 0 0, bir şövalye, kordları 6 veya -6 olan hücrelere hareket edebilir


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)]

Dosya ve sıralama için iki dizeyle çağrılan anonim bir işlev; bir dize listesi döndürür.

Ungolfed:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.