본문 바로가기

CTF/SEKAI CTF

[Programmig(PPC)] Let's Play Osu!Mania

1.in 파일을 열어보니...

당최 이게 뭔지를 모르겠다.

 

이건 같이 첨부되어있던 PDF 이다.

 

sample에 있는 내용이 1.in 파일의 것과 같은 듯하다.

 

리듬게임인가?

 

tap 노트가 내려오면 해당하는 올바른 키를 눌러 플레이한다.

hold 노트가 라인에 도달하면 시작 노트를 때맞춰 두드리고 종료 노트에서 해제한다.

 

4K 비트맵이 주어졌을 때 개체(노트?)가 몇 개 있는지 계산해야 한다.

 

첫줄에 나오는 비트맵의 길이에 해당하는 정수 N은 10보다 크고 10000보다 작고,

다음 N줄에서는 비트맵을 설명하는데, 각 줄은 길이가 6인 문자열이고, 첫번째와 마지막 문자는 기호 | 이다.

나머지 4개의 문자는 스페이스, 하이픈(-), 샵(#) 셋 중 하나일 수 있다.

 

중복되거나 깨진 hold 노트는 없고, 각 hold 노트는 본문에 # 과 시작과 끝 노트에 - 를 적어도 하나씩 가진다.

 

샘플처럼 비트맵이 있는건가 보다.

 

 

화면에 있던 링크를 클릭하면 이렇게 된다.

언어를 선택할 수 있고, 옆에 코딩하는 창이 있는데 뭘 코딩하는걸까...

5번 그림대로 플레이하려면 입력해야하는 비트맵을?

 

플래그는? 코딩을 다 하면 플래그가 나오는건가? 필요없는건가??

 

 

일본어로 되어 있어서 놀랐지만 대충 번역해서 읽어본 Write Up에 따르면,

일반적인 경쟁 프로그램이라고 한다.

 

음악 게임의 악보가 주어지고,

tap note와 hold note가 적혀있으며,

hold note는 연속적인 것은 하나로 계산할 때 note 수를 대답하는 문제라고 한다.

 

가로는 4 고정이고

세로 N은 N<10000

로 적당히 구현한다.

 

tap note의 수를 세고 hold note의 그룹 수도 센다.
hold note의 상하에는 tap note가 있으므로, hold note의 수만큼 tap note를 1개 많이 세게 된다.
(hold 부분의 위는 세어도 되지만 아래까지 세면 이중으로 세고 있는 것이 된다)
이므로, tap-hold가 답이다.

 

SEKAI{wysi_Wh3n_y0u_fuxx1ng_C_727727}

 

int N;
 string notes[ 10101 ];

void  _main () {
     cin >> N;
     getline ( cin , notes[ 0 ));
     rep (i, 0 , N) getline ( cin , notes[i]);

    int tap = 0 ;
     int hold = 0 ;
     int pre[ 4 ] = { 0 , 0 , 0 , 0 };
     rep (y, 0 , N) {
         rep (x, 0 , 4 ) {
             char c = notes[y ][x + 1 ];

            if (c == '#' ) {
                 if (pre[x] == 0 ) {
                    hold++;
                    pre[x]++;
                }
            }
            else {
                pre[x] = 0 ;
                 if (c == '-' ) tap++;
            }
        }
    }

    cout << tap - hold << endl ;
}

 

악보와 노트가 적혀있는대로 프로그램을 구현하고 tap-hold를 출력하면 저런 플래그가 나오는 듯한데 지금 CTF가 종료되어서 페이지에 들어갈 수가 없다.

다음부터는 종료되기 전에 Write Up을 완성하기 위해 노력해야겠다.

안 보고도 쓸 수 있으면 가장 좋을 것이다.

'CTF > SEKAI CTF' 카테고리의 다른 글

[Web] Bottle Poem  (0) 2022.11.18
[Rev] Matrix Lab 1  (0) 2022.10.01