I was wandering in Wikipedia when I came across this interesting page https://en.wikipedia.org/wiki/Obfuscation_(software), and this interesting piece of code.

char*M,A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf(M="%d",&C);
--            E;             J[              E]             =T
[E   ]=  E)   printf("._");  for(;(A-=Z=!Z)  ||  (printf("\n|"
)    ,   A    =              39              ,C             --
)    ;   Z    ||    printf   (M   ))M[Z]=Z[A-(E   =A[J-Z])&&!C
&    A   ==             T[                                  A]
|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}

According to the article, this was a non winning entry for the 1988 International Obfuscated C Code Contest. I really have no idea how anyone could've topped this. I searched around http://www.de.ioccc.org/years.html#1988, but it looks like this entry is missing in this page. Wikipedia citation points me to a book, which I might check out later.

The interesting part is..

  • It looks like a maze.
  • It can generate mazes of any height.
  • The word MAZE is spelled with white-spaces if you look carefully. Here's it highlighted

Also, as the wiki points out, ANSI-compliant C compilers don't allow constant strings to be overwritten, which can be avoided by changing "*M" to "M[3]" and omitting "M=". I did this and tried to compile + run it, and sure enough,

~ gcc m.c && ./a.out 
m.c:14:32: warning: return type defaults to int [-Wimplicit-int]
   14 | char M[3],A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf("%d",&C);
      |                                ^~~~
m.c: In function main’:
m.c:14:32: warning: type of C defaults to int [-Wimplicit-int]
m.c:14:49: warning: implicit declaration of function scanf [-Wimplicit-function-declaration]
   14 | char M[3],A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf("%d",&C);
      |                                                 ^~~~~
m.c:14:49: warning: incompatible implicit declaration of built-in function scanf
m.c:1:1: note: include <stdio.h> or provide a declaration of scanf
  +++ |+#include <stdio.h>
    1 | // #define W 40
m.c:16:15: warning: implicit declaration of function printf [-Wimplicit-function-declaration]
   16 | [E   ]=  E)   printf("._");  for(;(A-=Z=!Z)  ||  (printf("\n|"
      |               ^~~~~~
m.c:16:15: warning: incompatible implicit declaration of built-in function printf
m.c:16:15: note: include <stdio.h> or provide a declaration of printf
m.c:16:51: warning: incompatible implicit declaration of built-in function printf
   16 | [E   ]=  E)   printf("._");  for(;(A-=Z=!Z)  ||  (printf("\n|"
      |                                                   ^~~~~~
m.c:16:51: note: include <stdio.h> or provide a declaration of printf
m.c:18:31: warning: format not a string literal and no format arguments [-Wformat-security]
   18 | )    ;   Z    ||    printf   (M   ))M[Z]=Z[A-(E   =A[J-Z])&&!C
      |                               ^
m.c:20:8: warning: implicit declaration of function rand [-Wimplicit-function-declaration]
   20 | |6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}
      |        ^~~~
24
._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
|_._. ._| |_. ._._. . . | . ._| |_. ._._._|_._. | |_. |_. | |_. | | | ._|_. | |
|_._._. |_._._| . ._|_| . | ._._._._._._._| ._._._| | . |_. | ._|_._._. | | | |
| ._| | . . . . |_._._|_| |_| | | |_._. | | . . . ._|_| | |_. ._._._| ._._. ._|
|_._._._|_|_|_|_| . . . . | | ._. ._._|_. ._|_| |_| ._. . . ._._. |_. . ._|_. |
| ._| . |_. . . |_| |_| |_|_._. |_._._._| ._._|_. |_._|_|_| |_. |_._. |_| | | |
| |_._|_. ._|_| . |_| | | | |_. ._. ._. ._._. |_. . . ._. |_._|_. |_. | ._. | |
|_._. |_._. |_. |_._._| | | . . . | ._| ._|_. | |_| |_._|_| | ._._| |_._| |_| |
|_._. . ._._._| ._. . | ._._| | | |_| ._|_. | ._|_. ._._._._|_._._._._. ._._._|
| ._. |_._._._|_. |_|_|_. ._|_| |_._| . . ._|_._._| ._| ._|_._._._. . ._._. ._|
|_._|_| ._._._| |_. |_. | |_._._| . | |_|_._._|_._. | ._. . ._._. | |_| | |_| |
| | | |_. . ._. ._| ._|_._| | ._. |_. |_._. . . . . | | ._| ._. | ._._._. ._| |
| . ._| ._|_. | ._| | ._. ._. . |_|_._._. | | | | | ._|_._| |_. | |_. |_._|_. |
| |_._._| . |_|_| | |_. |_. |_|_. . ._| |_| |_|_| |_._| ._| ._| |_| | . ._._._|
| | | . ._|_._._._._| | ._|_._._|_|_._._. |_. | |_. . ._| | . |_| ._._| |_. ._|
|_._. |_._. | . |_. ._| ._. . . ._._._. | | ._|_. |_| | | |_|_|_. |_. | ._._._|
|_. . . . |_._|_. . |_._| | |_| . |_._. | |_|_._. | ._._| | ._._._. | |_._| | |
| |_|_| |_._._. |_| ._. ._._| ._| ._._| | | . . . ._._._._|_| | | ._| ._._| | |
| ._. . . ._|_._._|_. | | |_._|_._._|_._|_| |_|_|_. | | . | | ._. | |_. ._|_. |
|_|_. |_|_. . |_. |_._|_._._. ._._. . . ._|_._._| | ._._| ._|_. | | | |_. |_. |
|_. . ._| ._| ._._._. . | | | |_._. |_|_| |_. . . |_| | |_| . ._|_._. . | ._._|
|_. |_. | ._| . | | | |_|_. ._._._|_._| . . |_| | . | ._| ._|_| |_._. |_|_._. |
|_._._|_| ._|_| ._._| |_. | . ._._._|_._|_| |_._|_| | ._|_._._. ._. |_| | |_. |
|_._._. |_| |_._._._| . | | |_|_._. | . . ._| | ._| . ._._|_._. | |_. . ._| ._|
|_._._._._._._._._._._|_|_._._._._._._|_|_._._._._._|_._._._._._|_._._|_._._._|
| ~ $

It works!

This code tries to read the value for height (which I entered as 24). The width is locked to 80 characters, probably because that was the default number of characters per line in 1988??

I'll attempt to de-obfuscate this code as much as I can and try to explain how it works, and maybe even re-implement it's logic in a different language.

Cleanup

I started out by removing unwanted white-spaces and line breaks, which gave me

char M[3],A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf("%d",&C);--E;J[E]=T[E]=E)printf("._");for(;(A-=Z=!Z)||(printf("\n|"),A=39,C--);Z||printf(M))M[Z]=Z[A-(E=A[J-Z])&&!C&A==T[A]|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}

the whole program is only 239 bytes!. Running it through code beautify gave me:

char M[3], A, Z, E = 40, J[40], T[40];
main(C) {
  for ( * J = A = scanf("%d", & C); --E; J[E] = T[E] = E) printf("._");
  for (;(A -= Z = !Z) || (printf("\n|"), A = 39, C--); Z || printf(M)) 
    M[Z] = Z[A - (E = A[J - Z]) 
      && !C & A == T[A] | 6 << 27 < rand() 
      || !C & !Z ? J[T[E] = T[A]] = E, J[T[A] = A - Z] = A, "_." : " |"];
}

Lets try removing the scanf call and replacing 40 (I'm guessing the width of the maze divided by 2) so we can experiment with arbitrary widths and heights.

#define W 30
char M[3], A, Z, E = W, J[W], T[W];
main() {
  int H=20; 
  for ( * J = A = 1; --E; J[E] = T[E] = E)printf("._");
  for (;(A -= Z = !Z) || (printf("\n|"), A = W-1, H--); Z || printf(M)) 
    M[Z] = Z[A - (E = A[J - Z]) 
      && !H & A == T[A] | 6 << 27 < rand() 
      || !H & !Z ? J[T[E] = T[A]] = E, J[T[A] = A - Z] = A, "_." : " |"];
}

running this yields a 60x20 maze as expected

._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
|_._. ._| |_. ._._. . . | . ._| |_. ._._._|_._. | |_. |_. |
| | |_. | | | ._|_. |_|_._|_._|_. ._._| |_. ._| |_._._._. |
|_._. |_. |_._._| | . |_. | ._|_._._. | | | ._| | . . . . |
|_._._. | | . |_._. |_| | . . ._| ._|_. |_._. |_. |_|_|_|_|
| ._._._._._|_._| . . . . | |_| |_. ._._|_. ._. |_. |_. ._|
| | ._._. |_. . ._|_|_| |_| |_. | | |_. . . | . ._|_._. | |
|_._._. |_._|_|_. ._|_._. |_| ._._. | . | | |_|_._. ._. . |
| | | . | |_. ._. ._. ._|_. ._|_. | ._| |_| ._| ._. ._|_| |
| | ._| . |_._. |_._| ._| ._._._| |_| | ._| | ._. |_|_. | |
| | ._|_| . . ._._| |_. | ._._._._| |_._._|_|_|_. | | ._._|
| | | |_. | |_. . ._|_._|_|_._. ._._._._._._._|_._._|_| ._|
|_._._._|_|_| |_|_. ._._|_. . . ._._._. ._| ._|_._._._. ._|
| |_._. ._._._| ._._._| |_. |_| . |_._._| . | |_._. ._._._|
| | | ._. . ._._. | | | . | . | |_. . ._._| |_. | |_. . ._|
| |_._| . |_._._|_| | ._| | | |_| |_| ._. | ._._._. . |_. |
| ._| ._|_._| | | . ._._|_|_| . |_._._._| | | | | ._|_._| |
| |_. | | |_. |_. |_. ._._._|_| | | . ._|_|_| ._._._| | |_|
| | ._._| ._. |_._| | | . . ._._. . | . ._._|_._._._| | ._|
|_._._._._._| ._. | |_._| | ._| |_| | |_| ._. ._|_. |_._. |
|_._._._._._._._|_._._._._|_._._._|_|_._._|_._._._._._._._|

Analysis

let's start by looking at line 5: for ( * J = A = 1; --E; J[E] = T[E] = E)printf("._");

printf("._") is responsible for the first line of wall, but the loop it's part of is doing something else.

  • It initializes first value of array J and char A as 1.
  • evaluates --E, so runs 29 times
  • does J[E] = T[E] = E and printf("._").

So, It looks like at the end of the loop

  • E will be zero
  • Array J will have values 1,1,2,3,..29 (1 at zeroth position set in the loop init)
  • Array T will have values 0,1,2,3,..29

setting a breakpoint at line 6 and running this with gdb shows you what happened:

(gdb) x/100b J
0x555555558040 <J>:     1   1   2   3   4   5   6   7
0x555555558048 <J+8>:   8   9   10  11  12  13  14  15
0x555555558050 <J+16>:  16  17  18  19  20  21  22  23
0x555555558058 <J+24>:  24  25  26  27  28  29  0   0
0x555555558060 <J+32>:  0   0   0   0   0   0   0   0
0x555555558068 <J+40>:  0   0   0   0   0   0   0   0
0x555555558070 <J+48>:  0   0   0   0   0   0   0   0
0x555555558078 <J+56>:  0   0   0   0   0   0   0   0
0x555555558080 <J+64>:  0   0   0   0   0   0   0   0
0x555555558088 <J+72>:  0   0   0   0   0   0   0   0
0x555555558090 <J+80>:  0   0   0   0   0   0   0   0
0x555555558098 <J+88>:  0   0   0   0   0   0   0   0
0x5555555580a0 <J+96>:  0   0   0   0
(gdb) x/100b T
0x5555555580c0 <T>:     0   1   2   3   4   5   6   7
0x5555555580c8 <T+8>:   8   9   10  11  12  13  14  15
0x5555555580d0 <T+16>:  16  17  18  19  20  21  22  23
0x5555555580d8 <T+24>:  24  25  26  27  28  29  0   0
0x5555555580e0 <T+32>:  0   0   0   0   0   0   0   0
0x5555555580e8 <T+40>:  0   0   0   0   0   0   0   0
0x5555555580f0 <T+48>:  0   0   0   0   0   0   0   0
0x5555555580f8 <T+56>:  0   0   0   0   0   0   0   0
0x555555558100 <T+64>:  0   0   0   0   0   0   0   0
0x555555558108 <T+72>:  0   0   0   0   0   0   0   0
0x555555558110 <T+80>:  0   0   0   0   0   0   0   0
0x555555558118 <T+88>:  0   0   0   0   0   0   0   0
0x555555558120 <T+96>:  0   0   0   0
(gdb) print E
$9 = 0 '\000'
(gdb) print A
$11 = 1 '\001'

Line 6, starts with a loop condition (A -= Z = !Z) || (printf("\n|"), A = W-1, H--) . The printf in this condition also does, from what it looks like, draws the left side wall.

Quick refresher on conditional execution using || and &&

#include <stdio.h>

int main()
{
    0 || printf("test 1\n");
    1 || printf("test 2\n"); // any nonzero
    0 && printf("test 3\n");
    1 && printf("test 4\n"); // any nonzero
    return 0;
}
/* prints:
test 1                                                                                                                                                                             
test 4
*/

So, the loop test expression executes nothing when A -= Z = !Z evaluates to non-zero and (printf("\n|"), A = W-1, H--) when A -= Z = !Z evaluates to zero. We can also guess that (printf("\n|"), A = W-1, H--) is executed once per row, since it has the left wall printf.

In the whole program, Z, with initial value 0 is assigned a value only in this loop condition and it's simply !Z. This means, it can only take either 0 or 1 as a value.

Also, this give us a clue about A. A is set to W-1 in as soon as the loop starts and is decremented in every alternate loop when Z == 1. A is not modified anywhere in the loop. So, A's value should go like 29,29,28,28,...1. when the final A-=Z happens, the condition evaluates to 0, triggering the side-wall expression which resets value of A to W-1.

The update statement is just Z || printf(M). Seeing as this is the only other printf, we can be sure that this is the point where the maze gets rendered.

The body of the loop is something like M[Z] = Z[..stuff..];. This looks bizarre. Z is used both as an array and an index. But if you know pointer math, M[Z] = Z[x]; is equivalent to M[Z] = *(Z + x);. This is exactly what we're going to do. ie, create a char *x and assign this the value of whatever Z is adding with

for (; (A -= Z = !Z) || (printf("\n|"), A = W - 1, H--); Z || printf(M))
{
  char *x = A - (E = A[J - Z]) && !H & A == T[A] | 805306347 < rand() || !H & !Z ? (J[T[E] = T[A]] = E, J[T[A] = A - Z] = A, "_.") : " |";

  M[Z] = *(Z + x);
}

Also, if you look carefully, you can see that this is basically a terenary operator with condition (A - (E = A[J - Z]) && !H & A == T[A] | 805306347 < rand() || !H & !Z) with values (J[T[E] = T[A]] = E, J[T[A] = A - Z] = A, "_.") and " |";. Let's convert this to a proper if else:

for (; (A -= Z = !Z) || (printf("\n|"), A = W - 1, H--); Z || printf(M))
{
  char *x;

  if (A - (E = A[J - Z]) && !H & A == T[A] | 805306347 < rand() || !H & !Z)
  { x = (J[T[E] = T[A]] = E, J[T[A] = A - Z] = A, "_."); }
  else
    x = " |";

  M[Z] = *(Z + x);
}

The if success case looks like an elaborate swap operation. It's comma seperated, but this statement can be boken down like so:

{
      J[T[E] = T[A]] = E;
      J[T[A] = A - Z] = A;
      x = "_.";
}

and then

{
  T[E] = T[A];
  J[T[E]] = E;
  T[A] = A - Z;
  J[T[A]] = A;
  x = "_.";
}

Now we have some clarity on what happens inside the loop. It either prints a "_." (and does some magical swap operation) or a " |" based on a condition.