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.