CodeKata #6: Conversão numérica

Tempo de leitura: menos de 1 minuto

Van Damme

E aí galerinha, como vão vocês? Topam mais um Codekata? Então vamos lá! Ajudem-me a divulgar, quanto mais pessoas participarem mais emocionante o desafio fica, aumentando a rivalidade no ranking e zoação dos participantes.

Falando em ranking, na edição passada, o Flávio Pimenta tomou a ponta. Você vão deixar barato? kkkk…

No CodeKata #5: Número de Erdős foi bem legal, um desafio diferente, com dificuldade mediada. Foram 4 participantes, ótimas idéias para resolução do problema.

Regras

  • O desafio será dado e qualquer leitor poderá participar.
  • Os participantes terão duas semanas para dar uma solução para o problema.
  • A solução deverá ser escrita em Java ou Groovy.
  • A solução deverá ser enviada por e-mail: email_eder
  • As soluções e seus autores serão divulgados em um post no dia previamente fixado.
  • Pontuação para o ranking:
    • 100 dividido pela quantidade de cenários de teste, será a pontuação dada ao cenário que ficar verde, os cenários que falharem não pontuam.
      • Pontuação por acerto (cenário verde) = 100/n° cenários
    • Cenário cujo objetivo seja testar as restrições terá penalização de – 0,5 por cenário que ficar verde.
    • Performance (válidos apenas para cenários que passarem, ficarem verdes):
      • Bonificação (Média para baixo): + 0,25 por cenário;
      • Penalização (Acima da média): – 0,25 por cenário;
      • Adicional de 2,0 pontos para o participante que entregar a solução com maior performance (o vencedor será conhecido quando a solução dada por ele executar todos os cenários mais rapidamente que seus oponentes).

Desafio: Conversão numérica

Enviar a solução até: 12/07/2016
Divulgação do resultado até dia: 15/07/2016

O sistema de numeração romana (ou números romanos) desenvolveu-se na Roma Antiga e utilizou-se em todo o seu Império. Neste sistema as cifras escrevem-se com determinadas letras, que representam os números. As letras são sempre maiúsculas, já que no alfabeto romano não existem as minúsculas, as letras são I, V, X, L, C, D e M.

Cada letra corresponde a um determinado valor:

  • I = 1
  • V = 5
  • X = 10
  • L = 50
  • C = 100
  • D = 500
  • M = 1000

Algumas regras para a formação dos números romanos:

  1. Um número menor antes de um número maior significa subtração, exemplo: IV significa 4.
    • Não se utiliza mais de um número menor antes de um número maior para subtrair. Por exemplo, IIV não corresponde a 3.
  2. A adição é caracterizada por um número maior antes de um número menor, exemplo: VI significa 6.
  3. Devem separar-se, dezenas, centenas, e milhares como numerais separados, isso significa que a 99 corresponde XCIX (90 + 9), nunca deve ser escrito como IC.
  4. Uma linha sobre um numeral significa multiplicá-lo por 1000. O numeral V com uma linha sobre o símbolo significa 5000.

Por exemplo de conversão:

  • 3 = III
  • 4 = IV
  • 51 = LI
  • 99 = XCIX
  • 1001 = MI
  • 3999 = MMMCMXCIX
  • 5000 = V

Tarefa

Sua tarefa é desenvolver um programa que converta números indo-arábicos (1, 2, 3, …., n) para o formato romano (I, II, III, …., n) e vice-versa.

Premissas e Restrições

  • Números serão válidos entre 1 e 15000.
  • A representação de múltiplos de mil (vide regra 4), como não temos uma carácter correspondente a linha sobre o numeral, deverá ser usado o número entre parenteses, exemplos:
    • 5000 = (V)
    • 6001 = (V)(I)I
  • Apenas serão aceitas representação de múltiplos de mil a partir do número 4000.
  • Serão aceitos como entrar número indo-arábicos e número romanos (conforme premissa anterior), sendo que a saída esperada será sempre o inverso da entrada.

Interface a ser implementada

Essa vez o retorno é muito simples, basta retornar um inteiro, dispensando assim a necessidade de um TO específico.

Implemente a interface:

[code language=”java”]
public interface IConversorNumericoService {
/**
* Método responsável por receber um número romano e converte-lo para indo-arábico .
* Exemplos:
* – Entrada: II; saída: 2;
* – Entrada: M; saída: 1000.
* @param pNumeroRomano
* @return número indo-arábico
*/
public String converterParaIndoArabico(String pNumeroRomano) throws IllegalArgumentException;;

/**
* Método responsável por receber um número indo-arábico e converte-lo para romano.
* Exemplos:
* – Entrada: 10; saída: X;
* – Entrada: 1000; saída: M.
* @param pIndoArabico
* @return número romano
*/
public String converterParaRomano(String pIndoArabico) throws IllegalArgumentException;;
}</pre>
<pre>[/code]

Nota: Projeto disponível no GitHub, junto também estou disponibilizando a Test Table para facilitar a adição de cenários de teste na construção da solução.

Espero que gostem!!

Participe e convide seus amigos a participarem do CodeKata #6.

Envio da solução / implementação

Envie sua solução para o e-mail: meu e-mail, com a implementação em anexo

Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *