Write a C program to print map of India.





Below is obfuscated version in C that generates the map of India. Obfuscated code is any code that is difficult for humans to understand.

C #include <stdio.h> int main() { int a, b, c; for (b = c = 10; a = "Greetings from Techie Delight!!\ TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\ NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXy\ T|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!"[b++ + 21];) for (; a-- > 64;) putchar(++c == 'Z' ? c = c / 9 : 33 ^ b & 1); return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> int main ( ) { int a , b , c ; for ( b = c = 10 ; a = "Greetings from Techie Delight!!\ TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\ NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXy\ T|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!" [ b ++ + 21 ] ; ) for ( ; a -- > 64 ; ) putchar ( ++ c == 'Z' ? c = c / 9 : 33 ^ b & 1 ) ; return 0 ; } Download Run Code

Output:

Explanation:

Basically, the string is a run-length encoding of the map of India. Alternating characters in the string stores how many times to draw a space, and how many times to draw an exclamation mark consecutively. Here’s an analysis of the different elements of this program –

The encoded string –

“Greetings from Techie Delight!!TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJ

q TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcE

Aelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!”

Notice [b+++21] at the end of the encoded string. As b+++21 is equivalent to (b++ + 21) which will evaluate to 31 (10 + 21) , the first 31 characters of this string are ignored and do not contribute to anything. The remaining encoded string contain instructions for drawing the map. The individual characters determine how many spaces or exclamation marks to draw consecutively.

Outer for loop: This loop goes over the characters in the string. Each iteration increases the value of b by one, and assigns the next character in the string to a.

Inner for loop: This loop draws individual characters, and a newline whenever it reaches the end of line. Consider below putchar statement

putchar(++c==’Z’ ? c = c/9 : 33^b&1);

As ‘Z’ represents number 90 in ASCII, 90/9 will give us 10 which is a newline character. Decimal 33 is ASCII for ‘!’. Toggling the low-order bit of 33 gives you 32, which is ASCII for a space. This causes ! to be printed if b is odd, and a blank space to be printed if b is even.

Below is less obfuscated version of above code –

C #include <stdio.h> // C program to print map of India int main() { int a = 10, b = 0, c = 10; // The encoded string after removing first 31 characters char* str = "TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSW" "QAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn" "^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!"; // individual characters of str determine how many spaces or // exclamation marks to draw consecutively while (a) { // read each character from encoded string a = str[b++]; while (a-- > 64) { // 'Z' is 90 in ascii if (++c == 90) { // reset c to 10 ('

' in ascii) when end of line is reached c = 10; // print new line putchar(c); } else { // depending on b is even or odd, draw the appropriate char if (b % 2 == 0) putchar('!'); else putchar(' '); } } } return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include <stdio.h> // C program to print map of India int main ( ) { int a = 10 , b = 0 , c = 10 ; // The encoded string after removing first 31 characters char * str = "TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSW" "QAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn" "^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!" ; // individual characters of str determine how many spaces or // exclamation marks to draw consecutively while ( a ) { // read each character from encoded string a = str [ b ++ ] ; while ( a -- > 64 ) { // 'Z' is 90 in ascii if ( ++ c == 90 ) { // reset c to 10 ('

' in ascii) when end of line is reached c = 10 ; // print new line putchar ( c ) ; } else { // depending on b is even or odd, draw the appropriate char if ( b % 2 == 0 ) putchar ( '!' ) ; else putchar ( ' ' ) ; } } } return 0 ; } Download Run Code



Author: Aditya Goel



Reference: https://stackoverflow.com/questions/3533348/how-does-this-code-generate-the-map-of-india









(4 votes, average: 5.00 out of 5)

Loading...

Thanks for reading.