data = [ ["8","c","t","k","3"], ["2","r","H","V","r"], ["2","y",None,"0","v"], ["2","e","n","3","_"], ["}","3","h","{","m"], ] def find_char(c, min=(0, 0)): for x, row in enumerate(data): for y, v in enumerate(row): if v == c and (x, y) >= min: return (x, y) def find_key(cirb="HV23{"): min = (0, 0) key = [] for c in cirb: key.append(find_char(c, min)) min = key[-1] key[3] = (4, 1) # or (3, 3) key.append(rotate(find_char('}'), 3)) # for final '}' return key def rotate(key, rotation): rotation = rotation % 4 if rotation == 0: return key n = len(data) - 1 rotated = [] if isinstance(key, list): for (x, y) in key: rotated.append((y, n - x)) else: rotated = (key[1], n - key[0]) if rotation > 1: return rotate(rotated, rotation - 1) return rotated def get_text(key, rotation=0): text = "" key = list(sorted(rotate(key, rotation))) for (x, y) in key: text += data[x][y] return text key = find_key() flag = "" for i in range(0, 4): flag += get_text(key, -i) print("[+] Flag:", flag)