Mari kita mendefinisikan fungsi "ukuran tidak terbuka" u
dari daftar bersarang l
(hanya berisi daftar) dengan aturan berikut:
- Jika
l
kosong, berartiu(l)
1. - Jika
l
tidak kosong,u(l)
sama dengan jumlah ukuran setiap elemen yang terbukal
, ditambah satu.
Tugas Anda adalah menulis sebuah program (atau fungsi) yang menggunakan daftar sebagai input dan output (atau mengembalikan) ukuran daftar yang terbuka.
Kasus uji:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
Ini adalah kode-golf , jadi program terpendek (dalam byte) menang.
code-golf
string
array-manipulation
counting
Buah Esolanging
sumber
sumber
()
bukan[]
?[[[]][]]
bukan ini[[[]],[]]
dalam contoh kedua Anda?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
tampaknya merupakan solusi terpendek dalam banyak bahasa, ada juga banyak jawaban yang benar-benar menyelesaikan tantangan ini melalui manipulasi daftar, dan setidaknya di esolang menghitung kemunculan karakter tetap juga sangat berbeda dengan menghitung kemunculan karakter input.Jawaban:
Retina , 1 byte
Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
Secara default, Retina menghitung jumlah kecocokan dari regex yang diberikan pada input. Ukuran yang tidak dibungkus sama dengan jumlah
[]
pasangan pada input dan karenanya untuk jumlah]
.sumber
Mathematica, 9 byte
Ternyata ada built-in untuk itu ...
Perhatikan bahwa ini tidak akan berfungsi jika daftar benar-benar berisi elemen non-daftar. Yang
LeafCount
benar-benar dilakukan adalah menghitung jumlah subekspresi atom. Untuk input{{}, {{}}}
, ekspresi sebenarnya berbunyi:Di sini subekspresi atom sebenarnya adalah kepala
List
.sumber
Brainfuck,
716159 byteMengambil input dari STDIN dalam format yang diberikan dalam pertanyaan, dan mengeluarkan karakter yang kode ASCII -nya adalah "ukuran yang tidak dibuka."
Saya masih amatir di Brainfuck, jadi ada banyak kemungkinan optimisasi yang masih bisa dilakukan.
Cobalah online!
Tidak Disatukan:
sumber
JavaScript (ES6),
2927 byteSaya suka ketika rekursi ternyata bersih. Ini pada dasarnya adalah pencarian input yang paling mendalam, menambahkan 1 setiap kali akhir array tercapai.
Jika array kosong salah dalam JS, ini bisa menjadi 24 byte:
Tapi sayang sekali, tidak. Upaya lain:
sumber
f=a=>a[0]?f(a.pop())+f(a):1
bekerja (Jumlah byte yang sama.)f=a=>a.reduce((n,a)=>n+f(a),1)
. Sekarang,f=(n,a)=>n+a.reduce(f,1)
hanya 24 byte, tapi sayangnya parameternya dalam urutan yang salah.)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 byteMembutuhkan
-p
benderaTerima kasih kepada @Dada untuk menghemat dua byte (saya suka btw exploit titik koma ini)
sumber
-p
untuk menyimpan 1 byte;)y;[;
untuk menyimpan satu byte lagiCJam ,
75 byteTerima kasih kepada Peter Taylor untuk menghapus 2 byte! (
e=
bukannyaf=:+
)Cobalah online!
sumber
05AB1E , 4 byte
Cobalah online!
Saya pikir itu bisa golf lebih tetapi bahwa 'saya' wajib, jika input dianggap sebagai array yang sebenarnya, bukan string
sumber
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
di input menghapusI
persyaratan itu, meskipun saya tidak tahu apakah itu diizinkan.Labirin , 8 byte
Cobalah online!
Penjelasan
Ini menghitung kurung pembuka melalui sedikit bitwise magic. Jika kita mempertimbangkan hasil dari kode karakter bitwise AND of
[
,,
dan]
with2
, kita mendapatkan:Jadi jika kita meringkas hasil operasi ini untuk setiap karakter, kita mendapatkan dua kali nilai yang kita inginkan.
Adapun kode itu sendiri, blok 2x2 di awal adalah lingkaran kecil. Pada iterasi pertama
&-
tidak benar-benar melakukan apa pun kecuali bahwa mereka meletakkan nol eksplisit di atas yang implisit di bagian bawah tumpukan. Ini akan menjadi total yang berjalan (dan itu sebenarnya akan negatif untuk menyimpan byte nanti). Maka loopnya adalah sebagai berikut:Setelah kami meninggalkan loop, bit linear berikut dijalankan:
IP kemudian mengenai yang mati dan berbalik. Ketika mencoba dieksekusi
/
lagi, program berakhir karena pembagian yang dicoba dengan nol.sumber
Python
32,3623 byteSaya perhatikan itu
u(l)
sama dengan jumlah[
dalam representasi stringl
, jadi program ini mencoba melakukan itu. Mungkin bisa bermain golf lebih jauh dengan menemukan cara lain untuk melakukan ini, meskipun ...sumber
lambda x:`x`.count("[")
Python, 26 byte
Formula rekursif sederhana.
sumber
C #,
4641 bytel adalah string daftar bersarang. Uji di sini .
sumber
return
dengan menggunakan fungsi ekspresi tubuh. Jugachar
secara implisit gips untukint
sehingga Anda dapat menggunakan91
bukannya'['
:int u(string l)=>l.Count(c=>c==91);
Selanjutnya, Anda bisa drop tanda tangan fungsi dan menggunakan metode lambda:l=>l.Count(c=>c==91);
.Jelly , 4 byte
Tidak menggunakan manipulasi string. Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Ruby, 13 (+1) byte
Disebut dengan
-n
argumen:EDIT: Diubah untuk mencetak jawaban
sumber
->s{s.count ?[}
akan menjadi pengiriman yang valid.Regex, 1 byte
Cobalah online!
sumber
Brain-Flak ,
63, 61 byteCobalah online! 58 byte kode, dan +3 untuk
-a
flag yang mengaktifkan input ASCII.Versi / penjelasan yang dapat dibaca:
sumber
Befunge ,
221816 byteTryItOnline!
Sunting: Terima kasih kepada Martin Ender karena mencukur 4 byte!
Edit2: Kredit ke David Holderness untuk mengoptimalkan dua lagi
sumber
///, 13 byte
Output dalam unary.
Cobalah online!
Penjelasan:
sumber
///
?PHP, 35 byte
preg_match_all
menemukan semua contoh yang cocok dari ekspresi reguler dan mengembalikan nomor, itulah sebabnya tag gema pendek diperlukan.Seperti kebanyakan jawaban, ia menghitung jumlah
[
input dan output nomor itusumber
]
alih-alih[
, Anda tidak perlu menghindarinya.count_chars()[91];
melakukan banyak hal yang sama tetapi lebih pendek.Racket 82 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
V , 10 byte
Cobalah online!
Ini mengandung beberapa karakter yang tidak dapat dicetak, berikut ini adalah versi yang dapat dibaca:
<C-a>
mewakili "ctrl-a" (ASCII0x01
) dan<esc>
mewakili kunci keluar (ASCII0x1b
).Versi yang lebih menyenangkan, lebih tidak golf:
Cobalah online!
sumber
Scala, 15 byte
Tidak Disatukan:
count
jumlah berapa banyak elemen memuaskan predikat, dalam hal ini92<
, yang merupakan metode<
dari92
.sumber
O , 15 byte
Coba di sini!
Dalam input, koma apa pun harus dihapus atau diganti dengan spasi.
Penjelasan
Jika kami diizinkan untuk mengerjakan string: 10 byte
sumber
> <> ,
212018 byteSunting: skor 1 untuk pernyataan goto!
Sunting 2: Rupanya> <> berbeda dari Befunge karena ini memungkinkan offset IP non-nol setelah pembungkus (dengan kata lain, dengan menggunakan instruksi trampolin, saya dapat membungkus ke (1, 0) alih-alih (0, 0)). Menarik.
TryItOnline!
sumber
Brainfuck, 28 byte
Cobalah online.
Ini menghitung jumlah karakter input yang dapat dibagi 3, yaitu jumlah
]
karakter.Alternatif solusi 34-byte yang menghitung
[
karakter secara langsung dan mengandalkan sel 8-bit:sumber
C,
4846 BytesDisimpan dua byte berkat kirbyfan64sos
Kode uji
Uji kasus
sumber
*v++^91?0:i++
kei+=*v==91
untuk menyimpan 3 byte.i+=*v++==91
untuk menghemat dua byte.penggantian tinylisp , 39 byte
Menentukan fungsi
u
yang dapat disebut seperti(u (q ((())()) ))
(untuk kasus uji kedua). Melakukannya di repl menghemat 4 byte karena tanda kurung ditutup otomatis.Penjelasan
The
x-(0-y)
membangun diperlukan karena tinylisp tidak memiliki built-in fungsi Selain itu, hanya pengurangan.sumber
Befunge-98 ,
1211109 byteTryItOnline!
Sunting: Terima kasih kepada Martin Ender karena telah memangkas satu byte
sumber
Haskell,
20 1917 byteCobalah online!
Mengambil daftar sebagai string dan menempatkan sebuah
1
dalam daftar untuk masing-masing]
, lalu meringkas semua1
.Versi pointfree: (19 byte)
Asumsikan
, [ ]
adalah satu-satunya karakter dalam string. Memfilter daftar untuk mendapatkan semua karakter lebih besar dari[
, yang semuanya]
dan mengembalikan panjangnya.Pemakaian:
sumber
Bash + coreutils, 29 byte
sumber
tr -d -c [|wc -c
, yang secara default akan membaca daftar dari input standar.DASH , 14 byte
Cukup dihitung
]
. Pemakaian:Solusi bonus, 15 byte
Yang ini secara rekursif dihitung dari daftar nyata. Pemakaian:
sumber