Tulis sebuah program yang memuat empat karakter ()[]
yang memenuhi poin-poin ini:
- Setiap tanda kurung kiri
(
memiliki tanda kurung kanan yang cocok)
. - Setiap braket kiri
[
memiliki braket kanan yang cocok]
. - Pasangan kurung dan kurung yang cocok tidak akan tumpang tindih. mis.
[(])
tidak valid karena tanda kurung tidak sepenuhnya terkandung dalam tanda kurung yang cocok, atau sebaliknya. - Karakter pertama dan terakhir adalah pasangan kurung atau kurung yang cocok. Jadi
([]([]))
dan[[]([])]
valid tetapi[]([])
tidak.
( Tata bahasa untuk format input adalah <input> ::= [<input>*] | (<input>*)
.)
Setiap pasangan kurung dan kurung yang cocok dievaluasi menjadi bilangan bulat non-negatif:
- Nilai pasangan di dalam tanda kurung yang cocok semuanya dijumlahkan . Pencocokan kosong
()
memiliki nilai0
. - Nilai pasangan di dalam tanda kurung cocok dikalikan . Pencocokan kosong
[]
memiliki nilai1
.
( Jumlah atau produk dari satu nomor adalah nomor yang sama.)
Misalnya, ([](())([][])[()][([[][]][][])([][])])
dapat dipecah dan dievaluasi sebagai 9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
Contoh lain:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
Program Anda perlu mengevaluasi dan mencetak bilangan bulat yang diwakili oleh seluruh string input. Anda dapat menganggap input tersebut valid. Kode terpendek dalam byte menang.
Alih-alih sebuah program, Anda dapat menulis fungsi yang mengambil string dan mencetak atau mengembalikan integer.
code-golf
arithmetic
balanced-string
recursion
Hobi Calvin
sumber
sumber
Jawaban:
CJam, 23
Dengan kredit BESAR untuk Dennis! Cobalah online
Penjelasan:
Program mengonversi input ke ekspresi CJam kemudian mengevaluasinya.
[…]
menjadi[…1]:*
(tambahkan 1 dan kalikan)(…)
menjadi[…0]:+
(tambahkan 0 dan tambahkan)sumber
q"])(""1]:*0]:+["4/ers~
Gangguan Umum - 98
(
oleh(+
[
oleh(*
]
oleh)
Ini membutuhkan
cl-ppcre
pustaka untuk dimuat dalam gambar lisp saat ini.Penjelasan
Berfungsi
*
dan+
bersifat variadik dan mengembalikan nilai netralnya saat tidak ada argumen Untuk contoh Anda, bentuk lisp yang dievaluasi adalah yang berikut:dan
Tanpa regex - 183 byte
Ayo, Lisp - 16 byte (percobaan)
Bahasa-bahasa lain begitu singkat sehingga saya tergoda untuk membuat bahasa golf saya sendiri berdasarkan Common Lisp, untuk manipulasi string yang lebih pendek. Saat ini tidak ada spec, dan fungsi eval adalah yang berikut:
Tes:
s
dan dua tumpukan,p
danq
.p
.<
: muncul darip
dan mendorong keq
.r
: menggantikans
(harus berupa string) dari karakterq
ke karakter dip
; hasilnya disimpan dis
;p
danq
dikosongkan.R
: baca dari strings
, simpan hasil dalam variabels
.E
: bentuk evals
, hasil toko dalams
.sumber
Pyth,
353433 byteDemonstrasi.
1 byte berkat @Jakube.
Kami mulai dengan mem-parsing input. Format input dekat dengan Python, tetapi tidak cukup. Kita perlu koma setelah setiap kelompok kurung atau kurung kurung. Koma di akhir grup kurung tidak perlu, tetapi tidak berbahaya. Untuk mencapai ini, kami menggunakan kode ini:
Ini akan meninggalkan ekstra
,
di akhir string, yang akan membungkus seluruh objek dalam sebuah tuple, tetapi ini tidak berbahaya, karena tuple akan dijumlahkan, dan memiliki nilai yang sama dengan elemennya.Sekarang string diuraikan, kita harus menemukan nilainya. Ini dilakukan dengan menggunakan fungsi yang ditentukan pengguna
y
,, yang dipanggil pada objek yang diuraikan. fungsi didefinisikan sebagai berikut:sumber
Emacs lisp, 94
Formatnya terlihat sangat lispy, jadi saya pikir transformasi sederhana mungkin berhasil:
Format perantara terlihat seperti (misalnya dalam pertanyaan):
Kami terbantu oleh fakta bahwa penambahan dan perkalian sudah melakukan apa yang kami inginkan dengan daftar argumen kosong.
Sederhana, dan interaktif, untuk Anda bermain kesenangan:
sumber
interactive
(bukan buffer-string, gunakan read-from-string).Retina , 111 byte
Memberikan output secara unary.
Setiap baris harus menuju ke file sendiri tetapi Anda dapat menjalankan kode sebagai satu file dengan
-s
bendera. Misalnya:Penjelasannya datang kemudian.
sumber
Java, 349 karakter
Pendekatan rekursif sederhana. Mengharapkan string menjadi argumen pertama yang digunakan untuk memanggil program.
Diperluas:
sumber
Perl 5, 108
Dilakukan sebagai penerjemah alih-alih menulis ulang dan mengevaluasi. Bukan pertunjukan yang bagus, tapi tetap menyenangkan untuk menulis.
Tidak golf:
sumber
Python, 99
Saya mencoba berbagai metode tetapi yang terpendek yang bisa saya dapatkan pada dasarnya hanyalah penggantian dan evaluasi. Saya terkejut menemukan bahwa saya bisa meninggalkan semua trailing
,
, karena Python dapat mengurai[1,2,]
dan koma akhir terakhir hanya menempatkan semuanya dalam sebuah tuple. Bagian non-mudah hanya lain akan menjadiord(c)%31%7
untuk memisahkan keluar karakter yang berbeda (mengevaluasi untuk2
,3
,1
,0
untuk(
,)
,[
,]
masing-masing)sumber
Jawa, 301
sedikit pendekatan yang berbeda dari jawaban TheNumberOne, meskipun milik saya juga bersifat rekursif. Input diambil dari baris perintah. Metode void menyimpan beberapa byte saat menghapus karakter yang tidak lagi diperlukan.
diperluas:
sumber
Python,
117110109 byteSatu aspek yang saya perjuangkan adalah bahwa fungsi tersebut pada dasarnya memiliki dua nilai balik: produk / jumlah, dan posisi baru dalam string. Tapi saya butuh fungsi yang hanya mengembalikan hasilnya, jadi mengembalikan tuple tidak berfungsi. Versi ini menggunakan argumen "referensi" (daftar dengan satu elemen), untuk meneruskan posisi kembali dari fungsi.
Saya memiliki versi yang lebih pendek (103 byte) yang menggunakan variabel global untuk posisi itu. Tapi itu hanya akan berfungsi pada panggilan pertama. Dan fungsi yang hanya berfungsi sekali tampak agak mencurigakan. Tidak yakin apakah itu dapat diterima untuk golf kode.
Algoritma ini adalah rekursi langsung. Saya mencoba sejumlah variasi untuk ekspresi yang memperbarui produk / jumlah. Saya datang dengan beberapa versi yang panjangnya persis sama, tetapi tidak ada yang lebih pendek.
Saya agak berharap bahwa pendekatan yang mengubah ini menjadi ekspresi yang dievaluasi mungkin akan menang. Tetapi seperti yang mereka katakan: "Untuk beralih adalah manusia, untuk berulang ilahi."
sumber
Clojure - 66 byte
Perhatikan bahwa itu
([] (()) ([] []) [()] [([[] []] [] []) ([] [])])
adalah bentuk Clojure yang valid. Begitu:g
.g
berlaku+
atau*
untuk hasil doag
pada sub-elemen argumennya.x
dalam urutan kosong;(map g x)
mengembalikannil
, danapply
mengembalikan nilai netral untuk operasi.sumber
JavaScript (ES6), 116 byte
sumber