R= range
E= enumerate
def f( p) :
d= { ( x//5 , x%5 ) :[ ] for x in R( 25 ) } ; p= [ ( x, y) for x, r in E( p) for y, v in E( r) if 'X' == v] ; X, Y, C= 0 , 0 , 0 ; M= [ ] ; s= [ [ '0' ] *5for _ in R( 5 ) ] ; V= lambda X, Y:~ -all ( ( x+X, y+Y) in d for x, y in p)
while 1 :
C+= 1 ; Q, W= [ ] , [ ]
for x, y in p:d[ ( x+X, y+Y) ] += C,
if V( X, Y:= Y+1 ) and V( X:= X+1 , Y:= 0 ) :break
while any ( d.values ( ) ) :t= max ( d, key= lambda x:len ( d[ x] ) ) ; M+= t,; d= { i:{ *d[ i] } -{ *d[ t] } for i in d}
for x, y in M:s[ x] [ y] = '1'
return s
def F( b) :
return '\n ' .join ( map ( '' .join , f( b) ) )
print ( F( [ 'XXXX' ] ) ) #Sheep
print ( '-' *40 )
print ( F( [ 'XOO' ,
'0XX' ] ) ) #Unicorn
print ( '-' *40 )
print ( F( [ 'XoX' , #Hippo
'ooo' ,
'XoX' ] ) )
print ( '-' *40 )
print ( F( [ 'XX' , #Pig
'XX' ] ) )
print ( '-' *40 )
print ( F( [ 'XXO' , #Platypus
'OXX' ] ) )
print ( '-' *40 )
print ( F( [ 'X' ] ) ) #Every square needs to be matched
print ( '-' *40 )
print ( F( [ 'X' , 'X' , 'X' , 'X' ] ) ) #Rabbit
print ( '-' *40 )
print ( F( [ 'X' , 'X' , 'X' ] ) ) #Horse
print ( '-' *40 )
print ( F( [ 'XOOO' , 'OXOO' , 'OOXO' , 'OOOX' ] ) ) #Kangaroo
print ( '-' *40 )
print ( F( [ 'OXO' , 'XOX' ] ) ) #Tiddalik
print ( '-' *40 )
print ( F( [ 'OXO' , 'XOX' , 'OXO' ] ) ) #Zebra
print ( '-' *40 )
print ( F( [ 'XX' , 'OX' , 'OX' ] ) ) #Bear
print ( '-' *40 )
print ( F( [ 'OOX' , 'XXO' , 'OOX' ] ) ) #Beaver
print ( '-' *40 )
print ( F( [ 'XO' , 'OX' , 'OX' ] ) ) #Cockatoo
print ( '-' *40 )
print ( F( [ 'XOO' , 'OOO' , 'OOX' ] ) ) #Phoenix
Uj1yYW5nZQpFPWVudW1lcmF0ZQpkZWYgZihwKToKIGQ9eyh4Ly81LHglNSk6W11mb3IgeCBpbiBSKDI1KX07cD1bKHgseSlmb3IgeCxyIGluIEUocClmb3IgeSx2IGluIEUocilpZidYJz09dl07WCxZLEM9MCwwLDA7TT1bXTtzPVtbJzAnXSo1Zm9yIF8gaW4gUig1KV07Vj1sYW1iZGEgWCxZOn4tYWxsKCh4K1gseStZKWluIGQgZm9yIHgseSBpbiBwKQogd2hpbGUgMToKICBDKz0xO1EsVz1bXSxbXQogIGZvciB4LHkgaW4gcDpkWyh4K1gseStZKV0rPUMsCiAgaWYgVihYLFk6PVkrMSlhbmQgVihYOj1YKzEsWTo9MCk6YnJlYWsKIHdoaWxlIGFueShkLnZhbHVlcygpKTp0PW1heChkLGtleT1sYW1iZGEgeDpsZW4oZFt4XSkpO00rPXQsO2Q9e2k6eypkW2ldfS17KmRbdF19Zm9yIGkgaW4gZH0KIGZvciB4LHkgaW4gTTpzW3hdW3ldPScxJwogcmV0dXJuIHMKIApkZWYgRihiKToKCXJldHVybiAnXG4nLmpvaW4obWFwKCcnLmpvaW4sZihiKSkpCgoKcHJpbnQoRihbJ1hYWFgnXSkpICNTaGVlcApwcmludCgnLScqNDApCnByaW50KEYoWydYT08nLAogICAnMFhYJ10pKSAjVW5pY29ybgpwcmludCgnLScqNDApCnByaW50KEYoWydYb1gnLCAjSGlwcG8KICdvb28nLAogJ1hvWCddKSkKcHJpbnQoJy0nKjQwKQpwcmludChGKFsnWFgnLCAjUGlnCiAnWFgnXSkpCnByaW50KCctJyo0MCkKcHJpbnQoRihbJ1hYTycsICNQbGF0eXB1cwogJ09YWCddKSkKcHJpbnQoJy0nKjQwKQpwcmludChGKFsnWCddKSkgI0V2ZXJ5IHNxdWFyZSBuZWVkcyB0byBiZSBtYXRjaGVkCnByaW50KCctJyo0MCkKcHJpbnQoRihbJ1gnLCAnWCcsICdYJywgJ1gnXSkpICNSYWJiaXQKcHJpbnQoJy0nKjQwKQpwcmludChGKFsnWCcsICdYJywgJ1gnXSkpICNIb3JzZQpwcmludCgnLScqNDApCnByaW50KEYoWydYT09PJywgJ09YT08nLCAnT09YTycsICdPT09YJ10pKSAjS2FuZ2Fyb28KcHJpbnQoJy0nKjQwKQpwcmludChGKFsnT1hPJywgJ1hPWCddKSkgI1RpZGRhbGlrCnByaW50KCctJyo0MCkKcHJpbnQoRihbJ09YTycsICdYT1gnLCAnT1hPJ10pKSAjWmVicmEKcHJpbnQoJy0nKjQwKQpwcmludChGKFsnWFgnLCAnT1gnLCAnT1gnXSkpICNCZWFyCnByaW50KCctJyo0MCkKcHJpbnQoRihbJ09PWCcsICdYWE8nLCAnT09YJ10pKSAjQmVhdmVyCnByaW50KCctJyo0MCkKcHJpbnQoRihbJ1hPJywgJ09YJywgJ09YJ10pKSAjQ29ja2F0b28KcHJpbnQoJy0nKjQwKQpwcmludChGKFsnWE9PJywgJ09PTycsICdPT1gnXSkpICNQaG9lbml4