Dado un entero estrictamente positivo, devuelve el número romano más corto posible usando solo la regla aditiva. La salida debe consistir en cero o más de cada uno de los caracteres MDCLXVI
en ese orden. Por 14
lo tanto, el número debe dar en XIIII
lugar de XIV
.
Los valores numéricos de los caracteres son M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Ejemplos
3
→ III
4
→ IIII
9
→ VIIII
42
→ XXXXII
796
→ DCCLXXXXVI
2017
→ MMXVII
16807
→ MMMMMMMMMMMMMMMMDCCCVII
4 -> IIII
es9 -> VIIII
también en lugar deIX
?VIIII
es la única salida permitida para 9.Respuestas:
Inglés simple ,
10591025678641451399 bytesSe guardaron 34 bytes al eliminar una trampa de error. Luego ahorró 384 bytes jugando al golf. Luego guardó 190 bytes combinando la operación de división con la operación de agregar ("z") en una nueva operación ("p"). Luego ahorró 52 bytes jugando al golf.
Aquí está la versión no codificada del código final, más una trampa de error para un número negativo:
fuente
APL (Dyalog) ,
2522 bytesPruébalo en línea!
fuente
/
) en lugar de reshape (⍴
) para que pueda cortar cada uno y la reducción de catenado (¨
y,/
).⎕
) y usar commute (⍨
) para eliminar los parens y compose (∘
).{}
o la∇f∇
rodeaRetina ,
5742 bytesSe convierte en unario, luego reemplaza codiciosamente los racimos de
I
s con las denominaciones más altas en orden.Pruébalo en línea
Guardado 15 bytes gracias a Martin
fuente
I
como unidad?Python 2 , 64 bytes
Pruébalo en línea!
En lugar de crear la cadena de salida desde el principio tomando con avidez la parte más grande, esto la crea desde el final. Por ejemplo, el número de
I
's esn%5
, luego el número deV
' s esn/5%2
, y así sucesivamente. Esta es una conversión de base mixta con relaciones sucesivas de 5 y 2 alternadas.Aquí hay un equivalente iterativo:
Python 2 , 68 bytes
Pruébalo en línea!
Los
M
's deben manejarse por separado porque cualquier número de ellos podría estar presente ya que no hay un dígito más grande. Entonces, después de que se hayan asignado los otros valores de lugar, el valor restante se convierte aM
's.A modo de comparación, una estrategia codiciosa (69 bytes):
Python 2 , 69 bytes
Pruébalo en línea!
El valor del dígito actual
d
se divide entre 2 o 5 para producir el siguiente dígito. El valor ded%3
decirnos cuál: sid%3==1
, dividir por2
; y sid%3==2
, dividir por 5.fuente
Mathematica, 81 bytes
Usar explícitamente los valores y derivar los números correspondientes parece ser un byte más largo:
fuente
FromRomanNumeral@r
Excel,
236193161 bytes43 bytes guardados gracias a @ BradCEn este punto, la respuesta realmente pertenece totalmente a @ BradC . Otros 32 bytes guardados.
Formateado:
fuente
CONCATENATE
con&
entre cada elemento yQUOTIENT
conINT(A/B)
.REPT
ya trunca el número si no es un entero , por lo que puede guardar 30 bytes más al eliminar cada unoINT()
. Ahorre 2 más reemplazando ambos1000
con1E3
(aunque Excel no parece querer mantenerlo de esa manera una vez que presiona enter).1E3
comportamiento. Respuesta actualizadaPerl 5 , 66 bytes
65 bytes de código +
-p
bandera.Pruébalo en línea!
Sin cambiar el conteo de bytes,
MDCLXVI=~/./g
puede ser reemplazado porM,D,C,L,X,V,I
; y--$|?2:5
por$|--*3+2
.Mucho más largo ( 99 bytes ), hay:
fuente
CJam ,
3528 bytes-7 bytes gracias a Martin Ender
Pruébalo en línea!
Explicación
fuente
C #, 127 bytes
Una declaración ternaria puramente codificada usando recursión.
Versión completa / formateada:
fuente
n>0
es juston
.int
no se puede convertir implícitamente a abool
.05AB1E ,
292625 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6),
817569 BytesGuardado 6 bytes gracias a @Neil por portar la respuesta de @ Jörg Hülsermann
Guardado 6 bytes gracias a @Shaggy
Casos de prueba:
Mostrar fragmento de código
fuente
n%=x
dentro delrepeat
método para guardar algunos bytes.n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
/// , 50 bytes
Pruébalo en línea!
Toma la entrada en unario, y estoy (ab) usando el campo de pie de página en TIO para la entrada, por lo que la salida está precedida por una nueva línea.
fuente
Python 3 ,
100 97 96 94 93 9190 bytesdef
; array como parámetro predeterminado redujo un espacio de sangría; declaración de variable no deseada eliminadaa%=
taquigrafía(a//i)
eliminado[]
a costa de un espacio de sangría, ahorrando así 1 byte.Pruébalo en línea!
fuente
a%=i
es un byte más corto :)b
como una variable dentro de la función. Que elimina la necesidad de soportes -b=1000,500,100,50,10,5,1
Cubix , 69
7480bytesPruébalo en línea!
Míralo correr
Me las he arreglado para comprimirlo un poco más, pero todavía hay algunos molestos no-ops, especialmente en la cara superior.
52"IVXLCDM"U
pon los divisores y personajes necesarios en la pila. Los 5 y 2 se usarán para reducir el valor div / mod y los caracteres se descartarán después de su uso.UIN0/&0\&,/U
Gira en U hacia la cara superior y comienza un largo recorrido para obtener la entrada y empujar 1000 en la pila. Se realiza una división inicial y un cambio de sentido haciar
el siguiente fragmento. Esta era un área que estaba buscando para hacer algunos ahorros.,r%ws;rr
comienzo del bucle divmod. división entera, gire el resultado lejos mod, luego reorganice la parte superior de la pila para reducir la entrada, el divisor actual y el resultado de división.3tus
lleva el personaje actual a la parte superior e intercambia con el resultado de división!vsoUs(0;U
Este es el bucle de impresión. mientras el resultado div es más de 0, intercambie con salida de caracteres, intercambie hacia atrás, disminuya, presione un 0 y suéltelo. En 0 redirigir sobre la pila emergente (eliminar el resultado de división) y alrededor del cubo.\u;pwpsq,!@Urq;u
con un poco de redireccionamiento, esto elimina al personaje de la pila, lleva los 5 y 2 a la parte superior, los intercambia y empuja uno hacia abajo. El resto se usa para reducir el divisor. Deténgase si se reduce a 0; de lo contrario, presione el 5 o el 2 hacia abajo y vuelva a ingresar al bucle.fuente
Mathematica, 130 bytes
fuente
Python 2 ,
10990 bytesPruébalo en línea!
fuente
1000
puede ser1e3
(si no te importa que sea un flotador que no debería ser un problema)float
, y no puede multiplicar una cadena por un flotador: cPHP , 70 bytes
Pruébalo en línea!
fuente
T-SQL, 164 bytes
Saltos de línea agregados solo para facilitar la lectura.
Esta versión es mucho más larga (230 caracteres), pero se siente mucho más como "SQL":
Realiza una tabla m con todas las asignaciones de valores de caracteres y luego realiza un bucle para encontrar el valor más grande <= el número, concatenando el carácter coincidente.
fuente
Japt , 34 bytes
¡Pruébelo en línea!
fuente
JavaScript (ES6), 65 bytes
Una función recursiva.
¿Cómo?
La segunda llamada recursiva
f(n-a)
realmente debería serf(n-a,a)
. Al omitir el segundo parámetro,a
yi
se reinicializan (a 1000 y 0 respectivamente) cada vez que se agrega un nuevo dígito romano al resultado final. Esto causa más recursividad de la necesaria pero no altera el resultado de la función y ahorra 2 bytes.Casos de prueba
Mostrar fragmento de código
fuente
J ,
2623 bytes3 bytes guardados gracias a Adám.
Pruébalo en línea!
Similar a la respuesta APLbásicamente lo mismo.fuente
#.inv
lugar de#:
?#.inv
lugar de#:
, ya que algo así2 #: 4
es0
, mientras que2 #.inv 4
es1 0 0
#
es/
;~
es⍨
;$
es⍴
;&
es∘
;#:
es⊤
. La única diferencia es que usa infinito_
mientras que podría usar0
como la respuesta APL.Lote, 164 bytes
Toma entrada en STDIN.
fuente
Oracle SQL, 456 bytes
Salidas:
Tenga en cuenta que el tamaño real de la línea es de 460 bytes, ya que incluye el número de entrada (2849).
Sin golf:
Cómo funciona: calculo la cantidad de cada letra que necesito, calculando lo máximo que puedo obtener con el valor más alto uno (infinito para M), y luego haciendo una división entera entre el valor de la letra actual y el resultado de eso.
Por ejemplo, 2348, ¿cuántos
C
s necesito?trunc((2348-mod(2348,500))/100)
= 3.Luego, escribo
listagg
esa carta 3 veces (explotandoCONNECT BY
para generar las 3 filas que necesito) Finalmente,listagg
todo junto.Un poco voluminoso, pero la mayor parte es el
select from dual
s en la tabla de conversión y realmente no puedo hacer mucho al respecto ...fuente
Java (OpenJDK 8) ,
119118 bytesPruébalo en línea!
Guardado un byte gracias a @TheLethalCoder
fuente
v
yi
en el primer bucle for guardar un byte?Carbón ,
61 5046 bytesPruébalo en línea!
Explicación:
fuente
Nν
es un byte más corto queANν
,¬‹
es un byte más corto que restar 1, y si usa÷
(IntDivide) en lugar de∕
(Divide), puede usarloφ
como la condición del bucle externo. Sin embargo, creo que puede reducirlo a 40 bytes haciendo un bucleMDCLXVI
directamente en su lugar.C ++, 272 bytes
fuente
C, 183 bytes
El mismo algoritmo que antes, solo usando matrices c simples en lugar de un mapa std ::, parcialmente inspirado por la respuesta de @ xnor y usando una cadena para almacenar las letras.
fuente
Lisp común, 113 bytes
Esta es una función anónima, que devuelve el resultado como una cadena.
Sin golf, con nombres de variables descriptivas y comentarios:
CL tiene formateador de números romanos incorporado. Lamentablemente, no funciona para números superiores a 3999.
fuente
Carbón , 34 bytes
Originalmente basado en la respuesta de @ CarlosAlego. Un puerto de la solución Python de @ xnor también tiene 34 bytes:
Editar: ¡Un puerto de la otra solución de Python de @ xnor resulta ser 33 bytes!
Pruébalo en línea! El enlace es a la versión detallada del código. Tenga en cuenta que lo he usado en
⁺׳﹪φ³±¹
lugar de⁻׳﹪φ³¦¹
porque el desverbosificador actualmente no puede insertar el separador.fuente