Di mana meriam bisa pergi?

9

pengantar

Permainan xiangqi , juga dikenal sebagai catur Cina, adalah permainan seperti catur yang populer di Cina, Vietnam, Taiwan, dan negara-negara Asia Timur lainnya. Warna kedua sisi di xiangqi merah dan hitam. Ada tujuh bagian dalam xiangqi: jenderal ( G), penasihat ( A), gajah ( E), kuda ( H), kereta ( R), meriam ( C), dan prajurit ( S). Untuk keperluan tantangan ini, potongan huruf besar dianggap merah dan potongan kecil berwarna hitam. Sebagian besar karya-karya ini memiliki padanan kasar dalam catur Barat, tetapi ada satu bagian yang sepenuhnya unik: meriam.

The meriam bergerak seperti benteng dalam catur atau kereta di Xiangqi (bergerak sejumlah ruang di kedua X atau sumbu Y), tetapi tidak dapat menyerang dengan cara ini. Sebaliknya, menyerang dengan melompat sepanjang X atau sumbu Y (dengan cara yang sama bergerak) lebih satu bagian dari setiap warna (teman atau musuh) dan mendarat di bagian yang berlawanan berwarna, yang kemudian menangkap. Perhatikan bahwa seperti semua bidak catur dan xiangqi, meriam tidak dapat menangkap kepingan warna mereka sendiri.

Misalnya, dalam diagram berikut, ruang tempat meriam ( C) dapat ditandai ditandai dengan *, dan ruang yang dapat dilompati dan ditangkap ditandai dengan X, dengan asumsi bahwa ada potongan hitam / huruf kecil di sana.

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

Tantangan

Tulislah sebuah program atau fungsi yang, dengan papan xiangqi dan koordinat meriam di papan itu sebagai input, menampilkan daftar koordinat yang dapat dipindahkan atau dilompati oleh meriam.

Format untuk semua I / O fleksibel.

Format yang dapat diterima untuk papan xiangqi termasuk string yang dipisahkan baris baru, daftar string, atau string dengan pemisah lainnya yang tidak ada aceghrsACEGHRS.. Anda mungkin menganggap papan akan selalu 9x10, ukuran papan xiangqi.

Isi papan itu sendiri akan terdiri dari sejumlah periode ( .), mewakili titik-titik kosong di papan tulis, dan karakter yang mewakili potongan-potongan. Pemetaan piece-to-karakter adalah sebagai berikut:

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

Huruf besar mewakili potongan merah, dan huruf kecil mewakili keping hitam. Karakter yang tidak tercantum di sini (yaitu tidak ada aceghrsACEGHRS.) tidak akan muncul di papan tulis.

Format koordinat input fleksibel, dan tidak diperlukan untuk mencocokkan format koordinat output. Ini bisa berupa daftar dua elemen integer, 2-tuple, dua angka dengan pemisah apa pun, atau dua karakter, misalnya. Ini juga bisa 0-diindeks atau 1-diindeks. Anda dapat mengasumsikan bahwa koordinat di papan akan selalu menyelesaikan meriam ( Catau c).

Koordinat di mana meriam dapat melompat dan bergerak harus muncul dalam daftar yang sama dalam output; perbedaan antara keduanya tidak perlu. Format yang dapat diterima untuk setiap koordinat output individual sama dengan format untuk koordinat input. Koordinat mungkin dipisahkan baris baru, keluaran sebagai daftar, atau representasi lainnya. Tidak diperlukan urutan tertentu; urutannya bahkan tidak harus deterministik.

Perhatikan bahwa melompat ke sepotong dengan warna yang sama (kasus) dari meriam tidak sah, dan dengan demikian tidak dapat muncul dalam output.

Uji kasus

Perhatikan bahwa tidak semua kasus uji adalah posisi xiangqi yang memungkinkan.

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat (dalam byte) menang. Selamat bermain golf!

Tembaga
sumber
3
+1 untuk Xiangqi. Ini adalah permainan yang luar biasa, bahwa saya memiliki kesempatan untuk belajar dari rekan-rekan saya ketika saya bekerja untuk perusahaan Cina. Perasaan umum seperti bermain catur (mengawasi dengan tajam untuk pertahanan tetapi bermain dengan agresif) tetapi taktiknya berbeda (ada baiknya membawa kereta keluar lebih awal, sedangkan membawa rooks keluar di awal catur lebih buruk.) En.wikipedia .org / wiki / Xiangqi
Sungai Level St
@LevelRiverSt jauh lebih teknis daripada catur dan terasa seperti videogame dengan nuansa strategis yang berbeda. Saya suka itu!
noɥʇʎԀʎzɐɹƆ
Tampaknya tidak ada raja, tetapi bisakah ada lebih dari satu bagian yang mungkin?
l4m2

Jawaban:

1

Pip , 112 + 1 = 113 byte

Mengambil input sebagai argumen baris perintah: dua koordinat, diikuti oleh 10 baris papan. Koordinat berbasiskan 0. Output mengkoordinasikan suka 67 77, dengan baris baru antara daftar baris yang sama dan daftar kolom yang sama. Satu byte ditambahkan untuk -sbendera.

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)

Cobalah online!

Penjelasan dari versi yang agak tidak bertali

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)

Secara default, Pip membaca arg-baris perintah ke dalam daftar g. Itu juga menyimpan lima argumen pertama dalam variabel amelalui e. Dua argumen pertama kami, adan b, adalah koordinat meriam; gberisi koordinat yang diikuti oleh baris papan. Untuk mendapatkan hanya papan g, kami mengirisnya dari indeks 2 dan seterusnya dan menetapkan kembali ke g( g@>:2).

Sekarang kita mendefinisikan suatu fungsi f. Fungsi ini mengambil dua argumen: string yang mewakili baris atau kolom papan, dan indeks meriam di string itu. Argumen ini tersedia di dalam fungsi as adan b. Fungsi ini akan mengembalikan daftar semua indeks yang mewakili tempat meriam dapat ditangkap atau ditangkap.

Pertama, kami menguji apakah a@bini Catau c. Jika itu C, kita akan ingin regex [a-z]mencocokkan potongan yang bisa ditangkapnya. Jika itu c, regex adalah [A-Z]. (Kode golf menghasilkan Yregex ini dari variabel bawaan untuk alfabet huruf kecil dan besar.) Kami menggeser regex yang sesuai ke dalam yvariabel.

Kami mengubah karakter meriam di string ke @(untuk membedakannya dari meriam lain di baris / kolom yang sama).

Berikutnya datang serangkaian penggantian regex, yang akan mengubah setiap tempat meriam dapat pergi ke karakter luar angkasa. Regex pertama \.*@\.*pertandingan @dikelilingi oleh sejumlah periode, yang semuanya merupakan tempat kosong yang meriam bisa bergerak. Penggantian menggunakan fungsi panggilan balik {aR'.s}untuk mengubah semua periode menjadi spasi.

Regex berikutnya cocok dengan potongan yang dapat ditangkap oleh meriam: salah satu [a-z]atau [A-Z](tergantung pada yang diseret ke mana ysebelumnya) diikuti oleh \.*\w *@(sejumlah periode, satu huruf, sejumlah ruang, dan @). Ini akan cocok dengan string seperti h..R @(asalkan meriam itu C). Fungsi panggilan balik s._@>1mengiris karakter pertama dan menambahkan spasi.

Regex ketiga serupa, tetapi cocok dengan sepotong yang bisa ditangkap setelah meriam daripada sebelumnya.

Akhirnya, fungsi kembali a@*s, menggunakan operator find-all untuk mendapatkan daftar indeks semua ruang.

Kita sekarang memanggil fbarisan meriam dan lagi pada kolom meriam. String barisnya adalah g@b, dengan indeks meriam di dalam string itu a. Fungsi mengembalikan daftar nomor kolom, yang masing-masing kita tambahkan nomor baris b. Ketika daftar dicetak, -sbendera memberi spasi di antara pasangan koordinat.

Untuk mendapatkan kolom, kami menggunakan Zoperator ip untuk mengubah posisi g, memilih indeks a, dan Jmemasukkan daftar karakter yang dihasilkan ke dalam string. Indeks meriam dalam string ini adalah b. Fungsi mengembalikan daftar nomor baris, yang masing-masing kita tambahkan nomor kolom a. Daftar ini, yang merupakan ekspresi terakhir dalam program, dicetak secara otomatis.

(Kalau-kalau ada yang bertanya-tanya, pemisah ekspresi ;ada untuk memaksa Juntuk mengurai sebagai operator unary daripada biner.)

DLosc
sumber