Ubah notasi aljabar menjadi notasi deskriptif

8

Mr Short suka bermain catur. Tuan Short juga orang yang sangat tradisional. Oleh karena itu, Mr Short terganggu oleh tren baru-baru ini menggunakan notasi aljabar dalam catur modern, dan ia lebih suka menggunakan notasi deskriptif , seperti ayahnya dan ayah ayahnya sebelum dia.

Catatan

Untuk menyederhanakan tantangan ini, saya memilih untuk tidak berurusan dengan disambiguasi (seperti, ketika dua potong dapat pindah ke kotak yang sama, atau dapat menangkap potongan yang sama.) Juga tidak ada berurusan dengan en passant, promosi, atau Castling.

Notasi aljabar untuk yang belum tahu

  • Kotak papan diberi nomor mulai a1dari kiri bawah hingga h8kanan atas. Huruf mewakili file (kolom) sedangkan angka mewakili peringkat (baris). Raja putih ditempatkan di awal permainan di alun-alun e1.
  • Langkah terdiri dari bagian yang bergerak + kotak tujuan. Sebagai contoh, seorang raja pindah ke e2akan Ke2.
  • Jika potongan yang dipindahkan adalah Pion, huruf potong dihilangkan. Misalnya, langkah awal Gadai e4ditulis sebagai e4.
  • Jika langkah tersebut merupakan tangkapan, maka xhuruf dimasukkan di antara bagian dan kotak tujuan. Sebagai contoh, seorang Ratu yang menangkap di f7diberi penjelasan sebagai Qxf7.
  • Jika bagian yang menangkap adalah Gadai, karena ia bergerak secara diagonal, notasi mencatat file asal Gadai tersebut. Misalnya, ketika Pion di c4menangkap bagian di d5, langkah tersebut dijelaskan sebagai cxd5.
  • Simbol bagian Kuntuk Raja, Quntuk Ratu, Buntuk Uskup, Nuntuk Ksatria, dan Runtuk Benteng. Pion tidak memiliki simbol.
  • Anotasi lain termasuk +untuk cek, dan #untuk skakmat. Gadai pindah ke f7 dan memberi cek f7+. Perhatikan kekurangan ruang.

Notasi deskriptif untuk yang belum tahu

  • File-file tersebut dijelaskan oleh bagian yang dimulai di atasnya. Misalnya, apa yang akan menjadi efile dalam Aljabar, menjadi file King, atau, singkatnya K,. File-file lain ditandai di sisi mereka, lalu bagian itu. Jadi file hadalah file King's Rook, atau KR.
  • Barisan diberi nomor dari sudut pandang pemain yang bergerak. Apa yang akan menjadi peringkat keempat dalam Aljabar, adalah peringkat keempat untuk kulit putih, tetapi peringkat kelima untuk kulit hitam.
  • Oleh karena itu alun-alun e4adalah K4untuk pemain putih dan K5untuk pemain hitam. Kotak f7adalah KB7untuk pemain putih dan KB2untuk pemain hitam.
  • Sebuah gerakan dijelaskan oleh bagian yang bergerak, kemudian tanda hubung, lalu target persegi. Jadi pion pindah K4adalah P-K4. Seorang Ratu pindah ke KR5adalah Q-KR5.
  • Suatu tangkapan dianotasi oleh bagian yang menangkap, kemudian x, bagian yang ditangkap. Karena itu seorang Uskup yang menangkap seorang Pion adalah BxP. Biasanya Anda perlu menandai Pion mana yang sedang ditangkap, tetapi abaikan saja ini demi kesederhanaan.
  • Simbol bagian Kuntuk Raja, Quntuk Ratu, Buntuk Uskup, Ktuntuk Ksatria (perhatikan simbol yang berbeda), Runtuk Benteng, dan Puntuk Pion.
  • Anotasi lain termasuk chuntuk cek dan mateuntuk skakmat. Gadai pindah ke KB7dan memberi cek P-KB7 ch. Perhatikan ruangnya.

Memasukkan

Sederetan notasi aljabar bergerak, digambarkan oleh spasi. Tidak ada nomor bergerak. Misalnya, pasangan Bodoh seperti ini:

f3 e5 g4 Qh4#

Atau game Teed vs Delmar, dari halaman Wikipedia yang sama:

d4 f5 Bg5 h6 Bf4 g5 Bg3 f4 e3 h5 Bd3 Rh6 Qxh5+ Rxh5 Bg6#

The Immortal permainan .

e4 e5 f4 exf4 Bc4 Qh4+ Kf1 b5 Bxb5 Nf6 Nf3 Qh6 d3 Nh5 Nh4 Qg5 Nf5 c6 g4 Nf6 Rg1 cxb5 h4 Qg6 h5 Qg5 Qf3 Ng8 Bxf4 Qf6 Nc3 Bc5 Nd5 Qxb2 Bd6 Bxg1 e5 Qxa1+ Ke2 Na6 Nxg7+ Kd8 Qf6+ Nxf6 Be7#

Anda dapat berasumsi bahwa input selalu merupakan game yang valid. Semua gerakan berada dalam urutan yang benar, dan tidak ada data asing yang hadir. Tidak ada gerakan yang akan mencakup disambiguasi .

Sebagai contoh, permainan The Evergreen meskipun, jelas, permainan yang valid, tidak akan menjadi masukan karena langkah ke - 19 Rad1,.

Anda juga dapat mengasumsikan bahwa semua daftar langkah input mulai dari posisi awal.

Keluaran

Daftar pemindahan, dengan format yang serupa, dalam notasi deskriptif.

Misalnya, pasangan Bodoh:

P-KB3 P-K4 P-KKt4 Q-KR5 mate

Teed vs Delmar:

P-Q4 P-KB4 B-KKt5 P-KR3 B-KB4 P-KKt4 B-KKt3 P-KB5 P-K3 P-KR4 B-Q3 R-KR3 QxP ch RxQ B-KKt6 mate

The Immortal Game:

P-K4 P-K4 P-KB4 PxP B-QB4 Q-KR5 ch K-KB1 P-QKt4 BxP Kt-KB3 Kt-KB3 Q-KR3 P-Q3 Kt-KR4 Kt-KR4 Q-KKt4 Kt-KB5 P-QB3 P-KKt4 Kt-KB4 R-KKt1 PxB P-KR4 Q-KKt3 P-KR5 Q-KKt4 Q-KB3 Kt-KKt1 BxP Q-KB3 Kt-QB3 B-QB4 Kt-Q5 QxP B-Q6 BxR P-K5 QxR ch K-K2 Kt-QR3 KtxP ch K-Q1 Q-KB6 ch KtxQ B-K7 mate

Ini bukan notasi Deskriptif yang paling sederhana yang mungkin, karena kadang-kadang Anda tidak perlu menentukan ke mana file Knight dipindahkan (seperti dalam, Q-KKt4dapat ditulis sebagai Q-Kt4karena langkah Q-QKt4itu tidak mungkin.) Langkah BxPini ambigu (yang menggadaikan: seharusnya BxQKtP) , tapi Tuan Short tidak terlalu peduli tentang itu.

Anda dapat mempertimbangkan ini kasus uji Anda.

Catatan: Saya menulis ini dengan tangan. Jika Anda menemukan kesalahan mencolok, beri tahu saya.

Aturan dan Penilaian

  • Aturan standar berlaku: program dengan output ke stdout, atau fungsi. Tidak ada apa-apa untuk stderr. Celah standar dilarang.
  • Harap tautkan ke situs tempat kami dapat menguji kode Anda.
  • Golf kode: kode menang pendek.

Kesimpulannya

Ini adalah tantangan pertama saya, jadi saya mungkin membuat beberapa kesalahan noobish. Umpan balik atas pertanyaan (dalam komentar, jelas) sangat dihargai.

asibahi
sumber
3
Jika Anda benar-benar ingin waktu untuk menyelesaikan masalah tantangan Anda dan mendapatkan umpan balik pada saat yang sama tanpa masalah lain, Anda dapat mempostingnya sebagai proposal di kotak pasir .
R. Kap
Tantangan pertama yang hebat
edc65
Saya pikir notasi deskriptif adalah e2-e4 dan Ng1-f3 (untuk e4 dan Nf3 masing-masing dari posisi awal)
ericw31415

Jawaban:

2

Batch, 554 byte

@echo off
for %%r in (a.R b.Kt c.B d.Q e.K f.B g.Kt h.R)do set %%~nr1=%%~xr&set %%~nr8=%%~xr
for %%r in (a b c d e f g h)do set %%r2=.P&set %%r7=.P
set s=
:l
set m=%1
set c=
for %%r in (ch.+ mate.#) do if .%m:~-1%==%%~xr set c= %%~nr&set m=%m:~0,-1%
set p=%m:~0,1%
for %%r in (a b c d e f g h)do if %p%==%%r set p=P
for %%r in (QR.a QKt.b QB.c Q.d K.e KB.f KKt.g KR.h)do if .%m:~-2,1%==%%~xr set d=-%%~nr%m:~-1%
if %m:~-3,1%==x call set d=x%%%m:~-2%:~1%%
set %m:~-2%=.%p:N=Kt%
set s=%s% %p:N=Kt%%d%%c%
shift
if not "%1"=="" goto l
echo%s%

sadalah string output. madalah langkah saat ini (bergerak diambil sebagai parameter baris perintah). cadalah bendera chatau mate. padalah bagian saat ini. Jika tidak ada bagian (yaitu huruf kecil a-h) kemudian Pdiganti. (The Nuntuk Ktsubstitusi dilakukan kemudian untuk menyelamatkan bytes.) Kolom tujuan kemudian mendongak dalam kamus. Namun jika langkah itu benar-benar menangkap maka tujuan menjadi xdiikuti oleh bagian sebelumnya di alun-alun itu. Either way alun-alun tujuan kemudian diatur ke potongan yang baru saja pindah ke sana. Langkah tersebut diakumulasikan hingga tidak ada lagi parameter dan kemudian dicetak.

Variabel a1... h8digunakan untuk menyimpan bagian yang terakhir terlihat. The .prefix ada karena dari cara saya menginisialisasinya barisan belakang; sulit untuk mengulang dua variabel sekaligus dalam Batch kecuali saya diizinkan untuk memulai satu dengan a ..

Neil
sumber