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.
fuente
Respuestas:
Pyth,
3532 bytes - 10% = 28.8Pruébelo en línea: demostración o conjunto de pruebas
editar: Resultó que accidentalmente también puedo manejar números rizados incorrectos. No fue planeado en absoluto. ;-)
Explicación:
Hay dos expresiones en el código. El primero convierte un número en un número rizado, y el segundo convierte un número rizado en un número regular.
.x
manijas, cuya expresión se imprime. Intentará imprimir la primera expresión. Si no hay dígitos en la entrada, la primera expresión falla (a través de Exception)..x
captura la excepción e imprime la segunda.fuente
.[Z2
era necesaria.CJam,
51474441 bytesPruébelo en línea: ejecución de muestra |Banco de pruebas
Cómo funciona
fuente
Python 2, 167 bytes - 10% = 150.3
En esta implementación,
c
es la función que satisface los requisitos. Devuelve una cadena si se le da un entero no negativo como entrada, o un entero si se le da un número rizado como entrada.fuente
Python 266 bytes - 10% =
1268.1326.7239.4 bytesChico, todavía no soy un jugador de código = /, pero ese 10% me ayudó a montón cuando mi puntaje fue todavía más de 1000!
Tengo una versión completamente desarrollada (y detallada) de este código aquí.Reconocerá la validez de los números rizados y proporcionará una interfaz en bucle para ingresar números para la prueba.
(Comentarios solo para aclaración)
Ver este código en acción
¡Gracias a Erik Konstantopoulos por una importante reducción de bytes! Se podría decir ... él realmente tomó un ... byte ... de mi código ... * self five *
fuente
print
declaraciones no requeridas y un comentario, los nombres de sus variables son demasiado largos y se pueden eliminar algunos espacios en blanco. También recomiendo leer Consejos para jugar al golf en Pyrhon .value
av
etc.), 3) haga cosas ingeniosas para jugar al golf : este es el punto donde necesita mirar el enlace de Dennis. ¡Tengo curiosidad por ver cuánto puedes reducir esto!CJam,
87 bytes80.1 puntaje (89 bytes - 10% de bonificación)Versión de actualización que califica para la bonificación mientras crece en 2 bytes:
Pruébalo en línea
¡La primera vez que usé la recursión en CJam! Todo puede parecer un poco largo, pero las dos conversiones completamente separadas se suman.
Utilicé un caso completamente separado para convertir números menores de 4 a Curly. Probablemente sea posible evitar eso, pero plegar el manejo de casos especiales en la función recursiva no sería del todo trivial. Y agregar el extra
{}
como un paso de procesamiento posterior realmente no se veía mejor, aunque debería intentarlo nuevamente si pudiera ser un poco más corto.fuente
C #, 173 - 10% = 155.7
171.0, 177.3Esto no valida y solo busca
;
y}
caracteres. Se supone que todos los{
personajes van antes que cualquier;
personaje. Lo más difícil que encontré fue no insertar un{}
en medio de un número Curly.Saltos de línea y guiones para mayor claridad:
fuente
Java 326 bytes - 10% = 294 bytes
Es un programa completo escrito en java,
Estoy seguro de que puede ser mucho más corto, pero ahora no puedo tener mucho tiempo para optimizarlo
fuente
public
clase anteriorpublic static void main(String[]c){
constatic{
GNU sed,
330326 - 10% = 293,4(Agregué uno para usar
-r
antes de reclamar el bono del 10%; espero que sea correcto)La versión completa muestra que la mayor parte de lo anterior es la conversión entre decimal y unario:
fuente
Perl,
183177Puede que esta no sea la respuesta Perl más corta, pero creo que es lo suficientemente interesante como para publicar (entrada
$_
, salida como valor de retorno):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Observamos que Curly es simplemente notación cuaternaria (base-4). Estamos un poco obstaculizados por la falta de soporte nativo de Perl para el cuaternario, pero afortunadamente, cada cuarto es dos bits en binario, y podemos leer y escribir binarios. Entonces tenemos lo siguiente:
Versión ampliada
fuente
JavaScript (ES6), 95 (105-10%)
Prueba a ejecutar el fragmento a continuación
fuente
Rubí,
126.9129.6 (144 - 10%)Utiliza la recursividad para convertir el decimal en forma rizada. Quitar la
/[;{}]/
marca de verificación para ignorar caracteres fuera de aumenta la puntuación por0.4
el momento.fuente
Perl 5, 154 (
185170 Bytes - 10% + 1 Penalización)Regex y eval resuelven los curlies.
La generación de los curlies se realiza de manera diferente.
Prueba
El archivo de prueba contiene también los casos de bonificación
fuente
Retina ,
6964 bytesPrueba Test Suite
Explicación
Descomponga los frenos internos en solo
;
s. Haga un bucle hasta que no haya más aparatos.Convertir entre decimal y unario
;
Encuentre la ejecución más larga de
;
eso es un múltiplo de 4 y anide entre llaves, repita hasta que no existan más ejecuciones de 4+.Si el número rizado resultante comienza con
;
o es una cadena vacía, agregue{}
al frente.fuente
Python 2 , 157 bytes -10% = 141.3
Pruébalo en línea!
Una respuesta más desarrollada de Python 2 que maneja los casos de bonificación. No quería necro mensajes muertos con esto como un comentario, así que aquí está.
Funciona desde adentro hacia adentro en números rizados, agregando 4 ^ (el número de llaves finales que quedan en la cadena) a la suma de cada punto y coma encontrado. Si la cadena es un número, crea recursivamente el número rizado de la misma manera que la gramática proporcionada.
fuente