Dalam bahasa pemrograman esoterik Curly, program hanya terdiri dari kurung kurawal {}
dan titik koma ;
. Meskipun toolset sederhana ini, Curly memiliki literal yang dapat mewakili bilangan bulat negatif. Formatnya agak sulit bagi yang belum tahu untuk membaca, jadi mari kita menulis beberapa kode untuk melakukan konversi untuk kita.
Format angka
Angka keriting disusun berdasarkan aturan berikut:
- Menambahkan titik koma menambahkan satu ke nomor tersebut.
- Angka yang disertakan dalam kurung kurawal dikalikan empat.
- Kelompok kurung kurawal mungkin bersarang tetapi tidak disatukan. Kawat gigi harus cocok dengan benar.
- Titik koma di luar satu set kawat gigi keriting harus datang sesudahnya, bukan sebelumnya.
- Untuk menghindari ambiguitas dalam penguraian, angka harus selalu dimulai dengan kurung kurawal.
Beberapa contoh:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Perhatikan bahwa aturan 5 berarti angka 0 hingga 3 harus dimulai dengan sepasang kurung kurawal yang kosong.)
Dan beberapa contoh tidak valid:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Berikut ini adalah tata bahasa BNF untuk angka Curly:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Angka seperti {;;;;}
(lebih dari 3 titik koma berturut-turut) atau {{};}
(kelompok kurung kosong yang tidak perlu) disebut angka Keriting yang tidak tepat . Mereka mematuhi tata bahasa di atas dan dapat dievaluasi dengan cara biasa, tetapi mereka juga mampu representasi yang lebih pendek (untuk contoh di atas, {{;}}
dan {;}
masing - masing).
Tantangan
Tulis program atau fungsi yang menginput / menerima string. Jika string adalah bilangan bulat desimal negatif, output / kembalikan representasi Keriting yang tepat (sesingkat mungkin) untuk bilangan bulat itu. Jika string adalah angka Keriting, output / kembalikan representasi desimalnya.
Input dapat diterima melalui STDIN, argumen baris perintah, atau parameter fungsi. Itu harus berupa string; artinya, Anda tidak boleh menulis fungsi yang menerima string untuk angka Keriting tetapi bilangan bulat untuk angka desimal.
Output dapat dicetak ke STDOUT atau dikembalikan dari fungsi. Suatu fungsi dapat mengembalikan bilangan bulat jika perlu, atau dapat mengembalikan string dalam semua situasi.
Program Anda tidak harus menangani input yang buruk (Angka keriting yang melanggar aturan pemformatan, angka titik mengambang, bilangan bulat negatif, teks acak), dan tidak perlu menangani angka Keriting yang tidak benar (tetapi lihat di bawah). Input hanya akan terdiri dari karakter ASCII yang dapat dicetak.
Mencetak gol
Kode terpendek dalam byte menang. Jika program Anda dapat melakukan kedua hal berikut:
- menangani nomor Keriting yang tidak benar, dan
- ketika diberi nomor Keriting, abaikan karakter tambahan yang tidak
{};
lalu kurangi 10% dari skor Anda. (Input integer tidak akan pernah memiliki karakter asing, bahkan untuk bonus.)
Uji kasus
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Untuk bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Catatan: Curly belum diimplementasikan. Tetapi jika pertanyaan ini berhasil, saya dapat mengembangkannya lebih lanjut.
sumber
Jawaban:
Pyth,
3532 byte - 10% = 28,8Cobalah online: Demonstrasi atau Test Suite
sunting: Ternyata, saya tidak sengaja juga dapat menangani Angka Keriting yang tidak tepat. Tidak direncanakan sama sekali. ;-)
Penjelasan:
Ada dua ekspresi dalam kode. Yang pertama mengubah angka menjadi Nomor Keriting, dan yang kedua mengubah Nomor Keriting menjadi angka biasa.
.x
menangani, ekspresi mana yang akan dicetak. Ini akan mencoba untuk mencetak ekspresi pertama. Jika ada non-digit dalam input, ekspresi pertama gagal (melalui Pengecualian)..x
menangkap Pengecualian dan mencetak yang kedua.sumber
.[Z2
itu perlu.CJam,
51474441 byteCobalah online: contoh jalankan | test suite
Bagaimana itu bekerja
sumber
Python 2, 167 byte - 10% = 150,3
Dalam implementasi ini,
c
adalah fungsi yang memenuhi persyaratan. Ini mengembalikan string jika diberi bilangan bulat negatif sebagai input, atau bilangan bulat jika diberi angka keriting sebagai input.sumber
Python 266 byte - 10% =
1268.1326.7239,4 byteAnak saya tidak pegolf kode belum = /, tapi itu 10% membantu saya keluar banyak ketika skor saya masih lebih dari 1000!
Saya memiliki versi yang lengkap (dan verbose) dari kode ini di sini. Ini akan mengenali validitas angka keriting, dan menyediakan antarmuka melingkar untuk memasukkan angka untuk pengujian.
(Komentar hanya untuk klarifikasi)
Lihat kode ini dalam aksi
Terima kasih kepada Erik Konstantopoulos untuk pengurangan byte utama! Bisa dibilang ... dia benar-benar mengambil ... byte ... dari kode saya ... * self five *
sumber
print
pernyataan dan komentar yang tidak diminta , nama variabel Anda terlalu panjang dan beberapa spasi kosong dapat dihilangkan. Saya juga merekomendasikan membaca Tips untuk bermain golf di Pyrhon .value
kev
dll), 3) lakukan permainan golf yang pintar : ini adalah titik di mana Anda perlu melihat tautan Dennis. Saya ingin tahu berapa banyak Anda dapat mengurangi ini!Skor CJam,
87 byte80,1 (89 byte - 10% bonus)Perbarui versi yang memenuhi syarat untuk bonus sambil bertambah 2 byte:
Cobalah online
Pertama kali saya menggunakan rekursi di CJam! Semuanya mungkin terlihat agak panjang, tetapi dua konversi yang sepenuhnya terpisah bertambah.
Saya menggunakan kasing yang sepenuhnya terpisah untuk mengonversi angka yang lebih kecil dari 4 ke Curly. Mungkin mungkin untuk menghindari itu, tetapi melipat penanganan kasus khusus ke dalam fungsi rekursif tidak akan sepenuhnya sepele. Dan menambahkan ekstra
{}
sebagai langkah pasca-pemrosesan tidak benar-benar terlihat lebih baik, meskipun saya harus mencoba lagi jika mungkin sedikit lebih pendek.sumber
C #, 173 - 10% = 155,7
171.0, 177.3Ini tidak valid dan hanya mencari
;
dan}
karakter. Ini mengasumsikan semua{
karakter datang sebelum;
karakter apa pun . Hal tersulit yang saya temukan adalah untuk tidak memasukkan{}
di tengah angka keriting.Jeda baris dan indentasi untuk kejelasan:
sumber
Java 326 byte - 10% = 294 byte
Ini adalah program lengkap yang ditulis dalam java,
Saya yakin ini bisa jauh lebih pendek tetapi saya tidak punya banyak waktu sekarang untuk mengoptimalkannya
sumber
public
kelas sebelumpublic static void main(String[]c){
denganstatic{
GNU sed,
330326 - 10% = 293,4(Saya menambahkan satu untuk penggunaan
-r
sebelum mengklaim bonus 10%; Saya harap itu benar)Versi lengkap menunjukkan bahwa sebagian besar di atas adalah konversi antara desimal dan unary:
sumber
Perl,
183177Ini mungkin bukan jawaban Perl terpendek, tapi saya pikir itu cukup menarik untuk dikirim (input
$_
, output sebagai nilai balik):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Kami mengamati bahwa Curly hanyalah notasi kuartener (basis-4). Kami sedikit terhambat oleh kurangnya dukungan asli untuk kuernener, tetapi untungnya, setiap quaternit adalah dua bit dalam biner, dan kita dapat membaca dan menulis biner. Jadi kami memiliki yang berikut:
Versi yang diperluas
sumber
JavaScript (ES6), 95 (105-10%)
Tes menjalankan cuplikan di bawah ini
sumber
Ruby,
126.9129.6 (144 - 10%)Menggunakan rekursi untuk mengubah desimal menjadi bentuk keriting. Menghapus centang untuk mengabaikan karakter di luar
/[;{}]/
meningkatkan skor0.4
saat ini.sumber
Perl 5, 154 (
185170 Bytes - 10% + 1 Denda)Regex & eval menyelesaikan curlies.
Generasi ikal dilakukan secara berbeda.
Uji
File tes juga berisi kasus bonus
sumber
Retina ,
6964 byteCoba Test Suite
Penjelasan
Membusuk kawat gigi terdalam menjadi hanya
;
s. Ulangi sampai tidak ada lagi kawat gigi.Konversi antara desimal dan unary
;
Temukan jangka terpanjang dari
;
itu adalah kelipatan dari 4 dan bersarang ke dalam kawat gigi, lingkaran sampai tidak ada lagi berjalan dari 4+.Jika nomor keriting yang dihasilkan dimulai dengan
;
atau string kosong, tambahkan{}
di depan.sumber
Python 2 , 157 byte -10% = 141,3
Cobalah online!
Jawaban Python 2 yang lebih golf yang menangani kasus bonus. Tidak ingin menghapus posting yang mati dengan ini sebagai komentar, jadi ini dia.
Ini bekerja dari dalam ke dalam pada angka-angka keriting, menambahkan 4 ^ (jumlah kurung keriting ujung yang tersisa di string) ke jumlah untuk setiap titik koma yang ditemukan. Jika string adalah angka, maka secara rekursif menciptakan angka keriting dengan cara yang sama seperti tata bahasa yang disediakan.
sumber