Top nereye gidebilir?


9

Giriş

Oyun Xiangqi da Çinli satranç olarak bilinen, bir satranç gibi Çin, Vietnam, Tayvan ve diğer Doğu Asya ülkelerinde popüler bir oyun olduğunu. Xiangqi'de iki tarafın renkleri kırmızı ve siyahtır. Xiangqi'de yedi parça vardır: general ( G), danışman ( A), fil ( E), at ( H), araba ( R), top ( C) ve asker ( S). Bu zorluğun amaçları için, büyük harfler kırmızı ve küçük harfler siyah olarak kabul edilir. Bu parçaların çoğunun Batı satrancında kaba bir eşdeğeri var, ancak tamamen benzersiz bir parça var: top.

Topu satranç bir kale veya Xiangqi bir arabasına (X ya da Y eksenleri ya ilgili olarak herhangi sayıda hareketli) gibi hareket eder, ancak bu şekilde saldırtılamaz. Bunun yerine, X veya Y eksenleri boyunca (hareket ettiği gibi) herhangi bir rengin (arkadaş veya düşman) bir parçasının üzerine atlayarak ve daha sonra yakaladığı zıt renkli parçaya inerek saldırır . Tüm satranç ve xiangqi taşları gibi topların da kendi renklerini yakalayamayacağını unutmayın.

Örneğin, aşağıdaki şemada, topun ( C) hareket edebileceği boşluklar işaretlenmiştir *ve atlayabileceği ve yakalayabileceği boşluklar X, orada siyah / küçük bir parça olduğu varsayılarak işaretlenmiştir .

....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....

Meydan okuma

Bir xiangqi kartı ve bir topun koordinatlarını girdi olarak verildiğinde, topun hareket edebileceği veya atlayabileceği koordinatların bir listesini veren bir program veya işlev yazın.

Tüm G / Ç formatı esnektir.

Xiangqi kartı için kabul edilebilir biçimler arasında satır satırıyla ayrılmış bir dize, bir dize listesi ya da içinde olmayan başka bir ayırıcı bulunan bir dize bulunur aceghrsACEGHRS.. Tahtanın her zaman bir xiangqi tahtasının boyutu olan 9x10 olacağını varsayabilirsiniz.

Kartın içeriği, tahtadaki .boş noktaları temsil eden bir dizi noktadan ( ) ve parçaları temsil eden karakterlerden oluşacaktır . Parça-karakter eşlemesi aşağıdaki gibidir:

A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier

Büyük harfler kırmızı parçaları, küçük harfler siyah parçaları temsil eder. Burada listelenmeyen karakterler (yani içinde değil aceghrsACEGHRS.) tahtada görünmez.

Giriş koordinatının biçimi esnektir ve çıkış koordinatlarının biçimiyle eşleşmesi gerekmez. İki tamsayı öğesinin bir listesi, 2-demet, herhangi bir ayırıcılı iki sayı veya iki karakter olabilir. Ayrıca 0-indeksli veya 1-indeksli olabilir. Karttaki koordinatın her zaman bir top ( Cveya c) olarak çözüleceğini varsayabilirsiniz .

Topun atlayabileceği ve hareket edebileceği koordinatlar çıktıdaki aynı listede görünmelidir; ikisi arasında ayrım gerekli değildir. Her bir çıkış koordinatı için kabul edilebilir formatlar, giriş koordinatındaki formatlarla aynıdır. Koordinatlar yeni satırla ayrılmış, liste olarak çıktı veya başka herhangi bir gösterim olabilir. Özel bir düzen gerekli değildir; düzenin deterministik olması bile gerekmez.

Topun aynı renkteki (kasa) bir parçasına atlamanın yasal olmadığını ve bu nedenle çıktıda görünemeyeceğini unutmayın.

Test senaryoları

Tüm test vakalarının xiangqi pozisyonları mümkün olmadığını unutmayın.

Input board
Input coordinate (0-indexed)
List of output coordinates

.........
.........
.........
.........
.........
....C....
.........
.........
.........
.........
(4, 5)
[(0, 5), (1, 5), (2, 5), (3, 5), (5, 5), (6, 5), (7, 5), (8, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 6), (4, 7), (4, 8), (4, 9)]

.........
.....G...
.........
.........
.....e...
.........
.........
h..R.c..S
.....a...   
.........
(5, 7)
[(4, 7), (6, 7), (7, 7), (5, 6), (5, 5), (5, 1)]

..s......
..A...e..
.........
EACCcsh.H
..r......
.....S...
......s..  
....C....
..g......
(2, 3)
[(2, 0), (2, 2), (4, 3), (2, 9)]

rheagaehr
.........
.c.....c.
s.s.s.s.s
.........
.........
S.S.S.S.S
.C.....C.
.........
RHEAGAEHR
(7, 7)
[(2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (8, 7), (7, 0), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8)]

puanlama

Bu , böylece en kısa cevap (bayt cinsinden) kazanır. Mutlu golf!


3
Xiangqi için +1. Çinli bir şirkette çalışırken meslektaşlarımdan öğrenme fırsatı bulduğum harika bir oyundur. Genel his, satranç oynamak gibidir (savunma için keskin bir göz atın, ancak agresif bir şekilde oynayın), ancak taktikler farklıdır (savaş arabalarını erken çıkarmak iyidir, oysa kaleleri satrançta erken çıkarmak kötüdür.) En.wikipedia .org / wiki / Xiangqi
Level River St

@LevelRiverSt, satrançtan çok daha az teknik ve farklı bir stratejik hissi olan bir video oyunu gibi geliyor. Bunu sevdim!
noɥʇʎԀʎzɐɹƆ

Kral olmayabilir, ama mümkün olandan daha fazla parça olabilir mi?
l4m2

Yanıtlar:


1

Pip , 112 + 1 = 113 bayt

Girdiyi komut satırı bağımsız değişkenleri olarak alır: iki koordinat, ardından kartın 10 satırı. Koordinatlar 0 tabanlıdır. 67 77Aynı satır listesi ile aynı sütun listesi arasında yeni satır olacak şekilde koordinatları çıktılar . -sBayrak için bir bayt eklendi .

g@>:2P(f:{Ya@bQ'C?X^z;X^AZa@b:'@aR`\.*@\.*`{aR'.s}Ry.`\.*\w *@`s._@>1R`@ *\w\.*`.y_@<v.s@*s}g@ba).ba.(f;J(Zga)b)

Çevrimiçi deneyin!

Biraz soluksuz versiyonun açıklaması

g@>:2
f:{
 Y a@bQ'C ? `[a-z]` `[A-Z]`
 a@b:'@
 aR:`\.*@\.*` {aR'.s}
 aR:y.`\.*\w *@` s._@>1
 aR:`@ *\w\.*`.y _@<v.s
 a@*s
}
P (f g@b a).b
a.(f; J(Zg)@a b)

Pip varsayılan olarak komut satırı argümanlarını listeye okur g. Ayrıca değişkenler içindeki ilk beş argümanı aaracılığıyla saklar e. İlk iki argümanımız ave btopun koordinatları; gtahtaların ardından gelen koordinatları içerir. Sadece tahtayı almak giçin, dizin 2'den itibaren dilimleyip g( g@>:2) öğesine geri atarız .

Şimdi bir fonksiyon tanımladık f. Bu işlev iki argüman alır: tahtanın bir satırını veya sütununu temsil eden bir dize ve o dizgideki topun dizini. Bu argümanlar olarak işlevi içinde mevcuttur ave b. İşlev, topun hareket edebileceği veya yakalayabileceği noktaları temsil eden tüm indekslerin bir listesini döndürür.

İlk olarak, olmadığını test a@bolduğunu Cveya c. Eğer öyleyse C, normal ifadenin [a-z]yakalayabileceği parçalarla eşleşmesini isteyeceğiz . Eğer öyleyse c, normal ifade [A-Z]. (Golf kodu, bu regex'leri küçük ve büyük harfli alfabe için yerleşik değişkenlerden oluşturur.) Değişkene Yuygun regex'i soruyoruz y.

Dize içindeki top karakterini @(aynı satır / sütundaki diğer toplardan ayırmak için) olarak değiştiriyoruz.

Daha sonra, topun bir boşluk karakterine gidebileceği her yeri değiştirecek bir dizi regex değiştirme geliyor. Birinci normal ifade \.*@\.*maçlar @top hareket edebilen boş noktaları temsil eder, her biri süre, herhangi bir sayıda çevrili. Değiştirme işlemi, {aR'.s}tüm dönemleri boşluklara değiştirmek için bir geri arama işlevi kullanır .

Bir sonraki normal ifade, topun yakalayabileceği bir parça ile eşleşir: ya [a-z]ya [A-Z](hangisinin ydaha önce içine sokulduğuna bağlı olarak ) ve ardından \.*\w *@(herhangi bir sayıda nokta, bir harf, herhangi bir sayıda boşluk ve @). Bu, h..R @(topun olması şartıyla C) gibi bir dize ile eşleşir . Geri arama işlevi s._@>1ilk karakteri keser ve boşluk ekler.

Üçüncü regex benzerdir, ancak toptan önce değil, toptan sonra çıkarılabilir bir parça ile eşleşir.

Son olarak, a@*stüm boşlukların endekslerinin bir listesini almak için find-all işlecini kullanarak işlev geri döner .

Şimdi ftopun sırasını ve tekrar topun sütununu çağırıyoruz . Satırın dizesi, dizenin g@biçindeki topun dizini ile gösterilir a. İşlev, her birine satır numarasını eklediğimiz sütun numaralarının bir listesini döndürür b. Liste yazdırıldığında, -sbayrak koordinat çiftleri arasına bir boşluk koyar.

Sütunu almak için Zip operatörünü , bir karakter dizisine dönüştürmek , gdizin seçmek ave Jsonuçtaki karakter listesini yağlamak için kullanırız. Bu dize içindeki topun dizini b. İşlev, her birine sütun numarasının önüne eklediğimiz satır numaralarının bir listesini döndürür a. Programdaki son ifade olan bu liste otomatik yazdırılır.

(Vaka kimse merak, ifade ayırıcı ;zorlamak için orada Jdaha ziyade ikili daha tekli operatör olarak ayrıştırmak için.)

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.