Slashdot Mirror


Obfuscated C Code Contest Begins

slashdot-me writes "The International Obfuscated C Code Contest (IOCCC) has begun. See the rules at the IOCCC homepage. The contest runs from Feb. 1 to March 31. " As always, the results will be only readable by Martians.

58 of 227 comments (clear)

  1. Obfuscated C code ? by Anonymous Coward · · Score: 2

    Just send in some of the code from the Linux kernel... Oh wait, they didn't say "Wall of C Code"...

  2. first by Anonymous Coward · · Score: 2

    if (post.first()) { printf "FIRST POST!" }

  3. Not really possible by adamsc · · Score: 2

    COBOL is just too verbose a language to obfuscate in the way you can obfuscate C. This does have its virtues, though - most of the programmers that I know who use both languages would prefer to debug 20 year old COBOL than 8 year old C.

    1. Re:Not really possible by adamsc · · Score: 2
      most of the programmers that I know who use both languages would prefer to debug 20 year old COBOL than 8 year old C.
      But I bet all of them (the sane ones anyway) would rather write something new with C. COBOL is a hideous language, on a par with Visual Basic ;)
      Only if you haven't updated your compiler in the last decade or so. Recent COBOLs are roughly even feature-wise with ANSI C as far as language constructs go and do have the advantage of being much easier to do things like indexed file I/O, screen input/output and accurate math (accountants get real picky about that).

      Given my druthers, I would use a modern language instead of either one. C is just too close to a macro assembler, neither is really good for graphics or networking and they're both showing their age by now. By now, programming in either one basically serves to remind me of why I prefer Java, PHP and Perl.

  4. Re:LISP is readable? by Daniel · · Score: 2

    No, no, no, you're missing the point. The parentheses are *part of* the code!

    Daniel

    --
    Hurry up and jump on the individualist bandwagon!
  5. Re:For All You Young Bucks by Chris+Hiner · · Score: 2

    Isn't "Obfuscated FORTRAN" redundant?

    *muttering something about silly F77 column positions that descended from punch cards*

  6. Re:useful C obfuscation by David+Gould · · Score: 2


    Actually, a lot of them are useful programs, either original ones or re-implementations of standard utilities, but with absolutely horrifying things done in the code. Ideally, the obfuscations are not just there for puzzle value, but actually serve to optimize performance.

    I wish I could come up with some stuff like this -- I have a few programs that I've written normally, but with some moderately funky techniques, that I've been thinking I might be able to obfuscatify into reasonable entries, but I'm unlikely to get them ready in time. One of these years...


    David Gould

    --
    David Gould
    main(i){putchar(340056100>>(i-1)*5&31|!!(i<6)<< 6)&&main(++i);}
  7. Re:One of my favorites... by Ed+Avis · · Score: 2
    I've played a little tetris program somebody made that was practically immune to analysis other than to the compiler :-)

    Maybe that's a way to de-obfuscate programs. Just tell the compiler to assemble them, and the resulting assembler might be easier to understand than the source code. It would probably help to compile for a fairly simple RISC chip (eg ARM, MIPS) that has an easy-to-understand instruction set.

    Better still, create a new target processor for gcc that is a simple stack machine or something. Then you could compile your code to this. I think the JVM fits this description, so you could use something which compiles C to Java bytecode, and then use a Java decompiler to spit out Java source. I have no idea if this would be more readable, but it could hardly be any worse...

    --
    -- Ed Avis ed@membled.com
  8. Re:From the official rules by QZS4 · · Score: 2

    Why would anyone want to add newlines, tabs or whitespace?

    Have you seen the previous entries? A great example is the pi program from 1988 (westley.c). Without whitespace the whole charm of the program would be lost.

    Creative indentions can often make a program much sweeter in its source code appearance.

  9. Re:A True Obfuscated function. by doomy · · Score: 2

    Sorry, one begin was missing :) Here is the patch.

    10a11
    >begin
    --

    --
    ...free your source and the rest would follow...
  10. Fixes by doomy · · Score: 2

    #define begin {
    #define end }
    #define say if
    #define yell printf
    #define otherwise else
    #define play_q3 exit
    #define katz 1
    #define @ ;
    /* slash_posted returns a 1 if a new slashdot
    article has been posted */

    ac_poster_screams()
    begin
    say(slash_posted)
    begin
    yell("FIRST POST!")@
    play_q3@
    end
    otherwise
    begin
    yell("Bill Gates Naked and Petrified!")@
    slash_posted = katz;
    ac_poster_screams()@
    end
    end

    That's the final version.. now the patch..

    3c3
    #define say if
    5c5,7
    #define otherwise else
    > #define play_q3 exit
    > #define katz 1
    14a17
    > play_q3@
    18a22,23
    > slash_posted = katz;
    > ac_poster_screams()@
    --

    --
    ...free your source and the rest would follow...
  11. Re:Au Contraire! by Logan · · Score: 2
    Check out the source code to GTK (or simply do some GTK programming).

    logan

  12. Where's my FORTH papers... by ch-chuck · · Score: 2

    18 yrs old, uncommented, looks like heiroglyphics to me now :) Hmmm, something about a 'stack'.

    Agent 32

    --
    try { do() || do_not(); } catch (JediException err) { yoda(err); }
  13. Re:css-auth anyone by Illume · · Score: 2

    It doesn't compile on my system (gcc version 2.95.2, glibc2) but you might want to check Illiads entry for this contest.

  14. Whatever the rules are gated wins by arivanov · · Score: 2

    Download gated code from ftp.merit.net. And try to read it. It was not written by me so I cannot submit it but I would indeed suggest the gated-people to submit it in the contest. Especially the BGP part.

    The problem here is that we have to cope with it for at least a few more months until zebra matures completely...

    --
    Baker's Law: Misery no longer loves company. Nowadays it insists on it
    http://www.sigsegv.cx/
  15. Re:Shortest Self Duplicating C program by seebs · · Score: 2

    Actually, that one isn't a "correct" quine, because printf takes variable arguments, and thus requires a prototype to be strictly correct.

    It's hard to do a short quine which is also strictly-conforming.

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  16. Re:Shortest Self Duplicating C program by seebs · · Score: 2

    1. It can't be strictly conforming code, it assumes ASCII.
    2. It's 5 lines, which is pretty long for "short" code. ;-)
    3. Even if you think you can assume ASCII, you *CANNOT* have literal newlines in strings.

    Try "-ansi -pedantic -Wall". It won't warn about the ASCII thing, but it'll catch the string with newlines.

    I generally find you need something equivalent to
    char b='\\',q='"',s='\'',n='\n';
    to be able to reproduce all the stuff you end up needing. ;)

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  17. Re:www.ioccc.org by seebs · · Score: 2

    Actually, no. If it's time critical, it should *NOT* be in assembly, in all probability, because the chances are that the compiler will outsmart you or the chip will change.

    Assembly is like saying "Moore's Law doesn't apply to me".

    Take your pick: Hand-optimized Pentium assembly, or EGCS code tuned for the Pentium II. :)

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  18. Re:Anti-Obfuscated C by seebs · · Score: 2

    Also incorrect.

    MAIN RETURNS INT YOU SIMPERING FOOLS!

    :)

    (No, really, it does. "void main" is Just Plain Wrong.)

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  19. Re:useful C obfuscation by seebs · · Score: 2

    >being itself an ascii pig comprised of >pig-latin'ed code.

    "comprising" or "composed of".

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  20. Re:Shortest Self Duplicating C program by seebs · · Score: 2

    Very clever, I like it.

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  21. Re:www.ioccc.org by seebs · · Score: 2

    Get current. Modern games are mostly C++. Ick. But it's not assembly, because it doesn't matter.

    Look at kernel code. Lots of it. Across a number of OS's and platforms.

    Assembly is *rare*, and for good reasons.

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  22. Re:Shortest Self Duplicating C program by Industrial+Disease · · Score: 2

    I saw one once that, IIRC, consisted of a string declaration and a printf statement which used said string as the formatting string and the argument to be substituted for the %s. Maybe 30-40 characters.

    --
    Weblogging Considered Harmful:
  23. google by QuMa · · Score: 2

    Slashdotted already... Get yours while they're hot at google

  24. Re:first language... by Jonathan_S · · Score: 2

    Speaking of DOS batch files, anyone play the old Microprose game XCom. A friend of mine pointed out that the whole game was tied together by the loop in ufo.bat. The world view would run until a ground mission, the exe would shut down leaving a temp file. The next thing in the batch loop would be the ground combat exe which would pick up the temp file, when ground combat was over it dropped a temp file and exited the batch loop started the world map which pickedup the temp file and contiuned.
    Very scary.

  25. Re:For All You Young Bucks by GregWebb · · Score: 2

    I can never remember which was which of APL and PL/1 but whichever I'm thinking of would be absolutely perfect for this. Obscure symbols, an obsession with making the code as small as possible and a general belief that it's easier to reimplement than try and understand someone else's code.

    You can see why not many people use it any more...

    Greg

    --

    Greg

    (Inside a nuclear plant)
    Aaaarrrggh! Run! The canary has mutated!

  26. Kinds of obfuscation by David+A.+Madore · · Score: 2

    There are several kinds of obfuscation. The ones you generally see in IOCCC's, e.g. using one-letter variable names, formatting in bizarre ways, making abstruse use of CPP, and so on, are IMHO far less interesting than true algorithmic obfuscation.

    Some obfuscation is easy to produce algorithmically. For example, it is easy to have a program that will parse a C listing, replace variable names by things like O0O0Ooo, make white space come out in strange ways, and so on. Or, compile the program using gcc -O6, take the assembler output, and decompile it in an obvious way.

    Much more interesting, I find, is the more ``algorithmic'' kind of obfuscation, where identifiers are not deliberately unclear, but where the overall pattern of execution is difficult to follow. Take the following Scheme example, and try to understand how it works: then you will see what I mean:

    (((lambda (foo) (newline) foo)
    (call-with-current-continuation (lambda (bar) bar)))
    ((lambda (foo) (write-char #\*) foo)
    (call-with-current-continuation (lambda (bar) bar))))

    There are programming languages where nearly every program is obfuscated (in both ways I descibed!), and it is very difficult to write one which is not. One such language I invented is Unlambda.

  27. Re:useful C obfuscation by / · · Score: 2

    The code in question (I assume) is this lovely slashdotted ditty over here in case anyone wants a look-see.

    My favorite still has to be this one which translates the imput into pig latin while being itself an ascii pig comprised of pig-latin'ed code. I'd inline it, but slashdot munges the extra spacing.

    --
    "If one is really a superior person, the fact is likely to leak out without too much assistance" -- John Andrew Holmes
  28. Re:From the official rules by gorilla · · Score: 2
    Why would anyone want to add newlines, tabs or whitespace?

    Apart from some programs requiring white space in order to work (especially in printed strings), Sometimes it makes it prettier (This or This, you might need to view the source, as some browsers may reformat this on their rendered views).

  29. Re:Au Contraire! by ucblockhead · · Score: 2

    Hey, if I wrote maintainable code, they'd be able to hire someone to replace me.

    --
    The cake is a pie
  30. first language... by cdlu · · Score: 2

    DOS Batch files!! they kicked!

    I wrote the word game of boggle in batch (6500 lines), and a batch script that randomly replied to questions. Random number generation in Batch was about 200 lines. :)

    Just a couple of weeks ago I wrote a calendar for a PS/2 in batch as we have a macintosh functioning as a clock, and a formerly abandonned ps/2 on the windowsill in our club office :) ... the calendar: 2800 lines... I've written three patches for it since, and its now over 5000 lines long.

    I even wrote a TSR manager in batch which allowed me, to the best of the programme's abilities, to load and unload TSRs, complete with a menu. :)

    All you need? getkey.com: B4 00 CD 16 B4 4C CD 21
    (ok ok so i have too much free time...had.....have)
    #include <signal.h> \ #include <stdlib.h> \ int main(void){signal(ABRT,SIGIGN);while(1){abort(-1); }return(0);}

  31. Found this on my HD by Inoshiro · · Score: 2
    #include
    main(t,_,a)char *a;{return!0 main(-86,0,a+1)+a)):1,t main(2,_+1,"%s %d %d\n"):9:16:t "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q #n+,/#{l+,/n{n+,/+#n+,/#\
    ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
    q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w '){){nl]'/+#n';d}rw' i;# \
    ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
    iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
    ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w ! nr'/ ') }+}{rl#'{n' ')# \
    }'+}##(!!/")
    :t :0 "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

    Nice and christmasy. Disclaimer: I used a perl script to escape it. Here's the perl script escaped to itself :-) #!/usr/bin/perl -p
    #
    # code2html - convert code to html for posting to slashdot
    #
    # tchrist@perl.com
    # Sunday, December 19th, 1999
    BEGIN { print "\n" }# and the spirit of awk...
    # first kill all the tabs
    1 while s{ \t + }
    { " " x (length($&)*8 - length($`)%8) }ex;
    # then the four standard naughty bits
    s/&/&/g;# must remember to do this one first!
    s/ s/>/>/g;# don't close too early
    s/"/"/g;# only in embedded tags, i guess
    # make lines break where they should
    s/^\s*$/

    / || s/$/
    /;
    # make sure spaces aren't squishticated so we
    # can do indentation and properly align comments
    s/( {2,})/'' x length($1)/ge;
    END { print "
    \n" }# ...shall be with us always

    ---

    --
    --
    Internet Explorer (n): Another bug -- that is, a feature that can't be turned off -- in Windows.
    1. Re:Found this on my HD by Inoshiro · · Score: 4
      Slashdot ate part of the code, both the perl and the C.. It's the preview but they haven't fixed. Damnit.. (I also hit submit instead of preview by accident -- Rob, could we have those on separate sides of the format specifier?)... Have fun

      #include <stdio.h>
      main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
      main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94 ,-27+t,a)&&t==2?_<13?
      main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
      "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q #n+,/#{l+,/n{n+,/+#n+,/#\
      ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
      q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w '){){nl]'/+#n';d}rw' i;# \
      ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
      iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
      ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w ! nr'/ ') }+}{rl#'{n' ')# \
      }'+}##(!!/")
      :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main(( *a=='/')+t,_,a+1)
      :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
      "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}




      #!/usr/bin/perl -p
      #
      # code2html - convert code to html for posting to slashdot
      #
      # tchrist@perl.com
      # Sunday, December 19th, 1999
      BEGIN { print "<TT>\n" }# and the spirit of awk...
      # first kill all the tabs
      1 while s{ \t + }
      { " " x (length($&)*8 - length($`)%8) }ex;
      # then the four standard naughty bits
      s/&/&amp;/g;# must remember to do this one first!
      s/</&lt;/g;# this is the most important one
      s/>/&gt;/g;# don't close too early
      s/"/&quot;/g;# only in embedded tags, i guess
      # make lines break where they should
      s/^\s*$/<P>/ || s/$/<BR>/;
      # make sure spaces aren't squishticated so we
      # can do indentation and properly align comments
      s/( {2,})/'&nbsp;' x length($1)/ge;
      END { print "</TT>\n" }# ...shall be with us always

      ---

      --
      --
      Internet Explorer (n): Another bug -- that is, a feature that can't be turned off -- in Windows.
  32. Re:Let the IOCCC grade your students! by technos · · Score: 2

    You should told him that
    [BS MODE ON]
    'The [platform] C compiler limits the number of possible outstanding user-iterated conditionals to 32, unless you use a double-stage switch conditional, in which case you can stretch the number of allowed outstanding conditionals to 64. Remember, you're using a monolithic 32 bit compiler generating octal, okay? I think you can get around it by custom compiling GCC for [platform], but you have to hand-edit the sub-parser source. Just do a egrep in the appropriate source directory and change all of the 32s to 64s, and then go through again to change all of the 64s to 128'

    I used that on a family member that thought one huge 200 line case statement was the way to handle a command line interface efficiently. After I actually caught him peeking at GCC, I just wrote him a 20 line interpreter using a tree.

    --
    .sig: Now legally binding!
  33. Let the IOCCC grade your students! by technos · · Score: 2

    Having been a first-year programming student once, I know the crap that can get turned out. I think every CS instructor should submit at least one example of their students work, if only to show the professional obfuscators how well it can be done through plain amateurish ignorance. I seem to remember one classmate that wrote 800 lines of code, sans comments, to perform the simple action of reversing the order of a char array and inverting capitalization.. She didn't survive the class, and ended up in a Marketing degree..

    --
    .sig: Now legally binding!
  34. Re:For All You Young Bucks by Cheerio+Boy · · Score: 2


    Maybe old COBOL programmers too!

    The - Completely Obfuscated COBOL Code Contest

    Hmm... or maybe thats too obfusctated. ;-)




    The Tick - "Spoon!"

    --

    "Bah!" - Dogbert
  35. IOCCC is just a front for a secret plot! by syscrusher · · Score: 2

    They are trying to trick Micros~1 into open sourcing Windows 2000. This would be the first award that they could truly win on merit.

  36. why this is a good thing by jon_c · · Score: 2

    One of my most fund memories when I was learning program was flipping through a book full of obfuscated c contest winners (I forget the name of the book). The interesting thing about the book is about half contest entrees, and the rest we're tips on how to write good C.

    Many people will argue that this contest is a bad thing(tm), but I think without seeing totally unreadable code it's harder to appreciate truly beautiful code.

    My all time favorite was a program that solved the 8 queens problem in the while condition of a for loop.

    It looked *something* like this..

    for(i=zx= ,x=x=^; x*u*y*t!!==x%dh^h=7;x!t
    f+d^q*df*&g==m&c-=44(x=5%b;
    g=&g=*b!b%t^l=h&g!g^==0;x++)

    ;

    I love the semicolon on it's own line

    --
    this is my sig.
  37. Shortest Self Duplicating C program by jkleid · · Score: 2

    This is kinda off-topic, but I remember hearing about a contest to write the shortest self-duplicating C program (i.e. something that would spit out an exact copy of its own code). Someone submitted an empty file once, which is kind clever. But does anyone know of the next shortest?

    1. Re:Shortest Self Duplicating C program by rebrane · · Score: 3
      You mean quines. The above page is a pretty exhaustive resource. Since it's relatively brief, here's (AFAIK) the shortest C quine:

      char*f="char*f=%c%s%c;main()
      {printf(f,34,f,34,10);}%c";
      main(){printf(f,34,f,34,10);}

      Check out the Intercal quine. It's the most painful piece of source I've ever seen (and I keep up with the ioccc).

      --neil

  38. Moderation by Remote · · Score: 2

    Dear Mr. Moderator
    Please notice that that was msg #23, posted at 16:19 UTC and the only one comment under that thread that said something similar was posted at 16:18 UTC, so we couldn't see each other.
    Take a bit more care next time.

  39. New contest by QZS4 · · Score: 3

    Oh yeah, so where's the obfuscated Intercal code contest?

    Oh, maybe we should drop that...

  40. A True Obfuscated function. by doomy · · Score: 3

    #define begin {
    #define end }
    #define if say
    #define yell printf
    #define else otherwise
    #define @ ;
    /* slash_posted returns a 1 if a new slashdot
    article has been posted */

    ac_poster_screams()
    say(slash_posted)
    begin
    yell("FIRST POST!")@
    end
    otherwise
    begin
    yell("Bill Gates Naked and Petrified!")@
    end
    end

    --

    --
    ...free your source and the rest would follow...
  41. Obfuscated PERL contest? by jabber · · Score: 3

    No need! It already comes that way!!

    I can code that in three APL glyphs!

    --

    -- What you do today will cost you a day of your life.
  42. past winners by jetpack · · Score: 3

    Since www.ioccc.org seems to be unreachable at the moment (at least for me), you can amuse yourself by looking at previous winning entries

    Have fun :)

  43. Single entries to multiple contests? by dsplat · · Score: 3
    It would be interesting to see a single valid entry that could be submitted to more than one Obfuscated Foo Code Contest. Here are some of the contest announcements (not all current):


    --
    The net will not be what we demand, but what we make it. Build it well.
  44. Re:One of my favorites... by Tim+Behrendsen · · Score: 3

    By the way, I just tried it under gcc (I haven't tried it in a long time), and unfortunately it doesn't appear to work anymore. :(

    Anyone want to take a crack at debugging it? :)

    For you young 'uns, tiny basic took line numbers. The following should work:

    10 for i = 0 to 10
    20 print i
    30 next i
    run

    I think it also has a full expression evaluator built in, so you can do some "let j = i * 10" type thing also.


    --

  45. That was easy :) by Otis_INF · · Score: 3

    10 print "In reality I'm an obfuscated version of msvcrt.dll"
    20 goto 10

    --
    Never underestimate the relief of true separation of Religion and State.
  46. For All You Young Bucks by ShelbyCobra · · Score: 3

    Perhaps the same website should have an "old timer's league" as well.

    I can see it now "The Grande Olde Obfuscated FORTRAN Code Contest"

    --

    -ShelbyCobra

    Living life in the right side of the s-plane

  47. css-auth anyone by Anonymous Coward · · Score: 4

    I don't have the time, but an obviscated css-auth formated in the shape of the DVD logo would be neat. You could print it on t-shirts and the like without people realizing what they are looking at.

  48. Unfortunately... by jd · · Score: 4

    The Martian entry, due to be received by the Mars Lander and beamed back to Earth in time for this year's contest, was disqualified on account of being too obscure, causing the main on-board computer to explode.

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  49. Re:One of my favorites... by MbM · · Score: 4
    correction to above example,
    5th line after the #defines is

    (!Q(s,"\"")){U("",'#');U("=",'!');}d=B;while(*F=*s ){*s=='"'&&j


    after that it should compile with a few warnings
    reminder to use uppercase, most of the computers that ran this stuff didn't have working shift keys
    - MbM
    --
    - MbM
  50. www.ioccc.org by seebs · · Score: 4

    And yes, we're late. Sorry! It takes some coordination getting things set up.

    We've already got a number of entries. Remember, you can enter as often as you like.

    Many will enter! Some will win! Some will elicit reactions of abject terror!

    --
    My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
  51. Re:Writing Unintelligeable code by Azog · · Score: 4

    Here's the core of an email I just sent as an update to the unmaintainable code document.

    But my experience is so awful I must share the agony with as many as possible. So here you are - another way to write unmaintainable code...

    (cue creepy music)
    --------------------------------------

    When implementing a very complicated algorithm, use the classic software engineering principles of doing a sound design before beginning coding. Write an extremely detailed design document that describes each step in a very complicated algorithm. The more detailed this document is, the better.

    In fact, the design doc should break the algorithm down into a hierarchy of structured steps, described in a hierarchy of auto-numbered individual paragraphs in the document. Use headings at least 5 deep. Make sure that that when you are done, you have broken the structure down so completely that there are over 500 such auto-numbered paragraphs. For example, one paragraph might be: (this is a real example)

    1.2.4.6.3.13 - Display all impacts for activity where selected mitigations can apply
    (short pseudocode omitted).

    THEN... (and this is the kicker) when you write the code, for each of these paragraphs you write a corresponding global function named:

    Act1_2_4_6_3_13()

    Do not document these functions. After all, that's what the design document is for! HAHAHAHAHAHA!

    Since the design doc is auto-numbered, it will be extremely difficult to keep it up to date with changes in the code (because the function names, of course, are static, not auto-numbered.) This isn't a problem for you because you will not try to keep the document up to date. In fact, do everything you can to destroy all traces of the document.

    Those who come after you should only be able to find one or two contradictory, early drafts of the design document hidden on some dusty shelving in the back room near the dead 286 computers.

    ---------------------------

    Here's a real-life typical code snippet produced using this diabolical method:

    if (pProject->GetSecImpactStore()->ConnectedToPrimary (pSuccImpact))
    {
    wPrevFD= pSuccImpact->GetFD();
    wPrevECD= pSuccImpact->GetECD();
    wPrevEUCD= pSuccImpact->GetEUCD();

    // Act 1.2.4.6.4.11.7 recompute firing degrees, given different predecessors
    // (this is identical to Act 1.2.4.6.3.13)
    Act1_2_4_6_3_13(pSuccImpact, pProject->GetSecImpactStore());

    // Then propagate I2, given that its firing degrees may have changed
    Act1_2_4_6_4(pSuccImpact, wPrevFD, wPrevECD, wPrevEUCD, pInfEng, pProject, pSecRules);
    }
    else
    {
    // No other predecessors, so depropagate I2 also (recursion)
    if (!pStack->IsMember(pSuccImpact))
    {
    Act1_2_4_6_4_11( pInfEng, pProject, pSuccImpact, pSecRules, pStack );

    // Act 1.2.4.6.4.11.10 Then kill impact I2
    Act1_2_4_6_4_11_10( pInfEng, pProject, pSuccImpact, pProject->GetSecImpactStore() );
    }
    }

    This goes on for thousands of lines.
    --------------------------------------

    Thank you for sharing my pain.

    Torrey Hoffman (Azog)

    --
    Torrey Hoffman (Azog)
    "HTML needs a rant tag" - Alan Cox
  52. forget obfuscated C by / · · Score: 4

    I'm more interested in the obfuscated-justice contest they're having over at the Superior Court of the State of California County of Santa Clara. I keep trying to compile their efforts, but all I get is "error: INJUSTICE". Maybe I'm using the wrong Constitution? Does anyone have a totalitarian-state constitution I can link against? Maybe the old CCCP constitution?

    --
    "If one is really a superior person, the fact is likely to leak out without too much assistance" -- John Andrew Holmes
  53. Writing Unintelligeable code by thebruce · · Score: 4

    Here's a site for some pointers:

    http://mindprod.com/unmain.html

    Quite intriguing if you ask me :)

  54. 1988 Best Abuse Of The Rules by SEWilco · · Score: 5
    My favorite "Best Abuse Of the Rules" winner has always been spinellis.c

    In full:

    #include "/dev/tty"
  55. One of my favorites... by Tim+Behrendsen · · Score: 5

    Behold! A tiny BASIC interpreter that fits on one 24x80 screen:

    #define O(b,f,u,s,c,a)b(){int o=f();switch(*p++){X u:_ o s b();X c:_ o a b();default:p--;_ o;}}
    #define t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f)
    #define U(y,z)while(p=Q(s,y))*p++=z,*p=' '
    #define N for(i=0;i<11*R;i++)m[i]&&
    #define I "%d %s\n",i,m[i]
    #define X ;break;case
    #define _ return
    #define R 999
    typedef char*A;int*C,E[R],L[R],M[R],P[R],l,i,j;char B[R],F[2];A m[12*R],malloc
    (),p,q,x,y,z,s,d,f,fopen();A Q(s,o)A s,o;{for(x=s;*x;x++){for(y=x,z=o;*z&&*y==
    *z;y++)z++;if(z>o&&!*z)_ x;}_ 0;}main(){m[11*R]="E";while(puts("OK"),gets(B)
    )switch(*B){X'R':C=E;l=1;for(i=0;i<R;P[i++]=0);whi le(l){while(!(s=m[l]))l++;if
    (!Q(s,"\"")){U("<>",'#');U("<=",'$');U(">=",'!');} d=B;while(*F=*s){*s=='"'&amp ;&j
    ++;if(j&1||!Q(" \t",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(* B){X'E':l=-1
    X'R':B[2]!='M'&&(l=*--C)X'I':B[1]=='N'?gets(p=B),P [*d]=S():(*(q=Q(B,"TH"))=0,p
    =B+2,S()&&(p=q+4,l=S()-1))X'P':B[5]=='"'?*d=0,puts (B+6):(p=B+5,printf("%d\n",S
    ()))X'G':p=B+4,B[2]=='S'&&(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,"TO"))=0;p=B+5;P[i
    =B[3]]=S();p=q+2;M[i]=S();L[i]=l X'N':++P[*d]<=M[*d]&&(l=L[*d]);}else p=B+2,P[
    *B]=S();l++;}X'L':N printf(I)X'N':N free(m[i]),m[i]=0 X'B':_ 0 t('S',5,"w",N
    fprintf(f,I))t('O',4,"r",while(fgets(B,R,f))(*Q(B, "\n")=0,G()))X 0:default:G()
    ;}_ 0;}G(){l=atoi(B);m[l]&&free(m[l]);(p=Q(B," "))?strcpy(m[l]=malloc(strlen(p
    )),p+1):(m[l]=0,0);}O(S,J,'=',==,'#',!=)O(J,K,'<', <,'>',>)O(K,V,'$',<=,'!', >=)
    O(V,W,'+',+,'-',-)O(W,Y,'*',*,'/',/)Y(){int o;_*p=='-'?p++,-Y():*p>='0'&&*p<=
    '9'?strtol(p,&p,0):*p=='('?p++,o=S(),p++,o:P[*p++] ;}

    I hope that translated right... Slashdot "Plain Old Text" option is a little broken, so I had to do some HTML translation. Oh well, it gives you the flavor of the IOCCC, anyway.


    --