Berikut beberapa contoh input, jadi saya bisa menjelaskan apa masalahnya:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Pikirkan baris teks ini sebagai peta topografi beberapa gunung. Setiap rangkaian tanda kurung menggambarkan satu unit ketinggian.
Jika kita "melihat" ini dari samping, sehingga kita melihat gunung secara vertikal, kita akan melihat:
4 5 cherries woohoo
1 2 3 moo lik e
i
Diberikan salah satu peta topografi ini, output peta, tetapi pada skala vertikal, seperti output di atas. Pisahkan item yang berbeda di peta dengan jumlah karakter ke item berikutnya. Misalnya, ada 4 ruang dalam output antara moo
dan i
. Demikian juga, ada 4 karakter dalam input antara moo
dan i
.
Kode yang melakukan ini dalam jumlah karakter paling sedikit akan menang.
code-golf
string
balanced-string
beary605
sumber
sumber
((1 2))))))))))3
harus tidak valid jika ketinggian negatif dilarang.Jawaban:
J,
87797270675756 karakterMengambil input dari keyboard. Contoh:
Penjelasan:
Penjelasan ini didasarkan pada versi pertama dari program saya:
x=.1!:1[1
ambil input dari keyboard dan masukkanx
untuk nanti(('('&([:+/=)-')'&([:+/=))\,.i.@#)
membuat daftar semua indeces ke dalam string (i.@#
) dan jahitan (,.
) bersamaan dengan hasil dari(('('&([:+/=)-')'&([:+/=))\
kata kerja.(('('&([:+/=)-')'&([:+/=))\
kata kerja ini diterapkan untuk semua prefiks dari string (seterusnya masukanhello
itu akan berlaku untukh
,he
,hel
,hell
, danhello
. Ini adalah garpu , yang menghitung jumlah tanda kurung terbuka('('&([:+/=)
dan kemudian mengurangi jumlah kurung dekat')'&([:+/=)
. Ini memberi saya daftar dari indeces ke dalam string dan level karakter pada indeks itu harus di dalam output.Pada input sederhana ini memberi saya hal berikut:((' '$~{.@]),[{~{:@])"1
ini adalah kata kerja yang mengambil daftar yang baru saja saya buat dan juga keluaran dari('( ) 'charsub x)
(yang hanya melakukan penggantian string untuk mengganti semua tanda kurung dengan spasi dix
). Dibutuhkan ekor dari setiap item daftar{:@]
dan menggunakannya sebagai indeks ke dalam string untuk mendapatkan karakter[{~{:@]
. Lalu itu awalan itu,
dengan jumlah spasi seperti yang ditunjukkan oleh kepala setiap item dalam daftar(' '$~{.@])
. Pada contoh sebelumnya ini memberi saya:Saya kemudian memindahkan array
|:
dan membalikkannya|.
untuk mendapatkan output yang diinginkan.sumber
GolfScript
69Demo online di sini .
Penjelasan:
sumber
APL (59)
Saya berasumsi bahwa 'markas' harus dapat digunakan juga. (yaitu
(a(b))c(d)
valid). Jika ini tidak diperlukan, dua karakter dapat disimpan.Penjelasan:
T←⍞
: menyimpan sederetan input di T'()'∘=¨T
: untuk setiap karakter dalam T, lihat apakah itu tanda kurung buka atau tutup. Ini memberikan daftar daftar boolean.1 ¯1∘ר
: kalikan elemen kedua di masing-masing daftar ini dengan -1 (jadi tanda kurung pembuka adalah 1, yang penutup adalah -1 dan karakter lainnya adalah 0).+/¨
: ambil jumlah setiap daftar bagian dalam. Kami sekarang memiliki nilai fory untuk setiap karakter.P←
: simpan di P.R←1++\P
: ambil total P yang berjalan, berikan ketinggian untuk setiap karakter. Tambahkan satu ke setiap karakter sehingga karakter di luar tanda kurung ada di baris pertama.(⍴T)∘⍴¨⍳⌈/R
: untuk setiap kemungkinan nilai-y, buat daftar selama T, yang hanya terdiri dari nilai itu. (mis. 1111 ..., 2222 ...., dll.)R∘=¨
: untuk setiap elemen dalam daftar ini, lihat apakah itu sama dengan R. (Untuk setiap level, kami sekarang memiliki daftar nol dan yang sesuai dengan apakah karakter akan muncul pada level itu atau tidak).⍵×P=0
: untuk masing-masing daftar ini, setel ke nol jika P tidak nol di tempat itu. Ini menghilangkan karakter dengan delta-y yang tidak nol, sehingga menghilangkan tanda kurung.⊃,/T\¨⍨
: untuk setiap kedalaman, pilih dari T karakter yang akan muncul.⊖↑
: buat matriks dan letakkan di sisi atas.sumber
Tcl, 50
Agak curang, tapi yah ..
Saya menggunakan urutan melarikan diri ascii untuk mendapatkan perbedaan garis,
^[[A
berarti memindahkan kursor 1 ke atas,^[[B
adalah memindahkan kursor 1 ke bawah.sumber
APL, 41 karakter / byte *
Diuji pada Dyalog, dengan a
⎕IO←1
dan⎕ML←3
lingkungan. Ini adalah fungsi yang mengambil input yang diperlukan dan mengembalikan output. Mengingat kata-kata pertanyaan itu, saya percaya itu dapat diterima. Jika tidak, berikut adalah versi yang membaca dari stdin dan menulis ke stdout, untuk 4 karakter lainnya:Penjelasan :
Contoh:
*: APL dapat disimpan dalam berbagai rangkaian karakter byte tunggal sebelumnya yang memetakan simbol APL ke 128 byte atas. Oleh karena itu, untuk tujuan bermain golf, program yang hanya menggunakan karakter ASCII dan simbol APL dapat dinilai sebagai karakter = byte.
sumber
⍨
simbolnya. Sepertinya kombinasi dari¨
dan~
karakter?~
dan¨
, meskipun itu karakter yang berbeda dari keduanya. Ini operator yang disebut Commute . Dalam bentuk diad itu membalik argumen dari fungsi dyadic itu diterapkan:(5-2)=(2-⍨5)
. Sebagai operator monadik ternyata fungsi diad ke monadik, menduplikasi argumen yang tepat:(2*2)=(*⍨2)
. Ini sebagian besar digunakan untuk menulis aliran fungsi yang tidak terputus dari kanan ke kiri, tanpa harus meletakkan tanda kurung di sekitar ekspresi besar dan melompat-lompat mata Anda di sekitar mereka. Dalam bermain golf itu berguna karena3*⍨1-2
satu karakter kurang dari(1-2)*3
:-)~
di J lalu.J, 56 karakter
56-karakter solusi J lain ... saya menghitung kedalaman dengan menerjemahkan
(
ke dalam ⁻1,)
menjadi 1 dan semua karakter lain ke 0, dan kemudian mengambil jumlah yang menjalankan ini:[: +/\ 1 _1 0 {~ '()'&i.
. Sisanya sebagian besar mirip dengan solusi @ Gareth.sumber
Python, 161 karakter
sumber
Python, 130
sumber
Ruby 1.9 (129)
Baca dari stdin.
sumber
//
ke''
yang menjaga karakter menghitung yang sama dan menghindari bug di stabilo.C, 132 karakter
Deskripsi gagal menentukan berapa banyak input yang harus diterima oleh kiriman agar dapat diterima, jadi saya menetapkan batas yang paling konsisten dengan kebutuhan golf saya (sambil tetap bekerja dengan satu contoh input yang diberikan). Izinkan saya mengambil kesempatan ini untuk mengingatkan orang-orang bahwa sering kali merupakan ide yang baik untuk menentukan maksimum minimum dalam deskripsi tantangan Anda.
Ada dua loop utama dalam kode. Loop pertama menghasilkan semua karakter non-kurung ke baris output yang sesuai, dan loop kedua mencetak setiap baris.
sumber
C, 149 karakter
jalankan dengan arg yang dikutip, egaout "((1 2) (3 (4 5) moo))) (i (lik (ceri) e (woohoo))))"
sumber
Oktaf, 128
Sangat mirip dengan jawaban terakhir saya ...
Uji
Memasukkan:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Keluaran:
sumber
C #, 229 byte
Jika tidak ada batasan untuk memimpin ruang vertikal, Anda dapat menggunakan ini (indentasi untuk kejelasan). Ini akan menginisialisasi kursor satu baris untuk setiap yang
(
ditemukan sebelum mencetak, kemudian gerakkan kursor ke atas dan ke bawah saat tanda kurung dibaca.sumber
PowerShell ,
120119 byteCobalah online!
Efek samping: Karakter
&
dan'
perubahan ketinggian sebagai(
dan)
, tetapi ditampilkan. Bandingkan hasil untuk:Kurang bermain golf:
sumber
VB.net (Untuk S&G)
Bukan kode tercantik.
sumber