Python 3, (削除) 108 (削除ここまで), 104(削除) 104 (削除ここまで), 97 bytes
-7 by borowing @m90's better control flow
f=lambda M,n=0n=1:n n<len(M)and f(M,n+1)or all(X==[*sum(zip(*n*[X[::n]]),())]for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))*n
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Old, longer but more readable version:
f=lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Python 3, (削除) 108 (削除ここまで), 104 bytes
f=lambda M,n=0:n and all(X==[*sum(zip(*n*[X[::n]]),())]for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Old, longer but more readable version:
f=lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Python 3, (削除) 108 (削除ここまで), (削除) 104 (削除ここまで), 97 bytes
-7 by borowing @m90's better control flow
f=lambda M,n=1:n<len(M)and f(M,n+1)or all(X==[*sum(zip(*n*[X[::n]]),())]for X in[M,[*zip(*M)]])*n
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Old, longer but more readable version:
f=lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Python 3, 106(削除) 108 (削除ここまで), 104 bytes
lambdaf=lambda M,n=0:n and all(X[i::n]==X[X==[*sum(zip(*n*[X[::n]for i in rangen]]),(n)for)]for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Old, longer but more readable version:
f=lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Python 3, 106 bytes
lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Python 3, (削除) 108 (削除ここまで), 104 bytes
f=lambda M,n=0:n and all(X==[*sum(zip(*n*[X[::n]]),())]for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Straight-forward approach; tries successively smaller block sizes until a working one is found.
Old, longer but more readable version:
f=lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Python 3, 106 bytes
lambda M,n=0:n and all(X[i::n]==X[::n]for i in range(n)for X in[M,[*zip(*M)]])and n or f(M,~-n%-~len(M))
Straight-forward approach; tries successively smaller block sizes until a working one is found.