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

这个代码打印印度的地图。 它是如何工作的?

#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 - 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是偶数还是奇数来绘制适当的字符,或者在需要时绘制换行符。

我已经将相同的代码转换为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(); }