Buscaminas Programming Challenges de la UTN-FRC en Python

Resolví 2 problemas basados en el buscaminas en Python para la competencia de programación de la UTN-FRC, aca esta el código y mas abajo esta un link al repo de mercurial para quien desee bajar el código mas la entrada.

Problema Fácil (Enunciado)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE BEER-WARE LICENSE" (Revision 42):
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Juan BC

#===============================================================================
# DOCS
#===============================================================================

"""Solucion al problema del buscaminas para la competencia de programación de la
UTN-FRC.

Objetivo: Ser legible y servir de instroduccion a python

Problema originalmente propuesto:
    http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110102&format=html

Nota se simplifico para trabajar solo con matrices cuadradas

"""

#===============================================================================
# META
#===============================================================================

__author__ = "Juan BC"
__license__ = "BeerWare"
__date__ = "2011/10/26"
__version__ = "0.1"
__email__ = "jbc.develop@gmail.com"
__homepage__ = "http://jbcabral.wordpress.com/"
__twitter__ = "@juanbcabral"

#===============================================================================
# FUNCTIONS
#===============================================================================

def read_n_lines(n):
    """Esta funcion lee las siguientes n linea de la entrada y las retorna
    como una lista de listas.

    """
    lines = []
    for _ in range(n):
        line = list(raw_input())
        lines.append(line)
    return lines

def increment(board, row, col):
    """Funcion de soporte para resolve que incrementa en uno todas los vecinoa
    a una mina

    """
    for row_d in (-1, 0, 1):
        for col_d in (-1, 0, 1):
            rowp = row + row_d
            colp = col + col_d
            if rowp < 0 or colp < 0 \
               or rowp >= len(board) or colp >= len(board[rowp]) \
               or board[rowp][colp] == "*":
                continue
            if board[rowp][colp] == ".":
               board[rowp][colp] = 0
            board[rowp][colp] += 1

def resolve(board):
    """Itera sobre cada celda y si encuentra una mina (*) incrementa todos
    sus cacilleros vacios en 1

    """
    for idx_row, row in enumerate(board):
        for idx_col, cell in enumerate(row):
            if cell == "*":
                increment(board, idx_row, idx_col)

def main():
    field = 0;
    while True:

        # leemos el tamaño de nuestro board
        n = int(raw_input())

        # si el tamaño de nuestro board es 0 salimos
        if n == 0:
            break

        # incrementamos el numero de field
        field += 1

        # leemos el tablero
        board = read_n_lines(n)

        # resolvemos el tablero
        resolve(board)

        # armamos la salida
        out = "\n".join(["".join([str(c) for c in row]) for row in board])

        # imprimimos la salida con su decoradores
        # y si queda algun "." lo reemplazamos por un cero
        print "Field #{0}:".format(field)
        print out.replace(".", "0")
        print ""

#===============================================================================
# MAIN
#===============================================================================

if __name__ == "__main__":
    main()

Problema Menos Fácil (Enunciado)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE BEER-WARE LICENSE" (Revision 42):
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Juan BC

#===============================================================================
# DOCS
#===============================================================================

"""Solucion al problema del buscaminas para la competencia de programación de la
UTN-FRC.

Objetivo: Ser legible y servir de instroduccion a python

Problema originalmente propuesto: http://acm.tju.edu.cn/toj/showp1330.html

"""

#===============================================================================
# META
#===============================================================================

__author__ = "Juan BC"
__license__ = "BeerWare"
__date__ = "2011/10/26"
__version__ = "0.1"
__email__ = "jbc.develop@gmail.com"
__homepage__ = "http://jbcabral.wordpress.com/"
__twitter__ = "@juanbcabral"


#===============================================================================
# FUNCTIONS
#===============================================================================

def read_n_lines(n):
    """Esta funcion lee las siguientes n lineas del file pointer

    """
    lines = []
    for _ in range(n):
        line = list(raw_input())
        lines.append(line)
    return lines

def touch2coordinates(touch):
    """Combierte los "toques" a una lista de coordenadas (fila, columna)
    donde se toco.

    """
    coords = []
    for idx_row, row in enumerate(touch):
        for idx_col, cell in enumerate(row):
            if cell == ".":
                continue
            coords.append((idx_row, idx_col))
    return coords

def coord2mine(row, col, board):
    """Retorna un "*" si el lugar donde indica la cordenada tiene una mina
    en caso contrario retorna cuantas minas rodean a ese lugar.

    """
    # primero nos fijamos en el lugar
    if board[row][col] == "*":
        return "*"
    # sino exploramos
    mines = 0
    for row_d in (-1, 0, 1):
        for col_d in (-1, 0, 1):
            rowp = row + row_d
            colp = col + col_d
            if rowp < 0 or colp < 0 \
               or rowp >= len(board) or colp >= len(board[rowp]):
                continue
            if board[rowp][colp] == "*":
                mines += 1
    return str(mines)

def main():
    """Lee desde un archivo un tablero y toques del buscaminas. Por defecto
    usa la salida estandar.

    """
    # leemos
    n = int(raw_input())
    board = read_n_lines(n)
    touchs = read_n_lines(n)

    # resolvemos
    for row, col in touch2coordinates(touchs):
        symbol = coord2mine(row, col, board)
        touchs[row][col] = symbol

    # convertimos a string para imprimir por pantalla
    print "\n".join(["".join([c for c in row]) for row in touchs])

#===============================================================================
# MAIN
#===============================================================================

if __name__ == "__main__":
    main()

Los archivos en formato archivo

Slides de mis charlas de CNEISI 2011

Slides de mis charlas de PyconAr 2011

Agenda de Django Day Córdoba 2011 lista

El evento django day que va a realizarse en Córdoba el 2/07/2011 ya tiene confirmada su agenda:

http://djangoday.wordpress.com/agenda-de-charlas/

Django-Day Córdoba 2011

El 2 de julio en la utn-frc hay un django day.

Mas info

14/04/2011 – Voy a Estar Dando una Charla Sobre Datos

El viernes que viene (15 de abril) en la estoy dando la charla de Datos en el ciclo de charlas(sic) de unicode.

Los temas que voy a tocar de manera introductoria son:

  • XML
  • JSON
  • YAML
  • Db4o (OODB)
  • Sqlite
  • mongoDB (DB Documental)

 

Son muchos temas los que voy a  dar y a MAS tardar a las 18:10 voy a arrancar (eso significa que puede que lleguen a las 18:10 y yo ya haya empezado)

Lugar: UTN-FRC – Aula 155 edificio central 1er piso

(Mas)

Ultimatum de charlas para Pyday Cordoba 2011

Ultimatum de charlas para Pyday Cordoba 2011
Mañana viernes 8 de abril a las 23:59 VENCE el plazo para enviar charlas para el pyday que va a realizarse el 30 de este mismo mes.
Para enviarlas, logueense y envien la charla aca:
http://www.pyday.com.ar/cordoba2011

Llamado a Becas para Pyday Córdoba 2011

Cortito y al mentón:

Pyday Cba 2011 se enorgullece en anunciar un plan de becas.

Que se financia?: LO QUE USTED NECESITE!!!

Que tiene que hacer para aplicar y venir a este hermoso evento:

– Enviar un mail a con el asunto “[BECA]“
– Especificar en el mismo “MONTO REQUERIDO” y “MOTIVO”

Recuerde:
– Intente pedir el monto de lo que REALMENTE necesita (menos plata
para usted significa mas becas y un mejor evento con mas gente)
– Recuerde que si usted viaja, puede alojarse en lo de un amigo,
pariente, vecino, novi@, amante o criado

FINALMENTE: se darán tantas becas como sea posible y se las anunciara con una
semana de antelación.

Infopython: Charla de Pycon-ar 2010

Dí una charla sobre medición de medios de información con mi librería infopython.

Les dejo las fuentes de las slides

y en slideshare

Pycon Argentina 2010 – Call For Posters

Pycon Argentina en su edición 2010 a realizarse en la ciudad de Córdoba se enorgullece en presentar su:
“Call for Posters”

Usted dirá: Que es un póster?
Un póster es un resumen breve de un trabajo (utilizando python) en forma de
Pycon Argentina 2010.
lámina; el cual se expone de manera permanente en un salón durante toda la
cerca de su creación y expliquen a los curiosos de que se trata su  trabajo.
También se dispondrá de un horario para que todos los expositores estén
A quien esta dirigido:
  • A los que quieran presentar trabajos muy breves como para una charla
  • A los que hicieron charlas que quedaron afuera
  • A los que tengan pánico escénico.

A Donde envío mi póster:

Cierre de recepción de pósters:
  • Viernes 8 de Octubre del 2010, a las 23:59:59
Consideraciones MUY BÁSICAS al hacer un póster:

Formato:

  • No hay un lineamiento general por el tamaño, pero cualquier tamaño cercano al 90 x 120 es bueno (A3 no sera rechazado pero es muy pequeño)

Costos de Impresión:

Una impresión cuesta entre 50 y 100 pesos depende el tipo de
papel y el tratamiento final.
Si bien se pueden hacer con “Fibra y Papel” es mucho mas útil para
que los visitantes se sientan interesados en el trabajo que este impreso en
un lindo formato y papel.
Este costo queda a cargo del presentador del póster. Solo en caso de que no
pueda costearlo la organización analizara el caso.
Cuando me avisan de que mi póster fue aceptado:
  • Lunes 11 de Octubre
Seguir

Get every new post delivered to your Inbox.

Únete a otros 89 seguidores