Mostrando entradas con la etiqueta lenguajes. Mostrar todas las entradas
Mostrando entradas con la etiqueta lenguajes. Mostrar todas las entradas

jueves, 18 de noviembre de 2010

Lenguajes lógicos

El problema que elegí es Knights and Knaves 2.
There are three people (Alex, Brook and Cody), one of whom is a knight, one a knave, and one a spy. 
The knight always tells the truth, the knave always lies, and the spy can either lie or tell the truth. 
They are brought before a judge who wants to identify the spy. 
Alex says: "I am not a spy." 
Brook says: "I am a spy." 
Now Cody is in fact the spy. The judge asks him: "Is Brook really a spy?" 
Can Cody give an answer so that he doesn't convict himself as a spy?

Cosas que sabemos:
  • Uno siempre miente.
  • Otro siempre dice la verdad.
  • El restante miente o dice la verdad.
Tendremos que analizar dos situaciones, una en la que Cody responde si y otra en el que responde no, además de revisar cada combinación posible de lo que podría ser cada uno de los sospechosos.

Suponemos primero que Alex es un Knave, miente y lo que dice debe ser lo opuesto, "I am a spy", pero como no puede ser dos cosas al mismo tiempo, es imposible que sea Knave.

Ahora hay menos cosas que probar, en el primer caso suponemos que Alex es Knight y concuerda con lo que dice, y que Brook es Knave y también concuerda con lo que dice, es decir, no se contradicen, Cody es espía, ya no importa lo que diga Cody.

Si Cody responde al juez que Brook es un espía se presentan los siguientes acontecimientos, el juez puede pensar que efectivamente Brook es espía pero Cody estaría diciendo la verdad y lo convertiría en Knight y como Alex no puede ser Knave es imposible catalogarlos de esta manera.

En el segundo caso el juez puede pensar que Alex es el espía por lo que Cody miente al decir que Brook es espía, entonces Cody es Knave.

Tercer caso, el juez podría pensar que Cody mismo es el espía, y Alex podría ser Knight mientras Brook no se contradice quedándose como Knave, otra vez Cody se queda atrás.

De otra manera si Cody responde que Brook no es espía se presentan los siguientes casos.

El juez sigue pensando, si Alex es espía Cody dice la verdad al decir que Brooks no es espía y Brook queda como Knave y no se contradice, si Brook es espía, Cody sería Knave ya que mintió y Alex está otra vez como Knight. Ahora Alex o Brook pueden ser espía.

Cody dirá que  Brook no es espía.

Y Cody se ha salvado?

lunes, 18 de octubre de 2010

A.p.p.s. (Awk, Perl, Python, Shell)

Esto es la actividad de semana 5: 3 programas lenguaje script.

Awk

Awk es un lenguaje de programación diseñado o especializado en el procesado de archivos de texto o flujos de caracteres. Cada línea del archivo es considerado un registro dividido en campos y a su vez cada campo esta separado por un patrón, por ejemplo un caracter de espacio, una coma o mezclas extrañas.

Debido a su efectividad al tratar con cadenas de texto, se pueden manejar fácilmente pequeñas bases de dato, generar reportes y preparar documentos para otro proceso.

La palabra awk proviene del nombre de sus diseñadores Alfred V. Aho, Peter J. Weinberger y Brian W. Kernighan. La versión original fue escrita en 1977 y en 1985 fue actualizada.

La función básica es buscar por patrones en cada registro y realizar una acción:

/patrón/ {acción}

Existen varios intérpretes para awk, los más conocidos son mawk (que viene preinstalado en algunas versiones de ubuntu) y gawk, para instalar cualquiera de ellos, desde la terminal se escribe:

sudo apt-get install gawk
sudo apt-get install mawk

Hay distintas maneras de ejecutar el programa, si el código es pequeño se puede escribir desde la misma terminal encerrado entre comillas simples y seguido del archivo a procesar:

:~$ awk '/1/ {print $2}' archivoDatos

Cada campo en un registro es referido con un caracter $ seguido del número que lo representa.

Si el código es grande, se crearía un archivo que contiene el código y se usaría:

:~$ awk -f programa archivoDatos archivoDatos2

...y en un archivo como el siguiente:

123 nombre
24444.24 nom2
111   nom3
567 nom4
37   nom5
7177    nom6

...nos mostraría:

nombre
nom3
nom6

Lo que hace es buscar el patrón 1 y si lo encuentra imprime el campo número 2 del registro donde lo identificó.

Ahora imaginemos que necesitamos conseguir la temperatura promedio semanal de cada una de las ciudades en el mundo con la restricción de que las ciudades tengan mas de 1 millón de habitantes.

Tomando una lista de ciudades: Lista.
Y obteniendo temperaturas ficticias aleatorias entre 10 y 30 grados celsius: Temperaturas.

Primero comprobamos que ambos archivos contengan la misma cantidad de líneas:

:~$ wc -l city
336 city
:~$ wc -l temp
336 temp

Ahora juntamos ambos archivos para trabajar fácil en awk:

:~$ cat city temp > lista

Y hacemos un programa como este. Obtenemos este resultado.

Guías de awk:
Perl

Este programa calcula el número stirling del segundo tipo:

El número Stirling del segundo tipo S(n, m) es la cantidad de maneras en que se puede partir un conjunto de n cosas en m subconjuntos no vacíos.

Guías de Perl:



Python

Intento de creador de laberinto simple.

Lo que trataba de hacer: El laberinto se iba a construir a partir de las paredes destruidas entre cada celda o casilla de la matriz, solo se recorrerían todas las celdas de la matriz con un BFS destruyendo algunas paredes al azar y regresando a la celda anterior si la actual ya tiene alguna pared tirada o destruida que no sea la anterior que destruimos.

Guías de Python:



Shell

A veces no se puede extraer el texto de un pdf con herramientas como pdftotext (poppler-utils) o pdfminer. Una opción es convertir el pdf a imágenes y extraer el texto con un OCR (optical character recognition) como tesseract, se muestra el ejemplo aquí [1]. La desventaja es que el texto puede contener errores dependiendo de la resolución y otras cosas, hay que revisarlo.

Nota [1]: Para que funcione tienes que instalar tesseract y el idioma que vas a identificar ej.: sudo apt-get install tesseract-ocr-spa.

Guías Shell: