Escriba un programa o función que acepte un número entero en el rango 1..3999 como entrada y devuelva el número de segmentos de línea necesarios para expresar ese número entero en números romanos estándar (por lo que usaría XL pero no VM). Ejemplos:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Se permiten las conversiones de números romanos , pero puede resolver el problema sin ellas restando repetidamente el número restante más grande de la lista anterior. Ejemplo: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
Este es el código de golf , por lo que gana el programa más corto.
Respuestas:
Pyth,
927670 bytesPruébalo aquí!
¡Gracias a @FryAmTheEggman por algunas sugerencias de empaque de cadenas que me ahorraron algunos bytes!
Todavía me pregunto si hay una forma matemática de codificar esta lista. Intentará resolver algo.
Explicación
Esto usa el algoritmo dado.
K
contiene la lista dada con los números y el número de segmentos de línea corrosivos en alternancia. Esta lista se construye dividiendo una cadena lleno, lo que consigue decodificado a0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
, en/
y mapear cada elemento a un entero.fuente
C,
148129 caracteresMi primer código de golf: ^). Como la pregunta dice que puedo usar una función, he cambiado main a una función para recortar algunos caracteres (lo más importante: pasar c como parámetro en lugar de scanf)
desempaquetado
fuente
Mathematica,
8072 bytesFunción anónima que solo convierte números a números romanos, reemplaza cada carácter con su número de segmentos y toma el total.
fuente
Retina, 128 bytes
Reemplazo simple hasta que no quede nada para reemplazar. Luego se cuentan los apóstrofes y ese es nuestro número de segmentos de línea.
Si se permiten la entrada y la salida en unario, son 115 bytes (aunque ¿quién querría escribir 1234?).
Pruébalo en línea!
Pruébalo en línea! (IO unario)
fuente
Python 3, 95 bytes
La cadena Unicode consta de los puntos de código:
fuente
e=ord(e);
Java, 152 bytes
Porque, ya sabes, Java.
Implementación literal simple del algoritmo dado. La matriz empaqueta la información de transformación: los índices pares son uno menos que el número romano y los índices impares son el recuento de ese número.
Esta es una lambda que toma y devuelve un
int
/Integer
. Esto incluyeIntUnaryOperator
oUnaryOperator<Integer>
.fuente
JavaScript (ES6), 79 bytes
Las cadenas representan el número de segmentos de línea para las unidades, decenas y cientos de dígitos. (Miles es simplemente cuatro veces el dígito de miles). Este método parece ser más corto que otras opciones, como el algoritmo sugerido en la pregunta.
Editar: Guardado 2 bytes gracias a @ user81655.
fuente
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s a-
s me permite eliminar el inicio+
, pero luego la agrupación guarda otro byte.