Saltar al contenido

Segmentos de línea de números romanos

Solución:

C, 148 129 caracteres

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};f(c){while(d+=(c/n[x])*n[x+13],c%=n[x++]);return d;}

Mi primer código de golf: ^). Dado que 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

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};
f(c){
  while(d+=(c/n[x])*n[x+13],
        c%=n[x++]);
  return d;
}

Mathematica, 80 72 bytes

Tr[Characters[#~IntegerString~"Roman"]/.{"I"|"C"->1,"M"->4,_String->2}]&

Función anónima que simplemente convierte números en números romanos, reemplaza cada carácter con su número de segmentos y toma el total.

Pyth, 92 76 70 bytes

KsMc."/9hæ²z³Þ§ªW×Oû[Tnè,O¤"/WQ=Q-Q=Nef!>TQ%2K [email protected];sY

¡Pruébalo aquí!

¡Gracias a @FryAmTheEggman por algunas sugerencias de empaquetado de cadenas que me ahorraron algunos bytes!

Todavía me pregunto si existe una forma matemática de codificar esta lista. Intentaré averiguar algo.

Explicación

Esto usa el algoritmo dado. K contiene la lista dada con los números y el número correspondiente de segmentos de línea en alternancia. Esta lista se construye dividiendo una cadena empaquetada, que se decodifica a 0/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, sobre / y mapear cada elemento a un número entero.

KsMc."..."/WQ=Q-Q=Nef!>TQ%2K [email protected];sY    # Q = input

   c."..."/                                 # split the string on /
KsM                                          # map every number to int and assign to K
            WQ                               # while Q != 0
                     f    %2K                # only take every 2nd element of K and filter with T
                      !>TQ                   # T <= Q
                  =Ne                        # Take the last element of that and assign that to N
              =Q-Q                           # Q = Q - N
                                   xKN       # index of the first occurence of N in K
                                  h          # increment that index because we want the line segments
                              [email protected]           # get the line segment from that index and append that to Y
                                      ;sY    # end the loop and print the sum of all line segments in Y
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *