Pertanyaan ini adalah bagian dari seri Tantangan Ulang Tahun Brain-flak yang dirancang untuk merayakan Ulang Tahun pertama Brain-Flak. Anda dapat menemukan informasi lebih lanjut tentang Ulang Tahun Brain-Flak di sini .
Hari ini adalah Ulang Tahun pertama Brain-Flak! Jadi saya pikir kami akan mengadakan pesta ulang tahun kejutan. Jadi, cetak bahasa favorit Anda
Surprise!
Happy Birthday, Brain-Flak!
(Trailing whitespace diizinkan)
Seperti biasa program harus golf. Namun karena program Brain-Flak terbuat dari tanda kurung, itu tidak akan menghitung tanda kurung di sumber Anda terhadap Anda. (Karakter ()[]<>{}
tidak dihitung terhadap total byte Anda), tetapi mereka harus seimbang agar tidak mengecewakan Brain-Flak.
Aturan
Berikut ini rincian aturannya
Kurung di sumber Anda harus seimbang. Itu adalah tanda kurung program Anda harus membentang oleh tata bahasa berikut:
S -> SS | (S) | [S] | <S> | {S} | E
di mana
E
string kosong.Dengan kata lain, string seimbang adalah gabungan dari dua string seimbang, kawat gigi di sekitar string seimbang, atau string kosong.
Skor suatu program adalah jumlah byte non-braket.
Tujuan Anda adalah meminimalkan nilai Anda dalam bahasa apa pun yang Anda pilih.
Aturan standar berlaku sehingga Anda dapat menulis program atau fungsi yang lengkap.
dalam hal jumlah byte mentah tie bertindak sebagai tie breaker
Tentu saja akan ada solusi nol byte dalam bahasa tertentu ( Parenthesis Hell , Parenthetic , Glypho , Lenguage ). Cobalah untuk menemukan cara untuk bermain golf dengan baik dalam bahasa-bahasa di mana ini bukan tugas yang sepele.
sumber
><
dianggap seimbang, atau apakah kawat gigi harus dalam urutan yang benar (<>
)?Jawaban:
Python 2 ,
39373634 byte-1 berkat dzaima
-2 Terima kasih kepada Erik the Outgolfer
Cobalah online!
Karakter yang relevan:
Penjelasan
Program ini membangun string:
Ini dilakukan dengan mengubah string kurung panjang menjadi kode karakter. Setelah string dibangun, dieksekusi.
Itu membangun string dengan kerangka:
Ini membagi string di sepanjang
{}
dan memetakan setiap bagian ke kode karakter yang sesuai dengan panjangnya. Kami kemudian dapat membangun seluruh string dari parens dengan biaya nol byte.sumber
()
sekitarx
untuk menyimpan 2.Haskell (sebelum GHC 8.4), (
10119 7767 76267540 bytes), skor15 1410Cobalah online!
Baris terakhir mendefinisikan fungsi anonim
(<>)'y'pred(:)
. Panggil dengan(<>)'y'pred(:)()
untuk menghasilkan string.Sunting: Terima kasih banyak kepada @ Ørjan Johansen karena menyarankan untuk melewatkan fungsi helper sebagai parameter alih-alih mendeklarasikannya, menghemat empat byte penilaian!
Bytes non-braket adalah
Bagaimana cara kerjanya?
Sebuah string
"wxy"
di Haskell adalah sintaksis gula untuk daftar karakter['w','x','y']
, yang sekali lagi merupakan sintaksis gula untuk pembangunan selanjutnya dengan operator kontra:
dan daftar kosong:'w':'x':'y':[]
. Dengan mendefinisikan(<<>>)=(:)
kita menghasilkan string yang sama dengan menulis'w'<<>>('x'<<>>('y'<<>>[]))
.Karena karakter dipesan, kita dapat menghitung pendahulu dari masing-masing karakter dengan fungsi yang disebut
pred
. Hanya menggunakan char'y'
danpred
, string menjadipred(pred 'y')<<>>(pred 'y'<<>>('y'<<>>[]))
. Dengan mendefinisikan(<>)=pred
dan(<><>)='y'
kami dapat mewakili string hanya menggunakan tanda kurung seimbang:(<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[]))
Namun, pada akhirnya kami tidak menginginkan string tetapi fungsi mengembalikan string, jadi kami mendefinisikan operator kontra kami sebagai
(<<>>) x xs ()=x:xs
gantinya. (Tentu saja denganx
danxs
digantikan oleh pengidentifikasi menggunakan tanda kurung seimbang saja:)(<<>>)(<>)(<><>)()=(<>):(<><>)
. Cara ini,((<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[])())())
adalah fungsi ketik
() -> String
dan menambahkan()
hasil akhir string asli:((<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[])())())()
Dengan menggunakan metode ini kami mencapai solusi dengan skor 15. Namun, kita dapat menyingkat tiga deklarasi menjadi satu dengan menyatakan fungsi yang mengambil empat argumen:
'z'
,pred
,(:)
dan()
untuk menelepon.Fungsi berikut
encode
mengkodekan string dengan karakter yang lebih kecil atau sama dengan'y'
dengan cara ini: (Mengapay
? Karena itu karakter terbesar"Surprise!\nHappy Birthday, Brain-Flak!"
dan karenanya menghasilkan representasi terpendek. Sekali lagi terima kasih kepada Ørjan Johansen untuk menunjukkan ini.)Cobalah online!
sumber
'z'
tidak benar-benar terjadi di string tujuan, saya pikir Anda dapat mengurangi byte tie breaker dengan menggunakan'y'
gantinya.(<<<>>>)(<><>)(<>)(<<>>)()=...;(<<<>>>)'y'pred(:)
Retina , 59 - 24 = 35 byte
Cobalah online! Sebagai perbandingan, solusi yang membosankan membutuhkan 38 byte.
sumber
Jelly ,
76 byteDi dalam
“”
Anda perlu meletakkan output dari program Jelly ini:-1 byte terima kasih kepada Jonathan Allan (diizinkan mengikuti baris baru)
Ada 53127666317289661939246122975355844970973062889031671423309402549417051416384149 80886139013 (kami akan menyebutnya
n
)()
di antaranya“”
.Penjelasan :
sumber
Bahasa , 0 byte
Hanya 10024793746353848520175158940670214213802394805963081469362831141755126591573942436182287015467334956253918417576118983828148929806934751198148656645940502264502520032312455157880058174845907554602116807351044784410936407102892289953027884533102082518964744402664917253792543505897552998982122997648280947470217067174451441654554437678556775097996646071948 byte terbuat dari kurung seimbang.
Program Python 3 untuk menghasilkan versi favorit saya, diberikan cukup waktu dan memori:
sumber
Haskell , (
1200613485 bytes), skor1817EDIT:
toEnum
versi berfungsi tanpa ekstensi dengan memindahkannyatoEnum
ke fungsi utama, dengan biaya a$
.Gunakan sebagai
putStrLn$(<<>>)()
.Cobalah online!
di mana
...
string hasil dari ekspresi berikut:Satu-satunya karakter yang tidak seimbang adalah
Varian berikut (13484 bytes) memiliki skor 16 kecuali bahwa ia membutuhkan
ExtendedDefaultRules
ekstensi GHC , dan karenanya hanya berfungsi di GHCi secara default. (Kecuali jika Anda suka banyak peringatan, Anda juga ingin-fdefer-type-errors
dan-Wno-deferred-type-errors
untuk beberapa alasan.)Cobalah online!
Bagaimana itu bekerja
<>
merupakan karakter operator yang sah. Selain itu, jika di-kurung, ini dapat digunakan untuk nilai apa pun, bukan hanya fungsi dua argumen.(<<>>)
pada baris kedua adalah fungsi utama, dibutuhkan argumen dummy tunggal()
dan mengembalikan string terakhir.<>
mengambil dua daftar dan menambahkan panjang dari yang kedua ke yang pertama (dalam versi kedua, juga pertama mengonversi panjang menjadi karakter.) Operator dibiarkan asosiatif secara default, sehingga ini mudah terhubung.[]
dengan<>
.()<>[]
karakter seimbang - dan kemudian (dalam versi utama) pemetaantoEnum
atas daftar yang dihasilkan.sumber
Japt ,
1914131098 bytedi mana string di awal adalah:
Jumlah total byte adalah "hanya"
669433943354, jadi Anda dapat mencobanya secara online!Penjelasan
Metode aktual yang digunakan dijelaskan dalam jawaban lain: Membagi
<>
, memetakan setiap menjalankan parens untukchr(len(x))
, bergabung lagi pada string kosong. Di sini, golf adalah bagian yang menyenangkan.Sebelum "bermain golf", kode aslinya mungkin terlihat seperti
yang merupakan deskripsi yang sangat literal:
"...".split("<>").map(Z => Z.length.toChar()).join("")
Sekarang kita perlu meminimalkan karakter non-braket. Bagaimana? Nah, pertama kita bisa melakukan beberapa golf aktual:Ini kira-kira mewakili
"...".split("<>").map(Z => Z.length).map(Z => Z.toChar()).join()
.Sekarang kita dapat menyalahgunakan cara membingungkan Japt memperlakukan kurung.
(
mewakili naik satu tingkat, seperti dalam kebanyakan bahasa, tetapi)
mewakili turun dua tingkat (spasi turun satu tingkat), yang berarti kita dapat mengoptimalkan kode untuk:Kode ini berfungsi sama seperti di atas, tetapi menggunakan dua karakter non-bracket yang lebih sedikit.
Selain itu, jika operator adalah input pertama ke suatu fungsi, itu akan berubah menjadi string sehingga fungsi dapat memutuskan apa yang harus dilakukan dengannya. Ini berarti bahwa kita dapat menghindari tanda kutip jika kita membuat setiap tanda kurung pendek 1 byte lebih pendek, dan memecahnya
>
(dengan beberapa pengaturan pintar untuk membatalkan yang dihasilkan>)
dalam kode):Ini menghemat dua byte lebih lanjut, karena kami mengeluarkan dua tanda kutip.
sumber
Haskell , (
1965 313118073 bytes), skor31 2319Cobalah online! Penggunaan: Baris terakhir adalah fungsi anonim. Ikatkan ke mis
f
dan panggil denganf()
.19 byte non-braket adalah
ditambah baris baru yang tertinggal.
Skor 23 versi (3131 byte):
Cobalah online! 23 byte non-braket adalah
Versi skor 31 (1965 byte):
Cobalah online!
Setelah semua tanda kurung dilepas, 31 byte ini tetap:
Bagaimana cara kerjanya?
['\n'..'~']
menghasilkan daftar semua karakter dari baris baru~
yang mencakup semua karakter ASCII yang dapat dicetak.(<<>>)
adalah pengidentifikasi yang dipilih untuk memiliki nol byte di bawah aturan penilaian yang diberikan.(<<>>)=['\n'..'~']++(<<>>)
dengan demikian menghasilkan pengulangan tak terbatas dari daftar karakter.Pada baris kedua
zip"> ... "(<<>>)
ritsleting string kurung panjang dengan string tak hingga, menghasilkan daftar tupel dengan braket braket di komponen pertama dan beberapa arang ASCII di baris kedua. Untuk setiap tuple dalam daftar ini, kami memeriksa apakah cocok dengan pola('{'{-}-},(<>))
, yaitu apakah memiliki{
braket sebagai komponen pertama.{- ... -}
adalah komentar in - line di Haskell, jadi'{'{-}-}
ini adalah versi seimbang'{'
. Jika pertandingan berhasil, komponen kedua tuple adalah ikatan ke pengidentifikasi(<>)
dan ditambahkan ke string build melalui daftar pemahaman. AkhirnyaputStr
mencetak string.putStr[(<>)|('{'{-}-},(<>))<-zip"> ... "(<<>>)]
Mencetak string secara langsung adalah 46 byte:
sumber
HTML, 37 Bytes
sumber
<br>
tag seperti ini:Surprise!<br>Happy Birthday, Brain-Flak!
<br>
satu byte lebih lama karena<p>
saya sudah mencobanya sebelum memposting. Terlihat sedikit lebih bagus. Saya tidak menggunakan tag penutup<p>
.05AB1E , 24 byte
Menggunakan penyandian 05AB1E . Cobalah online!
sumber
Pyth,
4⃠3⃠2 byteMencoret 4 tidak teratur 4 jika Anda menggunakan
zalgoUnicode magicTerima kasih kepada Roman Gräf dan Neil karena telah menghemat 1 byte.
Kode ini adalah
Cl(()()()
... di()()())
mana tanda kurung luar berisi41505989310382548390036033574496753883572705382055993299460470741732071419050117038172961
salinan gabungan()
. (Stack Exchange tidak mengizinkan saya memposting kode lengkap.)Membuat tuple (
(
...)
) dari tuple kosong (()
), mengambil panjang (l
) dan mengubahnya menjadi string base-256 (C
).sumber
h
tidak bisa Anda hanya menambahkan sepasang kurung?h
kedua posisi ke kanan dan itu akan tetap bekerja dengan sempurna ;-)Japt , 6687 bytes, skor 5
Cobalah online!
Ini berada dalam nada yang sama dengan jawaban Japt saya yang lain , tetapi menggunakan array bersarang alih-alih string. Hal-hal baik tentang array bersarang (selain fakta bahwa mendefinisikan mereka tidak mengambil byte) adalah mereka pra-terorganisir, sehingga Anda tidak perlu melakukan
<>
sihir split-on- ajaib, atau memecahkan kode dari besar mendasarkan nomor 256, atau semacamnya. Logikanya sebenarnya adil.map(X => X.length).map(X => String.fromCharCode(X)).join("")
.sumber
Chip , 553 + 3 = 556 byte, skor 127 + 3 = 130
+3 untuk arg
-w
. Cobalah online!Bytes non-braket adalah
Tidak disatukan / tidak seimbang:
Seperti yang Anda lihat, kode asli hanya menggunakan tanda kurung sisi kanan, jadi semua tanda kurung sisi kiri hanya untuk menyeimbangkan. Dalam perjalanan untuk datang dengan solusi ini, saya menemukan representasi string yang jauh lebih padat di Chip yang saya miliki untuk jawaban saya sebelumnya misalnya halo dunia , dan jadi saya telah memperbarui itu juga.
Bagaimana itu bekerja:
Bit yang menggantung dari kiri menghasilkan pulsa 1 siklus untuk memulai sesuatu. Denyut nadi ini bergerak di sepanjang
Z
's pada tingkat 1 per siklus, yang menyediakan waktu. Ketika masingZ
- masing diaktifkan, kolom yang sesuai menghasilkan kode ascii dari karakter pada indeks itu, yang kemudian mendapatkan outputa
melalui elemen melaluig
(satu per bit dari byte keluaran, kecuali bit tinggih
yang selalu 0). Setelah selesai,t
penghentian eksekusi.Pengkodean ascii sangat mudah:
)
berarti 1 danx
berarti 0. Namun, sebagian besar baris 5 bawahx
, jadi saya membalikkan bit-bit dalam solusi akhir, secara efektif menukar dua simbol.Apakah ini skor terbaik?
Aku meragukan itu. Pada tingkat minimum absolut, saya pikir kita perlu yang berikut: masing
a
- masing melaluig
, karena itu adalah bit output aktif, 1*
atau serupa untuk memberikan sinyal awal, 1t
untuk mengakhiri eksekusi, 36Z
detik atauz
s untuk timeout setiap huruf, dan perintah arg-w
. Ini semua berjumlah skor 48.Di atas minimum teoretis, solusi saya memiliki 7 baris baru, satu detik
*
, ekstraZ
, dan 73x
detik.sumber
C, 9265 byte, skor 37
Lihat itu berfungsi online .
C, 8589934626 byte, skor 34
Dimana
STRING
string string besar yang sama seperti yang digunakan dalam contoh di atas, kecuali bahwa ia memiliki dua perbedaan di tengah-tengah string di mana ada substring<>
. Tepat sebelumnya<
, ada 4294962688[
karakter tambahan , dan hanya>
4294962688]
karakter tambahan .Program akan bekerja berdasarkan asumsi berikut:
INT_MAX adalah 2 ^ 31-1, dan INT_MIN adalah -2 ^ 31.
Dikompilasi dengan perilaku pembungkus untuk aritmatika yang ditandatangani. (-fwrapv)
Fungsi strspn mampu memproses 4294962689 karakter sekaligus.
Compiler mampu mengkompilasi string literal yang terdiri dari 8589934592 karakter.
Asumsi tersebut dimungkinkan pada arsitektur 64 bit modern, di mana tipe int adalah 4 byte dan tipe size_t adalah 8 byte. Fungsi strspn mengembalikan tipe size_t, dan tipe yang sama terkait dengan batas internal untuk ukuran objek maksimum. Ketik size_t menjadi 8 byte akan memenuhi dua asumsi terakhir.
Perbedaan dalam versi ini adalah bahwa variabel saya tidak harus diatur ulang ke 0, karena itu membungkus ke 0 setelah karakter terakhir dicetak.
sumber
Haskell , 9735 bytes, skor 9
Cobalah online!
9 byte scoring adalah
Ini berfungsi di versi Haskell saat ini (GHC 8.4 atau lebih baru) di mana
(<>)
berada diPrelude
. Terima kasih kepada Ørjan Johansen karena menunjukkan bahwa ini memecah solusi saya sebelumnya tetapi memungkinkan untuk menyimpan byte skor yang lain.Penjelasan
Karena
(<>)
pada dua daftar sama dengan(++)
, kita dapat mewakili string"abc"
sebagai"a"<>"b"<>"c"
gantinya. String adalah daftar karakter, jadi['a']<>['b']<>['c']
menunjukkan string yang sama. Sekarang, seperti dalam jawaban sebelumnya, kami hanya ingin karakter literal tunggal, jadi kami tetap dengan dia satu tertinggi'c'
dan mewakili orang lain sebagai pendahulu dari itu:[pred(pred 'c')]<>[pred 'c']<>['c']
. Akhirnya, dengan mengganti'c'
dengan(<><>)
yang merupakan pengenal yang sah danpred
dengan(<<>>)
, kita mendapatkan pengkodean dari string"abc"
yang hanya terdiri dari kurung seimbang:[(<<>>)((<<>>)(<><>))]<>[(<<>>)(<><>)]<>[(<><>)]
.Fungsi berikut mengkode string arbitrer dengan cara ini:
Cobalah online!
sumber
(<<>>)
digunakan berkali-kali, saya pikir itu akan menghemat banyak byte jika Anda menukar namanya dengan<>
(dengan melewatkan yang terakhir sebagai parameter tambahan).C # Interaktif, 45 Bytes
Saya tahu, ini agak membosankan, tetapi jika dieksekusi di C # interaktif, itu menghasilkan output yang diinginkan - dan sebenarnya saya ragu ada cara yang lebih kecil untuk menyelesaikan ini dalam C #.
Namun, ada cara yang lebih sulit:
Tapi ini besar 145 Bytes.
Dengan jeda baris sepertinya:
Ini mengartikan tanda kurung sebagai nilai boolean dan kemudian sebagai string.
Sebenarnya saya bukan pegolf kode canggih, jadi saran sangat dihargai!
sumber
.Select(s =>
untuk mematuhinyaS -> <S>
, Anda dapat mengubahnya ke.Select(/*<*/s =>
C# Interactive
, juga saya pikir itu ditafsirkan dalam C # interaktif, tidak dikompilasi, tetapi masih dianggap sebagai program \ scriptCJam , 6683 byte, skor 3
Saya memperpendek kode di sini agar tidak terlalu mengacaukan halaman. Anda dapat melihat kode lengkap di tautan TIO. Satu-satunya karakter non-braket adalah
,c%
.Cobalah online!
Penjelasan
Program dimulai dengan mendorong array array array kosong. Setiap sub array berisi sejumlah array kosong yang sesuai dengan nilai ASCII dari karakter dalam string yang diinginkan. Kemudian untuk setiap subarray (
{...}%
), ia mendapatkan panjang array (,
) dan memberikan panjang itu ke karakter (c
).String yang dihasilkan dicetak secara implisit.
sumber
C,
6964 byteCoba Online
Bagaimana saya melakukannya
*
dengan{}
,>
dengan<>
, dan<
dengan[]
begitu mereka tidak menghitung, jadi sekarang jumlah kode ini adalah 1 karena karakter awalS
.<>
, mengurangi[]
, mencetak jumlah saat ini{}
, dan berakhir pada akhir string\0
.C, 49 byte Coba Online
sumber
p
untuk menyimpan beberapa byte?Lua 5.3, 108097107033101 byte, skor
2827Di sini,
REPLACE
digantikan oleh 108097107033034 string karakter panjang. String mengkodekan data dengan meletakkan{}
pada posisi kunci tertentu. Yang pertamagsub
akan mengganti string dengan indeks{}
s (melalui grup tangkap kosong()
). Yang keduagsub
memecah string yang dihasilkan ini menjadi blok 3-digit dan menggantikan setiap blok dengan representasi ASCII-nya.Perhatikan bahwa sintaks untuk string mentah dalam Lua adalah (pada dasarnya)
[[string contents]]
, yang cukup berguna dalam mengurangi skor.String (unescaped) yang saya hasilkan adalah
print"Surprise!\nHappy Birthday, Brain-Flak!"
. Mengganti setiap karakter dengan kode ASCII desimal 3 digitnya112114105110116034083117114112114105115101033092110072097112112121032066105114116104100097121044032066114097105110045070108097107033034
. Kode yang saya gunakan hanya dapat menghasilkan urutan peningkatan bilangan asli (setidaknya 2 terpisah) yang tidak dimulai dengan nol awal. Jadi, nomor ini terbagi menjadi11, 2114, 105110, 1160340, 83117114, 112114105, 1151010330, 9211007209, 71121121210, 320661051141, 1610410009712, 10440320661140, 97105110045070, 108097107033034
. (Angka terakhir ini persis panjangREPLACE
nilai, karena kecocokan terakhir dari pola akan memberikan indeks final}
, mencatat bahwa indeks Lua mulai dari 1. Jika angka terakhir aneh, maka pola dan string akan memiliki harus dimodifikasi sedikit, meskipun tidak sulit.)Saya tidak benar-benar menghasilkan dan menjalankan program ini karena terlalu besar (meskipun secara teoritis dapat bekerja pada mesin 64-bit, itu tidak muat di hard drive saya).
Sebagai bukti konsep, inilah program kecil yang mencetak
3
menggunakan prinsip yang sama:Ini menghasilkan string kode
p"3"
melalui angka112034051034
melalui split11, 203, 405, 1034
.sumber
Pip , 6681 byte, skor 3
(dengan banyak tanda kurung dan beberapa tanda kurung siku dihapus). Cobalah online!
Kami membuat daftar daftar, yang masing-masing berisi
()
(nihil) beberapa kali.#*
memetakan operator panjang, menghasilkan daftar angka.C
mengambil setiap nomor sebagai kode ASCII dan mengubahnya menjadi karakter. Daftar karakter yang dihasilkan kemudian secara otomatis digabungkan dan dicetak.Selamat ulang tahun, Brain-Flak!
sumber
Mathematica, 40 byte
Fungsi anonim. Tidak mengambil input dan mengembalikan string sebagai output.
sumber
Jelly ,
1921 byteSama sekali tidak ada yang pintar di sini, hanya kamus + kompresi string teks ditambah baris baru untuk menghapus yang tak tertandingi
<
.Untuk pendekatan yang benar-benar golf, lihat jawaban ini oleh Erik the Outgolfer.
Cobalah online!
sumber
PHP, 42 Bytes
Cobalah online!
-5 Bytes solusi yang membosankan
PHP, 60 Bytes
Cobalah online!
sumber
<?=""?>
Ditumpuk , skor 23
Di mana
...
string yang dihilangkan. (Ini dapat dihasilkan dengan ini .)Cobalah online!
Ya tidak begitu kreatif. Mendapat jumlah semua
<>
dan mengubahnya menjadi kode karakter.sumber
Perl 5 , 3304 byte, 16 skor
Cobalah online!
Menggunakan encoding jangka panjang HeebyJeebyMan's solusi Python teks.
sumber
Java, 140 byte
Coba Online
sumber
C, 52 byte, skor 46
Versi naif. Ini adalah versi yang dioptimalkan .
sumber
Arang , 37 byte
Cobalah online!
Hanya mencetak string.
sumber