Madrid.rb y la kata de los Romanos

1
6419

Creación: 1-1-2011

Índice de contenidos

1. Introducción
2. Entorno
3. Los test
4. La clase
5. Conclusiones
6. Sobre el autor


1. Introducción

El pasado día 30 asistí a una reunión de Madrid.rb
(http://groups.google.com/group/madrid-rb). Se trata de un grupo de Madrid donde se reúne gente interesada en Ruby, y la programación en general.

Y ¿por qué fui?, bueno, pues porque aunque soy Javero desde hace muchos años, hay que aprender de todo en esta vida 😉 y como el 30 hacían un Coding Dojo, me animé a asistir para practicar un poco.

Os puedo decir que el evento fue estupendo y la gente fenomenal. Os animo a todos a asistir a sus reuniones, aunque no seáis de Ruby, porque os puede venir muy bien para intercambiar opiniones y pensamientos, y además siempre os podéis tomar luego unas cañas en la post-reunión, que esta gente de Ruby son muy majos 😉

En concreto en la reunión hicimos la kata de los números Romanos en formato “randori”. De lo que se trata es de tener a una única pareja programando la kata, un conductor y un navegante, pero cada 3 minutos se va cambiando a un miembro de la pareja, y así va rotando todo el mundo por los dos puestos.

El facilitador de la reunión fue Enrique Comba (http://ecomba.pro/), él preparó el entorno de trabajo, y fue especialmente divertido porque había que hacerlo con el Vim y con su teclado ingles, jur jur jur, a más de uno le dio quebraderos de cabeza esta combinación explosiva 😉

Al finalizar la sesión Enrique hizo la kata y nos dejó a todos con la boca abierta con el algoritmo para convertir número arábigos en números romanos. Por lo menos a mí, que nunca había sido capaz de terminarla con éxito y con estilo 😛 jajaja y es que lo importante para hacer la kata de los números romanos es saberse los números romanos 😛

Me gustó tanto que al final por la noche me puse a hacerla en casa, pero esta vez en Java, y he querido compartir con vosotros lo que me salió, que por cierto funciona 🙂


2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 17′ (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM, 128GB Solid State Drive).
  • NVIDIA GeForce 9400M + 9600M GT with 512MB
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.5
  • JDK 1.6.0_22


3. Los test

package com.autentia.kata.romanos;

import static org.junit.Assert.*;

import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;

public class RomanConverterTest {

    private final RomanConverter romanConverter = new RomanConverter();

    @Test
    public void should_convert_1_in_I() throws Exception {
        assertThat(romanConverter.convert(1), is("I"));
    }

    @Test
    public void should_convert_2_in_II() throws Exception {
        assertThat(romanConverter.convert(2), is("II"));
    }

    @Test
    public void should_convert_3_in_III() throws Exception {
        assertThat(romanConverter.convert(3), is("III"));
    }

    @Test
    public void should_convert_4_in_IV() throws Exception {
        assertThat(romanConverter.convert(4), is("IV"));
    }

    @Test
    public void should_convert_5_in_V() throws Exception {
        assertThat(romanConverter.convert(5), is("V"));
    }

    @Test
    public void should_convert_6_in_VI() throws Exception {
        assertThat(romanConverter.convert(6), is("VI"));
    }

    @Test
    public void should_convert_7_in_VII() throws Exception {
        assertThat(romanConverter.convert(7), is("VII"));
    }

    @Test
    public void should_convert_8_in_VIII() throws Exception {
        assertThat(romanConverter.convert(8), is("VIII"));
    }

    @Test
    public void should_convert_9_in_IX() throws Exception {
        assertThat(romanConverter.convert(9), is("IX"));
    }

    @Test
    public void should_convert_1949_in_MCMXLIX() throws Exception {
        assertThat(romanConverter.convert(1949), is("MCMXLIX"));
    }

    @Test
    public void print_all_roman_between_1_and_110() {
        // Esto no es un test, pero me hacía ilusión ver todos los numeritos ;)
        for (int i = 1; i < 111; i++) {
            System.out.println(i + ": " + romanConverter.convert(i));
        }
    }
}

4. La clase

package com.autentia.kata.romanos;

/**
 * Clase para convertir número arábigos en números romanos.
 * <p/>
 * <a href="http://www.mscperu.org/utiles/utilidades/num_roman.htm"
 * >http://www.mscperu.org/utiles/utilidades/num_roman.htm</a>
 * 
 * <pre>
 * 1  2   3  4 5  6   7    8  9 10 11  12   13  14 15
 * I II III IV V VI VII VIII IX  X XI XII XIII XIV XV
 * </pre>
 */
public class RomanConverter {

    private static final int[] specialArabicNumbers = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };

    private static final String[] specialRomanSymbol = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

    private StringBuilder roman;

    public String convert(int arabic) {
        int remainingArabic = arabic;
        roman = new StringBuilder(20);

        for (int romanSymbolIndex = 0; romanSymbolIndex < specialRomanSymbol.length; romanSymbolIndex++) {
            remainingArabic = addRomanSymbolIfArabicIsLargeEnough(remainingArabic, romanSymbolIndex);
        }

        return roman.toString();
    }

    private int addRomanSymbolIfArabicIsLargeEnough(int arabic, int romanSymbolIndex) {
        int integerDivision = arabic / specialArabicNumbers[romanSymbolIndex];
        concatenate(specialRomanSymbol[romanSymbolIndex], integerDivision);

        int remaining = arabic % specialArabicNumbers[romanSymbolIndex];
        return remaining;
    }

    private void concatenate(String romanSymbol, int times) {
        for (int i = 0; i < times; i++) {
            roman.append(romanSymbol);
        }
    }

}

5. Conclusiones

No dejéis de practicar, y ser promiscuos en vuestras relaciones profesionales. No os encerréis en un único entorno o lenguaje. Hablar y mezclaros con gente de otros entornos y lenguajes, y os garantizo que siempre aprenderéis algo nuevo.

6. Sobre el autor

Alejandro Pérez García, Ingeniero en Informática (especialidad de Ingeniería del Software) y Certified ScrumMaster

Socio fundador de Autentia (Formación, Consultoría, Desarrollo de sistemas transaccionales)

mailto:alejandropg@autentia.com

Autentia Real Business Solutions S.L. – «Soporte a Desarrollo»

http://www.autentia.com

 

Alejandro Pérez García
Alejandro es socio fundador de Autentia y nuestro experto en Java EE, Linux y optimización de aplicaciones empresariales. Ingeniero en Informática y Certified ScrumMaster. Seguir @alejandropgarci Si te gusta lo que ves, puedes contratarle para darte ayuda con soporte experto, impartir cursos presenciales en tu empresa o para que realicemos tus proyectos como factoría (Madrid). Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación.

1 COMENTARIO

  1. Interesante y ligerito, buena lectura para empezar la mañana, sobre todo las conclusiones, muchas veces alguien te señala la luna y nos quedamos mirando al dedo. No paremos de practicar, aprender y disfrutar, que nos oxidamos, no salimos de lo nuestro y luego solo nos queda la queja.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad