입력으로 정수 i(0 ≤ i ≤ 10)가 들어오면, genzaw.zip의 gen$i.out에 있는 내용을 출력하는 문제이다. 단, 소스코드는 10만자를 넘을 수 없다.
그래서 genzaw.zip을 까 보면, 가장 작은 gen0.out을 제외하고 200KB 정도 되는 파일부터 3MB 정도 되는 파일까지 다양하다. 물론 이걸 그대로 출력할 수는 없고, 파일 형태를 보고 생성한 알고리즘을 유추해서 문제를 풀어야 한다.
각 파일마다 푸는 방법이 많이 다르므로, 파일마다 힌트와 풀이를 정리해서 올린다.
~
gen0.out
예제 출력에 해당한다.
출력이 몇 바이트 안 되므로, 직접 하드코딩해서 출력하면 된다.
~
gen1.out
알파벳이 적힌 파일이다.
왠지 같은 문자가 여러 번 반복되는 것 같다.
반복되는 문자와 반복 횟수를 구한 뒤 하드코딩해서 출력하도록 하면 된다.
반복 횟수에서 규칙성을 찾아 보면, 적당한 문자열에 대해서 i번째 문자를 (2932 - i * i % 2932)번 반복하는 것임을 발견할 수 있다.
~
gen2.out
수열이 적힌 파일이다.
1, 1, 2, 3, 5, 8, ... 어디선가 많이 본 수열 같다. 모르겠다면 OEIS를 이용해보자.
주어진 수열은 피보나치 수열을 특정 수로 나눈 나머지를 적은 수열이다.
64비트 정수만으로도 어렵지 않게 풀 수 있으므로, 특정 수가 얼마인지는 직접 찾아보도록 하자.
~
gen3.out
#과 .이 적힌 파일이다.
i행 j열의 문자는 i & j가 0이면 #, 0이 아니면 .이다.
함정이 조금 있지만 직접 짜 보고 뭔지 확인해보자.
~
gen4.out
0과 1이 적힌 파일이다.
왠지 규칙성이 없어 보인다.
앞 부분에서는 0이 꽤 많지만, 뒤쪽으로 갈 수록 줄어든다.
0이 있는 위치 + 2가 모두 소수이다.
400002 미만의 소수를 모두 구해서 0을 체크하면 된다.
함정이 조금 있지만 직접 짜 보고 뭔지 확인해보자.
~
gen5.out
폴란드어가 적힌 파일이다.
폴란드어로 2000년 1월 1일부터 2020년 12월 31일까지가 각 해의 몇 번째 날인지를 출력하면 된다.
함정이 조금 있지만 직접 짜 보고 뭔지 확인해보자.
~
gen6.out
T[$number]="$string";이 적힌 파일이다.
$string을 이루는 문자들이 서로 다른 것 같다.
a~z에서 사전순으로 몇 개의 문자를 뽑아서 나열하는 방법들을 길이, 사전순으로 나열한 것이다.
예를 들어, T[2]="ab"; T[3]="ba"; T[4]="abc"; T[5]="acb"; T[6]="bac"; ...와 같은 식이다.
함정이 조금 있지만 직접 짜 보고 뭔지 확인해보자.
~
gen7.out
#과 .이 적힌 파일이다.
#으로 아스키 아트를 했는데, 사용된 숫자가 0, 1, 2 뿐인 것 같다.
2^n을 3진법으로 적어 놓은 것이다. 큰 수 연산이 필요하다.
마지막 네 줄이 뭘 뜻하는 지 모르겠어서 하드코딩을 했다.
함정이 조금 있지만 직접 짜 보고 뭔지 확인해보자.
~
gen8.out
#과 .이 적힌 파일이다.
중심에서부터 시작해서 나선을 그리는 것 같다.
중심에서부터 8방향 중 어느 곳으로 한 칸씩 움직이는지를 찾아서 하드코딩하면 된다.
~
gen9.out
#과 .이 적힌 파일이다.
선분을 여러 개 그린 것 같다.
각 선분의 시작 지점과 방향, 길이를 찾아서 하드코딩하면 된다.
~
gen10.out
수열과 행렬이 적힌 파일이다.
파일에 a_i와 B_i에 대한 식이 적혀 있는 것 같다.
a_i는 파일에 적힌 대로 구하면 되고, A_i는 a_20의 앞 i * i개의 수를 이용하면 된다.
B_i는 양이 별로 많지 않고 0과 1로만 구성되어 있으므로 압축해서 하드코딩해도 10만 자가 넉넉해서 풀린다.
B_1부터 순서대로 n에 대한 합동식을 구해나가서 n을 구해도 되고, 다른 파일들을 정직하게 풀었다면 n이 무엇인지 유추(?)할 수 있을 것이다.