fork download
  1. E=enumerate
  2. def g(b,B):
  3. q=[(x,y)for x,y in B if b[x][y]=='.'];Q=[q.pop(0)];S=[Q[0]]
  4. for x,y in Q:
  5. for X,Y in[(x+1,y),(x-1,y),(x,y-1),(x,y+1)]:
  6. if(u:=(X,Y))in set(B)-set(S)and'.'==b[X][Y]:Q+=u,;S+=u,
  7. return not{*q}-{*S}
  8. F=lambda x,l,c=0,k=0:F(x[1:],l,-~c*(T:=x[0]==l),max(k,c+T))if x else k
  9. def f(n,b):
  10. B=[(x,y)for x,r in E(b)for y,_ in E(r)];D=[(x,y)for x,y in B if'#'==b[x][y]]
  11. return all((n+~x,n+~y)in D for x,y in D)*g(b,B)*all(F(i,'.')>2and n>F(i,'#')for i in b)*all(F(i,'.')>2and n>F(i,'#')for i in zip(*b))
  12.  
  13. def to_board(s):
  14. n=int(len(s)**.5);return n,[s[i:i+n]for i in range(0,len(s),n)]
  15.  
  16. TEST = """
  17. `.........`|True|Valid grid
  18. `#..............#`|True|Valid grid
  19. `...#........#...`|True|Valid grid
  20. `...#........#...`|True|Valid grid
  21. `.........`|True|Valid grid
  22. `#...#......#...#`|False|Valid grid
  23. `.........................`|True|Valid grid
  24. `##...#.............#...##`|True|Valid grid
  25. `.................................................`|True|Valid grid
  26. `........................#........................`|True|Valid grid
  27. `....###.....##......##.....##......##.....###....`|True|Valid grid
  28. `................................................................`|True|Valid grid
  29. `##....####....##...........##......##...........##....####....##`|True|Valid grid
  30. `...##.......#...........##.....##.....##...........#.......##...`|True|Valid grid
  31. `#...............`|False|No 180 degree symmetry
  32. `#..##..##..##..#`|False|2-letter entries, filled-in columns
  33. `#........................`|False|No 180 degree symmetry
  34. `.......#...###...#.......`|False|1-letter and 1-letter entries
  35. `######....#....#....#....`|False|No 180 degree symmetry, filled-in column & row
  36. `######...##...##...######`|False|Filled-in columns & rows
  37. `...#......#......#......#......#......#......#...`|False|White squares not contiguous, filled-in column
  38. `.................###....#....###.................`|False|1-letter entries
  39. `...#......#...............##.....................`|False|No 180-degree symmetry
  40. `....#.......#.......#........######........#.......#.......#....`|False|White squares not contiguous
  41. `..#.........#.......#......##......#.......#.......#.........#..`|False|1-letter and 2-letter entries
  42. `.#......#..............................................#......#.`|False|1-letter entries, white squares not contiguous
  43. `...........................##......#............................`|False|No 180-degree symmetry
  44. `####............................................................`|False|No 180-degree symmetry
  45. `#......##......##......##......##......##......##......##......#`|False|Filled-in columns
  46. """
  47.  
  48.  
  49. for i in filter(None, TEST.split('\n')):
  50. a,b,_ = i.split('|')
  51. assert f(*to_board(a[1:-1])) == eval(b)
  52.  
  53. print('tests passed!')
Success #stdin #stdout 0.09s 14120KB
stdin
Standard input is empty
stdout
tests passed!