Pertimbangkan string kurung yang tidak kosong dengan benar:
(()(()())()((())))(())
Kita dapat membayangkan bahwa setiap pasangan kurung mewakili cincin dalam konstruksi teleskopik yang runtuh . Jadi mari kita memperluas teleskop:
( )( )
()( )()( ) ()
()() ( )
()
Cara lain untuk melihatnya adalah bahwa tanda kurung di kedalaman n dipindahkan ke garis n , sambil menjaga posisi horizontal mereka.
Tugas Anda adalah mengambil string kurung yang seimbang dan menghasilkan versi yang diperluas.
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau yang setara terdekat), argumen baris perintah atau parameter fungsi, dan menghasilkan output melalui STDOUT (atau yang terdekat terdekat), mengembalikan nilai atau parameter fungsi (keluar).
Anda dapat mengasumsikan bahwa string input valid, yaitu hanya terdiri tanda kurung, yang seimbang dengan benar.
Anda dapat mencetak spasi tambahan di setiap baris, tetapi tidak lebih banyak spasi dari yang diperlukan. Total garis harus tidak lebih dari dua kali panjang string input. Anda dapat secara opsional mencetak satu baris baru.
Contohnya
Selain contoh di atas, berikut adalah beberapa kasus uji lagi (input dan output dipisahkan oleh garis kosong).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Tantangan Terkait:
- String Topografi , yang meminta Anda untuk menghasilkan apa yang pada dasarnya adalah pelengkap dari output dalam tantangan ini.
- Code Explanation Formatter , generalisasi luas gagasan dalam tantangan ini, baru-baru ini diposting oleh PhiNotPi. (Sebenarnya, deskripsi asli PhiNotPi tentang idenya adalah yang menginspirasi tantangan ini.)
Papan peringkat
Huh, ini mendapat cukup banyak partisipasi, jadi di sini ada Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Jawaban:
CJam,
171615 byteDi atas adalah dump xxd reversibel, karena kode sumber berisi karakter VT yang tidak dapat dicetak (0x0b) dan CSI (0x9b).
Seperti jawaban ini , ia menggunakan urutan pelarian ANSI , tetapi juga menggunakan tab vertikal dan mencetak karakter kontrol secara langsung untuk menghindari penggunaan printf .
Ini memerlukan terminal teks video pendukung, yang mencakup sebagian besar emulator terminal non-Windows.
Uji coba
Kita harus mengatur variabel shell LANG dan pengkodean terminal emulator ke ISO 8859-1. Yang pertama dicapai dengan mengeksekusi
Juga, sebelum mengeksekusi kode aktual, kami akan menonaktifkan prompt dan menghapus layar.
Ini memastikan output ditampilkan dengan benar.
Untuk mengembalikan LANG dan prompt, jalankan ini:
Bagaimana itu bekerja
Kami menyisipkan tab vertikal setelah masing-masing ( untuk memindahkan kursor ke bawah dan urutan byte 9b 41 (
"\x9bA"
) sebelum masing-masing ) untuk memindahkan kursor ke atas.sumber
kode mesin x86,
3934333029 byterakitan x86 untuk DOS, dengan beberapa trik:
Keterbatasan :
cls
sebelum menjalankan hampir wajib;bh=0
dan tanda arah jelas saat start, keduanya tidak berdokumen; OTOH,bx
secara eksplisit diatur ke nol di semua varian DOS yang saya lihat (DosBox, MS-DOS 2, FreeDOS), dan di mana-mana saya menguji flag-flag yang sudah OK.sumber
cld
?add
/sub
.lop
keloop
?nasm
memisahkan antaraloop
sebagai label danloop
instruksi perakitan, jadi saya hanya menulislop
seperti yang dilakukan orang lain.J,
3228 byteIni menyenangkan.
Penjelasan
Ini adalah cara kerja solusi ini, termasuk penjelasan tentang cara golfnya.
sumber
:')
C, 150 byte
Ini adalah gila menyenangkan untuk golf. Saya masih tidak yakin saya selesai dengan itu.
Kami mendefinisikan satu fungsi,,
f
yang mengambil string sebagai input dan output ke stdout.Mari kita membaca kode, baris demi baris:
Saya akan menjawab pertanyaan apa pun yang Anda miliki!
Coba program pengujian online !
sumber
f
,m
tidak akan mengatur ulang ke 0. Ini dianggap sebagai "melanggar lingkungan Anda," dilarang di sini .Retina + Bash, 27 byte (14 + 10 + 3 = 27)
Ini menggunakan Escapes ANSI:
Setara dengan
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
. The\e[B
kode escape berarti memindahkan kursor ke bawah satu baris, dan\e[A
cara menggerakkan kursor ke atas satu baris, sehingga solusi ini hanya menyisipkan kode-kode setelah dan sebelum awal dan akhir dari masing-masing pasangan bersarang kurung. Input dilewatkan melalui STDIN.Anda harus menyebutnya
printf $(Retina ...)
untuk melihat output dengan benar.Keluaran
sumber
printf
itu akan bagus. Kalau tidak, saya pikir itu hanya adil untuk menambah| printf
jumlah byte.printf $()
atauprintf $(Retina )
.\e
ditambahprintf
? Anda cukup menempatkan karakter kontrol dalam pola penggantian.TI-BASIC,
69 60 5655 byteIni untuk keluarga kalkulator TI-83+ / 84+, meskipun ditulis pada Edisi Perak 84+ C.
Program ini muncul sebagai on-calc lebih besar karena info ukuran + PPN dimasukkan. Juga, ada lebih dari 56 karakter di sini; alasannya adalah 56 byte adalah karena semua perintah yang lebih dari satu karakter dikompresi ke token yang berukuran satu atau dua byte.
Dicukur byte lain berkat thomas-kwa ! (juga darinya adalah lompatan dari 60 ke 56.)
sumber
cos(piAns
trik untuk menyimpan byte lain.Python 2, 115 byte
Sebut seperti
f("((()())()(()(())()))")
, dan output ke STDOUT.Penjelasan
Kita mulai dengan
n = 0
. Untuk setiap karakter di baris input:(
, kami menambahkann
spasi kemudian menambahn
)
, kita mengurangin
lalu menambahkann
spasiHasilnya kemudian di-zip dan dicetak. Perhatikan bahwa
zip
ritsleting Python sesuai dengan panjang elemen terpendek , misalnyaBiasanya orang akan menggunakan
itertools.zip_longest
(izip_longest
) jika mereka inginzip
pad dengan panjang elemen terpanjang .Namun dalam Python 2, perilaku ini dapat disimulasikan dengan memetakan
None
:Python 3, 115 byte
Tanpa zip, cukup padding dengan
ljust
. Yang ini tampaknya memiliki potensi golf.sumber
R,
151127 karakterDengan indentasi dan baris baru:
Pemakaian:
Bunyinya string sebagai stdin, membaginya sebagai vektor karakter tunggal, menghitung jumlah kumulatif
(
dan)
, mengurangkan yang sebelumnya dengan yang terakhir (dengan lag) sehingga menghitung "level" dari masing-masing tanda kurung. Ia kemudian mencetak ke stdout, untuk setiap level, baik kurung yang sesuai atau spasi.Terima kasih kepada @MickyT karena telah membantu saya memperpendeknya!
sumber
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
denganX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Makan
tidak benar-benar diperlukan, tetapi Anda perlu sedikit mengubah bagian cumsum.D=c(C(S=="("),0)-c(0,C(S==")"));
membawanya ke 135.which
tidak benar-benar diperlukan di sini (D!=j
sudah menjadi vektor boolean yang memungkinkan pengindeksan). Saya tidak tahu argumenfill
untukcat
, itu trik bagus! Terima kasih telah membuat saya mempersingkatnya dengan 24 karakter yang mengejutkan !!C,
58 53 52 5149 byteMemanfaatkan urutan pelarian ANSI untuk memindahkan posisi kursor.
Jika tidak menggunakan gcc atau kompiler lain yang mendukung,
\e
maka dapat diganti dengan\x1B
total 2 byte tambahan.\e[A
memindahkan kursor ke atas satu baris dan\e[B
memindahkan kursor ke bawah satu baris. Tidak perlu menggunakan\e[B
untuk bergerak ke bawah satu baris karena dua byte lebih pendek untuk menggunakan karakter tab vertikal ASCII0xB
atau\v
.Input string diasumsikan, dari pertanyaan, hanya terdiri dari tanda kurung (seimbang), jadi memeriksa paritas karakter, dengan
&1
, cukup untuk membedakan antara(
dan)
.sumber
Pip, 53 byte
Pip adalah bahasa kode-golf dari penemuan saya. Versi pertama diterbitkan pada hari Sabtu, jadi saya dapat mengambilnya secara resmi! Solusi di bawah ini tidak terlalu kompetitif ketika bahasa golf digunakan, tetapi itu sebagian karena saya belum menerapkan hal-hal seperti zip dan max.
Mengharapkan string tanda kurung sebagai argumen baris perintah.
Versi "Tidak Dicampur":
Penjelasan:
Tidak seperti kebanyakan bahasa golf, Pip sangat penting dengan operator infiks, jadi sintaksisnya agak lebih dekat dengan C dan turunannya. Ini juga meminjam ide dari pemrograman berbasis fungsional dan array. Lihat repositori untuk dokumentasi lebih lanjut.
Program pertama-tama menghasilkan daftar kedalaman (menyimpannya
z
) dengan memetakan fungsi ke string inputa
. Variabel globalv
melacak level saat ini. (Variabela-g
dalam Pip adalah variabel fungsi-lokal, tetapih-z
bersifat global.v
Berguna karena diinisialisasi ke -1.)Selanjutnya, kami menggunakan
W
hile loop untuk menghasilkan dan mencetak setiap baris, hingga baris yang dihasilkan terdiri dari semua spasi.v
sekarang digunakan untuk kolom, dani
untuk baris. The{z@++v=i?as}
fungsi, berulang kali dipetakan ke input string asli, tes apakah baris saati
pertandingan garis kurung saat ini seharusnya pada (yang disimpan dalamz
daftar). Jika demikian, gunakan tanda kurung (a
); jika tidak, gunakans
(diinisialisasi ke spasi). Hasil akhirnya adalah bahwa pada setiap iterasi,o
akan diberikan daftar karakter yang setara dengan baris berikutnya dari output.Untuk menguji apakah kita harus melanjutkan perulangan, kita periksa apakah
o
semua spasiRM
kosong. Jika tidak, cetaklah (yang secara default menggabungkan semuanya seperti dalam CJam), mengatur ulang nomor kolom menjadi -1, dan menambah nomor baris.(Fakta menyenangkan: Saya punya solusi 51-byte pada awalnya ... yang tidak berfungsi karena muncul bug pada juru bahasa.)
sumber
Pyth, 31 byte
Cobalah online.
-/<zk\(/<zhk\)
: Menemukan level yang sesuai untuk posisi karakter saat ini.?YqN-/<zk\(/<zhk\)d
: Ruang jika level yang sesuai bukan level saat ini, karakter saat ini sebaliknya.Js.e?YqN-/<zk\(/<zhk\)dz
: Hasilkan string, simpan keJ
.I-JdJ
: JikaJ
tidak semua spasi, cetaklah.Vz
:z
Waktu putaran .sumber
GNU Bash + coreutils + indent, 135
Input / output melalui STDIN / STDOUT:
indent
melakukan sebagian besar pengangkatan berat, tetapi perlu bekerja dengan kawat gigi, bukan paren. Sisanya adalah modifikasi dari jawaban ini untuk mengubah output dariindent
.sumber
Python 2, 92
Mencetak baris demi baris. Untuk nomor baris yang diberikan
i
(sebenarnya, negasinya), melewati string inputs
, dan membuat string baruz
yang hanya berisi karakters
pada kedalamani
. Ini dilakukan dengan menambah atau mengurangii
untuk melacak kedalaman saat ini, dan menambahkan karakter saati
ini ketika0
disesuaikan dengan tipe paren, dan jika tidak menambahkan spasi.Kemudian, cetak dan berulang ke yang berikutnya
i
kecuali garis saat ini adalah semua spasi. Perhatikan bahwa karena parensnya seimbang,i
loop setelahnya sama dengan di awal.Python 3 akan sama kecuali untuk karakter untuk
print(z)
.sumber
kecurangan :(
Retina + TeX, N bytekecurangan :(Ini hanya berfungsi jika Anda me-render (?) Output menggunakan MathJax atau TeX lainnya, yang saat ini dinonaktifkan untuk SE ini :(
Setiap baris harus dalam file yang berbeda, tetapi Anda dapat mengujinya dengan menggunakan
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(atau perintah sed yang setarased -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
). Input dilewatkan melalui STDIN.Ini berfungsi dengan melampirkan konten dari setiap pasang tanda kurung di dalam kurung kurawal, dan kemudian mensubkripsikan semua item di dalamnya.
Keluaran
sumber
In total the lines must not be longer than twice the length of the input string
. Mengubah baris 2 ke(\,{
dan baris 4}\,)
berarti output sesuai dengan ini (meskipun kedalaman vertikal masih salah: ()Java,
232226224222 byteVersi golf:
Versi panjang:
String input dianalisis terlebih dahulu, mencari "(" dan ")" untuk menambah / mengurangi penghitung dan menyimpan nilainya menentukan seberapa jauh kurung harus berjalan dalam array sambil juga melacak seberapa dalam yang terdalam berjalan. Kemudian array dianalisis; tanda kurung dengan nilai yang lebih rendah dicetak terlebih dahulu, dan akan melanjutkan pencetakan baris demi baris hingga maksimum tercapai.
Saya mungkin akan menemukan cara untuk bermain golf ini lebih jauh nanti.
sumber
Javascript / ES6, 97 karakter
Pemakaian
Penjelasan
sumber
n<m?console.log(o):0
, Anda dapat menggunakann<m&&console.log(o)
yang menghemat 1 byte.CJam,
43 4136 bytesTidak terlalu bermain golf (saya pikir), tetapi inilah upaya pertama saya:
Bagaimana itu bekerja
Saya menggunakan fakta yang sangat berguna itu
)
dan(
di CJam berarti kenaikan dan penurunan masing-masing. Jadi, saya hanya mengevaluasi tanda kurung untuk mendapatkan kedalaman.Cobalah online di sini
sumber
Oktaf, 85 karakter
Ini merupakan optimasi dari pendekatan naif, yang sebenarnya cukup alami untuk Matlab dan Oktaf:
Tabel
t
mungkin bahkan belum ada, dan kami dapat menetapkan untuk setiap elemen segera, dan itu membentuk kembali ke dimensi terkecil yang diperlukan agar elemen ini ada yang cukup nyaman.sumber
Perl,
918988848079 bytesumber
Haskell, 154 byte
ide yang sama dengan solusi Haskell lainnya, tetapi agak lebih pendek. - Penggunaan:
sumber
J, 46
Tidak sehebat 'bahasa golf' lainnya, tetapi dalam pembelaan saya: J mengerikan dengan string.
Mengambil string sebagai input untuk suatu fungsi. Mungkin juga ada cara yang lebih baik untuk melakukannya di J.
Pemakaian:
sumber
Ruby,
119115114 114Penjelasan:
sumber
Java,
233214 byteBertakuk:
Saya kira putaran terakhir bisa diperpendek, tetapi saya akan membiarkannya sebagai latihan bagi pembaca. ;-)
Lama, 233 byte menjawab:
Bertakuk:
sumber
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
kefor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
untuk -1 byte. Selain itu, Anda dapat menyimpan 2 byte lebih banyak dengan menghapusp=x=0
dan hanya menggunakanint p=0,x=0,
inisialisasi bidang sebagai gantinya. Totalnya menjadi 211 byte .C #, 195 byte
Pertama-tama coba golf - berteriak jika saya melakukan kesalahan.
Versi C # alternatif menggunakan SetCursorPosition dan bekerja dari kiri ke kanan mengambil input sebagai arg baris perintah.
Saya pikir akan menyenangkan untuk menyesuaikan posisi penulisan berdasarkan pada buka / tutup paren dan bukan garis penuh. Tutup paren menggerakkan posisi ke atas sebelum menulis; buka paren memindahkannya ke bawah setelah menulis. Actioning SetCursorPosition menghemat lima byte. Memindahkan kursor ke baris berikutnya setelah output akan mengambil sedikit tambahan.
sumber
Batch,
356335 byteSaya tahu bahwa sudah ada solusi Batch untuk tantangan ini, tetapi yang satu ini lebih banyak bermain golf dan sepertinya mengambil pendekatan yang berbeda. Yang paling penting, solusi batch lainnya mengandung setidaknya satu perintah PowerShell; solusi ini tidak.
Ada karakter backspace (
U+0008
) pada baris kedua hingga terakhir setelah titik (baris 12, kolom 57). Ini tidak terlihat dalam kode yang diposting di sini tetapi termasuk dalam jumlah byte.sumber
Batch, 424 byte
Tidak golf:
Contoh:
sumber
C,
118117 BytesJawaban lain dalam C, tetapi jawaban saya lebih pendek.
Versi tidak disatukan:
Dan itu berhasil!
sumber
putchar(c-d?32:*p)
satu karakter lebih pendek dariputchar(c==d?*p:32)
.Haskell, 227 byte
sumber
n#[]
Alih-alihm n []
.Perl, 76 byte
Tidak
use strict
disini :)sumber
Lex, 94 byte
Tergantung pada kode konsol Linux. Dengan gcc, Anda dapat memotong empat byte dengan mengganti kedua instance
\33
dengan karakter escape yang sebenarnya.Untuk mengkompilasi dan menjalankan:
sumber