Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Binary hardcore aka z.join solution in Speedy category for Pattern Recognition by CDG.Axel
from itertools import product
# could be work with matrix without indexing an achievement?
def checkio(pattern, image):
(pc, pr, ic, ir), z = map(len, [pattern[0], pattern, image[0], image]), '0'
# a ton of preparation (image, pattern) --> int, 2 bits per cell [most significant bit is matrix[0][0]]
image = int(z.join(z.join(map(str, row)) for row in image), 2)
pattern = int(z.join(z.join(map(str, row)).ljust(2 * ic - 1, z) for row in pattern).ljust(ic * ir * 2 - 1, z), 2)
mask1, mask0 = (int(((x * pc).ljust(2 * ic, z) * pr).ljust(ic * ir * 2, z), 2) for x in ('11', '10'))
# definitely fast matching
for i in range(ir - pr + 1):
for j in range(ic - pc + 1):
if mask1 & image == pattern:
image |= mask0
pattern, mask0, mask1 = (x >> 2 for x in (pattern, mask0, mask1))
pattern, mask0, mask1 = (x >> 2 * pc - 2 for x in (pattern, mask0, mask1))
# then back transformation
return [[image >> (row * ic + col) * 2 & 3 for col in range(ic)[::-1]] for row in range(ir)[::-1]]
Nov. 28, 2021
Comments: