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