4月 04, 2009

【解題】Decode the tape

@
ACM Volume CVIII 10878 - Decode the tape


The Problem

Your boss has just unearthed a roll of old computer tapes. The tapes have holes in them and might contain some sort of useful information. It falls to you to figure out what is written on them.


Input

The input will contain one tape.


Output

Output the message that is written on the tape.


Sample Input

___________
| o   .  o|
|  o  .   |
| ooo .  o|
| ooo .o o|
| oo o.  o|
| oo  . oo|
| oo o. oo|
|  o  .   |
| oo  . o |
| ooo . o |
| oo o.ooo|
| ooo .ooo|
| oo o.oo |
|  o  .   |
| oo  .oo |
| oo o.ooo|
| oooo.   |
|  o  .   |
| oo o. o |
| ooo .o o|
| oo o.o o|
| ooo .   |
| ooo . oo|
|  o  .   |
| oo o.ooo|
| ooo .oo |
| oo  .o o|
| ooo . o |
|  o  .   |
| ooo .o  |
| oo o.   |
| oo  .o o|
|  o  .   |
| oo o.o  |
| oo  .  o|
| oooo. o |
| oooo.  o|
|  o  .   |
| oo  .o  |
| oo o.ooo|
| oo  .ooo|
|  o o.oo |
|    o. o |
___________


Sample Output

A quick brown fox jumps over the lazy dog.


解題思考

  我個人認為,這題還滿有意思的。

  雖然題目什麼都沒有告訴你,不過仔細觀察還是可以發現:tape 上的每一行其實都代表一個 ASCII 碼。


  首先,我做了一個合理的假設:tape 上是以 'o' 代表 1、' ' 代表 0 的方式描述一個二進制的數字。而中間的 '.' 字元,則留待分析完這個二進制數字之後再來判斷用途。

  所以,我試著將 tape 上的第一行轉換成數字:01000001,換成十進制就是 65。很明顯就是大寫 'A' 的 ASCII 碼。接著,我在將 tape 上的第二行轉換成數字:00100000,換成十進制就是 32,也就是空白字元 ' ' 的 ASCII 碼。

  接續拿第三行、第四行做實驗之後,便可以得出一個結論:tape 上的符號,正如假設中為一個以 'o' 代表 1、' ' 代表 0 的二進制數字。而這個數字本身即代表字元的 ASCII 碼。而且,中間的 '.' 字元純粹用來混淆視聽,沒有任何用途。

  得到這個結論,再透過程式實現,就解出這一題囉。


參考解答(C++)

#include <iostream>
#include <cstring>

using namespace std;

int main(void)
{
    char line[12];

    // 跳過第一行
    cin.getline(line, 12);

    while (1)
    {
        cin.getline(line, 12);

        // 結尾行跳出
        if (strcmp(line, "___________") == 0) { break; }

        // 將每一行轉換為 ASCII 碼
        char ch = 0;
        for (int i = 1; i <= 9; i++)
        {
            if (i == 6) { continue; }

            ch <<= 1;
            if (line[i] == 'o') { ch += 1; }
        }

        cout << ch;
    }

#ifndef ONLINE_JUDGE
    system("pause");
#endif

    return 0;
}

0 回覆:

張貼留言