Escreva um programa ou função que aceite um número inteiro no intervalo 1..3999 como entrada e retorne o número de segmentos de linha necessários para expressar esse número inteiro em números romanos padrão (para usar XL, mas não VM). Exemplos:
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
Construções de conversão de número romano são permitidas, mas você pode resolver o problema sem elas subtraindo repetidamente o maior número restante da lista acima. Exemplo: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
Isso é código-golfe , então o programa mais curto vence.
Respostas:
Pitão,
927670 bytesExperimente aqui!
Obrigado a @FryAmTheEggman por algumas sugestões de empilhamento de strings que me salvaram alguns bytes!
Ainda estou me perguntando se existe uma maneira matemática de codificar esta lista. Vai tentar descobrir alguma coisa.
Explicação
Isso usa o algoritmo fornecido.
K
contém a lista fornecida com os números e o número correspondente a corrosão dos segmentos de linha em alternância. Essa lista é construída dividindo uma sequência compactada, que é decodificada para0/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
,/
e mapeando cada elemento para um número inteiro.fonte
C,
148129 caracteresMeu primeiro código-golfe: ^). Como a pergunta indica que posso usar uma função, mudei main para uma função para aparar alguns caracteres (o mais importante: pass c como parâmetro, em vez de scanf)
desempacotado
fonte
Mathematica,
8072 bytesFunção anônima que apenas converte números em algarismos romanos, substitui cada caractere pelo número de segmentos e recebe o total.
fonte
Retina, 128 bytes
Substituição simples até que não haja mais nada para substituir. Então os apóstrofos são contados e esse é o nosso número de segmentos de linha.
Se entrada e saída em unário são permitidas, são 115 bytes (embora quem queira digitar 1234?).
Experimente online!
Experimente online! (IO unário)
fonte
Python 3, 95 bytes
A cadeia Unicode consiste nos pontos de código:
fonte
e=ord(e);
Java, 152 bytes
Porque, você sabe, Java.
Implementação literal simples do algoritmo fornecido. A matriz compacta as informações da transformação: os índices pares são um a menos que o número romano e os índices ímpares são a contagem desse número.
Este é um lambda que pega e retorna um
int
/Integer
. Isso incluiIntUnaryOperator
ouUnaryOperator<Integer>
.fonte
JavaScript (ES6), 79 bytes
As cadeias representam o número de segmentos de linha para as unidades, dezenas e centenas de dígitos. (Milhares é simplesmente quatro vezes o dígito de milhares.) Esse método parece ser mais curto que outras opções, como o algoritmo sugerido na pergunta.
Editar: salvou 2 bytes graças a @ user81655.
fonte
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s para-
s para remover o líder+
, mas o agrupamento salva outro byte.