#include <stdio.h>
int floor_div2(int x)
{
return (x >= 0) ? x / 2 : (x - 1) / 2;
}
int d2e(int c)
{
return 102 - (c - 99) + 4 * floor_div2(c - 99);
}
int e2d(int x)
{
for (int c = 0; c < 256; c++)
{
if (d2e(c) == x)
return c;
}
return -1;
}
char str[] =
"739B9D9895939EA45447A1969B43868C843F89913F3B718B7B7E8D8A347E87318477752D816E6F7B6F6B267E7575662F";
int main()
{
int len = sizeof(str) - 1;
int count = len / 2;
for (int i = 0; i < len; i += 2)
{
unsigned int num;
sscanf(&str[i], "%2X", &num);
int distance = count - 1 - i / 2;
num -= distance;
printf("%c", e2d(num));
}
return 0;
}
규칙만 약간의 노가다로 구했고, 일일이 쓰는건 진짜 하기 싫어서 자동화 프로그램을 작성했다.
a->64
b->63
c->66
d->65
e->68
f->67
g->6A
h->69
이런식으로 16진수 상에서 -1과 +3을 반복하면서 커진다. 이를 잘 다듬어서 d2e를 만들었고, 역으로 e2d를 만든다.
추가로
ab->6563
ac->6566
bc->6466
로 암호화 되는데, 마지막 문자까지 거리를 암호화문에서 빼고 복호화하면 된다.
이런 사고를 코드로 구현한거다. Level3에 복잡한 게 많은 것 같은데, 이건 그나마 쉬운 편인 것 같다.