Acertijo

astralrod astralrod en gmail.com
Mie Oct 15 23:54:41 CEST 2008


Ya una vez me pusieron este acertijo en la escuela, pero no lo pude
resolver, creo que habia copiado mal una pista o de a tiro, andaba mal ese
dia; pero lo qie si recuerdo es haber visto tambien este acertijo resuelto
en muy poco tiempo programado en un lenguaje, prolog, aunque no recuerdo
como lo programaron.

Ha de estar interesante programarlo en python.

Suerte!

PD: espero esta vez poder solucionarlo.

2008/10/15 Daniel Garcia Moreno <dani en danigm.net>

> Hola, hace poco recibí un correo electrónico con un acertijo y me puse a
> implementar una solución en python, pero no he conseguido sacar la
> solución en un tiempo aceptable. Hice una implementación en Haskell que
> tarda sobre 20 minutos en resolverlo, pero en python tarda mucho más.
>
> ¿Alguien sabe cómo resolverlo? Ya sea de manera funcional o
> procedimental.
>
> He aquí el problema y mi "mala" solución:
>
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
> # Author: Daniel Garcia <dani en danigm.net>
> # License: GPLv3
>
> # 1. Hay 5 casas de diferentes colores.
>
> # 2. En cada casa vive una persona de diferente nacionalidad.
>
> # 3. Estos 5 propietarios beben diferentes bebidas, fuman
> # diferentes cigarros y tiene cada uno, diferente de los demás, cierto
> # animal.
>
> # 4. Ninguno de ellos tiene el mismo animal, fuma el mismo cigarro ni
> # bebe la misma bebida.
> # La pregunta es: ¿Quién tiene el pez?
> #
> # Pistas:
> # 01. El inglés vive en la casa roja
> # 02. El sueco tiene perro.
> # 03. El danés toma té.
> # 04. El noruego vive en la primera casa.
> # 05. El alemán fuma prince.
> # 06. La casa verde queda inmediatamente a la izquierda de la blanca.
> # 07. El dueño de la casa verde toma café.
> # 08. La persona que fuma pall mall cría pájaros.
> # 09. El dueño de la casa amarilla fuma durnhill.
> # 10. El hombre que vive en la casa del centro toma leche.
> # 11. El hombre que fuma blends vive al lado del que tiene un gato.
> # 12. El hombre que tiene un caballo vive al lado que fuma durnhill.
> # 13. El hombre que fuma bluemaster toma cerveza.
> # 14. El hombre que fuma blends es vecino del que toma agua.
> # 15. El noruego vive al lado de la casa azul.
>
> ROJO, VERDE, AZUL, AMARILLO, BLANCO = range(5)
> INGLES, SUECO, DANES, ALEMAN, NORUEGO = range(5)
> GATO, CABALLO, PERRO, PEZ, PAJARO = range(5)
> DURN, PALL, PRINCE, BLENDS, BLUE = range(5)
> AGUA, CERVEZA, TE, CAFE, LECHE = range(5)
>
> colores = [ROJO, VERDE, AMARILLO, AZUL, BLANCO]
> nacionalidades = [INGLES, SUECO, DANES, ALEMAN, NORUEGO]
> animales = [GATO, CABALLO, PERRO, PEZ, PAJARO]
> tabacos = [DURN, PALL, PRINCE, BLENDS, BLUE]
> bebidas = [AGUA, CERVEZA, TE, CAFE, LECHE]
>
> N, C, NA, AN, BE, FU = range(6)
>
>
> def tests(casa):
>    for i in pistas_simples:
>        if not i(casa):
>            return False
>    return True
>
> def testc(casas):
>    for i in pistas_complejas:
>        if not i(casas):
>            return False
>    return True
>
> pistas_simples = []
> pistas_complejas = []
>
> def pista1(casa):
>    return pista_simple(casa, NA, INGLES, C, ROJO)
>
> def pista2(casa):
>    return pista_simple(casa, NA, SUECO, AN, PERRO)
>
> def pista3(casa):
>    return pista_simple(casa, NA, DANES, BE, TE)
>
> def pista4(casa):
>    return pista_simple(casa, NA, NORUEGO, N, 1)
>
> def pista5(casa):
>    return pista_simple(casa, NA, ALEMAN, FU, PRINCE)
>
> def pista6(casa):
>    n, c, na, an, be, fu = casa
>    if c == VERDE:
>        return n < 5
>    if c == BLANCO:
>        return n > 1
>    return True
>
> def pista7(casa):
>    return pista_simple(casa, C, VERDE, BE, CAFE)
>
> def pista8(casa):
>    return pista_simple(casa, FU, PALL, AN, PAJARO)
>
> def pista9(casa):
>    return pista_simple(casa, FU, DURN, C, AMARILLO)
>
> def pista10(casa):
>    return pista_simple(casa, BE, LECHE, N, 3)
>
> def pista11(casa):
>    n, c, na, an, be, fu = casa
>    if fu == BLENDS:
>        return an != GATO
>    if an == GATO:
>        return fu != BLENDS
>    return True
>
> def pista12(casa):
>    n, c, na, an, be, fu = casa
>    if fu == DURN:
>        return an != CABALLO
>    if an == CABALLO:
>        return fu != DURN
>    return True
>
> def pista13(casa):
>    return pista_simple(casa, FU, BLUE, BE, CERVEZA)
>
> def pista_simple(casa, i, x, j, y):
>    if casa[i] == x:
>        return casa[j] == y
>    if casa[j] == y:
>        return casa[i] == x
>    return True
>
>
> pistas_simples = [pista1, pista2, pista3, pista4, pista5, pista6,
>        pista7, pista8, pista9, pista10, pista11, pista12, pista13]
>
>
> def pista6c(casas):
>    verde = None
>    blanco = None
>    for casa in casas:
>        n, c, na, an, be, fu = casa
>        if c == VERDE:
>            verde = casa
>        if c == BLANCO:
>            blanco = casa
>
>        if verde and c == BLANCO:
>            return verde[0] == n - 1
>        if blanco and c == VERDE:
>            return blanco[0] == n + 1
>
>    return True
>
> def pista11c(casas):
>    return pista_compleja(casas, AN, GATO, FU, BLENDS)
>
> def pista12c(casas):
>    return pista_compleja(casas, AN, CABALLO, FU, DURN)
>
> def pista14c(casas):
>    return pista_compleja(casas, FU, BLENDS, BE, AGUA)
>
> def pista15c(casas):
>    return pista_compleja(casas, NA, NORUEGO, C, AZUL)
>
> pistas_complejas = [pista6c, pista11c, pista12c, pista14c, pista15c]
>
> def pista_compleja(casas, i, x, j, y):
>    uno = None
>    dos = None
>    for casa in casas:
>        if casa[i] == x:
>            uno = casa
>        if casa[j] == y:
>            dos = casa
>
>        if dos and casa[i] == x:
>            return dos[0] == n - 1 or dos[0] == n + 1
>        if uno and casa[j] == y:
>            return uno[0] == n - 1 or uno[0] == n + 1
>
>    return True
>
>
> def diferentes(lista):
>    if not lista:
>        return True
>    if in_lista(lista[0], lista[1:]):
>        return False
>    return diferentes(lista[1:])
>
> def in_lista(c1, lista):
>    for i in lista:
>        if cmp(c1, i):
>            return True
>    return False
>
> def cmp(c1, c2):
>    for i,j in zip(c1,c2):
>        if i == j:
>            return True
>    return False
>
> def main():
>    # una casa es (numero, color, nacionalidad, animal, bebe, fuma)
>    todos = [(n, c, na, an, be, fu) for n in range(1, 5)
>            for c in colores
>            for na in nacionalidades
>            for an in animales
>            for be in bebidas
>            for fu in tabacos
>            if tests((n, c, na, an, be, fu))]
>
>    solucion = [(x1, x2, x3, x4, x5)
>            for x1 in todos
>            for x2 in todos
>            for x3 in todos
>            for x4 in todos
>            for x5 in todos
>            if diferentes((x1, x2, x3, x4, x5))
>            if testc((x1, x2, x3, x4, x5))]
>
>    print solucion
>
> if __name__ == '__main__':
>    main()
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es