Los años maravillosos – Parte 6

Esta vez sí me tomó tiempo escribir esta parte, así que sin más contratiempos, comencemos.

Recuerden las recomendaciones: agarren palomitas, refresco y pónganse cómodos.

Por si no saben qué onda con esta serie de escritos, aquí proporciono las ligas directas a las partes anteriores.

Mi viaje a Japón había terminado: había una chica que se había llevado mi corazón a su país, esperaba los resultados de la beca de Monbukagakusho… y estaba desempleado. Esto último era quizá lo que no podía resolver tan fácilmente, o al menos así lo creía yo, porque sin saber exactamente si me ganaría la beca o no, me daba “cosa” ir a pedir trabajo sabiendo que era probable que en unos meses renunciaría. Ética a fin de cuentas.

Con todo, me puse a buscar trabajo. Gracias a un contacto de la primera empresa donde laboré concerté una entrevista de trabajo en una empresa de desarrollo de software. No me fue mal, y ellos estaban interesados, pero como no quería mentir mencioné lo de la posibilidad de obtener una beca, y que en caso de conseguirla renunciaría a finales de febrero. Sobra decir que ahí perdieron mucho del interés que tenían porque me uniera a sus filas, por lo que creo que ni es necesario escribir cuál fue su respuesta.

Traductor

La escuela de japonés a la que asistí (el instituto de intercambio cultural México-japonés de Guadalajara) siempre me brindó todo su apoyo, y en esos momentos que no tenía trabajo una profesora me ofreció ser el traductor de un documento. La tarea: traducir de japonés a español una tesis de psicología.

Para ser sincero, aunque tenía N2 de la JLPT y había intentado ya el N1 con resultados no satisfactorios, no me sentía capaz para realizar el trabajo. Una cosa es poder comunicarse en japonés y otra es meterte a traducir escritos que contienen expresiones técnicas de un área que no dominas.

Obviamente decliné la oferta al principio, pero la insistencia de la profesora, sus palabras de apoyo y lo que me dijo que podría cobrar por esa labor terminaron por convencerme. Había aceptado mi primer trabajo como traductor. No sabía en lo que me estaba metiendo. Eso fue, si mi memoria no me falla, por ahí de finales de enero.

Cuando alguien que sabe japonés está viendo una animación japonesa en español y conoce la obra original, o en su defecto la ve en su idioma original con subtítulos en otro lenguaje que entiende (en mi caso inglés y español), es realmente sencillo encontrar errores de traducción, apuntar que existe una mejor forma de expresar en el idioma lo que están diciendo en japonés, y en general señalar todo lo que (se sabe que) está mal. Toooodas las veces que lo hice (y no de mala fe, debo aclarar) se me regresaron al momento de comenzar a traducir el documento arriba mencionado: palabras que en mi vida había visto, nombres en katakana que ni idea tenía de cómo se podían escribir con las letras que nosotros utilizamos, ciudades en el mundo que no me sonaban y que no podía escribir en español… en fin, se avecinaban meses complicados.

El documento tenía 62 páginas, y traducía un promedio de 2.5 por día (dedicándole entre 8 y 10 horas diarias). Para no hacerles el cuento largo, el documento lo terminé justo al llegar a Japón ya becado, y los que me habían pedido el trabajo pensaron que los habían timado porque recibí el pago justo un día antes de partir de México y no los pude contactar hasta una semana después. ¿Cómo me quedó la traducción? Legible y entendible, pero tenía mucho que, ahora que lo pongo en retrospectiva, pudo haber sido mucho mejor. En la escala del 1 al 100 yo le daría un 70, y estaría siendo muy generoso.

Lo que aprendí de esa experiencia es respetar todavía más a las personas que se dedican a hacer traducciones. Es difícil, y muchas veces no puedes traducir exactamente una expresión idiomática, lo cual te orilla a jugar con el lenguaje hasta encontrar algo que se pueda asemejar al original. No obstante, no quito el dedo del renglón: hay trabajos que pueden ser MUCHO MEJORES y que se nota que la persona que lo llevó a cabo no cuenta con la experiencia o el conocimiento para hacerlo.

Continue reading “Los años maravillosos – Parte 6”

En Guadalajara, 2 años después

Sin avisarle a prácticamente nadie, aprovechando unas vacaciones forzadas en el trabajo y agradeciendo de corazón que haya vuelo directo de Tokio a la ciudad de México, aproveché para venirme a mi rancho

Este viaje se decidió repentinamente hace una semana. Renuncié al trabajo que tenía (historia que contaré por separado), y como el siguiente comienza hasta julio, aproveché para tomarme unas vacaciones. La idea original era irse a algún otro lado, pero considerando que tenía 2 años sin estar de este lado del charco y que necesitaba urgentemente una buena dosis de vitamina T, la opción sólo fue una.

Ayer visité mi antigua escuela de japonés y me dio mucho gusto ver a la directora, la profesora Noriko Tsuchiya, y también vi con gusto que el número de estudiantes ha crecido considerablemente.

Estaré por acá solamente un par de semanas. Planeo, de haber gente interesada, hacer otra plática informal para comentar acerca de las becas a Japón, del trabajo y la vida en el país del sol naciente. Intenté entrar al CUCEI, pero ahora resulta que no te dejan entrar a menos que justifiques la razón de tu visita. ¿Seguridad? Quién sabe, ahí sí no puedo decir nada, pero considero que las universidades deben ser espacios públicos abiertos.

Se aceptan invitaciones a la playa en lo que estoy por acá.

Todos los escritos pendientes por acá irán saliendo poco a poco. Como siempre, les agradezco su paciencia y su comprensión.

Por cierto, saludos a Baudelio, estudiante del instituto de intercambio cultural México-japonés, que ayer me saludó durante mi visita. ¡Gracias por leerme!

9 años después…

El pasado 2 de abril cumplí ya 9 años radicando en el país del sol naciente.

Siendo sincero, cuando dejé México aquel 1 de abril de 2003 no pensaba que pasaría tanto tiempo por este lado del mundo. Mi idea original era venir por la maestría, y si era posible, el doctorado, pero en esa época todavía no pensaba tan a fondo en lo que pasaría una vez que me convirtiera en maestro.

Iba a contarles aquí lo que sentí al llegar y lo que fueron los primeros meses en Japón, especialmente llegando al campo japonés, pero recordé que lo tengo planeado para otro escrito, así que no contaré eso, jejeje. Lo que sí puedo mencionar es cómo este país me ha mostrado muchas facetas de la vida que no tuve oportunidad de experimentar en México, y cómo he ido creciendo a lo largo de todo este tiempo.

Quienes me hacen el gran favor de leerme desde hace varios años (llevo 7 años y medio con el blog) han sido partícipes, en mayor o menor medida, de la forma en que he ido cambiando con el paso del tiempo, así como de los problemas a los que me he tenido que enfrentar y las experiencias que he vivido a lo largo de este tiempo. Y no es para menos: aunque me gradué en México (orgullosamente CUCEI, Universidad de Guadalajara) y laboré en 3 diferentes compañías, creo que es acertado decir que mi verdadero desarrollo comenzó en Japón, y todavía no concluye (ni creo que tenga final).

Estar aquí sigue siendo un sueño, por malos que sean los días o por amargas que sean las experiencias. Cada día aprendo algo nuevo de esta cultura, lo que me ayuda a:

  1. Conocer más profundamente este país.
  2. Darme cuenta de la belleza y de la riqueza cultural de México.
  3. Asombrarme del talento que mi país tiene (y del que hay que estar orgullosos)
  4. Entender que nunca podré disfrutar todos los videojuegos que existen (la vida no me va a ajustar 😛 ).

Japón, como cualquier otro lugar en el mundo, tiene sus pros y contras. Durante estos años he tratado de mantener una posición crítica sobre lo que este país ofrece a los extranjeros, y planeo seguir con ella, aunque es claro que mi forma de pensar y analizar las cosas se basa en el hecho que soy mexicano.

Durante estos años, he tenido el gusto y honor de conocer a muchas personas muy valiosas, inteligentes y amables, no sólo japonesas, sino de muchas nacionalidades. He entendido el concepto de “diversidad de razas, culturas y creencias” y de lo importante que es respetar todo lo que es diferente a lo que uno vio cuando creció (incluyendo al chino de mi trabajo al que deberían escuchar cuando come…). Por supuesto, también he conocido a muchos mexicanos que tienen o cumplieron el mismo sueño de venir para acá, de conocer este país.

Cuando llegué, era muy difícil encontrar información de mexicanos en Japón y de las becas del gobierno japonés para estudiar posgrado por acá. Ahora, hay muchas fuentes (incluyendo ésta, por supuesto) para conocer de viva voz lo que uno puede vivir, bueno o malo, estando en Japón. He conocido a compatriotas mucho más inteligentes y talentosos que yo y he aprendido mucho de ellos también.

Mi idilio con Japón continúa, pero aun cuando concluya (en el momento que sea que eso pase), el lazo con este país siempre existirá, y aprovecharé al máximo lo que haya aprendido hasta ese momento sobre el idioma, la cultura y las tradiciones, tratando de aplicar lo bueno a mi país, claro.

Por aquí andamos…

Japón y el transporte público – Parte 1

Viniendo de México, concretamente de Guadalajara, prácticamente cualquier destello de buen servicio en el transporte público, por pequeño que sea, nos deslumbra (con excepción quizá del tren ligero, que a mi gusto es un buen servicio). Sin embargo, el sistema de Japón realmente es de admirarse, y me gustaría mucho que en un futuro (quizá muy lejano), se viera algo similar en mi rancho.

¿Qué tiene de especial el transporte público en Japón? En esta serie de escritos trataré de analizar con detalle sus características. En este primera entrega mencionaré sobre los autobuses y los trenes. Agarren palomitas y refresco:

 

Autobuses

Antes que otra cosa, quiero aclarar que aunque “autobús” es una palabra que todo mundo entiende, en México les llamamos “camiones”.

Aunque la forma de los autobuses no es realmente cosa del otro mundo, su servicio es muy, pero muy diferente al de México.

Por principios de cuentas, usar el autobús en Japón es realmente seguro, y esto se refleja en el número de personas mayores que lo usan día a día. Y no es para menos: el autobús nunca va a exceso de velocidad (de hecho, bajo nuestros estándares los clasificaríamos como lentos), y los choferes son amables y muy serviciales.

La forma de subirse al autobús depende de la ruta y el tipo de autobús que se piense abordar. Lo más común es que la subida sea por atrás, y la bajada por adelante; y como por lo general la tarifa depende de la distancia que uno viaje, se paga antes de bajar, pero no se le da dinero al chofer, sino que se introduce en una máquina que está al frente de la unidad, y que muestro en la siguiente imagen:

 En esta máquina también se pueden cambiar billetes por monedas, y también es posible  realizar el pago por medio de tarjeta de prepago. Este último método es el más usado y el preferido por mucha gente, ya que te quitas el problema de siempre traer cambio o de andar cambiando billetes justo cuando tienes que bajarte y correr porque llevas prisa. Hablaré sobre las tarjetas de prepago un poco más abajo.

Algo que es bueno mencionar, tanto como por detalle curioso como por cultura general e información para quienes quieran venir de paseo a Japón, es la forma de ver el tablero de tarifas de los autobuses:

La primera vez que me subí a un autobús en Iizuka, estaba completamente perdido: desde subirse por atrás, que el chofer te regañe porque te paras del asiento antes de que el autobús se detenga por completo y no traer cambio… no fue una experiencia grata, pero sí ilustrativa. La imagen anterior muestra lo que hay que pagar de tarifa dependiendo de dónde se haya abordado el autobús. ¿Cómo recordarlo? Al subirse, tomas un boletito (llamado “seiriken” 整理券) en el que viene impreso un número. Ése es el número que tienes que buscar en el tablero, y debajo de él está la tarifa que se debe pagar, la cual, como ya mencioné, va aumentando de acuerdo a la distancia que se viaje.

En este caso, y tomando como base el tablero arriba mostrado, la tarifa que esta persona debe pagar si se baja en este momento es de 1630 yenes (lo que equivale a un viaje muy largo). Dicho sea de paso, la tarifa más barata también depende de la ruta y de la región de Japón, y hay autobuses que recorren en círculo rutas muy cortas y con tarifas fijas (en promedio 100 yenes).

En lo que respecta a viajes largos, el autobús es quizá la forma más barata de viajar en Japón si aguantan asientos estrechos. Por ejemplo, de Fukuoka a Tokio pueden encontrar boletos sencillos desde 5,500 yenes (dependiendo del día de la semana y de la temporada). ¡5,500 yenes! Es un precio sumamente accesible… pero, además de los asientos (que hay a quienes pueden no molestarles), hay otro factor a considerar: el tiempo que tarda el viaje.

Por ley, en Japón los choferes no pueden manejar más de cierto número de horas contínuas, por lo que, aun de noche, se hacen paradas en estaciones de servicio cada 2 o 3 horas durante un lapso de 15 a 30 minutos. De ahí que los viajes se alargan, a mi gusto, demasiado. En el viaje mencionado (Fukuoka – Tokio) se hacen 15 horas de camino. Yo lo más que he aguantado es un viaje de Fukuoka a Kioto, el cual duró poco más de 8 horas: no dormí nada, terminé con dolor de cuello y el siguiente día fue muy pesado (visité los templos en estado zombie).

Claro que si se gasta más dinero, se puede viajar mejor en autobús: los asientos de primera clase son amplios, se hacen cama, tienen TV incluída y hasta WiFi gratis hay, sin contar claro con que las unidades que los tienen son 2 de pisos y los mencionados asientos están en la parte del frente del segundo piso, perfectos para ir viendo el paisaje; lo malo es que solamente hay 4 por autobús y se ocupan rápidamente. ¿El precio? Lo más barato que lo pueden encontrar es a 15,000 yenes, y en temporada alta sube hasta cerca de 20,000. Para quienes gustan de disfrutar un viaje largo pero lleno de comodidades, quizá pueda ser una buena opción.

Como dato adicional: ¿alguna vez han visto que en una parada de autobuses haya una lista con los horarios a los que pasa el camión? Acá eso se da en todas, por pequeñas que sean. Ésta es una característica que me gustaría ver en México. Y hablando de paradas de autobuses, hay de todo tipo: desde muy pequeñas y sin lugar para sentarse, que solamente tienen el símbolo de “parada” y los horarios, hasta mucho más sofisticadas. Pero sin duda, lo más importante es que no importa lo solitaria, remota, escondida y oscura que pueda estar una parada, si en el horario dice que pasa un camión por ahí a las 11 pm, pueden estar seguros que pasará. En Japón no se dan situaciones estilo México, donde el chofer te dice “nomás llego hasta X lugar” cuando abordas en la noche (me pasó incontables veces en Guadalajara).

Trenes

Sin lugar a duda, el sistema de transporte público por excelencia.

Continue reading “Japón y el transporte público – Parte 1”

Encuentra la diferencia – versión Kanji – en Scala

Y ya con este código dejo el tema por la paz. Lo pongo para que quede en el registro:

object Uniques {
  def main(a: Array[String]) {
    if (a.length != 1) {
      println("Need an argument to analyze")
      sys.exit(1)
    }
    else {
      findUniques(a(0)) match {
        case l if (l.isEmpty) => println("All characters are the same")
        case l => l foreach println
      }
    }
  }

  def findUniques(seq: String) =  seq filter {c => seq.count(_ == c) == 1} map {c => "Unique instance found: " + c + " in position " + (seq.indexOf(c) + 1)}
}

Y probando el caso en cuestión:

mmedina@yggdrasil-m:~/Programming/Scala/Tests$ scala Uniques "麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈塵麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈 麈麈麈麈麈麈麈麈麈"
Unique instance found: 塵 in position 66

Hacerlo para que funcione con otros tipos de datos sin cambiar nada de código no es muy complicado.

Encuentra la diferencia – versión Kanji – en Haskell

Lo prometido es deuda. Siguiendo con el escrito anterior, aquí está el código que resuelve el problema, pero ahora en Haskell:

import qualified Data.ByteString as B
import qualified Data.ByteString.UTF8 as U
import System.Environment(getArgs)
import Data.List
import Data.Maybe

main = do
    putStrLn "Write the sequence you want to analyze:"
    B.getLine >>=  processArguments

processArguments :: B.ByteString ->  IO ()
processArguments xs = findUniques $ U.toString xs

findUniques = printUniques . findUniques'

findUniques' :: (Eq a, Show a) => [a] ->  [(a,Int)]
findUniques' xs = let uniques = filter (\i ->  countInstances i xs == 1) $ nub xs
                  in [(x,y) | x <- uniques, y <- mapMaybe (\i ->  i `elemIndex` xs) [x]]

printUniques :: (Eq a, Show a) =>  [(a,Int)] ->  IO ()
printUniques [] = putStrLn "All instances are the same"
printUniques us = mapM_ putStrLn $ map (\c →  ((("Unique instance: " ++ ) $ show $ fst c) ++ ) $ ((" in position " ++ ) $ show $ (+1) $ snd c)) us

countInstances :: (Eq a, Show a) =>  a ->  [a] ->  Int
countInstances _ [] = 0
countInstances c (x:xs)
    | c == x = 1 + countInstances c xs
    | otherwise = countInstances c xs

 

Es un hecho que puedo usar un where en la definición de printUniques, pero bueno, el caso es que funciona:

mmedina@yggdrasil-m:~/Programming/Haskell/FindDifference$ ./fdc
Write the sequence you want to analyze:
麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈塵麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈
Unique instance: '\22645' in position 66

Todo muy bonito, sí. Pero entonces: ¿para qué tanto código en Haskell? Explico:

Continue reading “Encuentra la diferencia – versión Kanji – en Haskell”

Encuentra la diferencia – versión Kanji

Hace unos días, me llegó un retweet con lo siguiente:

【間違い探し☆超超超超上級編】 麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈塵麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈 解けたらRT!

El punto es encontrar el kanji que es diferente, y al hacerlo, enviar el mensaje en un RT. Según el principio del mensaje, este problema es de nivel súper-súper-súper-súper avanzando.

“Buena forma de pasar el tiempo”, pensé, pero no para resolverlo “a mano”, sino creando un programa que lo hiciera por mí.

Viendo mis opciones, decidí programar el algoritmo en Python, tanto como práctica como para seguir dándome de topes por lo de las string unicode vs byte strings (quienes saben python entienden a lo que me refiero).

En sí, el algoritmo es sencillo, así que no tomó mucho tiempo:

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

import sys

def searchDifferentKanji(strseq):
    utf8Str = unicode(strseq,"utf-8")
    difstr = list(set(utf8Str))

    for c in difstr:
        if utf8Str.count(c) == 1:
            return c.encode("utf-8"), utf8Str.index(c) + 1

    return '',-1

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Error: Need a string to check"
        exit(1)
    else:
        difchar, pos = searchDifferentKanji(sys.argv[1])
        if pos != -1:
            print "Different char: " + unicode(difchar,"utf-8") + " in position " + str(pos)
        else:
            print "All characters are the same"

Lo que hago es simple: creo un set a partir de la cadena, haciendo con esto que todos los elementos repetidos se esfumen, y lo convierto a lista, la cual contiene exactamente un carácter por cada carácter diferente en la cadena original. Después recorro esa lista buscando en la cadena si el elemento actual aparece una sola vez; de ser así, es el carácter que estoy buscando, por lo que lo regreso, junto con la posición en la que está.

Existen problemas similares que contienen más de una diferencia, es decir: entre un mar de repeticiones del mismo carácter se encuentran varios diferentes. Para resolverlos, el algoritmo arriba expuesto puede ser sencillamente modificado para que no rompa el ciclo con el primer carácter diferente que encuentre, y agregue la tupla de (carácter,posición) a una lista, que sería el valor que la función “searchDifferentKanji” regresaría.

Como nota adicional, el kanji de ese problema es , que se lee 「しゅ」(shu), y conlleva el significado de “ciervo grande”. El kanji diferente es , con varias lecturas, entre ellas las más comúnes 「ちり」 (chiri), que significa “polvo”, “basura” y 「ごみ」(gomi), que también significa “basura”.

Sí: me queda de tarea hacerlo en Haskell.

Año fiscal nuevo, Saint Seiya nuevo

Actualización:

Lo dicho: ya no están los episodios en los links que tenía antes, pero con la fiebre que está causando la serie por allá, más de alguno sabe dónde conseguirlos o verlos.

Actualización:

Fueron rápidos. Ya está el episodio en Youtube, dividido en 2 partes. Véanlo antes de que lo quiten. Gracias a @Aries_Tj por la información. Obviamente están en japonés.

[youtube]http://www.youtube.com/watch?v=-nvDUzNgL94[/youtube]

[youtube]http://www.youtube.com/watch?v=SWur9gr3JTc[/youtube]

Ha comenzado un nuevo año fiscal en Japón: nuevo ciclo escolar, los recién egresados entran a las compañías a trabajar, y la ronda de estrenos de animación de primavera también hace su aparición.

Algunos lo consideraban leyenda urbana, otros ya habían visto el anuncio oficial… Como sea, el caso es que hay nueva serie de Saint Seiya. Y aunque no me emociona mucho el horario en el que la están transmitiendo (ya les comentaré el porqué), no puedo negar que sentí un poco de nostalgia al ver de nuevo en TV a Seiya y poder gritarle que no sirve para nada y que debía morir de unas 24 maneras diferentes 😛

¿Por qué no me emociona el horario? Bueno: consideremos que es los domingos a las 6:30 am. Olvídense de que es pecado mortal levantarse ese día a esa hora, ya que para eso existe el torne: los domingos por la mañana se caracterizan por ser la barra programación infantil; por aquí pasan programas como Pretty Cure, las mil y una versiones de Kamen Rider, y en fin, caricaturas para un público de menor edad de la que podríamos esperar para una serie como Saint Seiya. De verdad que me gustaría mucho estar equivocado y que resulte ser una serie atractiva… Creo que sólo el tiempo me podrá responder.

[youtube]http://www.youtube.com/watch?v=IKNtnF2s61s[/youtube]

En fin. El caso es que la serie comienza con Saori y un bebé. Un malo malote llega, y Saori se dispone a proteger al bebé. El malote ataca y en ese momento cuando hace su aparición triunfal el personaje X, o sea Seiya, sip, el original, como saint (caballero) dorado, visitendo la cross (armadura) de sagitario. El malote, después de que ve su ataque reducido a nada, expresa: 「流石ゴールドセイント」, es decir, “como era de esperarse de un saint dorado”, confirmando así que Seiya es oficialmente el saint dorado de sagitario (por si a alguien todavía pudiera sorprenderle). Seiya hace su pose tradicional y lanza el ペガサス流星拳 o en español, el “meteoro pegaso”, mientras que el bebé en los brazos de Saori ve a su salvador de espaldas.

Unos 13 años después vemos a un chico (que adivinamos sin problemas que es aquel bebé) siendo entrenado por Shaina, sí, la misma de antes. Este chico, de nombre Kouga (光牙) es el nuevo candidato a la armadura de pegaso, pero nunca ha sentido el cosmo, no entiende por qué tiene que convertirse en saint, y detesta la idea de que alguien más decida el destino que él debe seguir. Shaina lo reprime mucho, diciéndole que si no puede despertar su cosmo, no podrá defender a Atena, a lo que Kouga responde que dónde está Atena y que lo lleve ante ella, de otra forma no puede creer nada.

Para no hacerles el cuento largo: Saori al parecer está siendo consumida por energía negativa. Llega un malo malote a llevársela argumentando que para poder conquistar el mundo necesitan de ella. Obviamente Saori reacciona enciendiendo su cosmo, momento en el que Kouga se da cuenta que Saori es Atena (por si no lo sabían :P); Saori se dispone a pelear, pero en eso llega Shaina y comienza la pelea del malo contra ella, la cual termina rápidamente con la victoria del malote. Kouga, a quien Saori justo acababa de regalarle un collar con una especie de diamante, dice que él protegerá a Atena, su cosmo se prende, y del collar sale una luz que resulta ser la armadura de pegaso. Kouga, al mismo tiempo, ve la visión de aquel sujeto en armadura dorada que peleó hace mucho tiempo (léase “Seiya”),  y Seiya le dice que lo que está sintiendo es el cosmo, y que lo tiene que hacer arder. Acto seguido, Kouga lanza el fantabuloso y trillado ペガサス流星拳 (meteoro pegaso) y … ahí termina el capítulo.

¿Qué les puedo decir? Sinceramente, el principio estuvo mejor de lo que esperaba, pero aún es imposible decir si la serie pinta bien o no. Lo que me sorprendió es que ahora todo está situado en el futuro, y Seiya (y quiero creer que los demás, Shiryu, Shun, Ikki y Hyoga) está posicionado dentro de los saint dorados, consolidando todo lo que hizo en el pasado. Veamos como se desenvuelve la historia.

Algunos detalles:

  • La voz de Saori, y la intérprete del opening, es 中川翔子(Nakagawa Shoko), mejor conocido como “Shokotan”, una embajadora del mundo otaku que brincó al mainstream hace ya varios años.
  • La canción del opening es una versión nueva de Pegasus Fantasy, titulada originalmente como “ペガサス幻想 ver. Ω” (Pegasus Fantasy, versión Omega). La letra es la misma.
  • La voz de Seiya es la del seiyuu original, es decir 古谷徹 (Furuya Tooru).
  • Seiya es muy chafa (opinión personal desde hace muuuuuchos años).

¿Cómo la ven? Yo opino que hay que darle una oportunidad. Insisto: no espero mucho de esta serie, pero ojalá me equivoque y resulte ser algo digno de ser recordado.

Por cierto, otra de las series que comienzan, y que vaya que hacía falta que algo así llegara, es Lupin III, a partir del 4 de abril. La serie se titula “Lupin III: una mujer llamada Mine Fujiko” (ルパン三世:峰不二子という女). Acá les dejo el video promocional:

[youtube]http://www.youtube.com/watch?v=Om_UdToxqqE[/youtube]

Obteniendo todas las posibles “palabras” de 7 letras (o menos)

Últimamente, el juego al que más le dedico tiempo (además de Tekken) es a Angry Words (apalabrados en español). Con eso que me gusta Scrabble desde hace mucho, me relaja mientras voy en el tren y al mismo tiempo me ayuda a practicar mi vocabulario.

De la misma manera, le he estado dedicando tiempo a aprender Haskell, ya que veo que algunas cosas de PLN podrían ser implementadas más fácilmente con programación funcional.

Buscaba un problema que me ayudara a practicar Haskell, a dar mis primeros pinitos en el lenguaje. Y mientras disfrutaba el mencionado juego y veía que es más de “ponle lo que sea a ver si pega” en vez de “piensa en alguna palabra interesante”, se me ocurrió crear un programa que, dada una serie de letras, mostrara todas la combinaciones posibles entre ellas. Lo veía fácil y factible, por lo que me decidí a poner manos a la obra.

¿Qué tan difícil puede ser?… me pregunté. Y aunque no es algo tan complicado, sí me tomó más tiempo del que pensaba debido a que había que hacer el cambio a programación funcional y no a imperativa.

Primero, a definir el algoritmo:

Tomemos una palabra de 3 letras (por conveniencia, más adelante verán por qué), digamos “ola”. ¿Qué es lo que quiero obtener? La lista de posibles permutaciones con esas 3 letras, es decir: ola, oal, loa, lao, aol, alo. Aquí me di cuenta de un patrón: tomo una letra de la palabra, la pongo al principio, y simplemente tomo las otras 2 letras restantes y les cambio el orden. Para comenzar, tomo la “o” como la letra principal, entonces me quedo con “la”, y las únicas combinaciones posibles son “la” y “al”; después, agrego la letra principal “o” y la pongo al principio de cada palabra, obteniendo “ola”,”oal”. Continúo con la siguiente letra, la “l”, la tomo como principal, quedándome “oa”, de la cual obtengo “oa” y “ao”; le pongo la “l” al principio de cada una y obtengo “loa”,”lao”. Por último tomo la “a” como letra principal, lo que me deja con “ol” como el resto, obteniendo “ol” y “lo”; le pongo la “a” al principio de cada una y resultan “aol”, “alo”. Juntando todos los resultados parciales, obtengo la lista de palabras que estoy buscando.

Con la definición anterior, recursivamente se pueden analizar palabras de cualquier longitud. ¿Buenas noticias para los que juegan apalabrados? En teoría, si es que tienen la paciencia de ver todos los resultados. ¿Cuántos son? Saquemos cuentas:

Una palabra de 3 letras resultó en una lista de 6 palabras. ¿Cuántas resultarán de una de 4? Como lo que buscamos son permutaciones, la fórmula es sencilla:

n!

Revisemos: 3! = 3x2x1 = 6. ¡Bien! Si cuadra el resultado

Entonces, con 4 letras tendremos: 4! = 4x3x2x1 = 24 Todavía no son muchas…

Con 5 : 5! = 5x4x3x2x1 = 120 ya da flojera ver tantas permutaciones…

¿Y con 7? Pues 7! = 7x6x5x4x3x2x1 = 5040 Está bien que no haya límite de tiempo en cada jugada de apalabrados, pero qué flojera (o ganas de ganar) de aquél(la) que se ponga a leerla cada vez.

¡Ajá! Dirán ustedes: ¿qué pasa si hay letras repetidas? Obviamente habrá palabras repetidas también, lo cual reduce nuestra lista. ¿A cuánto? Oh benditas matemáticas:

n!/(a!b!c!…)

En donde a es el número de veces que se repite una letra, b es el número de veces que se repite otra, c es el número de veces que se repite otra… y así sucesivamente.

Supongamos que tenemos las letras “atajada” (si las tienen, ¡no la piensen y jueguen esa palabra!). La letra “a” se repite 4 veces, entonces, tendremos:

7!/4! = 7x6x5 = 210

Quizá pude haber pensado el algoritmo con una palabra de 4 letras desde el principio, y aunque sí revisé a mano después, me era más fácil iniciar con una de 3 (sólo 6 posibles permutaciones).

Luego, a hacer el programa. El resultado, a sabiendas de que puede haber una mucho mejor implementación, es una belleza de 18 líneas de código (y porque puse doble enter en algunos lugares):

Continue reading “Obteniendo todas las posibles “palabras” de 7 letras (o menos)”

XMonad: Cambiar el nombre del layout que se muestra

Hace tiempo escribí sobre XMonad y un xmonad.hs básico en donde mostraba cómo mostrar íconos en vez del título del layout. Esta vez esalgo similar, pero como ahora sí estoy estudiando Haskell en forma, ando buscando cómo hacer lo que quiero con guards:

En uno de los escritorios estoy usando LayoutCombinators para combinar 2 layouts (concretamente simpledTabbed y DragPane Horizontal). Al mostrarse el nombre del layout aparece lo siguiente:

“combining Tabbed Simplest with DragPane Horizontal 0.1 0.099999999”

Debido a su longitud, me quita espacio del título de la ventana activa, por lo que pensé hacer un shorten, pero después recordé que en la laptop hago pattern matching para mostrar un ícono en vez del nombre del layout, por lo que pensé hacer algo parecido: si el nombre del layout comienza con “combining”, muestro un nombre que yo defina, y en cualquier otro caso muestro el nombre original.

El layout quedó así:

myXmobarPP h = xmobarPP
             { ppOutput = hPutStrLn h
             , ppCurrent = xmobarColor "green" "" 
             , ppHidden = xmobarColor "#5f7962" ""
             , ppVisible = xmobarColor "#f4a460" ""
             , ppUrgent = xmobarColor "#cc0000" "" . wrap "*" "*"
             , ppSep = " | "
             , ppWsSep = "  "
             , ppLayout = xmobarColor "#5CBAF5" "" .
                          (\lName -> showLayoutName lName)
             , ppTitle = xmobarColor "white" "" . shorten 150
             }

showLayoutName :: String -> String  
showLayoutName a | Just rest <- stripPrefix "combining" a = "Tabbed + DragPane H" 
showLayoutName a = a

Donde lo que quiero hacer está en ppLayout: una expresión lambda para revisar si el título comienza con “combining” o no. Esa revisión la hago en la función showLayoutName con la función stripPrefix, que recibe una lista y regresa otra lista que contiene los elementos después del prefijo indicado si es que existe, o Nothing en caso contrario. Si el título del Layout comienza con “combining”, regreso “Tabbed + DragPane H”, y si no, simplemente regreso lo que me llegó.

Intenté hacerlo con guards, pero nomás no me compiló el código, y como estoy en el trabajo, no me dio más tiempo de probar, por eso lo implementé como aquí se muestra.

Si quisiera hacerlo en Scala, el código quedaría así:

val xmobarColor = (bgColor: String) => (fgColor: String) => (output: String) => {
  // Hacer algo con los parámetros y regresar un String
  ...
}

val showLayoutName = (layout: String) => {
  layout.startsWith("combining") match {
    case true => "Tabbed + DragPane H"
    case _ => layout
}

// Asignando todo a ppLayout

val ppLayout = ((xmobarColor("#5CBAF5")("")) compose showLayoutName)

// Siendo layoutName el nombre del layout actual

ppLayout(layout)

Aunque sigo siendo novato en Scala (y para esos fines, en programación funcional), me late más la forma concisa de Haskell. Hacer function composition en scala es agregar demasiadas palabras (aunque si usara scalaz todo cambiaría), mientras que en Haskell el currying, la aplicación parcial y la composición se hacen sin mayor complicación.

Sigo estudiando y practicando.