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

这个密码可以打印印度地图,它是怎么工作的?

#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;
}
53185 次浏览

长字符串只是一个转换为 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;
}

很奇怪的聪明之处在于 putchar语句。拿第一个 putchar。ASCII 'Z'的小数是90,所以90/9 = 10是换行符。在第二种情况下,小数点33是 '!'的 ASCII。切换低阶位33得到32,这是空格的 ASCII。如果 b是奇数,则打印 !; 如果 b是偶数,则打印空格。剩下的代码只是在字符串中遍历“指针”a

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

编码字符串

忽略此字符串的前31个字符。其余部分包含绘制图像的说明。单个字符决定要连续绘制多少个空格或感叹号。

外部循环

这个循环遍历字符串中的字符。每次迭代都将 b的值增加一个,并将字符串中的下一个字符赋给 a

内循环

这个循环绘制单个字符,每当到达行尾时就绘制一个换行符。所绘制的字符数为 a - 64c的值从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(' ');
}

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