How can I shorten this python code analyzing a 3d grid? My Python 3 function golf(...) should take a list of lists of lists of strings representing a solid cube and return whether there are any places in which two equal strings are directly next to each other on the x, y or z axis (not diagonally).
If there are no adjacent duplicates, True shall be returned, else False.  

The input list and all of its sublists have the same length as they represent a cube, and their length is greater than 1 but lower than or equal to 5. The only possible values for the Strings inside the nested lists are "X" and "Z".
The maximum code length should be less than 200 bytes.

This is an example test case:

golf([[["X", "Z"],
       ["Z", "X"]],
      [["Z", "X"],
       ["X", "Z"]]]) == True
golf([[["X", "Z"],
       ["Z", "X"]],
      [["X", "Z"],
       ["Z", "X"]]]) == False


My current solution has 234 bytes:

def golf(c):
 r=range(len(c));R=[(a,b)for a in r for b in r];j="".join
 return all("XX"not in l and"ZZ"not in l for l in[j(c[x][y][z]for x in r)for y,z in R]+[j(c[x][y][z]for y in r)for x,z in R]+[j(c[x][y][z]for z in r)for x,y in R])


How can I golf this code any further to save another 35 bytes?
Python 3, 108 107 bytes
Since the cube only contains the strings &quot;X&quot; and &quot;Z&quot;, there are only two valid cube patterns. The one that starts with XZXZX... and the one that starts with ZXZXZ....
My solutions generates these 2 cubes and checks if the inputted cube is one of them.
def golf(l):L=len(l);r=range(L);return l in[[[list(&quot;XZ&quot;*L)[(i+j+k)%2:][:L]for j in r]for k in r]for i in r]
i iterates over the possible cubes. Since the dimension is at least 2, we can reuse r instead of writing for i in(0,1).