Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Si lo vamos a hacer, vamos a hacerlo bien!

Acá es­tá el th­read.

Es la­aaar­go, pe­ro bue­no, re­sul­ta­do fi­na­l, co­mo soy un ner­d, soy un pro­gra­ma­do­r, y los pro­gra­ma­do­res pro­gra­man hi­ce el pro­gra­ma.

Lo que me sor­pren­dió fué que ape­nas lo em­pe­cé a ha­ce­r, es­te pro­gra­ma com­ple­ta­men­te des­car­ta­ble, que no sir­ve pa­ra na­da... es­tu­ve re pro­li­jo.

  • Usé do­c­­trings.

  • Usé do­c­­tes­­ts.

  • Lo hi­­ce con cui­­da­­do con el uni­­co­­­de.

  • Los co­­­men­­ta­­rios son ade­­cua­­dos

  • La fa­c­­to­­­ri­­za­­ción en fun­­cio­­­nes es­­tá bien he­­cha

Ha­ce ape­nas un año no hu­bie­ra he­cho to­do eso. Me pa­re­ce que es­toy ter­mi­nan­do una eta­pa en mi (len­ta, a los tro­pe­zo­nes) evo­lu­ción co­mo pro­gra­ma­do­r, y es­toy pro­gra­man­do me­jor que lo que ve­nía ha­cien­do.

Me pa­sa­ba mu­cho que co­mo py­thon te de­ja ha­cer las co­sas rá­pi­do, las ha­cía rá­pi­do y ma­l, o len­to y bien. Aho­ra las ha­go rá­pi­do y (creo) bien, o por lo me­nos me­jo­r, o al me­nos me­nos peo­r.

De pa­so: és­te es un ex­ce­len­te ejer­ci­cio pa­ra pro­gra­ma­do­res "ju­nio­r"!

  • In­­vo­­­lu­­cra ma­­ne­­jo de strings que pue­­de (o no) re­­so­l­­ve­r­­se con re­­gexps

  • Usar tes­­ts ha­­ce las co­­sas más fá­­ci­­les en vez de más di­­fí­­ci­­les

  • Te ha­­ce "pen­sar en uni­­co­­­de"

  • El al­­go­­­ri­t­­mo en sí no es di­­fí­­ci­­l, pe­­ro es al­­go tra­m­­po­­­so

De pa­so, acá es­tá el (tal vez pa­vo­ta­men­te so­brees­tu­dia­do) pro­gra­ma en cues­tió­n, ga­so­.­py:

# -*- coding: utf-8 -*-

"""
Éste es el módulo gasó.

Éste módulo provee la función gasear. Por ejemplo:

>>> gasear(u'rosarino')
u'rosarigasino'
"""

import unicodedata
import re

def gas(letra):
    '''dada una letra X devuelve XgasX
    excepto si X es una vocal acentuada, en cuyo caso devuelve
    la primera X sin acento

    >>> gas(u'a')
    u'agasa'

    >>> gas (u'\xf3')
    u'ogas\\xf3'

    '''
    return u'%sgas%s'%(unicodedata.normalize('NFKD', letra).encode('ASCII', 'ignore'), letra)

def umuda(palabra):
    '''
    Si una palabra no tiene "!":
        Reemplaza las u mudas de la palabra por !

    Si la palabra tiene "!":
        Reemplaza las "!" por u

    >>> umuda (u'queso')
    u'q!eso'

    >>> umuda (u'q!eso')
    u'queso'

    >>> umuda (u'cuis')
    u'cuis'

    '''

    if '!' in palabra:
        return palabra.replace('!', 'u')
    if re.search('([qg])u([ei])', palabra):
        return re.sub('([qg])u([ei])', u'\\1!\\2', palabra)
    return palabra

def es_diptongo(par):
    '''Dado un par de letras te dice si es un diptongo o no

    >>> es_diptongo(u'ui')
    True

    >>> es_diptongo(u'pa')
    False

    >>> es_diptongo(u'ae')
    False

    >>> es_diptongo(u'ai')
    True

    >>> es_diptongo(u'a')
    False

    >>> es_diptongo(u'cuis')
    False

    '''

    if len(par) != 2:
        return False

    if (par[0] in 'aeiou' and par[1] in 'iu') or \
    (par[1] in 'aeiou' and par[0] in 'iu'):
        return True
    return False

def elegir_tonica(par):
    '''Dado un par de vocales que forman diptongo, decidir cual de las
    dos es la tónica.

    >>> elegir_tonica(u'ai')
    0

    >>> elegir_tonica(u'ui')
    1
    '''
    if par[0] in 'aeo':
        return 0
    return 1

def gasear(palabra):
    """
    Convierte una palabra de castellano a rosarigasino.

    >>> gasear(u'rosarino')
    u'rosarigasino'

    >>> gasear(u'pas\xe1')
    u'pasagas\\xe1'

    Los diptongos son un problema a veces:

    >>> gasear(u'cuis')
    u'cuigasis'

    >>> gasear(u'caigo')
    u'cagasaigo'


    Los adverbios son especiales para el castellano pero no
    para el rosarino!

    >>> gasear(u'especialmente')
    u'especialmegasente'

    """
    #from pudb import set_trace; set_trace()

    # Primero el caso obvio: acentos.
    # Lo resolvemos con una regexp

    if re.search(u'[\xe1\xe9\xed\xf3\xfa]',palabra):
        return re.sub(u'([\xe1\xe9\xed\xf3\xfa])',lambda x: gas(x.group(0)),palabra,1)


    # Siguiente problema: u muda
    # Reemplazamos gui gue qui que por g!i g!e q!i q!e
    # y lo deshacemos antes de salir
    palabra=umuda(palabra)

    # Que hacemos? Vemos en qué termina

    if palabra[-1] in 'nsaeiou':
        # Palabra grave, acento en la penúltima vocal
        # Posición de la penúltima vocal:
        pos=list(re.finditer('[aeiou]',palabra))[-2].start()
    else:
        # Palabra aguda, acento en la última vocal
        # Posición de la última vocal:
        pos=list(re.finditer('[aeiou]',palabra))[-1].start()

    # Pero que pasa si esa vocal es parte de un diptongo?

    if es_diptongo(palabra[pos-1:pos+1]):
        pos += elegir_tonica(palabra[pos-1:pos+1])-1
    elif es_diptongo(palabra[pos:pos+2]):
        pos += elegir_tonica(palabra[pos:pos+2])


    return umuda(palabra[:pos]+gas(palabra[pos])+palabra[pos+1:])

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Pablo / 2010-03-19 16:21:

Muy bueno el codigo, lo lei en un ratito.

Steinke Elida / 2010-08-06 09:18:

it is the script translate spanish to rosarino?don't know,but thanks you and learning
discount watches

jayboyd / 2011-09-16 09:48:

This post is inspiring and encouraging. I can relate. After many years programming, I've found myself recently feeling a need to be test-driven, document, add UML diagrams to my personal idle time projects. I hope as you suggest that this marks the cusp of a new level of maturity in my evolution as a software maker. 

phone number lookup / 2011-12-03 22:31:

this is really interesting viewpoint on the subject i might add

employment background check / 2011-12-27 23:28:

Man ... Beautiful . Amazing ... I will bookmark your website and use the your RSS feed also


Contents © 2000-2024 Roberto Alsina