Tantangan
Forsyth – Edwards Notation (FEN) adalah notasi standar untuk menggambarkan posisi papan tertentu dari permainan catur. Tantangan Anda adalah untuk mengevaluasi skor menggunakan string FEN. Ini adalah contoh string FEN:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Dengan menggunakan string ini, Anda dapat menghitung skor materi untuk setiap warna dengan tabel skor berikut:
- p / P = Gadai = 1 poin
- n / N = Ksatria = 3 poin
- b / B = Uskup = 3 poin
- r / R = Benteng = 5 poin
- q / Q = Ratu = 9 poin
- k / K = Raja, ini tidak memiliki poin karena setiap posisi hukum berisi raja untuk setiap sisi
Potongan putih ditunjuk menggunakan huruf besar ("PNBRQK") sementara potongan hitam menggunakan huruf kecil ("pnbrqk"). Kotak kosong dicatat menggunakan angka 1 hingga 8 (jumlah kotak kosong), dan "/" memisahkan peringkat.
Dari contoh string FEN, kita dapat menghitung skor materi untuk setiap sisi:
Untuk hitam:
5 k 2 / ppp 5 / 4P3 / 3R3 p / 6P1 / 1K2N r 2 / PP3P2 / 8
Semua potongan hitam tersisa: p + p + p + p + r, ini adalah total 9
Untuk putih:
5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 2/8
Semua bagian putih yang tersisa: P + R + P + N + P + P + P, ini total 13
Skor akhir ditentukan dengan rumus berikut: Skor putih - Skor hitam = Skor akhir , jadi misalnya skor akhir adalah: 13 - 9 = 4
Contoh :
Memasukkan:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Keluaran:
4
Semua aturan kode-golf berlaku di sini, solusi dengan jumlah byte terkecil yang menang.
Cara memposting
# Language Name, N bytes
[code]
[explaination, etc.]
Jawaban:
CJam,
282726 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
> <> ,
64575653 byte(-7 byte dengan beberapa inspirasi dari jawaban @ El'endiaStarman, -3 byte terima kasih kepada @randomra)
Penjelasan
Program ini menggunakan kotak kode sebagai tabel pencarian. Put / get out of range tidak berfungsi dengan juru bahasa online, jadi ini hanya bekerja dengan juru bahasa Python resmi.
Baris pertama mendorong potongan, diikuti dengan nilai potongan. Ini juga mendorong 0 awal untuk memulai total untuk baris ketiga.
Baris kedua kemudian menempatkan nilai positif atau negatif yang sesuai pada potongan sel yang sesuai, misalnya
-1
ditempatkan di('p', 4)
dan1
ditempatkan('P', 4)
. Panjang tumpukan diperiksa untuk memastikan loop berjalan 5 kali.Setelah loop selesai, stack terdiri dari nol tunggal kami dari baris pertama. Untuk setiap karakter kami melakukan pencarian pada sel yang sesuai dalam tabel dan menambahkannya ke total kami. Secara default, nilai sel tidak diinisialisasi adalah 0, yang sempurna untuk tujuan kami.
Baris terakhir hanya mencetak hasilnya.
sumber
Ruby, 88 karakter
Ini aneh dan jelek, dan mungkin ada cara yang lebih baik, tapi oh well.
{foo: 'bar'}
Sintaks Ruby sebenarnya hanya gula untuk{:foo => 'bar'}
— ini menjengkelkan untuk golf karena itu berarti saya harus mengonversi kunci menjadi simbol sebelum menggunakannya untuk mengakses elemen hash (:"#{x}"
satu karakter lebih pendek darix.to_sym
).sumber
Pip, 39 byte
Saya akan mengambil giliran singkat dalam memimpin sebelum jawaban CJam dan Pyth datang ...
Mengambil string FEN sebagai argumen baris perintah. Berikut penjelasan untuk versi yang sedikit tidak ungolfed:
sumber
Perl, 44 byte
Menghitung shebang sebagai satu, input diambil dari stdin.
Contoh Penggunaan
Penjelasan
Potongan ditransliterasikan dengan nilainya masing-masing. Jika potongan dikapitalisasi (yaitu kurang dari
a
), nilainya ditambahkan ke jumlah, jika tidak dikurangi.sumber
JavaScript ES7, 79 byte
124131Sesingkat yang saya bisa. Menggunakan pemahaman array mewah, untuk mengulang melalui string.
Penjelasan
sumber
Minkolang 0,9 ,
72656460444241 byteCoba di sini.
Terima kasih banyak kepada Sp3000 karena menunjukkan cara yang lebih efisien untuk melakukan ini!
Penjelasan
13359"QRBNP"m
dorongan skor dan karakter yang sesuai mereka, maka interleaves mereka, sehingga terlihat tumpukan seperti ini:[1,80,3,78,3,66,5,82,9,81]
. Kemudian5[d3~c~$r48*+0p0p]
letakkan skor setiap karakter, baik huruf kecil dan besar, di lokasinya dalam ruang kode. Akhirnya,$I[o0q+]N.
loop melalui input sampai kosong, menambahkan skor saat berjalan.sumber
CJam, 33 byte
Inilah cara mencari string yang super naif. Cobalah online .
sumber
Ouroboros , 82
Ouroboros adalah esolang yang saya rancang minggu ini. Saatnya untuk berputar!
Setiap baris perintah single-char 1 mewakili ular ouroboros, di mana eksekusi berlangsung dari kepala (mulai) hingga ekor (ujung) dan loop kembali ke kepala. The
(
dan)
perintah membiarkan Anda makan bagian dari ekor atau memuntahkan itu, sehingga mengubah apa perintah dijalankan. Jika penunjuk instruksi pernah ditelan, ular mati (berhenti mengeksekusi). Program Ouroboros terdiri dari satu atau lebih ular yang dieksekusi secara paralel. Setiap ular memiliki tumpukan sendiri, dan ada juga tumpukan bersama.1 Satu pengecualian, yang membedakan Ouroboros dari banyak bahasa 2D: angka multi-digit dapat ditulis dengan mudah, tanpa harus melakukan matematika atau menekan angka 0 terlebih dahulu.
Ular 1
Ular pertama membaca karakter (
i
) dan memeriksa apakah itu -1 / EOF (.1+!
). Jika demikian, ia memakan sebagian besar ekornya, hingga dan termasukM
(57*(
).Ular kemudian menukar kode karakter dengan penghitungan yang di atasnya pada stack (
\
), memindahkan penghitungan ke stack bersama (m
), dan menelan karakter lain (1(
). Jika sudah menelan banyak, ini berarti menelan(
bahwa IP saat ini hidup dan mati. Jika tidak, eksekusi akan dilanjutkan dengan menggerakkan penghitungan kembali ke tumpukan ular 1, menukar dengan kode char, dan memuntahkan karakter yang sebelumnya ditelan (M\1)
).Kami kemudian menggunakan operasi matematika dan tumpukan untuk menghasilkan skor yang sesuai untuk karakter.
.96>
menguji apakah huruf kecil atau tidak;32*-
konversi selanjutnya ke huruf besar. Kemudian bentangan panjang dari.80=
ke81=9*++++
petaP
->1
,N
->3
, dll. Akhirnya,\2*1\-*
meniadakan skor jika huruf itu huruf kecil, dan+
menambahkannya ke penghitungan berjalan. Ular itu kemudian loop dan membaca karakter lain.Ular 2
Ular kedua dimulai dengan operasi memuntahkan (
)
), yang tidak melakukan apa pun pertama kali melalui (karena belum ada yang ditelan, dan juga sejak muncul tumpukan memberi kosong0
). Selanjutnya, ia mendorong panjang tumpukan bersama ke tumpukannya sendiri dan secara logis meniadakan (L!
). Ini memberi1
jika tumpukan kosong,0
jika tidak. Ular itu bertambah banyak dengan 4 dan memakan banyak karakter (4*(
).Jika tumpukan bersama kosong, ini berarti ular sekarang berakhir sebelum
S
. Ini mendorong4
dan loop kembali ke)
, di mana ia memuntahkan karakter yang baru saja ditelan dan mulai lagi.Namun, jika ada nilai pada tumpukan bersama, tidak ada karakter yang ditelan dan eksekusi berlanjut. Ular beralih ke tumpukan bersama dan menampilkan nomor di sana (
Sn
); kemudian ia menelan karakter terakhirnya dan mati (1(
).Sinkronisasi
Kedua ular harus disinkronkan dengan hati-hati sehingga tidak pernah ada nilai pada tumpukan bersama ketika ular 2 melakukan pemeriksaannya, sampai akhir input tercapai. Snake 1 memberi nilai pada stack yang dibagikan secara singkat pada setiap pass melalui loop-nya. Dengan demikian,
L
perintah snake 2 tidak boleh dieksekusi antara perintahm
danM
di snake 1. Untungnya, ular berbaris dengan sangat baik. Yang terpenting, panjang lingkaran ular 1 (70 instruksi) adalah kelipatan lingkaran ular 2 (7 instruksi), sehingga keduanya tidak akan pernah keluar dari sinkronisasi:Jika angkanya tidak berjalan dengan sempurna, saya akan memberi satu atau dua ular dengan spasi untuk membuatnya sejajar yang diperlukan.
Semua ini sangat baik, tetapi saya ingin melihatnya beraksi!
Berikut adalah program di atas via Stack Snippet. Bahkan pada 1000 operasi per detik, dibutuhkan sekitar 10 detik untuk mengeluarkan jawaban untuk input sampel - tetapi ia sampai di sana!
Tampilkan cuplikan kode
sumber
JavaScript ES6, 71
Sebagai fungsi anonim
sumber
Perl 5,
7163 byteIni memodifikasi
$\
(pemisah baris untukprint
, yang dimulai false) untuk setiap alfanumerik dalam string yang merupakan kunci dari hash yang%a
ditentukan di awal. Itu bertambah$\
dengan nilai hash jika surat itu adalah kunci seperti apa adanya; jika tidak, itu bertambah dengan negatif nilai hash jika huruf besar adalah kunci; selain itu tidak menambah apa-apa.Banyak terima kasih kepada Primo karena telah menyelamatkan saya delapan byte (dalam komentar tentang jawaban ini).
Saya dapat menyimpan byte lain dengan saran lain dari primo (terima kasih!): Ubah
$a{$_}||-$a{uc$_}
ke$a{$_}-$a{$"^$_}
. Tapi itu jawaban yang agak berbeda dari saya, saya pikir, jadi saya tidak akan mengambil "kredit" (dari −1 byte) untuk itu.sumber
Clojure / ClojureScript, 63 karakter
Ditulis menggunakan ClojureScript REPL, juga harus Clojure yang valid. Coba di sini . Masukkan, lalu panggil menggunakan
(*1 "FEN_string_here")
Cukup mudah.
{"P"1..."q"-9}
adalah struktur data literal untuk peta "P" ke 1, "N" ke 3, dll.map
mengambil fungsi sebagai argumen pertama dan struktur data untuk diproses sebagai yang kedua - dalam hal ini, ia menggunakan fitur yang struktur data (peta literal) dapat bertindak sebagai fungsi pengakses sendiri. Parameter string (%
dari fungsi makro) dapat diperlakukan sebagai daftar string karakter individu. Karakter apa pun yang tidak ada di peta akan berakhir sepertinil
dalam daftar yang dihasilkan, yang+
dengan senang hati mengabaikannya.sumber
Pyth, 25 byte
Demonstrasi
Ini menggunakan rumus pemetaan berikut untuk huruf dalam
pbnrq
, jikak
huruf:Ini diwakili dalam Pyth sebagai:
Pertama, program membuat versi input kasus yang ditukar, kemudian pada kedua filter string untuk huruf kecil, kemudian menerapkan rumus di atas, lalu menjumlahkan dan mengurangi nilai hitam dari nilai putih.
sumber
Python 3, 93
sumber