Dans le langage de programmation ésotérique Curly, les programmes sont composés uniquement d'accolades {}
et de points-virgules ;
. En dépit de cet outil modeste, Curly a des littéraux qui peuvent représenter n’importe quel entier non négatif. Le format est un peu difficile à lire pour les non-initiés, cependant, écrivons un peu de code pour effectuer la conversion pour nous.
Format des nombres
Les nombres bouclés sont structurés selon les règles suivantes:
- L'ajout d'un point-virgule en ajoute un au nombre.
- Un nombre entre accolades est multiplié par quatre.
- Les groupes d'accolades peuvent être imbriqués mais non concaténés. Les accolades doivent correspondre correctement.
- Les points-virgules en dehors d'un ensemble d'accolades doivent venir après, pas avant.
- Pour éviter toute ambiguïté dans l'analyse, un nombre doit toujours commencer par une accolade.
Quelques exemples:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Notez que la règle 5 signifie que les chiffres 0 à 3 doivent commencer par une paire d'accolades vides.)
Et quelques exemples non valides:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Voici une grammaire BNF pour les nombres Curly:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Des nombres tels que {;;;;}
(plus de 3 points-virgules à la suite) ou {{};}
(groupes d'accolades vides inutiles) sont appelés des nombres de Curly inappropriés . Ils obéissent à la grammaire ci-dessus et peuvent être évalués de la manière habituelle, mais ils sont également capables de représentations plus courtes (pour les exemples ci-dessus {{;}}
et {;}
respectivement).
Le défi
Écrivez un programme ou une fonction qui entre / reçoit une chaîne. Si la chaîne est un entier décimal non négatif, sortie / retourne la représentation Curly correcte (c'est-à-dire la plus courte possible) pour cet entier. Si la chaîne est un nombre Curly, affiche / retourne sa représentation décimale.
L'entrée peut être reçue via STDIN, un argument de ligne de commande ou un paramètre de fonction. Ce doit être une ficelle; Autrement dit, vous ne pouvez pas écrire une fonction qui accepte les chaînes pour les nombres Curly, mais les entiers pour les nombres décimaux.
La sortie peut être imprimée sur STDOUT ou renvoyée par la fonction. Une fonction peut renvoyer un entier, le cas échéant, ou des chaînes dans toutes les situations.
Votre programme ne doit pas nécessairement traiter des entrées incorrectes (nombres Curly qui enfreignent les règles de formatage, nombres à virgule flottante, nombres entiers négatifs, texte aléatoire), et il n'est pas nécessaire de gérer des nombres Curly incorrects (voir ci-dessous). La saisie consistera uniquement en caractères ASCII imprimables.
Notation
Le code le plus court en octets gagne. Si votre programme peut effectuer les deux opérations suivantes:
- gérer correctement les numéros Curly inappropriés, et
- quand on leur donne un numéro Curly, ignore tous les caractères supplémentaires qui ne sont pas
{};
puis soustrayez 10% de votre score. (L'entrée entière n'aura jamais de caractères superflus, même pour le bonus.)
Cas de test
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Pour le bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Remarque: Curly n'est pas encore implémenté. Mais si cette question se pose bien, je pourrai la développer davantage.