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 ( C
atau 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 kode-golf , jadi jawaban tersingkat (dalam byte) menang. Selamat bermain golf!
sumber
Jawaban:
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-s
bendera.Cobalah online!
Penjelasan dari versi yang agak tidak bertali
Secara default, Pip membaca arg-baris perintah ke dalam daftar
g
. Itu juga menyimpan lima argumen pertama dalam variabela
melaluie
. Dua argumen pertama kami,a
danb
, adalah koordinat meriam;g
berisi koordinat yang diikuti oleh baris papan. Untuk mendapatkan hanya papang
, kami mengirisnya dari indeks 2 dan seterusnya dan menetapkan kembali keg
(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 asa
danb
. Fungsi ini akan mengembalikan daftar semua indeks yang mewakili tempat meriam dapat ditangkap atau ditangkap.Pertama, kami menguji apakah
a@b
iniC
atauc
. Jika ituC
, kita akan ingin regex[a-z]
mencocokkan potongan yang bisa ditangkapnya. Jika ituc
, regex adalah[A-Z]
. (Kode golf menghasilkanY
regex ini dari variabel bawaan untuk alfabet huruf kecil dan besar.) Kami menggeser regex yang sesuai ke dalamy
variabel.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 manay
sebelumnya) diikuti oleh\.*\w *@
(sejumlah periode, satu huruf, sejumlah ruang, dan@
). Ini akan cocok dengan string sepertih..R @
(asalkan meriam ituC
). Fungsi panggilan baliks._@>1
mengiris 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
f
barisan meriam dan lagi pada kolom meriam. String barisnya adalahg@b
, dengan indeks meriam di dalam string itua
. Fungsi mengembalikan daftar nomor kolom, yang masing-masing kita tambahkan nomor barisb
. Ketika daftar dicetak,-s
bendera memberi spasi di antara pasangan koordinat.Untuk mendapatkan kolom, kami menggunakan
Z
operator ip untuk mengubah posisig
, memilih indeksa
, danJ
memasukkan daftar karakter yang dihasilkan ke dalam string. Indeks meriam dalam string ini adalahb
. Fungsi mengembalikan daftar nomor baris, yang masing-masing kita tambahkan nomor koloma
. Daftar ini, yang merupakan ekspresi terakhir dalam program, dicetak secara otomatis.(Kalau-kalau ada yang bertanya-tanya, pemisah ekspresi
;
ada untuk memaksaJ
untuk mengurai sebagai operator unary daripada biner.)sumber