Crie uma calculadora básica para algarismos romanos.
Exigências
- Suportes
+
,-
,*
,/
- A entrada e a saída devem esperar apenas um prefixo de subtrator por símbolo (ou seja, 3 não pode ser
IIV
porque existem doisI
antesV
) - Manipulação do princípio da subtração na entrada e obrigação de saída em suporte mínimo modernas convenções padrão, em que apenas potências de dez são subtraídos números maiores (por exemplo
I
,X
,C
subtratores são necessários, mas nãoV
,L
,D
) e subtração nunca é feito a partir de um número de mais de 10x o subtrator (por exemplo,IX
deve ser suportado, masIC
não é necessário). - Entrada e saída devem ser deixadas para a direita em ordem de valor, começando pelo maior (ou seja, 19 =
XIX
nãoIXX
, 10 é maior que 9) - Da esquerda para a direita, sem precedentes de operador, como se você estivesse usando uma calculadora manual.
- Suporta números positivos inteiros de entrada / saída entre 1-4999 (sem necessidade de V̅)
- Nenhuma biblioteca que faça a conversão de números romanos para você
Para você decidir
- Sensibilidade a maiúsculas e minúsculas
- Espaços ou nenhum espaço na entrada
- O que acontece se você obtiver uma saída decimal. Truncar, sem resposta, erro, etc.
- O que fazer com a saída que você não pode lidar. Negativos ou números muito grandes para serem impressos.
- Se deve apoiar um uso mais liberal do princípio da subtração do que o requisito mínimo.
Crédito extra
- -50 - Manuseie até 99999 ou maior. Os símbolos devem incluir um vinculo
Entrada / saída de amostra
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
O código mais curto vence.
code-golf
roman-numerals
Danny
fonte
fonte
IM = 999
obrigatório?IM
. Se a saída éIM
ouCMXCIX
para 999, é com você. Ambos se encaixam nos requisitos.Respostas:
JavaScript (ES6), 238
Uso:
Versão anotada:
fonte
T-SQL, 1974 - 50 = 1924 bytes
Sei que jogar golfe no SQL equivale a jogar 18 buracos com nada além de uma cunha de areia, mas gostei do desafio deste e acho que consegui fazer algumas coisas interessantes metodologicamente.
Isso suporta o vínculo de entrada e saída. Adotei a convenção de usar um til à direita para representá-lo, então V ~ é 5000, X ~ é 10000, etc. Depois disso, ele fará codificação romana parcialmente fora do padrão de qualquer coisa no intervalo suportado pelo INT.
Como é toda matemática inteira, qualquer resultado não inteiro é arredondado implicitamente.
Ainda estou trabalhando em uma solução baseada em conjunto para substituir alguns dos loop WHILE que podem diminuir a contagem de bytes e ser um exemplo mais elegante de SQL idiomático. Também há alguns bytes a serem ganhos ao reduzir o uso de aliases da tabela a um mínimo. Mas como é essencialmente imbatível nesse idioma, estou aqui apenas para mostrar minha roupa de Don Quixote. :)
SELECT @i na parte superior repete a entrada:
E o SELECT no final retorna:
E você pode testá-lo neste SQLFiddle
E voltarei a acrescentar alguns comentários sobre como funciona, porque por que postar uma resposta obviamente perdida se você não deseja explorá-la por valor educacional?
fonte
Javascript -
482476 caracteresA entrada / saída de amostra funciona:
Ele também lida com grandes números:
E aceita, mas não exige, espaços também.
Mas, desde que eu estava jogando golfe, ele tem alguns problemas:
Esta versão alternativa lida com números acima de 5000 até 99999, mas possui
600598584 caracteres:fonte
Javascript
479361348278253303 caracteres - 50 para números de suporte de até 1 milhão, completos com suporte a vinculum:
Uso:
p(text)
por exemplo,p('XIX + LXXX')
retornosXCIX
.Código com comentários explicativos:
Isso funciona para as amostras fornecidas e para todas as outras que tentei. Exemplos:
fonte
Ruby 2.1,
353 (e muitas outras iterações), 295 - 50 = 245A manipulação do vinculum adiciona ~ 23 caracteres.
Ele lida com "IL" ou "VM" na entrada e falha sem erro em negativos (vai para ints altos) ou decimais (trunca) ou em qualquer espaço. Agora também lida com um primeiro número negativo (embora, se o total for negativo, ele ainda falhe mal). Também falhará mal se você começar com * ou / ou se o resultado for 4 milhões ou maior.
Usa o objeto # send para a funcionalidade "calculadora de mão".
Ungolfed:
fonte
Python 2 -
427418404401396395392 caracteresLê da entrada padrão. Ele lida apenas com maiúsculas (pode diferenciar maiúsculas de minúsculas ao custo de 8 caracteres extras) e requer espaços. Não faz validação - não testei para ver como ele quebra em vários casos. No entanto, lida com números como VC = 95.
E a versão não destruída:
Sinto que Perl teria sido melhor, mas não sei o suficiente. Para uma primeira tentativa no código de golfe, no entanto, me sinto muito bem com isso.
fonte
PHP -
549525524520 bytesNada muito inovador: normaliza os operadores para garantir precedência da esquerda para a direita, converte romano em decimal, é executado
eval
na instrução, por exemplo, XCIX + I / L * D + IV é convertido em algo como return (((((+90 +9) + (+1)) / (+50)) * (+500)) + (+4)); , em seguida, converte decimal novamente em romano.por exemplo
fonte
Python - 446 bytes
Isso poderia ser melhorado consideravelmente. Eu senti que tinha que dar o primeiro balanço usando Python. Faz 3 coisas na primeira passagem
x
para incluir todas as combinações possíveis encontradas (mesmo que não sejam usadas). Por exemplo, enquantoXIX
está a ser lexed, os valores parciais de"X":10
,"XI":11
e"XIX":19
são adicionados à tabela de símbolosNo final, ele chama
eval
a string original (exceto com parênteses adicionados) e fornece a tabela de símbolos.Depois colei uma solução conhecida para converter inteiro para romano, pois já havia trabalhado nisso por tempo suficiente ... sinta-se à vontade para melhorar para aprender algo novo :)
fonte