h1

Kateando un poco

4/03/11

Y no hablo de catear, que también, hablo de katas de código. En resumen son pequeños ejercicios de programación y la gracia es que muy 2.0. Es decir, luego comentas con la gente sobre las soluciones propuestas.

El caso es que vía Mundo Geek llego a una curiosa iniciativa con un nombre de lo más descriptivo: 12 meses, 12 katas.

El problema de marzo es el siguiente (traduzco y resumo el original):

Escribe un programa que imprima los números del 1 al 100 con las siguientes excepciones:

  • Si el número es divisible por 3 ha de imprimir “Fizz”.
  • Si el número es divisible por 5 ha de imprimir “Buzz”.
  • Si el número contiene un 3 ha de imprimir “Fizz”.
  • Si el número contiene un 5 ha de imprimir “Buzz”.

Ejemplo de salida:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

… etc hasta 100

Y aquí va mi propuesta en shell script:

Editado (07/03/11): el script anterior no mostraba los número FizzBuzz. Ya está solucionado:

#!/bin/bash

for i in {1..100}
do
  F=0
  B=0

  if [ $(expr $i % 3) -eq 0 ] || [ $(echo $i | grep 3) ]; then
    F=1
  fi

  if [ $(expr $i % 5) -eq 0 ] || [ $(echo $i | grep 5) ]; then
    B=1
  fi

  case $F in
    0) if [ $B -eq 1 ]; then
         echo "Buzz"
       else
         echo $i
       fi
       ;;

   1) if [ $B -eq 1 ]; then
         echo "FizzBuzz"
       else
         echo "Fizz"
       fi
       ;;

  esac
done

Versión anterior:


#!/bin/bash

for i in {1..100}
  do

    if [ $(expr $i % 3) -eq 0 ] || [ $(echo $i | grep 3) ]; then
      echo "Fizz"

    elif [ $(expr $i % 5) -eq 0 ] || [ $(echo $i | grep 5) ]; then
      echo "Buzz"

    else
      echo $i
    fi
done

Seguro que alguno puede hacerlo más eficientemente. ¿Quién se anima?

PD: Para los que, como yo, su primer reto sea aprender a utilizar Git y GitHub, he encontrado un tutorial estupendo en el blog de ElePHPante.

Anuncios

13 comentarios

  1. Emh… ¿no tendría que ser lo segundo un if también? De lo contrario, o te pone Fizz o te pone Buzz, pero nunca FizzBuzz. Y entonces el else final no queda bien… umh…

    Ah, y el 13 debería ser Fizz :P


  2. Si te fijas un poco mejor verás que he utilizado elif en vez de dos if anidados ;)

    En cuanto al 13, tienes toda la razón. No me había dado cuenta. Pero como lo he copipasteado del original así se queda :P

    Saludos!!


  3. hmmmm… ¿qué debería ocurrir en el número 35? es divisible por 5 y contiene al 3 y al 5. ¿Cuál es el “orden de aplicación” o de “importancia” para cada critero?

    Yo no tengo ni idea de programación (salvo por el primer curso de carrera con Turbo Pascal), pero he estado siguiendo un cursillo de Google sobre Python… a ver qué tal me sale xD.


  4. No estoy seguro de cómo escribir el código fuente, así que espero no joder nada con el comentario:

    #!/usr/bin/python -tt
    
    import sys
    
    def caic(total):
      for i in range(total):
        numero = i+1
        if (numero % 3) == 0 or ('3' in str(numero)):
          print 'Fizz'
        if (numero % 5) == 0 or ('5' in str(numero)):
          print 'Buzz'
        else:
          print i+1
    
    def main():
      caic(100)
    
    if __name__ == '__main__':
      main()
    

    Supongo que habrá cientos de mejores formas de hacerlo… pero ey que soy principiante!!

    Como doy más relevancia al 3 que al 5, en los resultados aparecen 35, 51, 54 como Fizz.

    Saludos!!


  5. Ahora entiendo el primer comentario de Lek!! jejeje

    Tenéis razón hay números “FizzBuzz”. Es decir, que cumplan alguna condición de los Fizz y alguna de los Buzz. Como por ejemplo el 15 y el 35.

    A ver si luego tengo un rato y le doy otra vuelta :)


  6. Actualizado :)

    mimetist, ahora te toca a ti jejeje


  7. Y otra duda tonta… ¿el 35 es FizzBuzz o FizzBuzzBuzz al cumplir las 2 condiciones del 5?

    (esto me está recordando a un típico proyecto donde se dan unas especificaciones iniciales y al programador le acaban asaltando las dudas :P)


  8. Tu mucho sumar requerimientos pero aún no he visto tu programa!!! XDD


    • Natural… como que no tengo todos los requisitos necesarios ^^


  9. Bueno, la cosa se complica porque no tengo ni idea de cómo usar “casos” en python… pero hecho está:

    #!/usr/bin/python -tt
    
    import sys
    
    def caic(total):
      for i in range(total):
        numero = i+1
        if (numero % 3) == 0 or ('3' in str(numero)):
          if (numero % 5) == 0 or ('5' in str(numero)):
            print 'FizzBuzz'
          else:
            print 'Fizz'
                 
        if (numero % 5) == 0 or ('5' in str(numero)):
          print 'Buzz'
        else:
          print i+1
    
    def main():
      caic(100)
    
    if __name__ == '__main__':
      main()
    

    Ahora estoy intentando lo que ha propuesto Lek, para que se incluyan esos también… pero leñe, no quiero hacerlo a base de if if if if, así que ya veremos si encuentro la forma xD


  10. Muy interesante esto de las katas… a ver si saco un rato y me pongo a dar alguna opción ;)
    Ah! Muchas gracias por tu mención! Me alegro mucho que te haya servido de ayuda mi post sobre Git! :)


  11. Gracias a ti por el tutorial :)

    La verdad es que costó un poco enterarme cómo funcionaba esto del Github jejeje


  12. […] ¡¡Ostias, pobre hombre!! « Kateando un poco Kateando II: ahora en Java […]



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: