from itertools import permutations
from pprint import pprint
COLORS = [ 'blue' , 'green' , 'red' , 'white' , 'yellow' ]
PETS = [ 'cat' , 'bird' , 'dog' , 'fish' , 'horse' ]
BEVERAGES = [ 'beer' , 'coffee' , 'milk' , 'tea' , 'water' ]
CIGARETTES = [ 'Dunhill' , 'Rothmans' , 'Pall Mall' , 'Winfield' , 'Marlboro' ]
NATIONALITY = [ 'Norwegian' , 'Brit' , 'Dane' , 'German' , 'Swede' ]
NUMBERS = [ '1' , '2' , '3' , '4' , '5' ]
QUESTIONS = [ "number" , "color" , "nationality" , "beverage" , "cigarettes" , "pet" ]
def is_predicate( citizens: list , predicate: str ) :
return any ( [ ( set ( predicate.split ( "-" ) ) ) .issubset ( el.values ( ) ) for el in citizens] )
def z( predicate: str ) :
def carry( citizens: list ) :
return is_predicate( citizens, predicate)
return carry
def answer( relations, question) :
my_list = (
( { "color" : c[ 0 ] , "pet" : pe[ 0 ] , "beverage" : b[ 0 ] ,
"cigarettes" : ci[ 0 ] , "nationality" : n[ 0 ] , "number" : NUMBERS[ 0 ] } ,
{ "color" : c[ 1 ] , "pet" : pe[ 1 ] , "beverage" : b[ 1 ] ,
"cigarettes" : ci[ 1 ] , "nationality" : n[ 1 ] , "number" : NUMBERS[ 1 ] } ,
{ "color" : c[ 2 ] , "pet" : pe[ 2 ] , "beverage" : b[ 2 ] ,
"cigarettes" : ci[ 2 ] , "nationality" : n[ 2 ] , "number" : NUMBERS[ 2 ] } ,
{ "color" : c[ 3 ] , "pet" : pe[ 3 ] , "beverage" : b[ 3 ] ,
"cigarettes" : ci[ 3 ] , "nationality" : n[ 3 ] , "number" : NUMBERS[ 3 ] } ,
{ "color" : c[ 4 ] , "pet" : pe[ 4 ] , "beverage" : b[ 4 ] ,
"cigarettes" : ci[ 4 ] , "nationality" : n[ 4 ] , "number" : NUMBERS[ 4 ] }
)
for c in permutations( COLORS)
for pe in permutations( PETS)
for b in permutations( BEVERAGES)
for ci in permutations( CIGARETTES)
for n in permutations( NATIONALITY)
)
for p in relations:
f = z( p)
my_list = filter ( f, my_list)
return next( my_list)
if __name__ == '__main__' :
pprint ( answer( ( 'Marlboro-blue' , 'Norwegian-Dunhill' , 'Brit-3' ,
'German-coffee' , 'beer-white' , 'cat-water' ,
'horse-2' , 'milk-3' , '4-Rothmans' ,
'dog-Swede' , 'Norwegian-1' , 'horse-Marlboro' ,
'bird-Brit' , '4-green' , 'Winfield-beer' ,
'Dane-blue' , '5-dog' , 'blue-horse' ,
'yellow-cat' , 'Winfield-Swede' , 'tea-Marlboro' ) ,
'fish-color' ) )
#asserts
# assert answer(('Norwegian-Dunhill', 'Marlboro-blue', 'Brit-3',
# 'German-coffee', 'beer-white', 'cat-water',
# 'horse-2', 'milk-3', '4-Rothmans',
# 'dog-Swede', 'Norwegian-1', 'horse-Marlboro',
# 'bird-Brit', '4-green', 'Winfield-beer',
# 'Dane-blue', '5-dog', 'blue-horse',
# 'yellow-cat', 'Winfield-Swede', 'tea-Marlboro'),
# 'fish-color') == 'green' # What is the color of the house where the Fish lives?
# assert answer(('Norwegian-Dunhill', 'Marlboro-blue', 'Brit-3',
# 'German-coffee', 'beer-white', 'cat-water',
# 'horse-2', 'milk-3', '4-Rothmans',
# 'dog-Swede', 'Norwegian-1', 'horse-Marlboro',
# 'bird-Brit', '4-green', 'Winfield-beer',
# 'Dane-blue', '5-dog', 'blue-horse',
# 'yellow-cat', 'Winfield-Swede', 'tea-Marlboro'),
# 'tea-number') == '2' # What is the number of the house where tea is favorite beverage?
# assert answer(('Norwegian-Dunhill', 'Marlboro-blue', 'Brit-3',
# 'German-coffee', 'beer-white', 'cat-water',
# 'horse-2', 'milk-3', '4-Rothmans',
# 'dog-Swede', 'Norwegian-1', 'horse-Marlboro',
# 'bird-Brit', '4-green', 'Winfield-beer',
# 'Dane-blue', '5-dog', 'blue-horse',
# 'yellow-cat', 'Winfield-Swede', 'tea-Marlboro'),
# 'Norwegian-beverage') == 'water'
# What is the favorite beverage of the Norwegian man?###
pass
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHBlcm11dGF0aW9ucwpmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CgpDT0xPUlMgPSBbJ2JsdWUnLCAnZ3JlZW4nLCAncmVkJywgJ3doaXRlJywgJ3llbGxvdyddClBFVFMgPSBbJ2NhdCcsICdiaXJkJywgJ2RvZycsICdmaXNoJywgJ2hvcnNlJ10KQkVWRVJBR0VTID0gWydiZWVyJywgJ2NvZmZlZScsICdtaWxrJywgJ3RlYScsICd3YXRlciddCkNJR0FSRVRURVMgPSBbJ0R1bmhpbGwnLCAnUm90aG1hbnMnLCAnUGFsbCBNYWxsJywgJ1dpbmZpZWxkJywgJ01hcmxib3JvJ10KTkFUSU9OQUxJVFkgPSBbJ05vcndlZ2lhbicsICdCcml0JywgJ0RhbmUnLCAnR2VybWFuJywgJ1N3ZWRlJ10KTlVNQkVSUyA9IFsnMScsICcyJywgJzMnLCAnNCcsICc1J10KUVVFU1RJT05TID0gWyJudW1iZXIiLCAiY29sb3IiLCAibmF0aW9uYWxpdHkiLCAiYmV2ZXJhZ2UiLCAiY2lnYXJldHRlcyIsICJwZXQiXQoKCmRlZiBpc19wcmVkaWNhdGUoY2l0aXplbnM6IGxpc3QsIHByZWRpY2F0ZTogc3RyKToKICAgIHJldHVybiAgYW55KFsoc2V0KHByZWRpY2F0ZS5zcGxpdCgiLSIpKSkuaXNzdWJzZXQoZWwudmFsdWVzKCkpIGZvciBlbCBpbiBjaXRpemVuc10pCgoKZGVmIHoocHJlZGljYXRlOiBzdHIpOgogICAgZGVmIGNhcnJ5KGNpdGl6ZW5zOiBsaXN0KToKICAgICAgICByZXR1cm4gaXNfcHJlZGljYXRlKGNpdGl6ZW5zLCBwcmVkaWNhdGUpCiAgICByZXR1cm4gY2FycnkKCgpkZWYgYW5zd2VyKHJlbGF0aW9ucywgcXVlc3Rpb24pOgogICAgbXlfbGlzdCA9ICgKICAgICAgICAoeyJjb2xvciI6IGNbMF0sICJwZXQiOiBwZVswXSwgImJldmVyYWdlIjogYlswXSwKICAgICAgICAgICJjaWdhcmV0dGVzIjogY2lbMF0sICJuYXRpb25hbGl0eSI6IG5bMF0sICJudW1iZXIiOiBOVU1CRVJTWzBdfSwKICAgICAgICAgeyJjb2xvciI6IGNbMV0sICJwZXQiOiBwZVsxXSwgImJldmVyYWdlIjogYlsxXSwKICAgICAgICAgICJjaWdhcmV0dGVzIjogY2lbMV0sICJuYXRpb25hbGl0eSI6IG5bMV0sICJudW1iZXIiOiBOVU1CRVJTWzFdfSwKICAgICAgICAgeyJjb2xvciI6IGNbMl0sICJwZXQiOiBwZVsyXSwgImJldmVyYWdlIjogYlsyXSwKICAgICAgICAgICJjaWdhcmV0dGVzIjogY2lbMl0sICJuYXRpb25hbGl0eSI6IG5bMl0sICJudW1iZXIiOiBOVU1CRVJTWzJdfSwKICAgICAgICAgeyJjb2xvciI6IGNbM10sICJwZXQiOiBwZVszXSwgImJldmVyYWdlIjogYlszXSwKICAgICAgICAgICJjaWdhcmV0dGVzIjogY2lbM10sICJuYXRpb25hbGl0eSI6IG5bM10sICJudW1iZXIiOiBOVU1CRVJTWzNdfSwKICAgICAgICAgeyJjb2xvciI6IGNbNF0sICJwZXQiOiBwZVs0XSwgImJldmVyYWdlIjogYls0XSwKICAgICAgICAgICJjaWdhcmV0dGVzIjogY2lbNF0sICJuYXRpb25hbGl0eSI6IG5bNF0sICJudW1iZXIiOiBOVU1CRVJTWzRdfQogICAgICAgICkKICAgICAgICBmb3IgYyBpbiBwZXJtdXRhdGlvbnMoQ09MT1JTKQogICAgICAgIGZvciBwZSBpbiBwZXJtdXRhdGlvbnMoUEVUUykKICAgICAgICBmb3IgYiBpbiBwZXJtdXRhdGlvbnMoQkVWRVJBR0VTKQogICAgICAgIGZvciBjaSBpbiBwZXJtdXRhdGlvbnMoQ0lHQVJFVFRFUykKICAgICAgICBmb3IgbiBpbiBwZXJtdXRhdGlvbnMoTkFUSU9OQUxJVFkpCiAgICApCiAgICBmb3IgcCBpbiByZWxhdGlvbnM6CiAgICAgICAgZiA9IHoocCkKICAgICAgICBteV9saXN0ID0gZmlsdGVyKGYsIG15X2xpc3QpCiAgICByZXR1cm4gbmV4dChteV9saXN0KQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHBwcmludChhbnN3ZXIoKCdNYXJsYm9yby1ibHVlJywgJ05vcndlZ2lhbi1EdW5oaWxsJywgJ0JyaXQtMycsCiAgICAgICAgICAgICAgICAgICAnR2VybWFuLWNvZmZlZScsICdiZWVyLXdoaXRlJywgJ2NhdC13YXRlcicsCiAgICAgICAgICAgICAgICAgICAnaG9yc2UtMicsICdtaWxrLTMnLCAnNC1Sb3RobWFucycsCiAgICAgICAgICAgICAgICAgICAnZG9nLVN3ZWRlJywgJ05vcndlZ2lhbi0xJywgJ2hvcnNlLU1hcmxib3JvJywKICAgICAgICAgICAgICAgICAgICdiaXJkLUJyaXQnLCAnNC1ncmVlbicsICdXaW5maWVsZC1iZWVyJywKICAgICAgICAgICAgICAgICAgICdEYW5lLWJsdWUnLCAnNS1kb2cnLCAnYmx1ZS1ob3JzZScsCiAgICAgICAgICAgICAgICAgICAneWVsbG93LWNhdCcsICdXaW5maWVsZC1Td2VkZScsICd0ZWEtTWFybGJvcm8nKSwKICAgICAgICAgICAgICAgICAgJ2Zpc2gtY29sb3InKSkKICAgICNhc3NlcnRzCiAgICAjIGFzc2VydCBhbnN3ZXIoKCdOb3J3ZWdpYW4tRHVuaGlsbCcsICdNYXJsYm9yby1ibHVlJywgJ0JyaXQtMycsCiAgICAjICAgICAgICAgICAgICAgICdHZXJtYW4tY29mZmVlJywgJ2JlZXItd2hpdGUnLCAnY2F0LXdhdGVyJywKICAgICMgICAgICAgICAgICAgICAgJ2hvcnNlLTInLCAnbWlsay0zJywgJzQtUm90aG1hbnMnLAogICAgIyAgICAgICAgICAgICAgICAnZG9nLVN3ZWRlJywgJ05vcndlZ2lhbi0xJywgJ2hvcnNlLU1hcmxib3JvJywKICAgICMgICAgICAgICAgICAgICAgJ2JpcmQtQnJpdCcsICc0LWdyZWVuJywgJ1dpbmZpZWxkLWJlZXInLAogICAgIyAgICAgICAgICAgICAgICAnRGFuZS1ibHVlJywgJzUtZG9nJywgJ2JsdWUtaG9yc2UnLAogICAgIyAgICAgICAgICAgICAgICAneWVsbG93LWNhdCcsICdXaW5maWVsZC1Td2VkZScsICd0ZWEtTWFybGJvcm8nKSwKICAgICMgICAgICAgICAgICAgICAnZmlzaC1jb2xvcicpID09ICdncmVlbicgICMgV2hhdCBpcyB0aGUgY29sb3Igb2YgdGhlIGhvdXNlIHdoZXJlIHRoZSBGaXNoIGxpdmVzPwogICAgIyBhc3NlcnQgYW5zd2VyKCgnTm9yd2VnaWFuLUR1bmhpbGwnLCAnTWFybGJvcm8tYmx1ZScsICdCcml0LTMnLAogICAgIyAgICAgICAgICAgICAgICAnR2VybWFuLWNvZmZlZScsICdiZWVyLXdoaXRlJywgJ2NhdC13YXRlcicsCiAgICAjICAgICAgICAgICAgICAgICdob3JzZS0yJywgJ21pbGstMycsICc0LVJvdGhtYW5zJywKICAgICMgICAgICAgICAgICAgICAgJ2RvZy1Td2VkZScsICdOb3J3ZWdpYW4tMScsICdob3JzZS1NYXJsYm9ybycsCiAgICAjICAgICAgICAgICAgICAgICdiaXJkLUJyaXQnLCAnNC1ncmVlbicsICdXaW5maWVsZC1iZWVyJywKICAgICMgICAgICAgICAgICAgICAgJ0RhbmUtYmx1ZScsICc1LWRvZycsICdibHVlLWhvcnNlJywKICAgICMgICAgICAgICAgICAgICAgJ3llbGxvdy1jYXQnLCAnV2luZmllbGQtU3dlZGUnLCAndGVhLU1hcmxib3JvJyksCiAgICAjICAgICAgICAgICAgICAgJ3RlYS1udW1iZXInKSA9PSAnMicgICMgV2hhdCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBob3VzZSB3aGVyZSB0ZWEgaXMgZmF2b3JpdGUgYmV2ZXJhZ2U/CiAgICAjIGFzc2VydCBhbnN3ZXIoKCdOb3J3ZWdpYW4tRHVuaGlsbCcsICdNYXJsYm9yby1ibHVlJywgJ0JyaXQtMycsCiAgICAjICAgICAgICAgICAgICAgICdHZXJtYW4tY29mZmVlJywgJ2JlZXItd2hpdGUnLCAnY2F0LXdhdGVyJywKICAgICMgICAgICAgICAgICAgICAgJ2hvcnNlLTInLCAnbWlsay0zJywgJzQtUm90aG1hbnMnLAogICAgIyAgICAgICAgICAgICAgICAnZG9nLVN3ZWRlJywgJ05vcndlZ2lhbi0xJywgJ2hvcnNlLU1hcmxib3JvJywKICAgICMgICAgICAgICAgICAgICAgJ2JpcmQtQnJpdCcsICc0LWdyZWVuJywgJ1dpbmZpZWxkLWJlZXInLAogICAgIyAgICAgICAgICAgICAgICAnRGFuZS1ibHVlJywgJzUtZG9nJywgJ2JsdWUtaG9yc2UnLAogICAgIyAgICAgICAgICAgICAgICAneWVsbG93LWNhdCcsICdXaW5maWVsZC1Td2VkZScsICd0ZWEtTWFybGJvcm8nKSwKICAgICMgICAgICAgICAgICAgICAnTm9yd2VnaWFuLWJldmVyYWdlJykgPT0gJ3dhdGVyJwogICAgIyAgV2hhdCBpcyB0aGUgZmF2b3JpdGUgYmV2ZXJhZ2Ugb2YgdGhlIE5vcndlZ2lhbiBtYW4/IyMjCiAgICBwYXNz