In der esoterischen Programmiersprache Curly bestehen Programme ausschließlich aus geschweiften Klammern {}
und Semikolons ;
. Trotz dieses bescheidenen Toolsets verfügt Curly über Literale, die eine beliebige nichtnegative Ganzzahl darstellen können. Das Format ist jedoch für die Uneingeweihten etwas schwierig zu lesen. Schreiben wir also Code, um die Konvertierung für uns durchzuführen.
Format der Zahlen
Geschweifte Zahlen sind nach folgenden Regeln aufgebaut:
- Durch Hinzufügen eines Semikolons wird die Zahl um eins erhöht.
- Eine Zahl in geschweiften Klammern wird mit vier multipliziert.
- Geschweifte Klammergruppen können verschachtelt, aber nicht verkettet sein. Hosenträger müssen richtig passen.
- Semikolons außerhalb einer Reihe von geschweiften Klammern müssen nachher kommen, nicht vorher.
- Um Mehrdeutigkeiten beim Parsen zu vermeiden, muss eine Zahl immer mit einer geschweiften Klammer beginnen.
Einige Beispiele:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Beachten Sie, dass Regel 5 bedeutet, dass die Zahlen 0 bis 3 mit einem leeren Paar geschweifter Klammern beginnen müssen.)
Und einige ungültige Beispiele:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Hier ist eine BNF-Grammatik für Curly-Zahlen:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Zahlen wie {;;;;}
(mehr als 3 Semikolons in einer Reihe) oder {{};}
(unnötige leere Klammergruppen) werden als falsche geschweifte Zahlen bezeichnet. Sie gehorchen die obige Grammatik und können in der üblichen Weise ausgewertet werden, aber sie sind auch in der Lage kürzerer Darstellungen (für die obigen Beispiele {{;}}
und {;}
respectively).
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge eingibt / empfängt. Wenn die Zeichenfolge eine nichtnegative Dezimalzahl ist, geben Sie die richtige (dh kürzestmögliche) Curly-Darstellung für diese Ganzzahl aus bzw. geben Sie sie zurück. Wenn es sich bei der Zeichenfolge um eine geschweifte Zahl handelt, geben Sie die Dezimaldarstellung aus bzw. geben Sie sie zurück.
Eingaben können über STDIN, Befehlszeilenargument oder Funktionsparameter empfangen werden. Es muss eine Zeichenfolge sein; Das heißt, Sie dürfen keine Funktion schreiben, die Zeichenfolgen für geschweifte Zahlen akzeptiert, sondern ganze Zahlen für Dezimalzahlen.
Die Ausgabe kann auf STDOUT gedruckt oder von der Funktion zurückgegeben werden. Eine Funktion kann gegebenenfalls eine Ganzzahl oder in allen Situationen Zeichenfolgen zurückgeben.
Ihr Programm muss keine falschen Eingaben verarbeiten (geschweifte Zahlen, die gegen die Formatierungsregeln verstoßen, Gleitkommazahlen, negative Ganzzahlen, zufälliger Text), und es muss keine falschen geschweiften Zahlen verarbeiten (siehe unten). Die Eingabe besteht nur aus druckbaren ASCII-Zeichen.
Wertung
Der kürzeste Code in Bytes gewinnt. Wenn Ihr Programm beide der folgenden Funktionen ausführen kann :
- richtig mit unsachgemäßen geschweiften Zahlen umgehen, und
- Wenn Sie eine geschweifte Zahl haben, ignorieren Sie alle zusätzlichen Zeichen, die nicht vorhanden sind
{};
Dann ziehen Sie 10% von Ihrer Punktzahl ab. (Die Ganzzahleingabe wird auch für den Bonus niemals überflüssige Zeichen enthalten.)
Testfälle
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Für den Bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Hinweis: Curly ist noch nicht implementiert. Aber wenn diese Frage gut ist, kann ich sie weiterentwickeln.