En el lenguaje de programación esotérico Curly, los programas consisten únicamente en llaves {}
y puntos y comas ;
. A pesar de este humilde conjunto de herramientas, Curly tiene literales que pueden representar cualquier número entero no negativo. Sin embargo, el formato es un poco difícil de leer para los no iniciados, así que escribamos un código para hacer la conversión por nosotros.
Formato de numeros
Los números rizados se estructuran de acuerdo con las siguientes reglas:
- Agregar un punto y coma agrega uno al número.
- Un número encerrado entre llaves se multiplica por cuatro.
- Los grupos de llaves pueden estar anidados pero no concatenados. Los frenos deben coincidir correctamente.
- Los puntos y comas fuera de un conjunto de llaves deben aparecer después, no antes.
- Para evitar la ambigüedad en el análisis, un número siempre debe comenzar con una llave.
Algunos ejemplos:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Tenga en cuenta que la regla 5 significa que los números del 0 al 3 deben comenzar con un par vacío de llaves).
Y algunos ejemplos inválidos:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Aquí hay una gramática BNF para números rizados:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Los números como {;;;;}
(más de 3 puntos y coma seguidos) o {{};}
(grupos de llaves vacías innecesarias) se denominan números rizados incorrectos . Obedecen la gramática anterior y pueden evaluarse de la manera habitual, pero también son capaces de representaciones más cortas (para los ejemplos anteriores, {{;}}
y {;}
respectivamente).
El reto
Escriba un programa o función que ingrese / reciba una cadena. Si la cadena es un entero decimal no negativo, genera / devuelve la representación Curly adecuada (es decir, la más corta posible) para ese entero. Si la cadena es un número rizado, genera / devuelve su representación decimal.
La entrada se puede recibir a través de STDIN, argumento de línea de comando o parámetro de función. Se debe ser una cadena; es decir, no puede escribir una función que acepte cadenas para números Curly pero números enteros para números decimales.
La salida puede imprimirse en STDOUT o devolverse desde la función. Una función puede devolver un número entero cuando sea apropiado, o puede devolver cadenas en todas las situaciones.
Su programa no tiene que manejar mal de entrada (números de Curly que rompen las reglas de formato, números de punto flotante, enteros negativos, texto aleatorio), y se no se requiere para manejar números Curly indebidos (pero véase más adelante). La entrada consistirá solo en caracteres ASCII imprimibles.
Tanteo
El código más corto en bytes gana. Si su programa puede hacer tanto de lo siguiente:
- manejar correctamente los números rizados incorrectos, y
- cuando se le da un número Curly, ignore cualquier carácter adicional que no sea
{};
luego reste el 10% de su puntaje. (La entrada entera nunca tendrá caracteres extraños, incluso para la bonificación).
Casos de prueba
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Por el bono:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Nota: Curly aún no está implementado. Pero si esta pregunta funciona bien, puedo desarrollarla más.