Dado um número inteiro estritamente positivo, retorne o menor número romano possível usando apenas a regra aditiva. A saída deve consistir em zero ou mais de cada um dos caracteres MDCLXVI
nessa ordem. O número 14
deve, portanto, dar XIIII
e não XIV
.
Os valores numéricos dos caracteres são M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Exemplos
3
→ III
4
→ IIII
9
→ VIIII
42
→ XXXXII
796
→ DCCLXXXXVI
2017
→ MMXVII
16807
→ MMMMMMMMMMMMMMMMDCCCVII
4 -> IIII
é9 -> VIIII
assim em vez deIX
?VIIII
é a única saída permitida para o 9. #Respostas:
Inglês simples ,
10591025678641451399 bytesSalva 34 bytes removendo uma interceptação de erro. Em seguida, salvou 384 bytes jogando golfe. Em seguida, salvou 190 bytes combinando a operação de divisão com a operação de acréscimo ("z") em uma nova operação ("p"). Em seguida, salvou 52 bytes jogando golfe.
Aqui está a versão não destruída do código final, além de uma interceptação de erro para um número negativo:
fonte
APL (Dyalog) ,
2522 bytesExperimente online!
fonte
/
) em vez de reformular (⍴
) para cortar a redução de cada e a catenata (¨
e,/
).⎕
) e usar commute (⍨
) para remover as parênteses e compor (∘
).{}
ou∇f∇
em torno da funçãoRetina ,
5742 bytesConverte em unário e, em seguida, avidamente substitui grupos de
I
s pelas denominações mais altas em ordem.Experimente online
Economizou 15 bytes graças a Martin
fonte
I
como unidade?Python 2 , 64 bytes
Experimente online!
Em vez de criar a sequência de saída desde o início, ganhando avidamente a maior parte, isso a cria a partir do final. Por exemplo, o número de
I
's én%5
, então o número deV
' s én/5%2
, e assim por diante. Isso é conversão de base mista com proporções sucessivas de 5 e 2 alternadas.Aqui está um equivalente iterativo:
Python 2 , 68 bytes
Experimente online!
Eles
M
precisam ser manuseados separadamente, pois qualquer número deles pode estar presente, pois não há um dígito maior. Portanto, depois que os outros valores de local foram atribuídos, o valor restante é convertido emM
's.Para comparação, uma estratégia gananciosa (69 bytes):
Python 2 , 69 bytes
Experimente online!
O valor atual do dígito
d
é dividido por 2 ou 5 para produzir o próximo dígito. O valor ded%3
nos diz qual: sed%3==1
, dividir por2
; e sed%3==2
, divida por 5.fonte
Mathematica, 81 bytes
O uso explícito dos valores e a derivação dos números correspondentes parecem ter um byte a mais:
fonte
FromRomanNumeral@r
Excel,
236193161 bytes43 bytes salvos graças a @ BradCNeste ponto, a resposta realmente pertence totalmente ao @ BradC . Outros 32 bytes salvos.
Formatado:
fonte
CONCATENATE
por&
entre cada elemento eQUOTIENT
porINT(A/B)
.REPT
já trunca o número, se não for um número inteiro , para que você possa salvar mais 30 bytes removendo cada umINT()
. Economize mais 2 substituindo ambos1000
por1E3
(embora o Excel pareça não querer mantê-lo assim quando você pressionar enter).1E3
comportamento. Resposta atualizada.Perl 5 , 66 bytes
65 bytes de código +
-p
sinalizador.Experimente online!
Sem alterar a contagem de bytes,
MDCLXVI=~/./g
pode ser substituído porM,D,C,L,X,V,I
; e--$|?2:5
por$|--*3+2
.Muito mais tempo ( 99 bytes ), existe:
fonte
CJam ,
3528 bytes-7 bytes graças a Martin Ender
Experimente online!
Explicação
fonte
C #, 127 bytes
Uma declaração ternária puramente codificada usando recursão.
Versão completa / formatada:
fonte
n>0
é juston
.int
não pode ser implicitamente convertido em abool
.05AB1E ,
292625 bytesExperimente online!
Explicação
fonte
JavaScript (ES6),
817569 bytesGuardado 6 bytes graças a @Neil por portar a resposta de @ Jörg Hülsermann
Guardado 6 bytes graças a @Shaggy
Casos de teste:
Mostrar snippet de código
fonte
n%=x
orepeat
método dentro para economizar alguns bytes.n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
/// , 50 bytes
Experimente online!
Recebe entrada em unário, e eu estou (ab) usando o campo rodapé no TIO para entrada, para que a saída seja precedida por uma nova linha.
fonte
Python 3 ,
100 97 96 94 93 9190 bytesdef
; matriz como parâmetro padrão reduziu um espaço de indentação; declaração de variável indesejada removidaa%=
taquigrafia(a//i)
foram removidos[]
ao custo de um espaço de recuo, economizando 1 byte.Experimente online!
fonte
a%=i
é um byte mais curto :)b
como uma variável dentro da função. Isso elimina a necessidade de suportes -b=1000,500,100,50,10,5,1
Cubix , 69
7480bytesExperimente online!
Assista a corrida
Consegui compactá-lo um pouco mais, mas ainda existem algumas no-ops, especialmente na face superior.
52"IVXLCDM"U
coloque os divisores e caracteres necessários na pilha. Os 5 e 2 serão usados para reduzir o valor div / mod e os caracteres serão descartados após o uso.UIN0/&0\&,/U
vira-se para a face superior e inicia um longo tour para obter a entrada e pressione 1000 na pilha. Uma divisão inicial é feita e uma inversão de marcha parar
o próximo trecho. Esta era uma área que eu estava olhando para fazer algumas economias.,r%ws;rr
início do loop divmod. divisor inteiro, gire o resultado para fora do mod e reorganize o topo da pilha para reduzir a entrada, o divisor de corrente e o resultado da divisão.3tus
traga o caractere atual para o topo e troque-o pelo resultado da divisão.!vsoUs(0;U
esse é o loop de impressão. enquanto o resultado div for maior que 0, troque com saída de caractere, troque de volta, diminua, pressione 0 e solte-o. Em 0, redirecione sobre a pilha pop (remova o resultado da divisão) e ao redor do cubo.\u;pwpsq,!@Urq;u
com um pouco de redirecionamento, isso remove o personagem da pilha, coloca os 5 e 2 no topo, troca-os e empurra um de volta. O restante é usado para reduzir o divisor. Pare se reduzir para 0, caso contrário, empurre os 5 ou 2 para baixo e insira novamente o loop.fonte
Mathematica, 130 bytes
fonte
Python 2 ,
10990 bytesExperimente online!
fonte
1000
pode ser1e3
(se você não se importa que seja uma bóia que não deve ser um problema)float
, e você não pode multiplicar uma string por um float: cPHP , 70 bytes
Experimente online!
fonte
T-SQL, 164 bytes
Quebras de linha adicionadas apenas para facilitar a leitura.
Esta versão é muito mais longa (230 caracteres), mas parece muito mais "semelhante a SQL":
Cria uma tabela m com todos os mapeamentos de valor de char e, em seguida, procura o maior valor <= o número, concatenando o caractere correspondente.
fonte
Japonês , 34 bytes
Teste online!
fonte
JavaScript (ES6), 65 bytes
Uma função recursiva.
Quão?
A segunda chamada recursiva
f(n-a)
realmente deveria serf(n-a,a)
. Ao omitir o 2º parâmetro,a
ei
são reinicializados (para 1000 e 0 respectivamente) cada vez que um novo dígito romano é anexado ao resultado final. Isso causa mais recursão do que o necessário, mas não altera o resultado da função e economiza 2 bytes.Casos de teste
Mostrar snippet de código
fonte
J ,
2623 bytes3 bytes salvos graças a Adám.
Experimente online!
Semelhante à resposta do APLbasicamente a mesma coisa.fonte
#.inv
vez de#:
?#.inv
vez de#:
, uma vez que algo como2 #: 4
é0
, enquanto2 #.inv 4
é1 0 0
#
é/
;~
é⍨
;$
é⍴
;&
é∘
;#:
é⊤
. A única diferença é que você usa o infinito_
enquanto pode usar0
como a resposta da APL.Lote, 164 bytes
Recebe entrada em STDIN.
fonte
Oracle SQL, 456 bytes
Saídas:
Observe que o tamanho real da linha é 460 bytes, porque inclui o número de entrada (2849).
Ungolfed:
Como funciona: calculo quantas letras de cada letra preciso, calculando o máximo possível com o valor mais alto (infinito para M) e, em seguida, fazendo uma divisão inteira entre o valor da letra atual e o resultado disso.
Por exemplo, 2348, quantos
C
s eu preciso?trunc((2348-mod(2348,500))/100)
= 3Então, eu
listagg
letra juntos três vezes (explorandoCONNECT BY
para gerar as três linhas necessárias). Finalmente eulistagg
tudo junto.Meio volumoso, mas a maioria está
select from dual
na tabela de conversão e não posso fazer muito sobre isso ...fonte
Java (OpenJDK 8) ,
119118 bytesExperimente online!
Guardou um byte graças a @TheLethalCoder
fonte
v
e,i
no primeiro loop for, salvar um byte?Carvão ,
61 5046 bytesExperimente online!
Explicação:
fonte
Nν
é um byte menor queANν
,¬‹
é um byte menor que subtraindo 1 e, se você usar÷
(IntDivide) em vez de∕
(Divide), poderá usarφ
como condição de loop externo. No entanto, acho que você pode reduzi-lo a 40 bytes fazendo um loopMDCLXVI
direto diretamente.C ++, 272 bytes
fonte
C, 183 bytes
O mesmo algoritmo de antes, apenas usando matrizes c simples em vez de um std :: map, parcialmente inspirado na resposta do @ xnor e usando uma string para armazenar as letras.
fonte
Lisp comum, 113 bytes
Esta é uma função anônima, retornando o resultado como uma sequência.
Ungolfed, com nomes descritivos de variáveis e comentários:
O CL possui um formatador de numeral romano interno. Infelizmente, ele não funciona para números maiores que 3999.
fonte
Carvão , 34 bytes
Originalmente baseado na resposta de @ CarlosAlego. Uma porta da solução Python do @ xnor também tem 34 bytes:
Edit: Uma porta da outra solução Python do @ xnor é de 33 bytes!
Experimente online! Link é a versão detalhada do código. Observe que eu usei, em
⁺׳﹪φ³±¹
vez de,⁻׳﹪φ³¦¹
porque o deverbosifier atualmente não está inserindo o separador.fonte