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)