Leonardo da Pisano, também conhecido como Fibonacci, foi fundamental para trazer o sistema numérico hindu-árabe para a Europa. Antes disso, os matemáticos trabalhavam na base sessenta com algarismos romanos.
Por exemplo, a raiz quadrada de dois pode ser aproximada como: uma e vinte e quatro partes de sessenta e cinquenta e uma partes de três mil e seiscentos e escrita como: i xxiv li , com a escala determinada pelo contexto. Na época, o “nada” era conhecido ( ou seja, zero), mas não tinha representação padrão nesse sistema numérico.
Se Fibonacci tivesse ignorado esses dígitos decimais que encontrara durante suas viagens, ele certamente teria abordado as deficiências no sistema atual. Esse sistema aprimorado chamaremos de sexagesimais de Fibonacci .
Sua tarefa é escrever um programa, função ou snippet de código que use um número de ponto flutuante no formato ASCII ou binário e faça a saída em sessenta algarismos romanos base. A entrada pode ser arquivo, console, argumento de linha de comando ou função e a saída pode ser arquivo ou console, o que for mais fácil.
A saída pode ser maiúscula ou minúscula e deve incluir estas melhorias:
- use n ou N para indicar nulo, o que significa que um local não tem valor, ou seja , "zero" (um problema com o sistema)
- use e ou E para indicar et correspondente ao ponto sexagesimal (outro problema com o sistema)
- use um ponto do meio · ou um asterisco * para separar grupos de algarismos romanos (mais um problema com o sistema)
Suponha que a entrada será um ponto flutuante com mantissa não superior a lix · lix · lix · lix · lix . Frações menores que n · e · n · n · n · n · i podem ser ignoradas. Portanto, desde que a entrada tenha essas restrições, no máximo dez grupos de algarismos romanos com um e podem ser gerados.
Números menores que i deve ter um líder e n · para garantir o contexto é claro.
Alguns exemplos: input
→ output
0
→ n1
→ i60
→ i · n0.1
→ n · e · vi3600
→ i · n · n10.5
→ x · e · xxx16777215
→ i · xvii · xl · xx · xv3.1415926536
→ iii · e · viii · xxix · xliv · n · xlvii
A saída deve evitar n · inicial desnecessário na parte da mantissa, e isolado ou rastreio · n na parte fracionária da saída. Assim, por exemplo, n · · n n n · · i , i · E , e i · e · · n n n · · · n n são saídas incorrectos para uma entrada de 1
.
Diferenças de mais ou menos n · e · n · n · n · n · i na saída estão dentro das tolerâncias e são aceitáveis.
A entrada é qualquer ponto flutuante legal no idioma de sua escolha, portanto, pode incluir expoentes positivos ou negativos, desde que a entrada não fique fora do intervalo especificado acima.
E, finalmente, os números romanos embutidos são permitidos!
Respostas:
Python 3,
323319320 bytesEsta resposta implementa os sexagesimais de Fibonacci com o delimitador
*
e sem considerar a complexidade de Kolmogorov nas listas de algarismos romanos (por enquanto, pelo menos por enquanto). Tentativas foram feitas para unir o loopwhile
efor
sob o qual os números romanos são gerados em um loop, mas essas tentativas ainda não foram bem-sucedidas. Todas as dicas e sugestões de golfe são bem-vindas e apreciadas.Edit: Reparação de bugs e golfe.
Edit: Mais correção de bugs.
Ungolfed:
fonte
C - 584 bytes
Não concorrente (obviamente), mas para servir de inspiração:
Salve como
fs.c
, construa comgcc -o fs fs.c -lm
e execute como./fs <arg>
.Casos de teste:
Maior mantissa e fração:
Como estou usando
double
o tipo de trabalho, a maior mantissa e fração combinada excede a precisão nativa desse tipo. Se eu usasselong double
, poderia lidar com isso.fonte
int main
não precisa retornar0
.Haskell (
333322315 bytes)Não estou claro se o último dígito sexagesimal deve ser arredondado quando o faço ou se o truncamento é permitido; isso trunca, acho que o Python3 pode também?
(-9 bytes, graças a H.PWiz ! -2 bytes ao eliminar
where
por(\->)$
, -5 mais ao inventar estad
função e jogar golfea++"."++x
paraa++'.':x
.)Ungolfed:
O método de conversão de números inteiros em algarismos romanos foi roubado descaradamente de Thomas Ahle no StackOverflow e apenas jogou um pouco de golfe.
fonte
["l","xl","x","ix","v","iv","i"]
pode serwords"l xl x ix v iv i"