Prelude adalah bahasa pemrograman esoterik, yang memiliki sangat sedikit, tetapi tidak biasa, pembatasan pada apa yang merupakan program yang valid. Setiap blok teks ASCII yang dapat dicetak ("blok" yang berarti bahwa garis ASCII yang dapat dicetak dipisahkan oleh baris baru - 0x0A) valid dengan ketentuan bahwa:
- Setiap kolom teks (vertikal) paling banyak berisi satu
(
dan)
. - Mengabaikan posisi vertikal mereka,
(
dan)
seimbang, yaitu masing(
- masing dipasangkan dengan tepat)
di sebelah kanannya, dan sebaliknya.
Tulis program atau fungsi yang, jika diberi string berisi ASCII yang dapat dicetak dan baris baru, menentukan apakah itu merupakan program Prelude yang valid. Anda dapat mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi. Hasilnya dapat dikembalikan atau dicetak ke STDOUT, menggunakan dua nilai kebenaran / kepalsuan tetap pilihan Anda.
Anda tidak boleh berasumsi bahwa input berbentuk persegi panjang.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.
Contohnya
Berikut ini adalah program Prelude yang valid (pada kenyataannya, mereka bahkan merupakan program Prelude yang nyata ):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
Dan di sini ada sejumlah input, yang semuanya tidak valid :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
sumber
)
dan 2(
. Bukankah seharusnya hanya 1 per baris?Jawaban:
CJam,
5756 byteTerlalu lama, bisa banyak bermain golf. Penjelasan yang akan ditambahkan begitu saya golf itu.
Penjelasan singkat
Ada dua cek dalam kode:
Number of "(" - Number of ")"
) harus saling memuji. Jadi, ketika Anda menjumlahkannya, itu harus menghasilkan 0. Setiap bagian yang gagal properti ini membuat seluruh input memiliki tanda kurung yang tidak cocok.Number of "(" - Number of ")"
tidak boleh negatif untuk blok sisi kanan.Cobalah online di sini
sumber
Python 2,
128119105 byteTahukah Anda bahwa Anda dapat memetakan Tidak Ada dalam Python 2?
Penjelasan
Kami ingin memulai dengan mentransposisi Prelude sehingga kolom menjadi baris. Biasanya kita akan melakukan ini dengan
zip
, tetapi karenazip
memotong ke panjang baris terpendek danitertools.zip_longest
terlalu panjang untuk kode-golf, sepertinya tidak ada cara pendek untuk melakukan apa yang kita inginkan ...Kecuali untuk pemetaan
None
:Sayangnya (atau lebih tepatnya, untungnya untuk semua tujuan non-golf), ini hanya berfungsi di Python 2.
Adapun
n
danv
:n
bertindak seperti tumpukan, menghitung1 - <number of unmatched '(' remaining>
. Untuk setiap yang(
kita lihat kita kurangi 1, dan untuk setiap yang)
kita lihat kita tambahkan 1. Oleh karena itu jikan >= 2
pada titik mana pun, maka kita telah melihat terlalu banyak)
dan program tidak valid. Jikan
tidak selesai pada 1, maka kami memiliki setidaknya satu yang(
tersisa yang tidak cocok.v
memeriksa validitas, dan mulai dari 1. Jika program tidak valid (n >= 2
atauA+B >= 2
), makav
menjadi 0 untuk menandai ketidakabsahan.Karenanya jika program tersebut valid, maka pada akhirnya harus kita miliki
n = 1, v = 1
. Jika program tidak valid, maka pada akhirnya kita harus memilikiv = 0
, atauv = 1, n <= 0
. Oleh karena itu validitas dapat secara ringkas dinyatakan sebagain*v>0
.(Terima kasih kepada @feersum untuk banyak saran bagus yang melepaskan 14 byte!)
Sebelumnya, pengiriman lebih mudah dibaca:
sumber
map
...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
menjadi perbandingan chaining, tapi saya tidak berpikir untuk mengubah|=
ke dalam*=
.J, 64 byte
Input adalah string dengan baris baru yang tertinggal. Outputnya 0 atau 1.
Contoh penggunaan
Metodenya adalah sebagai berikut
];.2
(
/)
/anything else
ke1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
kata keterangan yang ditambahkan ke kata kerja meringkas output array kata kerjatambahkan nilai dalam kolom
]s
()
saldo positif di setiap awalan[:(0>])s)[:+/\]
()
saldo yang sama di seluruh daftar (yaitu di awalan terakhir)|@{:@]
tambahkan abs (nilai) di kolom dan periksa setiap elemen untuk nilai maksimal 1
(1<|s)s
karena semua cek sebelumnya menghasilkan positif pada kegagalan, kami menjumlahkannya dan membandingkannya dengan 0 untuk mendapatkan validitas input
0=]
sumber
J, 56 byte
Itu adalah fungsi anonim yang menerima string dengan baris baru tambahan dan mengembalikan 0 atau 1. Membaca dari kanan ke kiri:
];.2 y
, seperti pada pengajuan J lainnya, memotong stringy
sama sekali kemunculan karakter terakhirnya (itulah sebabnya input membutuhkan baris baru) dan membuat matriks persegi panjang yang barisnya adalah potongan-potongan, diisi dengan spasi jika perlu.'()'=/
membandingkan setiap karakter dalam matriks pertama dengan(
dan kemudian dengan)
mengembalikan daftar dua matriks 0-1.+.^:_1]0|:
mengubah daftar dua matriks menjadi matriks tunggal bilangan kompleks. Sejauh ini program mengubah setiap(
input menjadi 1, setiap)
menjadi i, dan setiap karakter lainnya menjadi 0.b=.+/
menugaskan jumlah baris dari matriks kompleks untukb
.-.|b
membuat daftar 1- | z | untuk setiap z inb
. Kondisi bahwa setiap kolom mengandung paling banyak tanda kurung tunggal diterjemahkan ke semua angka ini 1- | z | menjadi tidak negatif.+/\*:b
adalah vektor menjalankan jumlah kuadrat dari angka dalamb
. Jika setiap kolom berisi paling banyak satu tanda kurung, kuadrat angka dalamb
semua 0, 1 atau -1. The,
merangkai vektor ini dengan vektor 1- | z | 's.sekarang semua yang perlu kita lakukan adalah menguji bahwa entri dari vektor gabungan kita
v
adalah angka asli non-negatif, ini hampir*/0<:v
, kecuali yang menyebabkan kesalahan jika beberapa entriv
tidak nyata, jadi kita ganti<:
dengan<: ::0:
yang hanya mengembalikan 0 jika terjadi kesalahan .sumber
0={:+/\*:b
karena mis.(
Tidak valid.0=(-|)v
lebih pendek 2 byte untuk memeriksa real non-negatif. (Ayo kalahkan CJam!: P)inv
bukannya^:_1
menyimpan byte lain.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.