1. ホーム
  2. c

[解決済み] このコードでインドの地図はどのように生成されるのでしょうか?

2022-04-29 19:26:22

質問

このコードはインドの地図を表示します。どのように動作するのでしょうか?

#include <stdio.h>
main()
{
    int a,b,c;
    int count = 1;
    for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
    TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
    UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
    NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
    HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
    T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
    Hq!WFs XDt!" [b+++21]; )
    for(; a-- > 64 ; )
    putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
    return 0;
}

解決方法は?

長い文字列は、バイナリ列をASCIIに変換しただけのものです。 最初の for 文は b は10で始まり [b+++21] の後に31を出力します。 文字列を配列として扱うと、オフセット31は文字列の中の"real"データの開始位置となります(ご提供いただいたコードサンプルの2行目です)。 残りのコードは単純にビット列をループして、1や0を!や空白に変換し、一度に1文字ずつ表示します。

難読化されていないバージョン。

#include "stdio.h"
int main (void) {
    int a=10, b=0, c=10;
    char* bits ="TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!";
    a = bits[b];
    while (a != 0) {
        a = bits[b];
        b++;
        while (a > 64) {
            a--;
            if (++c == 'Z') {
                c /= 9;
                putchar(c);
            } else {
                putchar(33 ^ (b & 0x01));
            }
        }
    }
    return 0;
}

は <ストライク 変 巧妙な部分は putchar ステートメントを使用します。 最初の putchar . ASCII 'Z' は10進数で90なので、90÷9=10で改行文字となります。 2つ目は、10進数で33がASCIIとなり '!' . 33の下位ビットを切り替えると32となり、これはASCIIでいうところのスペースになります。 このため ! が印刷される場合 b が奇数の場合は空白が印刷されます。 b は偶数である。 残りのコードは単に"pointer"を歩かせるために存在します。 a を文字列を通して表示します。