'''
Python 3.x solution to puzzle at:
http://programmingpraxis.com/2009/06/16/who-owns-the-zebra/
'''
import itertools
colors = ('yellow', 'blue', 'red', 'ivory', 'green')
nationalities = ('Norwegian', 'Ukranian', 'Englishman', 'Spaniard', 'Japanese')
drinks = ('water', 'tea', 'milk', 'orange juice', 'coffee')
brands = ('Kools', 'Chesterfields', 'Old Gold', 'Lucky Strikes', 'Parliaments')
pets = ('fox', 'horse', 'snails', 'dog', 'zebra')
count = 0 # Count of solutions, just in case there is more than one.
for n in itertools.permutations(nationalities):
if n.index('Norwegian') != 0:
continue
for d in itertools.permutations(drinks):
if (d.index('milk') != 2 or
n.index('Ukranian') != d.index('tea')):
continue
for c in itertools.permutations(colors):
if (n.index('Englishman') != c.index('red') or
d.index('coffee') != c.index('green') or
c.index('green') != (c.index('ivory') + 1) or
abs(n.index('Norwegian') - c.index('blue')) != 1):
continue
for b in itertools.permutations(brands):
if (b.index('Kools') != c.index('yellow') or
b.index('Lucky Strikes') != d.index('orange juice') or
n.index('Japanese') != b.index('Parliaments')):
continue
for p in itertools.permutations(pets):
if (n.index('Spaniard') != p.index('dog') or
b.index('Old Gold') != p.index('snails') or
abs(b.index('Chesterfields') - p.index('fox')) != 1 or
abs(b.index('Kools') - p.index('horse')) != 1):
continue
count +=1
print('Solution #', count, ':', sep = '')
print('Water drinker: ', n[d.index('water')])
print('Zebra owner: ', n[p.index('zebra')])
# End of script.