Nel linguaggio di programmazione esoterico Ricci, i programmi consistono esclusivamente di parentesi graffe {}
e punti e virgola ;
. Nonostante questo umile set di strumenti, Curly ha letterali che possono rappresentare qualsiasi numero intero non negativo. Il formato è un po 'difficile da leggere per chi non lo sapesse, quindi scriviamo del codice per fare la conversione per noi.
Formato dei numeri
I numeri ricci sono strutturati secondo le seguenti regole:
- L'aggiunta di un punto e virgola aggiunge uno al numero.
- Un numero racchiuso tra parentesi graffe viene moltiplicato per quattro.
- I gruppi di parentesi graffe possono essere nidificati ma non concatenati. Le parentesi graffe devono corrispondere correttamente.
- I punti e virgola all'esterno di una serie di parentesi graffe devono venire dopo, non prima.
- Per evitare ambiguità nell'analisi, un numero deve sempre iniziare con una parentesi graffa.
Qualche esempio:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Nota che la regola 5 indica che i numeri da 0 a 3 devono iniziare con una coppia vuota di parentesi graffe.)
E alcuni esempi non validi:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Ecco una grammatica BNF per i numeri ricci:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Numeri come {;;;;}
(più di 3 punti e virgola di seguito) o {{};}
(inutili gruppi di parentesi graffe vuote) sono chiamati numeri ricci impropri . Obbediscono alla grammatica sopra e possono essere valutati nel solito modo, ma sono anche capaci di rappresentazioni più brevi (per gli esempi sopra {{;}}
e {;}
rispettivamente).
La sfida
Scrivi un programma o una funzione che inserisce / riceve una stringa. Se la stringa è un numero intero decimale non negativo, visualizza / restituisce la rappresentazione riccia corretta (ovvero il più breve possibile) per quel numero intero. Se la stringa è un numero riccio, emette / restituisce la sua rappresentazione decimale.
L'ingresso può essere ricevuto tramite STDIN, argomento della riga di comando o parametro della funzione. Essa deve essere una stringa; vale a dire, non è possibile scrivere una funzione che accetta stringhe per numeri ricci ma numeri interi per numeri decimali.
L'output può essere stampato su STDOUT o restituito dalla funzione. Una funzione può restituire un numero intero quando appropriato, oppure può restituire stringhe in tutte le situazioni.
Il vostro programma non ha bisogno di gestire input non validi (numeri ricci che infrangono le regole di formattazione, numeri in virgola mobile, numeri interi negativi, testo casuale), ed è non necessario per gestire i numeri Curly improprie (ma vedi sotto). L'input consisterà solo di caratteri ASCII stampabili.
punteggio
Vince il codice più breve in byte. Se il tuo programma può eseguire entrambe le seguenti operazioni:
- gestire correttamente i numeri ricci impropri e
- quando viene assegnato un numero Ricci, ignora eventuali caratteri extra che non lo sono
{};
quindi sottrai il 10% dal tuo punteggio. (L'input intero non avrà mai caratteri estranei, nemmeno per il bonus.)
Casi test
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Per il bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Nota: Curly non è ancora implementato. Ma se questa domanda va bene, posso svilupparla ulteriormente.