Challenge 03

3 - Wednesday

Be the wednesday. Unlike challenge 1, you probably won't be able to beat this game the old fashioned way. Read the README.txt file, it is very important.

Đề bài cho 1 game 2D, ta mở lên chạy thử

Game chỉ đơn giản là vượt qua các chướng ngại vật (ngồi xuống hoặc nhảy để né vật thể).

Tuy nhiên, có những chỗ như hình trên, nhìn bằng mắt thì phải ngồi xuống để vượt qua, nhưng khi ngồi xuống thì character của chúng ta die ngay lập tức, hoặc có chỗ nhìn thì đáng ra phải nhảy lên, nhưng thật ra phải ngồi xuống mới qua được.

Sau 1 thời gian ngồi chơi game, mình phát hiện ra rằng:

  • Game không thay đổi vị trí các vật thể sau các lần chết, để đạt được 8 điểm đầu tiên thì trạng thái lần lượt là: ngồi, ngồi, nhảy, nhảy, ngồi, ngồi, ngồi, nhảy.
  • Chỉ có thể nhảy hoặc ngồi mới vượt qua được vật thể, đứng yên là die.

Vậy chỉ có 2 trạng thái là có thể giúp ta vượt qua vật thể, đến đây mình nghĩ ngay tới số nhị phân, vì số nhị phân cũng chỉ có 2 chữ số là 0 và 1. Với loạt trạng thái như ở trên thì số nhị phân có thể là: 00110001 hoặc 11001110.

Tìm thử dãy binary 00110001 trong memory ta được:

Ở trên hình, mình đã select 296 byte, giá trị của các byte này chỉ là “00” hoặc “01”. Ta có thể nghĩ ngay tới số nhị phân vì số nhị phân cũng được biểu diễn từ các con số 0 và 1. Vì vậy đoạn code dưới đây mình đã ghép 8 byte lại với nhau, rồi in ra màn hình. Lý do mình ghép 8 mà ko phải là 7 hay 9 là vì mỗi byte được tạo nên từ số nhị phân có 8 chữ số.

# python3

if __name__ == '__main__':
    d = [0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
         0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
         0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
         0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
         0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
         0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00,
         0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
         0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00,
         0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
         0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
         0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01,
         0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
         0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
         0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
         0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
         0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
         0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
         0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00,
         0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
         0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
         0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00,
         0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01,
         0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
         0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
         0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
         0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01,
         0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
         0x01, 0x00, 0x01, 0x01, 0x00, 0x01
    ]
    assert len(d) % 8 == 0
    s = ""
    for i in range(len(d) // 8):
        tmp = 0
        for j in range(8):
            tmp = tmp | (d[8*i+j] << (7 - j))
        s = s + chr(tmp)
    print (s)

Run:

1t_i5_wEdn3sd4y_mY_Dud3s@flare-on.com

[+] Source code dùng để giải cho tất cả các bài nằm ở đây