这个代码如何生成印度的地图?
这个代码打印印度的地图。 它是如何工作的?
#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; }  长string只是一个转换为ASCII的二进制序列。 第一个for语句使b从10开始,在string之后的[b+++21]得到31.将string当作数组处理,偏移31是string中“真实”数据的开始(第二个在你提供的代码示例中)。 其余的代码只是循环遍历位序列,将1和0转换为!和空白并一次打印一个字符。 
较less混淆的版本:
 #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 'Z'是十进制的90,所以90/9 = 10这是一个换行符。 在第二个中,小数点33是'!' ASCII码  。 切换33的低位给你32,这是一个空格的ASCII。 这导致! 如果b是奇数,则打印,如果b是偶数,则打印空白。 其余的代码就是在那里走“串”string的“指针”。 
基本上,string是图像的运行长度编码 :string中的交替字符表示绘制空间的次数,以及连续绘制感叹号的次数。 这里是对这个程序的不同元素的分析:
编码的string
该string的前31个字符被忽略。 其余包含绘制图像的说明。 单个字符决定连续绘制多less个空格或感叹号。
外循环
 这个循环遍历string中的字符。 每次迭代将b的值增加1,并将string中的下一个字符赋值给a 。 
内部for循环
 这个循环绘制单个字符,并且每当到达行的末尾时都会绘制一个换行符。 绘制的字符数是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(' '); } 
 它根据b是偶数还是奇数来绘制适当的字符,或者在需要时绘制换行符。 
我已经将相同的代码转换为C#。 只需在控制台应用程序中运行这个。
  Console.OutputEncoding = System.Text.Encoding.UTF8; 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!".ToCharArray(); a = bits[b]; while (a != 0) { try { a = bits[b]; b++; while (a > 64) { a--; if (++c == 'Z') { c /= 9; Console.Write(Strings.ChrW(c)); } else { Console.Write(Strings.ChrW(33 ^ (b & 0x01))); } } } catch (Exception ex) { } } Console.ReadKey(); }