Sua tarefa é converter um número inteiro positivo de número arábico para número romano.
As coisas ficam difíceis quando você conta até 4000.
Os romanos fizeram isso adicionando uma linha acima de um símbolo para multiplicá-lo por 1 000
. No entanto, as linhas de cima não são exatamente exibidas no ASCII. Além disso, existem linhas duplas para multiplicar um símbolo por 1 000 000
e, em seguida, linha tripla para multiplicar um símbolo por 1 000 000 000
, etc ...
Portanto, decidi usar parênteses para substituir as linhas excessivas.
Os símbolos podem ser colocados individualmente entre parênteses. Por exemplo, ambos (VI)
e (V)(I)
são representações válidas de 6 000
. (V)M
também é uma representação válida de 6000.
(I)
é uma maneira válida de representar 1 000
.
Casos de teste
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
Pontuação
Isso é código-golfe . O código mais curto em bytes vence.
fonte
(IV)
uma representação aceitável de 4000?Respostas:
Mathematica, 67 bytes
Evita todos os problemas
M
convertendo a entrada na base 1000 e convertendo cada dígito separadamente comRomanNumeral
. Em seguida, dobramos-os inserindo(...)
da esquerda.Infelizmente, o Mathematica representa zeros,
N
portanto precisamos nos livrar deles.fonte
RomanNumeral
pode fazê-lo?MMMM
para4000
, ele só começa a trabalhar a especificação em5000
(e, em seguida, você tem o mesmo problema para4000000
etc.). Mesmo assim, ele usa barras superiores em vez de parênteses. Se você está bem com isso, deve dizê-lo na especificação do desafio.JavaScript (ES6), 136 bytes
Para números abaixo de 4000, repita cada "letra" romana o máximo de vezes possível, usando a lista de "letras" romanas e seus valores decimais. Caso contrário, recursivamente cria a resposta da divisão e do módulo com 1000. Felizmente,
repeat
trunca para que eu não precise fazer isso sozinho.fonte
Lisp comum, 108
Ungolfed
Testes
Dois testes fornecem resultados diferentes dos da pergunta:
fonte
R, 134
Não é praticamente a melhor opção, mas acho que a ideia deve ser bastante semelhante a isso.
fonte
Python,
188194-6 bytes de se livrar de algum espaço em branco
Esse desafio me trouxe de volta a quando eu estava aprendendo a programar ...
Pode não ser a solução mais curta, mas eu me diverti jogando golfe nesse problema.
Experimente!
fonte
Ruby,
137134130 bytesFunção recursiva que retorna a string. Estou tentando jogar as codificações numéricas um pouco mais, se possível, mas não sei como.
Opa, é praticamente uma porta direta da resposta ES6 do @ Neil agora.
fonte
Ruby,
185 161144 bytesMais de um ano após o post original, acho que aprendi algo sobre golfe.
Obrigado Value Ink por seus valiosos comentários.
fonte
gsub
pode usar uma string como o primeiro argumento, removendo a necessidade de substituições em um padrão regex, uma vezs.gsub! x,y
que o faz automaticamente. Fora isso, você provavelmente pode simplesmente renunciar à atribuição do seua
array, pois você o usa apenas uma vez e coloca-o diretamente naeach_slice
chamada."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
funciona tambémr[x]
é funcionalmente equivalente ar.(x)
sempre que estiver envolvido lambdas stabby #r[x]
truque será útil para todo o meu futuro golfe recursivo em rubi!TCL 134 bytes
Experimente aqui: https://rextester.com/BJC92885
fonte