Latar Belakang
Alice dan Bob menciptakan bahasa golf untuk memenangkan setiap tantangan PPCG. Alice ingin membuat bahasa dua dimensi, seperti> <>, tetapi Bob lebih memilih sintaks awalan-infiks seperti pada J. Sebagai kompromi, mereka memutuskan untuk membuat bahasa awalan-infiks dua dimensi. Pengurai adalah rasa sakit untuk menulis, dan mereka membutuhkan bantuan Anda!
Spesifikasi sintaks
Dalam bahasa Alice dan Bob, ada variabel , yang diwakili oleh huruf ASCII huruf kecil a-z
, dan fungsi , yang diwakili oleh huruf ASCII huruf besar A-Z
. Suatu fungsi dapat dipanggil dengan satu atau dua argumen. Suatu program adalah kotak persegi panjang dari huruf a-zA-Z
dan spasi, dan sudut kiri atas tidak boleh mengandung spasi. Ini adalah contoh dari program yang valid:
F Gy
H
R x
Ketika program diurai, itu diubah menjadi ekspresi bahasa gaya-C (C, Java, Python ...) yang berisi variabel huruf tunggal dan panggilan fungsi dalam format <func>(<arg>)
atau <func>(<arg1>,<arg2>)
. Misalnya, program di atas menghasilkan ekspresi ini:
F(H(R(x)),G(x,y))
Rincian proses penguraian adalah sebagai berikut:
- Spasi hanyalah pengisi, sehingga tidak diurai.
- Setiap variabel
a-z
selalu diurai seperti itu sendiri. - Setiap fungsi
A-Z
diuraikan sebagai panggilan fungsi. Argumennya adalah ekspresi terdekat di bawahnya dan ke kanan di grid, dalam urutan ini. Jika hanya satu yang hadir, itu diberikan sebagai satu-satunya argumen. Anda dapat mengasumsikan bahwa semua fungsi memiliki setidaknya satu argumen di kisi.
Dalam contoh di atas, variabel x
dan y
diuraikan sebagai diri mereka sendiri. Fungsi R
tidak memiliki apa pun di bawahnya dan di x
sebelah kanannya, sehingga diuraikan sebagai doa satu argumen R(x)
. Demikian pula, H
diuraikan sebagai H(R(x))
, karena memiliki R
di bawahnya. Fungsi G
memiliki x
di bawahnya dan di y
sebelah kanannya, sehingga diuraikan sebagai G(x,y)
, dan demikian pula untuk F
. Ekspresi yang diuraikan di sudut kiri atas adalah hasil dari proses penguraian.
Masukan dan keluaran
Input Anda adalah array karakter persegi panjang yang tidak kosong. Ini akan selalu menjadi program yang valid dalam bahasa Alice dan Bob, tetapi mungkin berisi ekspresi yang tidak digunakan dalam output. Output Anda akan menjadi ekspresi parsing yang dihasilkan dari proses di atas.
Aturan dan penilaian
Anda dapat menulis program lengkap suatu fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji kasus
Ini diberikan dalam format grid <newline> expression
, dengan tanda hubung ---
antara kasus. Format SE membiarkan beberapa baris kosong, tetapi harus diisi dengan spasi.
x
x
---
x y
z
x
---
Fx
F(x)
---
Fx
y
F(y,x)
---
ABu
A(B(u))
---
G
H
k
G(H(k))
---
ABCA
x xs
DFk
A(x,B(D(F(k)),C(x,A(s))))
---
A B
C D x
A(C(D(x)),B(D(x)))
---
RT Hq
I xR k
R(I(x),T(H(R(k),q)))
---
A A A a
S A b
B C Dx
d X u f
A(B(d,C(D(f,x))),A(X(u),A(u,a)))
(A (B (D x)) (C (D x)))
cocok atau formatnya sudah diperbaiki?Jawaban:
CJam,
676260585754 byteTerima kasih kepada Dennis karena telah menghemat 4 byte.
Ini mendefinisikan blok bernama (fungsi)
J
dan meninggalkannya di tumpukan. Fungsi itu sendiri mengharapkan array string pada stack, yang mewakili grid input, dan meninggalkan string yang diinginkan sebagai gantinya.Uji di sini.
Saya sudah bermaksud untuk mengatasi yang ini sejak diposting, tetapi ternyata saya membutuhkan solusi Pyth karunia dan terlalu lama untuk memotivasi diri saya sendiri secara memadai.
Penjelasan
Solusinya tentu saja bersifat rekursif dan secara bertahap membangun string.
sumber
Python 2,
227223192182179177 byte(Keempat spasi sebenarnya tab)
Mengambil daftar karakter 2d sebagai argumen pertama ke r.
sumber
Pyth, 97 byte
Ya Tuhan, butuh waktu lama (sekitar 5/6 jam?). Pyth benar-benar tidak dirancang untuk ini ...
Coba di sini .
Coba di penjelasan serta setara python
Di mana fungsi
Pprint
danassign
mengembalikan apa yang diberikan.sumber
Haskell,
124122120119 byteContoh penggunaan:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Cara kerjanya: selain kisi masukan
r
, fungsi tersebut#
mengambil fungsi laing
sebagai argumen yang diterapkanr
kapan pun karakter kiri atas adalah spasi. Jika itu adalah huruf kecil, kembalikan. Kalau tidak, itu harus karakter huruf besar dan#
disebut secara rekursif, sekali dengantail
turun dan sekali denganmap tail
ke kanan.!
bergabung dengan hasil dari panggilan rekursif dengan,
,, jika perlu. Semua dimulai dengan kisi masukan dan fungsi identitas.sumber
Python 3, 187 byte
Masih mencari cara untuk bermain golf ini, tapi saya senang saya berhasil mengubahnya menjadi satu-liner.
sumber