W ezoterycznym języku programowania Curly programy składają się wyłącznie z nawiasów klamrowych {}
i średników ;
. Pomimo tego skromnego zestawu narzędzi, Curly ma literały, które mogą reprezentować dowolną nieujemną liczbę całkowitą. Format jest jednak nieco trudny do odczytania przez niewtajemniczonych, więc napiszmy kod, który przeprowadzi dla nas konwersję.
Format liczb
Liczby kręcone są uporządkowane zgodnie z następującymi zasadami:
- Dodanie średnika dodaje jeden do liczby.
- Liczba zamknięta w nawiasy klamrowe jest mnożona przez cztery.
- Grupy nawiasów klamrowych mogą być zagnieżdżone, ale nie łączone. Nawiasy klamrowe muszą być odpowiednio dopasowane.
- Średniki poza zestawem nawiasów klamrowych muszą pojawić się później, a nie wcześniej.
- Aby uniknąć dwuznaczności podczas analizowania, liczba musi zawsze zaczynać się od nawiasów klamrowych.
Kilka przykładów:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Uwaga: reguła 5 oznacza, że liczby od 0 do 3 muszą zaczynać się od pustej pary nawiasów klamrowych).
I niektóre nieprawidłowe przykłady:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Oto gramatyka BNF dla liczb kręconych:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Liczby takie jak {;;;;}
(więcej niż 3 średniki z rzędu) lub {{};}
(niepotrzebne puste grupy nawiasów klamrowych) są nazywane nieprawidłowymi liczbami kręconymi. Przestrzegać ich wyżej gramatyki i może być rozpatrywane w zwykły sposób, ale są również zdolne do krótszych przedstawień (w powyższych przykładach, {{;}}
a {;}
odpowiednio).
Wyzwanie
Napisz program lub funkcję, która wprowadza / odbiera ciąg znaków. Jeśli ciąg jest nieujemną liczbą całkowitą dziesiętną, wyślij / zwróć odpowiednią (tj. Najkrótszą możliwą) reprezentację Curly dla tej liczby całkowitej. Jeśli ciąg jest liczbą Curly, wyślij / zwróć jego reprezentację dziesiętną.
Dane wejściowe można odbierać za pomocą STDIN, argumentu wiersza poleceń lub parametru funkcji. To musi być sznurek; to znaczy, nie możesz napisać funkcji, która akceptuje łańcuchy dla liczb Curly, ale liczby całkowite dla liczb dziesiętnych.
Wyjście można wydrukować do STDOUT lub zwrócić z funkcji. Funkcja może zwracać liczbę całkowitą, gdy jest to właściwe, lub może zwracać ciągi we wszystkich sytuacjach.
Twój program nie musi obsługiwać złe wejście (liczby Curly, które łamią zasady formatowanie liczb zmiennoprzecinkowych, ujemnych liczb całkowitych, tekst losowe), a to jest nie muszą obsługiwać niewłaściwych numerów Curly (ale patrz niżej). Dane wejściowe będą składały się wyłącznie z drukowalnych znaków ASCII.
Punktacja
Najkrótszy kod w bajtach wygrywa. Jeśli Twój program może wykonać obie następujące czynności:
- poprawnie obsługiwać niewłaściwe liczby kręcone, oraz
- po otrzymaniu liczby Curly zignoruj dodatkowe znaki, które nie są
{};
następnie odejmij 10% od swojego wyniku. (Dane liczbowe całkowite nigdy nie będą miały obcych znaków, nawet dla bonusu).
Przypadki testowe
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Aby otrzymać bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Uwaga: Curly nie jest jeszcze zaimplementowany. Ale jeśli to pytanie się powiedzie, mogę je rozwinąć.