58 lines
1.2 KiB
Python
58 lines
1.2 KiB
Python
|
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)
|