views:

404

answers:

5

I got this code from somewhere. It prints the map of India, But how this code works? I can't understand anything of this. If somebody knows, please help me to understand this.

 #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;
    }
A: 

It's a code golf/obscufated C program. I've reformatted it for "readability".

I'm not sure about the b+++21 though.

Paul Nathan
The `b+++21` can only be `(b++)+21`.
Pascal Cuoq
@Pascal: Okay. I wasn't sure how to parse it - obfuscated C isn't my forte.
Paul Nathan
A: 

Running the code at IDEOne (see here!) produces this output:

                !!!!!!                                                     
                !!!!!!!!!!                                                 
                 !!!!!!!!!!!!!!!                                           
                   !!!!!!!!!!!!!!                                          
                 !!!!!!!!!!!!!!!                                           
                  !!!!!!!!!!!!                                             
                  !!!!!!!!!!!!                                             
                    !!!!!!!!!!!!                                           
                    !!!!!!!!                                               
                    !!!!!!!!!!                                             
                   !!!!!!!!!!!!!!                                          
                 !!!!!!!!!!!!!!!!                                          
                !!!!!!!!!!!!!!!!                                  !!!!!    
              !!!!!!!!!!!!!!!!!!!                               !!!!!!!!!! 
             !!!!!!!!!!!!!!!!!!!!!!!                 !         !!!!!!!!!!  
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!              !!     !!!!!!!!!!!!    
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!      !!!!!!!!       
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      
         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!       
          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!       
   !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!!!!!        
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      !!!!!         
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !!!          
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        !          
      !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                       
       !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                         
              !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                          
             !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                           
              !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                               
              !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                               
              !!!!!!!!!!!!!!!!!!!!!!!!!!!!                                 
              !!!!!!!!!!!!!!!!!!!!!!!!!!                                   
              !!!!!!!!!!!!!!!!!!!!!!!!!                                    
               !!!!!!!!!!!!!!!!!!!!!!!!                                    
                !!!!!!!!!!!!!!!!!!!!                                       
                !!!!!!!!!!!!!!!!!!!                                        
                 !!!!!!!!!!!!!!!!                                          
                  !!!!!!!!!!!!!!!!                                         
                  !!!!!!!!!!!!!!!                                          
                   !!!!!!!!!!!!!!                                          
                    !!!!!!!!!!!!                                           
                    !!!!!!!!!!!!                                           
                    !!!!!!!!!!!!                                           
                      !!!!!!!!                                             
                      !!!!!!                                               
                       !!!!                                                
India
That's a map of India!
MPelletier
Dude, it's already in the question and in a comment. HowTF did you manage to get +2 for this? This is not an answer, so I downvote to bring it back to 0.
delnan
`@delnan:` I upvoted your comment, since you're right (although I posted this before the codepad comment). I thought the output was relevant to the question, but it didn't fit in a comment. I should have just posted the link to the output, but _I thought you programmers might like to see your motherland_ :)
India
Is it upside-down? As in relation to Wales
Tom Gullen
+13  A: 

The long string is simply a binary sequence converted to ASCII. The first for statement makes b start out at 10, and the [b+++21] after the string yields 31. Treating the string as an array, offset 31 is the start of the "real" data in the string (the second line in the code sample you provided). The rest of the code simply loops through the bit sequence, converting the 1's and 0's to !'s and whitespace and printing one character at a time.

Less obfuscated version:

#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;
}

The strange clever part is in the putchar statements. Take the first putchar. ASCII 'Z' is 90 in decimal, so 90 / 9 = 10 which is a newline character. In the second, 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. The rest of the code is simply there to walk the "pointer" a through the string.

bta
The string is not a bit sequence (note that there are no bit-shift operations in the code). It is a run-length encoding of the image.
interjay
A: 

Looks like something from the International Obfuscated C Code Contest, although I haven't been following it recently and didn't go through the yearly entries to see if it was from there.

David Thornley
+8  A: 

Basically, the string is a run-length encoding of the image: Alternating characters in the string say how many times to draw a space, and how many times to draw an exclamation mark consecutively. Here is an analysis of the different elements of this program:

The encoded string

The first 31 characters of this string are ignored. The rest contain instructions for drawing the image. 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. The number of characters drawn is a - 64. The value of c goes from 10 to 90, and resets to 10 when the end of line is reached.

The putchar

This can be rewritten as:

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

It draws the appropriate character, depending on whether b is even or odd, or a newline when needed.

interjay
+1 Great answer!
Lazer