Entrada:
Um inteiro.
Resultado:
- Primeiro converta o número inteiro para o seu numeral romano equivalente.
- Em seguida, converta cada letra maiúscula desse numeral romano em seu valor decimal ASCII / UNICODE.
- E produza a soma desses.
Exemplo:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Algarismos romanos: Aqui está um conversor de algarismos romanos talvez útil.
Regras do desafio:
- As regras do numeral romano padrão são aplicadas, portanto, nenhuma forma alternativa é como
IIII
ou emVIIII
vez deIV
eIX
. * - As linhas de Macron acima dos algarismos romanos anteriores a 1.000 são
¯
(UNICODE nº 175). Portanto, uma linha conta como+175
e duas como+350
. - Você tem permissão para usar qualquer tipo de entrada e saída, desde que represente os números inteiros.
- Os casos de teste estarão no intervalo de
1 - 2,147,483,647
.
* Regras do numeral romano (citação da Wikipedia):
Os números são formados pela combinação de símbolos e pela adição de valores, assim
II
como dois (dois) eXIII
treze (dez e três). Como cada numeral tem um valor fixo, em vez de representar múltiplos de dez, cem e assim por diante, de acordo com a posição, não há necessidade de zeros de "manutenção de lugar", como em números como 207 ou 1066; esses números são escritos comoCCVII
(duas centenas, um cinco e dois) eMLXVI
(mil, cinquenta, dez, cinco e um).Os símbolos são colocados da esquerda para a direita em ordem de valor, começando pelo maior. No entanto, em alguns casos específicos, para evitar que quatro caracteres sejam repetidos em sucessão (como
IIII
ouXXXX
), a notação subtrativa é frequentemente usada da seguinte maneira:
I
colocado antesV
ouX
indica um a menos, então quatro éIV
(um a menos de cinco) e nove éIX
(um a menos de dez)X
colocado antesL
ouC
indica dez a menos, então quarenta éXL
(dez a menos de cinquenta) e noventa éXC
(dez a menos de cem)C
colocado antesD
ouM
indica cem menos, então quatrocentos éCD
(cem menos que quinhentos) e novecentos éCM
(cem menos que mil)
Por exemplo,MCMIV
é mil novecentos e quatro, 1904 (M
é mil,CM
é novecentos eIV
é quatro).Alguns exemplos do uso moderno de algarismos romanos incluem:
1954 asMCMLIV
; 1990 asMCMXC
; 2014 comoMMXIV
SOURCE
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - Aplicam-se regras padrão à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- Lacunas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
fonte
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
e2147483647
->((MMCXLV)MMCDLXXX)MMMDCXLVII
->427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73
->5362
. Então eu corrigi o segundo, mas o9999
estava correto.2222222222
não está no intervalo especificado. Também concordo5362
.Respostas:
Mathematica,
181173166151 bytesGolfe
Ungolfed
Mathematica's
RomanNumeral
implementação fornece o (IX) CMXCIX para 9999 e, portanto, o programa retorna 971 para esse número.Conforme escrito, um numeral romano do tipo ((...)) (...) ... retorna uma lista aninhada dos códigos ASCII para os numerais romanos de comprimento 4, ((...)) ... retorna uma lista de comprimento 3, (...) ... retorna uma lista de comprimento 2 e ... retorna uma lista de comprimento 1. A linha final converte essas regras no número apropriado de macrons para cada seção do lista, adiciona essas macrons e soma a lista aninhada inteira para retornar a saída.
fonte
Python 3,
281278273269 bytesMinha primeira tentativa no codegolf, aqui vamos nós. Tentei fazê-lo sem olhar para a pergunta vinculada, então provavelmente é terrível :)
8 bytes menor, graças a Gábor Fekete
Ungolfed:
fonte
return 0 if n==0 else
comreturn 0if n<1else
f
quando o nome da função ég
.n//9*10>=10*l
paran//9>=l
para economizar um pouco mais.Ruby, 188 bytes
Uma adaptação baseada na minha antiga resposta Ruby para conversão de numeral romano . Experimente online!
fonte
Mathematica, 198 bytes
Infelizmente, o builtin não ajuda muito aqui, embora eu tenha certeza que isso pode ser jogado muito mais.
Nota: Avalia
9999 -> 971
conforme aqui .fonte
Lote, 373 bytes
Funciona através da tradução de cada dígito do número de acordo com uma tabela de consulta para os valores de 1, 4, 5 e 9. Utilizações
M(V)
,M(X)
,(M(V))
e(M(X))
. Se preferir(IV)
,(IX)
,((IV))
e((IX))
, em seguida, usarcall:l 77 509 261 511
ecall:l 252 859 436 861
, respectivamente.fonte
JavaScript (ES6), 183 bytes
Nota: não só prefere
(IV)
aM(V)
, mas também prefere(VI)
a(V)M
; na verdade, ele usará M apenas no início do número.fonte
Python, 263 bytes
fonte
R, 115 bytes
Então ... estou postando minha solução porque acho a pergunta bastante interessante. Eu fiz o meu melhor com R 'capacidades s para lidar com números romanos sem pacotes: você só pode introduzir números entre
1
e3899
, como oas.roman
' s documentação explica.É por isso que eu enganei um pouco, dando intervalo entre
1
a no loop:é o comprimento do's de saída (). De fato, de acordo com este site , o número romano mais longo é (14 caracteres), o que corresponde a11
14
for
as.roman(3899)
MMMDCCCXCIX
MMDCCCLXXXVIII
2888
.Além disso, você não pode calcular
length
a saída desta função.Se alguém encontrar uma solução para lidar com os problemas acima, não hesite em comentar.
fonte
Python 3, 315 bytes
Versão não destruída:
Explicação: Esta versão usa uma abordagem diferente, conta as ocorrências de números romanos no número.
[abs(((n-4)%5)-1)]
é o número deI
s no número romano.[((n+10**g)//(10**g*5))%2for g in r(10)]
é o número deV,L,D,(V),(L),(D),((V)),((L)),((D))
s no número.[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
é o número deX,C,M,(X),(C),(M),((X)),((C)),((M))
s no número.Em seguida, multiplica as ocorrências pelo valor do caractere e retorna a soma dele.
fonte