这段代码如何生成印度地图?

nar*_*tra 169 c obfuscation

此代码打印印度地图.它是如何工作的?

#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;
}
Run Code Online (Sandbox Code Playgroud)

bta*_*bta 154

长字符串只是转换为ASCII的二进制序列.第一个for语句b从10开始,[b+++21]字符串后产生31.将字符串作为数组处理,偏移31是字符串中"实际"数据的开始(您提供的代码示例中的第二行).其余代码只是循环遍历位序列,将1和0转换为!和空格并一次打印一个字符.

较少混淆的版本:

#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;
}
Run Code Online (Sandbox Code Playgroud)

巧的部分在putchar报表.拿第一个putchar.ASCII 'Z'为十进制90,因此90/9 = 10这是换行符.在第二个中,十进制33是ASCII '!'.切换33的低位为你提供32,这是一个空格的ASCII.!如果b是奇数则导致打印,如果是偶数则打印空白区域b.剩下的代码只是在那里a通过字符串走"指针" .

  • 字符串不是位序列(注意代码中没有位移操作).它是图像的行程编码. (22认同)

int*_*jay 89

基本上,字符串是图像的行程编码:字符串中的交替字符表示绘制空格的次数,以及连续绘制感叹号的次数.以下是对该计划不同要素的分析:

编码的字符串

此字符串的前31个字符将被忽略.其余包含绘制图像的说明.各个字符确定连续绘制的空格或感叹号的数量.

外循环

此循环遍历字符串中的字符.每次迭代都会将值增加b1,并将字符串中的下一个字符分配给a.

内循环

此循环绘制单个字符,并在到达行尾时绘制换行符.绘制的字符数是a - 64.值c从10到90,并在达到行尾时重置为10.

putchar

这可以改写为:

++c;
if (c==90) {       //'Z' == 90
    c = 10;        //Note: 10 == '\n'
    putchar('\n');
}
else {
    if (b % 2 == 0)
        putchar('!');
    else
        putchar(' ');
}
Run Code Online (Sandbox Code Playgroud)

它根据b是偶数还是奇数绘制适当的字符,或者在需要时绘制换行符.

  • @PankajMahato因为`b`从10开始,索引是`(b ++)+ 21`,从31开始. (3认同)
  • 为什么前 31 个字符被忽略? (2认同)