Add preview of 1984-2019

The 2020 winners are hinted it, but the source code is not there,
nor are the hints. Someone could look into the HTML and
see what was commented out, but that is not a problem because
WHO won is known and the name of their AWARD is known already.
Moreover a number of the winners have talked about what their
entirs do, so the commented out spoiler text is not a bit problem.

One will find HTML commented out with:

    <!-- XXX remove when 2020 is ready
    2020 links here
    XXX remove when 2020 is ready -->

The "XXX remove when 2020 is ready" string is found at the
start and end comment blocks.  Again, soneone could read
what was commented out, but that is OK since most of that
information is known or can be known.  The following files
have such HTML comment blocks in them.

    ./winners.html
    ./years-spoiler.html
    ./years.html

In addition, ./all/summary.txt was modified to not
include the 2020 entries for the momemt.

The 2020 winner code AND write-ups are NOT part of this set.

p.s. The all/all.tar.bz2 does not contain the 2020 source code (yet?).
This commit is contained in:
Landon Curt Noll committed 2020-12-30 16:57:03 -08:00
1 parent 28efc67f5d
commit c0663537cb
1683 files changed
+220064

No files matched your search

BIN
View File
Binary file not shown.
+175
View File
@@ -0,0 +1,175 @@
#!/bin/make
# 1998 makefile
#
# Copyright (c) Landon Curt Noll, Jeremy Horn, Peter Seebach
# and Leonid A. Broukhis, 1999.
# All Rights Reserved. Permission for personal, educational or non-profit
# use is granted provided this this copyright and notice are included in its
# entirety and remains unaltered. All other uses must receive prior permission
# from the contest judges.
SHELL=/bin/sh
CAT=cat
CHMOD=chmod
CP=cp
MV=mv
ECHO=echo
LN=ln
RM=rm
SED=sed
TRUE=true
# flags for ANSI compiles
#
# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode,
# others such as gcc may want -ansi, others may want nothing
# at all. Adjust the CFLAGS line as needed.
#
# NOTE: Some compilers cannot optimize, or optimize some entries
# incorrectly. You might want to turn on -O to see if your
# compiler can handle them.
#
# NOTE: On some systems, the library path does not include the location
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
#
#CFLAGS=-O -Xa
#CFLAGS=-Xa
CFLAGS= -ansi
#CFLAGS= -ansi -O
#CFLAGS=
#CFLAGS= -ansi -L/usr/X11R6/lib
# ANSI compiler
#
# Set CC to the name of your ANSI compiler.
#
# Some entries seem to need gcc. If you have gcc, set
# both CC and MAY_NEED_GCC to gcc.
#
# If you do not have gcc, set CC to the name of your ANSI compiler, and
# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just :
# to disable such programs.
#
CC= cc
MAY_NEED_GCC= gcc
# winners that compile under ANSI C
#
WINNERS= schweikh1 df dloweneil banks dlowe bas2 fanf bas1 tomtorfs dorssel \
schweikh2 schnitzi chaos schweikh3
ALT_NAMES= schweikh2.orig banks.orig dlowe.orig df.orig schweikh1.orig \
chaos_nohalf
DATA_FILES= banks_files chaos_files fanf_files schweikh1_files schweikh3_files
all: ${WINNERS}
schweikh1: schweikh1.c
${MAY_NEED_GCC} ${CFLAGS} $? -o $@
schweikh1.orig: schweikh1.orig.c
${MAY_NEED_GCC} ${CFLAGS} $? -o $@
schweikh1_files: data
df: df.c
${CC} ${CFLAGS} $? -o $@
df.orig: prog.c
${CC} ${CFLAGS} $? -o $@
prog.c : df.c
${RM} -f prog.c
${CP} $? prog.c
dloweneil: dloweneil.c
${CC} ${CFLAGS} $? -lcurses -o $@
# See note about use of -L/path/to/X11/lib/dir above this rule fails to link
#
banks: banks.c
${CC} ${CFLAGS} $? -DIT=XK_Page_Up -DDT=XK_Page_Down \
-DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \
-DCS=XK_Return -Ddt=0.02 -lm -lX11 -o $@
# See note about use of -L/path/to/X11/lib/dir above this rule fails to link
#
banks.orig: banks.orig.c
${MAY_NEED_GCC} ${CFLAGS} $? -DIT=XK_Page_Up -DDT=XK_Page_Down \
-DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \
-DCS=XK_Return -Ddt=0.02 -lm -lX11 -o $@
banks_files: bb.sc horizon.sc mountains.sc pittsburgh.sc pyramids.sc river.sc
dlowe: dlowe.c
${CC} ${CFLAGS} $? -o $@
dlowe.orig: dlowe.orig.c
${CC} ${CFLAGS} $? -o $@
bas2: bas2.c
${CC} ${CFLAGS} $? -o $@
fanf: fanf.c
${RM} -f fanftmp1.c fanftmp2.c
${MAY_NEED_GCC} ${CFLAGS} -E $? > fanftmp1.c
${MAY_NEED_GCC} ${CFLAGS} -E fanftmp1.c > fanftmp2.c
${MAY_NEED_GCC} ${CFLAGS} fanftmp2.c ${LDFLAGS} -o $@
fanf_files: fanf.lambda
bas1: bas1.c
${CC} ${CFLAGS} $? -o $@
tomtorfs: tomtorfs.c
${CC} ${CFLAGS} $? -o $@
dorssel: dorssel.c
${CC} ${CFLAGS} $? -o $@
schweikh2: schweikh2.c
${MAY_NEED_GCC} ${CFLAGS} $? -o $@
schweikh2.orig: schweikh2.orig.c
${MAY_NEED_GCC} ${CFLAGS} $? -o $@
schweikh3: schweikh3.c
${MAY_NEED_GCC} ${CFLAGS} $? -DM0=sizeof -DM1=long -DM2=void \
-DM3=realloc -DM4=calloc -DM5=free -o $@
schweikh3_files: samefile.1
schnitzi: schnitzi.c
${CC} ${CFLAGS} $? -o $@
chaos: chaos.c
${CC} ${CFLAGS} $? -lcurses -o $@
# some libcurses do not have halfdelay(). This rule is for those systems
#
chaos_nohalf: chaos_nohalf.c
${CC} ${CFLAGS} $? -lcurses -o $@
${CP} -f $@ chaos
chaos_nohalf.c: chaos.c
${RM} -f $@
${SED} -e 's/halfdelay([^)]*);//' < $? > $@
chaos_files: cube.data desk.data ioccc.data pyramid.data xwing.data
everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES}
clean:
${RM} -f *.o a.out core ${WINNERS}
${RM} -f prog.c fanftmp1.c fanftmp2.c chaos_nohalf.c
clobber: clean
${RM} -f ${WINNERS}
${RM} -f ${ALT_NAMES}
nuke: clobber
@${TRUE}
install: all
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null
+133
View File
@@ -0,0 +1,133 @@
1998 marked the "The Fourteenth International Obfuscated C Code Contest"
Copyright (c) Landon Curt Noll, Jeremy Horn, Peter Seebach
and Leonid A. Broukhis, 1999.
All Rights Reserved. Permission for personal, educational or non-profit
use is granted provided this this copyright and notice are included in its
entirety and remains unaltered. All other uses must receive prior permission
from the contest judges.
Standard IOCCC stuff
--------------------
The IOCCC has its own domain. The IOCCC has an official home page is now:
http://www.ioccc.org
Use make to compile entries. It is possible that on BSD or non-unix
systems the makefile needs to be changed. See the Makefile for details.
Look at the source and try to figure out what the programs do, and run
them with various inputs. If you want to, look at the hints files for
spoilers - this year we included most of the information included
by the submitters.
Read over the makefile for compile/build issues. Your system may
require certain changes (add or remove a library, add or remove a
#define).
Some ANSI C compilers are not quite as good as they should be. If
yours is lacking, you may need to compile using gcc instead of your
local compiler.
New Judges
----------
Larry Bassel is now a graduate student in number theory at UC San Diego.
Barbara Frezza also went to San Diego to enter into law school at the
same time. Her cooking in the role of official chef was sorely missed.
Both Larry and Barbara have taken important new steps in their lives.
We wish them the best.
Landon was unable to contact with Sriram Srinivasan at the start of
the 1998 IOCCC season. Having not heard from Sriram, Landon put out
a call for new IOCCC judges. A number of excellent people applied.
Landon selected Leonid A. Broukhis, a two time IOCCC winner, as a
co-judge. Landon and Leo together selected Jeremy Horn and Peter
Seebach. The four judges:
http://www.ioccc.org/judges.html
together worked thru-out the 1998 IOCCC season.
Remarks on some of the entries
------------------------------
This year, Jens Schweikhardt won 3 times ... AGAIN! He is the only
person who was able to do this, let alone do it in two contests
in a row. Bas de Bakker and David Lowe won twice this year as well.
As we state in the guidelines, the names of the winners are as much
news to us as they are to you because we keep authorship separate from
rest of the entry. Some people have it, we guess!
There were a few very good entries that might have won if it were not
for the fact that they didn't work. If you didn't win, but think you
had a chance: test your program, fix it and submit it next year!
This year we awarded some outstanding entries. We recommend that you
look at all of the winners. The list of winners is a bit too long to
say something about every winner. On the other hand a partial mention
of a few is in order:
+ Audiences were very impressed with the Best of Show entry.
+ The judges were amused that for the first time we received an entry
that caused gcc to give the assembler bad input in some cases.
+ The poot entries got a good laugh from the Usenix IOCCC BOF crowd.
+ Those with Functional Programming knowledge as well as those
impressed with CPP code expansion liked the entry that translated
lambda expressions into combinator expressions.
+ Logic minded folks will get somewhat twisted up while following the
flow of the Best Flow Control entry.
+ Those who know the PostScript language will be ``bemused'' by
the Best Encapsulation entry.
There were some outstanding entries that did not win. Unfortunately
some very good entries lost because they:
+ depended too much on non-portable side effects in expressions;
+ depended too much on a particular byte order;
+ required the use of a special script, data file or pseudo-machine
language that was not supplied with the entry.
We hope the authors of some of those entries will fix and re-submit
them for the next IOCCC.
There was no 1997 contest
-------------------------
So what happened to 1997? There was no summer USENIX Technical
Conference. The Technical Conference was held Jun 15-19, 1998 instead
... 18 months later than the 1996 summer USENIX Technical Conference.
In addition we had to select some new IOCCC judges. As a result IOCCC
skipped over 1997.
Final Comments
--------------
Please send us comments and suggestions what we have expressed above.
Also include anything else that you would like to see in future contests.
Send such email to:
questions@ioccc.org
If you use, distribute or publish these entries in some way, please drop
us a line. We enjoy seeing who, where and how the contest is used.
You must include the words ``ioccc question'' in the subject of your EMail
message when sending EMail to the judges.
If you have problems with any of the entries, AND YOU HAVE A FIX, please
EMail the fix (patch file or the entire changed file) to the above address.
The next IOCCC is planned to start towards the end of 1999. Watch:
http://www.ioccc.org
for news of the next contest.
+60
View File
@@ -0,0 +1,60 @@
#include <math.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
double L ,o ,P
,_=dt,T,Z,D=1,d,
s[999],E,h= 8,I,
J,K,w[999],M,m,O
,n[999],j=33e-3,i=
1E3,r,t, u,v ,W,S=
74.5,l=221,X=7.26,
a,B,A=32.2,c, F,H;
int N,q, C, y,p,U;
Window z; char f[52]
; GC k; main(){ Display*e=
XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0))
; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400,
0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6}
; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B=
sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E
*T*B,E*d/K *B+v+B/K*F*D)*_; p<y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s
]== 0|K <fabs(W=T*r-I*E +D*P) |fabs(D=t *D+Z *T-a *E)> K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K
*D; N-1E4&& XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M;
XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){
XEvent z; XNextEvent(e ,&z);
++*((N=XLookupKeysym
(&z.xkey,0))-IT?
N-LT? UP-N?& E:&
J:& u: &h); --*(
DN -N? N-DT ?N==
RT?&u: & W:&h:&J
); } m=15*F/l;
c+=(I=M/ l,l*H
+I*M+a*X)*_; H
=A*r+v*X-F*l+(
E=.1+X*4.9/l,t
=T*m/32-I*T/24
)/S; K=F*M+(
h* 1e4/l-(T+
E*5*T*E)/3e2
)/S-X*d-B*A;
a=2.63 /l*d;
X+=( d*l-T/S
*(.19*E +a
*.64+J/1e3
)-M* v +A*
Z)*_; l +=
K *_; W=d;
sprintf(f,
"%5d %3d"
"%7d",p =l
/1.7,(C=9E3+
O*57.3)%0550,(int)i); d+=T*(.45-14/l*
X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47
*I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W*
179*v)/2312; select(p=0,0,0,0,&G); v-=(
W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u
)/107e2)*_; D=cos(o); E=sin(o); } }
+195
View File
@@ -0,0 +1,195 @@
Best of Show:
Carl Banks
Penn State Department of Aerospace Engineering
232 Hammond Building
University Park, PA 16802
USA
http://www.personal.psu.edu/users/c/w/cwb129/
Judge's Comments:
To build:
make banks
To use:
cat horizon.sc pittsburgh.sc | ./banks
What can we say? It's a flight sim done in 1536 bytes of real code.
This one is a real marvel. When people say the size limits are too
tight, well, we can just point them at this one. This program really
pushes the envelope!
The provided Makefile should work; you will need an X-ish system, and
a select() system call. More on building in the author comments.
NOTE: On some systems the original entry did not correctly display
the altitude and airspeed. These problems have been fixed. One can
still build the original program by:
make banks.orig
Selected Author's Comments:
You have just stepped out of the real world and into the
virtual. You are now sitting in the cockpit of a Piper Cherokee
airplane, heading north, flying 1000 feet above ground level.
Use the keyboard to fly the airplane. The arrow keys represent
the control stick. Press the Up Arrow key to push the stick
forward. Press the left arrow key to move the stick left, and
so on. Press Enter to re-center the stick. Use Page Up and Page
Down increase and decrease the throttle, respectively. (The
rudder is automatically coordinated with the turn rate, so
rudder pedals are not represented.)
On your display, you will see on the bottom left corner three
instruments. The first is the airspeed indicator; it tells you
how fast you're going in knots. The second is the heading
indicator, or compass. 0 is north, 90 is east, 180 is south,
270 is west. The third instrument is the altimeter, which
measures your height above ground level in feet.
--------
Features
--------
* Simulator models a Piper Cherokee, which is a light,
single-engine propeller driven airplane.
* The airplane is modeled as a six degree-of-freedom rigid
body, accurately reflecting its dynamics (for normal flight
conditions, at least).
* Fly through a virtual 3-D world, while sitting at your X
console.
* Loadable scenery files.
* Head-up display contains three instruments: a true airspeed
indicator, a heading indicator (compass), and an altimeter.
* Flight controls may be mapped to any keys at compile time
by redefining the macros in the build file. Nice if your
keyboard doesn't have arrow keys. (Or if you still use
vi. :-)
* Time step size can be set at compile time. This is useful to
reduce flicker on network X connections. (But be careful:
step sizes longer than about 0.03 seconds tend to have
numerical stability problems.)
* Airplane never stalls!
* Airplane never runs out of fuel!
* Fly underground!
* Fly through buildings!
-------
Scenery
-------
Each of the *.sc files is a scenery file. The simulator
program reads in the scenery from standard input on startup.
You may input more than one scenery file, as long as there are
less than 1000 total lines of input.
Here is a brief description of the scenery files:
horizon.sc -- A horizon, nothing more. You will probably
always want to input this piece of scenery.
mountains.sc -- An alternate horizon; a little more
mountainous.
pittsburgh.sc -- Scenery of downtown Pittsburgh. The downtown
area is initially located to your right.
bb.sc -- Simple obstacle course. Try to fly over the
buildings and under the bridges.
pyramids.sc -- Fly over the tombs of the ancient Pharaohs,
in this (fictitious) Egyptian landscape.
river.sc -- Follow a flowing river from the sky.
A few examples of how to input scenery:
cat horizon.sc pittsburgh.sc | ./banks
cat mountains.sc bb.sc | ./banks
cat mountains.sc river.sc pyramids.sc | ./banks
You can simulate flying through a cloud bank as well:
./banks < /dev/null
You will usually want at least a horizon, though.
The format of scenery files is simple, by the way. They're just
a list of 3-D coordinates, and the simulator simply draws line
segments from point to point as listed in the scenery file. 0 0
0 is used to end a series of consecutive line segments. Note
that in the coordinate system used, the third coordinate
represents altitude in a negative sense: negative numbers are
positive altitudes.
I'm sure you'll be making your own scenery files very soon!!!
----------------------------
Alternate Build Instructions
----------------------------
Several options must be passed to the compiler to make the build
work. The provided build file has the appropriate options set
to default values. Use this section if you want to compile with
different options.
To map a key to a control, you must pass an option to the
compiler in the format ``-Dcontrol=key''. The possible controls
you can map are described in the table below:
Control Description Default Key
------- ------------------------- -----------
IT Increase throttle XK_Page_Up
DT Decrease throttle XK_Page_Down
FD Move stick forward XK_Up
BK Move stick back XK_Down
LT Move stick left XK_Left
RT Move stick right XK_Right
CS Center stick XK_Enter
Values for the possible keys can be found in the X Windows
header file <X11/keysym.h>. This file is most likely a
cross-reference to another header, <X11/keysymdef.h>.
You must map all seven controls to keys at compile time, or the
compilation will fail.
For example, to map Center Stick to the space-bar, the compile
option would be ``-DCS=XK_space''.
To set the time step size, you must pass the following option to
the compiler: ``-Ddt=duration'', where dt is literal, and where
duration is the time in seconds you want the time step to be.
Two things to keep in mind when selecting a time step. Time
steps that are too large (more than about 0.03) will cause
numerical stability problems and should be avoided. Setting the
time step to be smaller than your clock resolution will slow
down the simulator, because the system pauses for more time than
the simulator expects.
The best advice is to set time step size to your system timer
resolution. Try a longer period if you're getting too much
flicker.
+60
View File
@@ -0,0 +1,60 @@
#include <math.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
double L ,o ,P
,_=dt,T,Z,D=1,d,
s[999],E,h= 8,I,
J,K,w[999],M,m,O
,n[999],j=33e-3,i=
1E3,r,t, u,v ,W,S=
74.5,l=221,X=7.26,
a,B,A=32.2,c, F,H;
int N,q,C,y,p,U,*g
; Display*e; char f[
52]; GC k; main( ){ Window
z=RootWindow(e=XOpenDisplay( 0),0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0 ))
; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400,
0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6}
; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B=
sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E
*T*B,E*d/K *B+v+B/K*F*D)*_; p<y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s
]==0|K <fabs(W=T*r-I*E +D*P)|fabs(D=t*D+Z *T-a*E)>K)N=1e4; else{ q=W/(9+K) *4E2+2e2; C= 2E2+4e2/( K
+9)*D; N-1E4&&XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_*(X*t+P*M+m*l); T=X*X+ l*l+M *M;
XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){
XEvent z; XNextEvent(e ,&z);
++*((N=XLookupKeysym
(&z.xkey,0))-IT?
N-LT? UP-N?& E:&
J:& u: &h); --*(
DN -N? N-DT ?N==
RT?&u: & W:&h:&J
); } m=15*F/l;
c+=(I=M/ l,l*H
+I*M+a*X)*_; H
=A*r+v*X-F*l+(
E=.1+X*4.9/l,t
=T*m/32-I*T/24
)/S; K=F*M+(
h* 1e4/l-(T+
E*5*T*E)/3e2
)/S-X*d-B*A;
a=2.63 /l*d;
X+=( d*l-T/S
*(.19*E +a
*.64+J/1e3
)-M* v +A*
Z)*_; l +=
K *_; W=d;
sprintf(f,
"%5.0f %4"
"d %6.0f",
l /1.7,( C =
9E3+O*57.3)% 0550,i); d+=T*(.45-14/l*
X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47
*I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W*
179*v)/2312; select(p=0,g,g,g,&G); v-=(
W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u
)/107e2)*_; D=cos(o); E=sin(o); } }
+67
View File
@@ -0,0 +1,67 @@
char r[]="C#S3K+[;G'W7OB/_? ? « ( !IOCCC! ´ ³Ën £0 0 e÷|ÅtÑ%Ä ° 2u"
" »¾ß mÔ/p ª c p) nm «¨ªúïµ!!¶â¡a £À3sîÜ 9sz2{ +§ 9_°0 © h0 ºÂ / "
"¤)$1 ¬ a~ ) % y qÃ'¯ ¹â ° \" ! q 6 µy' 0 3;e{ Ì kãÔs¾,Ê 2~a q t"
" 9dl 9 ¬.´ .ù_ &Á!ê '* ·­ ; ·± µÁ = <eàª1à B:29 ¦ 6 n´ o®¨b:_2"
" µ +úí h |÷t\177°#d`Ý l½Ù r )þÁ @ ·´Ö m d©ià ¤6 e¦ v¸½^ ¶` rq"
"Á <'7Ã÷°ÅÙ ´[|äÈ=ñ@îp (², /ä^ c ¦ . ­` £²î ¡­ñ`fæ /= :ù]y÷¢·"
" 2º » q ¢ v²4Õm³íÓ&=a¤¡ g ; dà,é+· +_¼ =È 5߬iêÔØû§ÌÌ r£"
#define O(Q)p!O) { *i[25][41]|=U(642+Q); u e r[(Q)/2]&63); }
"solÞÄ&¾X¼[Ý; }ï? º= &c} 9ȾóÀ2 >ü 5 ,Þ & Ã0 Úù*½ ³äÿgh";
#define C( b)O(28+(B+b)%6)
# define a >> B &M[i X]
#include/* s */<stdio.h>
#include/* s */<time.h>
unsigned int long
# define e putchar(
B,E,M,A,Z,I,N,G
# define g ! (32 a)
# define u U(533);
# define n (65 a)
# define z for (
[32768], i [32]
# define p if(
[48][3]={ { { 2} } } ; void**V,*D,*F[32][48];
void*Q(void**O){ return*O?(*O=Q(*O)):O; } U(
O){return E+=(O/=2)-1?U((A=A/2^57525273+(A&
1^O&1)*9583591<<5,O)),0:O,16; } main(O){ A
=O?time(D):953351751; z I=0; I<26; ++I){z
N=I/2; N<30+I/2; ++N){ z M=0; M<3; ++M){
p Z=O)z; (B=I+Z*!!M) <26&&N+Z*(M!=2)-B/
2<30; B[G]=N<<7|Z++<<13|I*4+M)z; G[B=A
# define X [ I+Z*!! M] [ N+Z*(M!= 2)]
&32767]; )u p!Z&&M[i X]){ z B=0; B<6
; B++){ p!g){ C(5)O(0)C(2)O(2)} C((
B&1?!!n:4-3*g))p!g|n)O(4)O(7)} z B
=0; B<6; B++){ p g&&!n)O(14)p!g)O
(8)p B&1|g){ O=!n; O(10)O=!(1040
a ); O(12 )O=0; } O(17+(B&1 ?!(
1040 a)!=!n:g))} } } O(24)} O(
21+(I&1))} O(26)p O)z E=0; E<
1<<15; I=16){ B=E++[G]; D=Q(
&F[I=B/4&31][N=B>>7&63]); M
=B%4; Z=B>>=13; V=Q(&F X);
p!(D==V|N[I[i]] [1]|i X[1
])){ z; --Z&&!(*i X%9|*i
X/9&*i X/9-1); ); p!Z){
*V=D; *i X|=32>>M; Z=B
; z*i X|=4>>M; --Z; i
X[*i X?2-!i X [1]:!(
F X=V)]=36>>M); } }
} p!O){ u u z I=8;
I--; )p(N=I[r]=(I
>3?E:A)>>(I*9&24
))==10||N==13){
e 0 ); I =8; u
u u u} e 1 );
} z E =1333;
++ I<8+469*
!!O; e(N=I
[r])-32|!
O?N:r[++
I]-N));
return
O &&
main
(!O
);
}
+78
View File
@@ -0,0 +1,78 @@
Best Encapsulation:
Bas de Bakker
Pica, Centre for Library Automation
Statenweg 154 B (home address)
3039 JN Rotterdam
The Netherlands
Judges' comments:
To build:
make bas1
To use:
If lpr on your system can print PostScript:
./bas1 | gunzip | lpr
else, while in X Window System,
./bas1 | gunzip | gv -
or:
./bas1 | gunzip | gs -sDEVICE=pgmraw -sOutputFile='|xv -' -
The output is supposed to be a 3D maze, but it is somewhat more
than that. If you've seen any of the Maurits Escher's works,
you'll know what we're talking about.
When trying to run the program with command line arguments, be generous.
Selected Author's Comments:
BEMAZING
========
"You're in a twisty little maze of beams, all different."
Bemazing is "amazing" taken one step (letter) further. Bemazing
creates a 3D maze of beams. Try to go from the entrance (the
unfinished beam in one corner) to the exit (the unfinished beam in the
opposite corner) or vice versa.
For maximum portability, Bemazing is not tied to any window system,
but creates postscript. The picture it makes will fit on either A4 or
letter size paper.
In addition, because postscript is rather verbose, Bemazing creates
the postscript in gzip format, in order to save precious bits on your
hard disk for the latest version of GNU Emacs (after all, you wouldn't
want to use an editor without a psychoanalyze-pinhead function, now
would you). Again for maximum portability, Bemazing will take special
care that the binary output will not contain any newline or return
characters that may get weird treatment on systems that do not use the
One True Line Separator.
NOTES
=====
Be sure to view the source with something that can display characters
\240-\377. Use LESSCHARSET=latin1, M-x standard-display-european in
GNU Emacs etc. The source does not use characters in the range
\200-\237 (we are not an unnamed word processor that tends to create
HTML containing these control characters).
Because this is not the obfuscated postscript contest, the postscript
does not contain any "for", "if" or other control structures. All the
logic is in the C code. There are only a few straightforward "def"s,
because otherwise the output would become much larger.
Try running Bemazing with command line arguments and see what
happens. (But note that the program only guarantees that there
actually is a route from entrance to exit if you run it without
command line arguments.)
+3
View File
@@ -0,0 +1,3 @@
#include <stdio.h>
int O,o,i;char*I="";main(l){O&=l&1?*I:~*I,*I++||(l=2*getchar(),i+=O>8
?o:O?0:o+1,o=O>9,O=-1,I="t8B~pq`",l>0)?main(l/2):printf("%d\n",--i);}
+49
View File
@@ -0,0 +1,49 @@
Best Small Program:
Bas de Bakker
Pica, Centre for Library Automation
Statenweg 154 B (home address)
3039 JN Rotterdam
The Netherlands
Judges' comments:
To build:
make bas2
To use:
./bas2 < bas2.c
Questions to ponder:
Can you determine the relationship between the input and the
resulting numeric output?
The program was not designed to process files with a certain
octet value, what value is that?
Hint and Extra Credit:
This entry points our a minor flaw in the IOCCC rules that has
been around since 1992. It processes a certain octet value in
a way that differs from a strict reading of one of the
official IOCCC rules. What is the rule and what is the octet
value?
Selected Author's Comments:
The main obfuscation is the way characters are recognized, which is
done by matching the bit patterns. Minor obfuscations are:
- Useless layout.
- Useless variable names.
- Recursive main() instead of 2 loops (over input characters and over
bits in the character).
- ? and || instead of if statements.
+572
View File
@@ -0,0 +1,572 @@
23374 -1302 -30
23374 -1200 -30
23374 -1099 -30
23374 -998 -30
23374 -897 -30
23374 -796 -30
23374 -695 -30
23374 -594 -30
23374 -493 -30
23374 -392 -30
23374 -291 -30
23374 -190 -30
23374 -89 -30
23374 11 -30
23374 112 -30
23374 213 -30
23374 314 -30
23374 415 -30
23374 516 -30
23374 617 -30
23374 718 -30
23374 819 -30
23374 920 -30
23374 1021 -30
23374 1122 -30
23374 1223 -30
23374 1324 -30
23374 1426 -30
23498 1426 -30
23498 1324 -30
23498 1223 -30
23498 1122 -30
23498 1021 -30
23498 920 -30
23498 819 -30
23498 718 -30
23498 617 -30
23498 516 -30
23498 415 -30
23498 314 -30
23498 213 -30
23498 112 -30
23498 11 -30
23498 -89 -30
23498 -190 -30
23498 -291 -30
23498 -392 -30
23498 -493 -30
23498 -594 -30
23498 -695 -30
23498 -796 -30
23498 -897 -30
23498 -998 -30
23498 -1099 -30
23498 -1200 -30
23498 -1302 -30
23374 -1302 -30
23374 -1302 -30
0 0 0
0 0 0
7502 124 -30
7502 124 -750
7750 124 -750
7502 124 -510
7750 124 -510
7502 124 -270
7750 124 -270
7502 124 -30
7750 124 -30
7750 124 -750
7750 -124 -750
7750 124 -510
7750 -124 -510
7750 124 -270
7750 -124 -270
7750 124 -30
7750 -124 -30
7750 -124 -750
7502 -124 -750
7750 -124 -510
7502 -124 -510
7750 -124 -270
7502 -124 -270
7750 -124 -30
7502 -124 -30
7502 -124 -750
7502 124 -750
7502 -124 -510
7502 124 -510
7502 -124 -270
7502 124 -270
7502 -124 -30
7502 124 -30
7502 124 -750
7502 124 -750
7502 124 -510
7502 124 -510
7502 124 -270
7502 124 -270
7502 124 -30
7502 124 -30
0 0 0
23374 -1054 0
23374 -1054 -30
23374 -496 -402
23374 62 -526
23374 620 -402
23374 1178 -30
23374 1178 0
0 0 0
23498 1178 0
23498 1178 -30
23498 620 -402
23498 62 -526
23498 -496 -402
23498 -1054 -30
23498 -1054 0
0 0 0
18166 0 -30
18166 0 -610
18352 186 -610
18166 0 -320
18352 186 -320
18166 0 -30
18352 186 -30
18352 186 -610
18538 0 -610
18352 186 -320
18538 0 -320
18352 186 -30
18538 0 -30
18538 0 -610
18352 -186 -610
18538 0 -320
18352 -186 -320
18538 0 -30
18352 -186 -30
18352 -186 -610
18166 0 -610
18352 -186 -320
18166 0 -320
18352 -186 -30
18166 0 -30
18166 0 -610
18166 0 -610
18166 0 -320
18166 0 -320
18166 0 -30
18166 0 -30
0 0 0
13392 -1364 -30
13392 -1262 -30
13392 -1161 -30
13392 -1060 -30
13392 -959 -30
13392 -858 -30
13392 -757 -30
13392 -656 -30
13392 -555 -30
13392 -454 -30
13392 -353 -30
13392 -252 -30
13392 -151 -30
13392 -50 -30
13392 50 -30
13392 151 -30
13392 252 -30
13392 353 -30
13392 454 -30
13392 555 -30
13392 656 -30
13392 757 -30
13392 858 -30
13392 959 -30
13392 1060 -30
13392 1161 -30
13392 1262 -30
13392 1364 -30
13516 1364 -30
13516 1262 -30
13516 1161 -30
13516 1060 -30
13516 959 -30
13516 858 -30
13516 757 -30
13516 656 -30
13516 555 -30
13516 454 -30
13516 353 -30
13516 252 -30
13516 151 -30
13516 50 -30
13516 -50 -30
13516 -151 -30
13516 -252 -30
13516 -353 -30
13516 -454 -30
13516 -555 -30
13516 -656 -30
13516 -757 -30
13516 -858 -30
13516 -959 -30
13516 -1060 -30
13516 -1161 -30
13516 -1262 -30
13516 -1364 -30
13392 -1364 -30
13392 -1364 -30
0 0 0
13392 -1116 -30
13392 -892 -60
13392 -669 -150
13392 -334 -60
13392 0 -35
13392 334 -60
13392 669 -150
13392 892 -60
13392 1116 -30
0 0 0
13392 -669 -150
13392 -669 0
0 0 0
13392 669 -150
13392 669 0
0 0 0
13516 1116 -30
13516 892 -60
13516 669 -150
13516 334 -60
13516 0 -35
13516 -334 -60
13516 -669 -150
13516 -892 -60
13516 -1116 -30
0 0 0
13516 669 -150
13516 669 0
0 0 0
13516 -669 -150
13516 -669 0
0 0 0
33604 620 -30
33604 620 -1132
33852 620 -1132
33604 620 -856
33852 620 -856
33604 620 -581
33852 620 -581
33604 620 -305
33852 620 -305
33604 620 -30
33852 620 -30
33852 620 -1132
33852 372 -1132
33852 620 -856
33852 372 -856
33852 620 -581
33852 372 -581
33852 620 -305
33852 372 -305
33852 620 -30
33852 372 -30
33852 372 -1132
33604 372 -1132
33852 372 -856
33604 372 -856
33852 372 -581
33604 372 -581
33852 372 -305
33604 372 -305
33852 372 -30
33604 372 -30
33604 372 -1132
33604 620 -1132
33604 372 -856
33604 620 -856
33604 372 -581
33604 620 -581
33604 372 -305
33604 620 -305
33604 372 -30
33604 620 -30
33604 620 -1132
33604 620 -1132
33604 620 -856
33604 620 -856
33604 620 -581
33604 620 -581
33604 620 -305
33604 620 -305
33604 620 -30
33604 620 -30
0 0 0
44516 1240 -30
44516 1340 -30
44516 1441 -30
44516 1542 -30
44516 1643 -30
44516 1743 -30
44516 1844 -30
44516 1945 -30
44516 2046 -30
44516 2146 -30
44516 2247 -30
44516 2348 -30
44516 2449 -30
44516 2549 -30
44516 2650 -30
44516 2751 -30
44516 2852 -30
44516 2952 -30
44516 3053 -30
44516 3154 -30
44516 3255 -30
44516 3355 -30
44516 3456 -30
44516 3557 -30
44516 3658 -30
44640 3658 -30
44640 3557 -30
44640 3456 -30
44640 3355 -30
44640 3255 -30
44640 3154 -30
44640 3053 -30
44640 2952 -30
44640 2852 -30
44640 2751 -30
44640 2650 -30
44640 2549 -30
44640 2449 -30
44640 2348 -30
44640 2247 -30
44640 2146 -30
44640 2046 -30
44640 1945 -30
44640 1844 -30
44640 1743 -30
44640 1643 -30
44640 1542 -30
44640 1441 -30
44640 1340 -30
44640 1240 -30
44516 1240 -30
44516 1240 -30
0 0 0
44516 1488 -30
44516 1674 -60
44516 1860 -150
44516 2139 -60
44516 2418 -35
44516 2697 -60
44516 2976 -150
44516 3162 -60
44516 3348 -30
0 0 0
44516 1860 -150
44516 1860 0
0 0 0
44516 2976 -150
44516 2976 0
0 0 0
44640 3348 -30
44640 3162 -60
44640 2976 -150
44640 2697 -60
44640 2418 -35
44640 2139 -60
44640 1860 -150
44640 1674 -60
44640 1488 -30
0 0 0
44640 2976 -150
44640 2976 0
0 0 0
44640 1860 -150
44640 1860 0
0 0 0
48980 3348 -30
48980 3348 -440
49228 3348 -440
48980 3348 -30
49228 3348 -30
49228 3348 -440
49228 2604 -440
49228 3348 -30
49228 2604 -30
49228 2604 -440
48980 2604 -440
49228 2604 -30
48980 2604 -30
48980 2604 -440
48980 3348 -440
48980 2604 -30
48980 3348 -30
48980 3348 -440
48980 3348 -440
48980 3348 -30
48980 3348 -30
0 0 0
53940 1798 -30
53940 1901 -30
53940 2004 -30
53940 2108 -30
53940 2211 -30
53940 2314 -30
53940 2418 -30
53940 2521 -30
53940 2624 -30
53940 2728 -30
53940 2831 -30
53940 2934 -30
53940 3038 -30
53940 3141 -30
53940 3244 -30
53940 3348 -30
53940 3451 -30
53940 3554 -30
53940 3658 -30
54064 3658 -30
54064 3554 -30
54064 3451 -30
54064 3348 -30
54064 3244 -30
54064 3141 -30
54064 3038 -30
54064 2934 -30
54064 2831 -30
54064 2728 -30
54064 2624 -30
54064 2521 -30
54064 2418 -30
54064 2314 -30
54064 2211 -30
54064 2108 -30
54064 2004 -30
54064 1901 -30
54064 1798 -30
53940 1798 -30
53940 1798 -30
0 0 0
53940 1984 0
53940 1984 -80
53940 2356 -130
53940 3100 -30
53940 3472 -30
53940 3100 -130
53940 2356 -30
53940 1984 -80
0 0 0
53940 3472 -30
53940 3472 0
0 0 0
54064 3472 0
54064 3472 -80
54064 3100 -130
54064 2356 -30
54064 1984 -30
54064 2356 -130
54064 3100 -30
54064 3472 -80
0 0 0
54064 1984 -30
54064 1984 0
0 0 0
64790 0 -30
64790 0 -580
65100 -248 -580
64790 0 -305
65100 -248 -305
64790 0 -30
65100 -248 -30
65100 -248 -580
65596 372 -580
65100 -248 -305
65596 372 -305
65100 -248 -30
65596 372 -30
65596 372 -580
65286 620 -580
65596 372 -305
65286 620 -305
65596 372 -30
65286 620 -30
65286 620 -580
64790 0 -580
65286 620 -305
64790 0 -305
65286 620 -30
64790 0 -30
64790 0 -580
64790 0 -580
64790 0 -305
64790 0 -305
64790 0 -30
64790 0 -30
0 0 0
73470 -1798 -30
73470 -1696 -30
73470 -1595 -30
73470 -1494 -30
73470 -1393 -30
73470 -1292 -30
73470 -1191 -30
73470 -1090 -30
73470 -989 -30
73470 -888 -30
73470 -787 -30
73470 -686 -30
73470 -585 -30
73470 -484 -30
73470 -383 -30
73470 -282 -30
73470 -181 -30
73470 -80 -30
73470 20 -30
73470 121 -30
73470 222 -30
73470 323 -30
73470 424 -30
73470 525 -30
73470 626 -30
73470 727 -30
73470 828 -30
73470 930 -30
73594 930 -30
73594 828 -30
73594 727 -30
73594 626 -30
73594 525 -30
73594 424 -30
73594 323 -30
73594 222 -30
73594 121 -30
73594 20 -30
73594 -80 -30
73594 -181 -30
73594 -282 -30
73594 -383 -30
73594 -484 -30
73594 -585 -30
73594 -686 -30
73594 -787 -30
73594 -888 -30
73594 -989 -30
73594 -1090 -30
73594 -1191 -30
73594 -1292 -30
73594 -1393 -30
73594 -1494 -30
73594 -1595 -30
73594 -1696 -30
73594 -1798 -30
73470 -1798 -30
73470 -1798 -30
0 0 0
73470 -1550 0
73470 -1550 -30
73470 -992 -402
73470 -434 -526
73470 124 -402
73470 682 -30
73470 682 0
0 0 0
73594 682 0
73594 682 -30
73594 124 -402
73594 -434 -526
73594 -992 -402
73594 -1550 -30
73594 -1550 0
0 0 0
+93
View File
@@ -0,0 +1,93 @@
#include<curses.h>
#include<stdlib.h>
#include<string.h>
#define A int
#define F float
#define O sizeof
#define V ((A *)(X+N))
#define U(a,b) for(a = 0; a < b; a++)
#define L(a) (X[K] * H[a*4]+ X[K+1] * H[a*4+1]+ X[K+2] * H[a*4+2])
#define _(e,f,a,b,c) if(M==e) { T[a*4+c] = T[b*4+c] = T[c*4+a] = T[c*4+b] = !(T[c*5] = 1); T[a*4+b] = -(T[b*4+a] = f .1045284632); T[b*5] = T[a*5] = .9945418726; U(M,3) U(E,4) U(K,3) R[M*4+E] += H[K*4+E] * T[M*4+K]; memcpy(H,R,12*O(F)); }
char Q[3792];
A K, M=0, E, B;
long Z;
F H[] = { 1,0,0,0,0,1,0,0,0,0,1,0 } , T[12], R[12], C, D, I, J, S, * X, G=4;
FILE * W;
A main(A N,char ** Y) {
char P[] = "AlWuzEre 72 -1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 ";
strcpy(Q,P);
if(!(W = fopen(Y[N<2?0:1],"r"))) {
printf("Can't read\n"); exit(-1); }
fseek(W,0,SEEK_END);
Z = ftell(W);
fseek(W,0,SEEK_SET);
strcpy(Q+9, "%d");
while(fscanf(W,Q,&N) != 1) {
fseek(W,1,SEEK_CUR);
if(ftell(W) >= Z) {
printf("Bad input\n"); exit(-1); } }
X = (F *)malloc(N * (O(A)>O(F)?O(A):O(F)) * 2);
if(!X) { printf("No memory\n"); exit(-1); }
U(K,N) fscanf(W,"%f",X+K);
fclose(W);
initscr();
halfdelay(30);
noecho();
CH:
memset(R,0,12*O(F));
_('h', ,1,2,0)
_('j', ,2,0,1)
_('k', ,1,0,2)
_('y',-,1,2,0)
_('u',-,2,0,1)
_('i',-,1,0,2)
G += M=='a'?-.1:M=='z'?.1:0;
if(M=='q') { printf("%.9s\n",P); exit(0); }
memset(Q,0,3792);
erase();
U(K,N) {
C = 40 / (L(2)+G);
V[K] = (A)(L(0) * C) + 40;
V[K+1] = (A)(L(1) * C) + 24;
K+=2; }
U(B,N) {
C = V[B++];
D = V[B++];
E = V[++B] - C;
M = V[++B] - D;
B++;
S = (F)abs((abs(E)>abs(M))?E:M);
I=E/S;
J=M/S++;
U(K,S)
{
E = (A)(C+0.5);
M = (A)(D+0.5);
if(E>=0 && M>=0 && E<79 && M<48)
{
Q[E + M * 79] = 1;
mvaddch((M&1?M-1:M)/2,E,Q[E+(M+(M&1?-1:1))*79]?':':(M&1?'.':'`'));
}
C+=I;
D+=J;
}
}
move(0,0);
refresh();
M = getch();
halfdelay(M==ERR?1:30);
M = M==ERR?'u':M;
goto CH;
}
+77
View File
@@ -0,0 +1,77 @@
Best Object Orientation:
Alan De Smet
8531 Greenway Blvd. #206
Middleton, WI 53562
USA
http://www.upl.cs.wisc.edu/~chaos/
Judge's Comments:
To build:
make chaos
To use:
./chaos
This is the authors first IOCCC entry. We thought the entry was
a nice example of a compact collection of obfuscations.
Can you figure our why, in some cases, it wants to read itself?
Some systems do not implement halfdelay() in their libcurses.
You might try compiling with -lncurses of you have that library.
Or you can build this entry without the halfdelay() call by:
make chaos_nohalf
Selected Author's Comments:
* Usage
The executable takes a single argument for the data file to use.
If no argument is given, it will find a data file by itself, don't
worry about it...
* Summary
This is a simple ncurses 3D object viewer. The keys 'y', 'u', 'i',
'h', 'j', and 'k' rotate. 'a' and 'z' zoom in and out. 'q' quits.
Given about 3 seconds of no input, it will start rotating until
interrupted by user input.
* Features (aka Bugs):
Memory malloced is never freed. This shouldn't be a big deal,
since only one block is ever allocated, and the OS should recover it.
My local flavor of lint doesn't seem to like the fact that I never
"return" from main. Feh, what does it know? Otherwise, ignoring
lint's over protectiveness ("Of course I'm not using all of the
functions defined in curses.h!"), it's lint clean.
If the compiler happens to generate the byte sequence "AlWuzEre"
in the executable by chance, the program may be unable to locate
the embedded string. As a result, running the program without an
external data file may act in undefined ways.
If the compiler doesn't store char * P's data in a nice contiguous
stream, it would be bad. As above, it would break running the
program without an external data file.
If the incoming data is corrupt, the results are undefined.
(Although dumping core is a popular result.)
When a point passes behind the camera, it is still plotted.
The object will "bounce" off the camera, but the result (some points
in front, some reflected from the rear) looks really odd. And it
sometimes hangs. So just don't fly through objects. You'll be
happier.
+14
View File
@@ -0,0 +1,14 @@
AlWuzEre 72
-1 1 1 1 1 1
1 1 1 1 1 -1
1 1 1 1 -1 1
1 1 -1 1 -1 -1
-1 1 -1 -1 1 1
1 1 -1 -1 1 -1
1 -1 1 -1 -1 1
1 -1 -1 -1 -1 -1
1 -1 1 1 -1 -1
-1 1 1 -1 -1 1
-1 1 -1 -1 -1 -1
-1 -1 1 -1 -1 -1
+949
View File
@@ -0,0 +1,949 @@
# This file is read by a standard conformance test program.
#
# File format:
# Three paragraphs separated by exactly one empty line.
# Lines beginning with '#' at the very beginning are ignored.
#
# Lines in the first paragraph consist of a single digit [0-9], a space,
# and an argument for cpp which selects some standard. Normally this is
# done with a feature test macros but for example for ANSI compliance it
# might be a compiler switch, like -Xa or -ansi.
# No more than 10 standards (identified by the digits 0 - 9, in order)
# are allowed.
#
# Lines in the second paragraph consist of a string of digits, a space,
# and an identifier. An identifier may begin or end with '*' meaning
# zero or more characters can be appended or prepended, respectively.
# The string of digits describes the particular standards in which this
# identifier is *always* (regardless of which header is included) reserved
# and thus may be a valid macro.
#
# Lines in the third paragraph consist of two or three fields.
# A two field line consists of a string of digits describing the
# standards, a space, and an identifier (of the same format as in
# the second paragraph). A sequence of two field lines is followed
# by exactly one three field line. This line consists of a string
# of digits describing the standards, a space, the header name,
# another space and the single character H. In other words, a list
# of identifiers *followed* by the header in which they may appear.
# [That way only one pass is needed when reading this file.]
#
0 -D__STDC__ -D_ANSI_SOURCE
1 -D_POSIX_SOURCE
2 -D_XOPEN_SOURCE -D_XOPEN_VERSION=4
# Identifiers with external linkage (extern functions and extern
# variables) are always in scope, even when no header is included.
#
# Always okay, because these constitute the implementation name space:
012 _*
#
# <errno.h> :
012 errno
#
# <stddef.h> : [no identifiers with external linkage]
#
# <assert.h> : [no identifiers with external linkage]
#
# <ctype.h> :
012 isa*
012 isb*
012 isc*
012 isd*
012 ise*
012 isf*
012 isg*
012 ish*
012 isi*
012 isj*
012 isk*
012 isl*
012 ism*
012 isn*
012 iso*
012 isp*
012 isq*
012 isr*
012 iss*
012 ist*
012 isu*
012 isv*
012 isw*
012 isx*
012 isy*
012 isz*
012 toa*
012 tob*
012 toc*
012 tod*
012 toe*
012 tof*
012 tog*
012 toh*
012 toi*
012 toj*
012 tok*
012 tol*
012 tom*
012 ton*
012 too*
012 top*
012 toq*
012 tor*
012 tos*
012 tot*
012 tou*
012 tov*
012 tow*
012 tox*
012 toy*
012 toz*
#
# <locale.h> :
012 lconv
012 setlocale
012 localeconv
#
# <math.h> :
012 acos
012 acosf
012 acosl
012 asin
012 asinf
012 asinl
012 atan
012 atanf
012 atanl
012 atan2
012 atan2f
012 atan2l
012 cos
012 cosf
012 cosl
012 cosh
012 coshf
012 coshl
012 exp
012 expf
012 expl
012 fabs
012 fabsf
012 fabsl
012 floor
012 floorf
012 floorl
012 fmod
012 fmodf
012 fmodl
012 frexp
012 frexpf
012 frexpl
012 ldexp
012 ldexpf
012 ldexpl
012 log
012 logf
012 logl
012 log10
012 log10f
012 log10l
012 modf
012 modff
012 modfl
012 pow
012 powf
012 powl
012 sin
012 sinf
012 sinl
012 sinh
012 sinhf
012 sinhl
012 tan
012 tanf
012 tanl
012 tanh
012 tanhf
012 tanhl
012 sqrt
012 sqrtf
012 sqrtl
012 ceil
012 ceilf
012 ceill
#
# <setjmp.h> :
012 longjmp
012 setjmp
12 siglongjmp
12 sigsetjmp
#
# <signal.h> :
012 raise
012 signal
12 kill
12 sigaction
12 sigaddset
12 sigdelset
12 sigemptyset
12 sigfillset
12 sigismember
12 sigpending
12 sigprocmask
12 sigsuspend
#
# <stdarg.h> : [no identifiers with external linkage]
#
# <stdio.h> :
012 stderr
012 stdin
012 stdout
012 remove
012 rename
012 tmpfile
012 tmpnam
012 fclose
012 fflush
012 fileno
012 fopen
012 freopen
012 setbuf
012 setvbuf
012 fprintf
012 fscanf
012 printf
012 scanf
012 sprintf
012 sscanf
012 vfprintf
012 vprintf
012 vsprintf
012 fgetc
012 fgets
012 fputc
012 fputs
012 getc
012 getchar
012 gets
012 putc
012 putchar
012 puts
012 ungetc
012 fread
012 fwrite
012 fgetpos
012 fseek
012 fsetpos
012 ftell
012 rewind
012 clearerr
012 feof
012 ferror
012 perror
#
# <stdlib.h> :
012 atof
012 atoi
012 atol
012 strtod
012 strtol
012 strtoul
012 rand
012 srand
012 calloc
012 free
012 malloc
012 realloc
012 abort
012 atexit
012 exit
012 getenv
012 system
012 bsearch
012 qsort
012 abs
012 div
012 labs
012 ldiv
012 mblen
012 mbtowc
012 wctomb
012 mbstowcs
012 wcstombs
#
# <string.h>
012 mema*
012 memb*
012 memc*
012 memd*
012 meme*
012 memf*
012 memg*
012 memh*
012 memi*
012 memj*
012 memk*
012 meml*
012 memm*
012 memn*
012 memo*
012 memp*
012 memq*
012 memr*
012 mems*
012 memt*
012 memu*
012 memv*
012 memw*
012 memx*
012 memy*
012 memz*
012 stra*
012 strb*
012 strc*
012 strd*
012 stre*
012 strf*
012 strg*
012 strh*
012 stri*
012 strj*
012 strk*
012 strl*
012 strm*
012 strn*
012 stro*
012 strp*
012 strq*
012 strr*
012 strs*
012 strt*
012 stru*
012 strv*
012 strw*
012 strx*
012 stry*
012 strz*
012 wcsa*
012 wcsb*
012 wcsc*
012 wcsd*
012 wcse*
012 wcsf*
012 wcsg*
012 wcsh*
012 wcsi*
012 wcsj*
012 wcsk*
012 wcsl*
012 wcsm*
012 wcsn*
012 wcso*
012 wcsp*
012 wcsq*
012 wcsr*
012 wcss*
012 wcst*
012 wcsu*
012 wcsv*
012 wcsw*
012 wcsx*
012 wcsy*
012 wcsz*
#
# <time.h> :
012 clock
012 difftime
012 mktime
012 time
012 asctime
012 ctime
012 gmtime
012 localtime
012 strftime
12 tzset
12 tzname
#
# <limits.h> : [no identifiers with external linkage]
#
# <float.h> : [no identifiers with external linkage]
#
# <iso646.h> : [no identifiers with external linkage]
#
# <wctype.h> :
012 wctype
012 wctrans
# (is* and to* mentioned above)
#
# <wchar.h> :
# (wcs* already mentioned above)
012 fwprintf
012 fwscanf
012 wprintf
012 wscanf
012 swprintf
012 swscanf
012 vfwprintf
012 vwprintf
012 vswprintf
012 fgetwc
012 fgetws
012 fputwc
012 fputws
012 getwc
012 getwchar
012 putwc
012 putwchar
012 ungetwc
012 fwide
012 wmemchr
012 wmemcmp
012 wmemcpy
012 wmemmove
012 wmemset
012 btowc
012 wctob
012 mbsinit
012 mbrlen
012 mbrtowc
012 wcrtomb
012 mbsrtowcs
#
# <dirent.h> (POSIX) :
12 dirent
12 closedir
12 opendir
12 readdir
12 rewinddir
#
# <fcntl.h> (POSIX) :
12 flock
12 creat
12 fcntl
12 open
#
# <grp.h> (POSIX) :
12 getgrgid
12 getgrnam
#
# <pwd.h> (POSIX) :
12 getpwnam
12 getpwuid
#
# <sys/stat.h> (POSIX) :
12 chmod
12 fstat
12 mkdir
12 mkfifo
12 stat
12 umask
#
# <sys/times.h> (POSIX) :
12 times
#
# <sys/types.h> (POSIX) : [no external identifiers]
#
# <sys/utsname.h> (POSIX) :
12 uname
#
# <sys/wait.h> (POSIX) :
12 wait
12 waitpid
#
# <termios.h> (POSIX) :
12 cfgetispeed
12 cfgetospeed
12 cfsetispeed
12 cfsetospeed
12 tcdrain
12 tcflow
12 tcflush
12 tcgetattr
12 tcsendbreak
12 tcsetattr
#
# <unistd.h> (POSIX) :
12 _exit
12 access
12 alarm
12 chdir
12 chown
12 close
12 ctermid
12 cuserid
12 dup2
12 dup
12 execl
12 execle
12 execlp
12 execv
12 execve
12 execvp
12 fork
12 fpathconf
12 getcwd
12 getegid
12 geteuid
12 getgid
12 getgroups
12 getlogin
12 getpgrp
12 getpid
12 getppid
12 getuid
12 isatty
12 link
12 lseek
12 pathconf
12 pause
12 pipe
12 read
12 rmdir
12 setgid
12 setpgid
12 setsid
12 setuid
12 sleep
12 sysconf
12 tcgetpgrp
12 tcsetpgrp
12 ttyname
12 unlink
12 write
# <unistd.h> (XOPEN additions)
2 confstr
2 crypt
2 encrypt
2 getopt
2 optarg
2 opterr
2 optind
2 optopt
2 getpass
2 swab
#
# <utime.h> (POSIX) :
12 utime
# Identifiers with no linkage, per header:
# macros, types, structs, unions.
012 E0*
012 E1*
012 E2*
012 E3*
012 E4*
012 E5*
012 E6*
012 E7*
012 E8*
012 E9*
012 EA*
012 EB*
012 EC*
012 ED*
012 EE*
012 EF*
012 EG*
012 EH*
012 EI*
012 EJ*
012 EK*
012 EL*
012 EM*
012 EN*
012 EO*
012 EP*
012 EQ*
012 ER*
012 ES*
012 ET*
012 EU*
012 EV*
012 EW*
012 EX*
012 EY*
012 EZ*
12 *_t
012 errno.h H
012 NULL
012 offsetof
012 ptrdiff_t
012 size_t
012 wchar_z
12 *_t
012 stddef.h H
012 NDEBUG
012 assert
12 *_t
012 assert.h H
012 LC_A*
012 LC_B*
012 LC_C*
012 LC_D*
012 LC_E*
012 LC_F*
012 LC_G*
012 LC_H*
012 LC_I*
012 LC_J*
012 LC_K*
012 LC_L*
012 LC_M*
012 LC_N*
012 LC_O*
012 LC_P*
012 LC_Q*
012 LC_R*
012 LC_S*
012 LC_T*
012 LC_U*
012 LC_V*
012 LC_W*
012 LC_X*
012 LC_Y*
012 LC_Z*
012 NULL
12 *_t
012 locale.h H
012 HUGE_VAL
12 *_t
2 MAXFLOAT
2 M_E
2 M_LOG2E
2 M_LOG10E
2 M_LN2
2 M_LN10
2 M_PI
2 M_PI_2
2 M_PI_4
2 M_1_PI
2 M_2_PI
2 M_2_SQRTPI
2 M_SQRT2
2 M_SQRT1_2
012 math.h H
012 jmp_buf
12 sigjmp_buf
12 *_t
012 setjmp.h H
012 sig_atomic_t
012 SIG_*
012 SIGA*
012 SIGB*
012 SIGC*
012 SIGD*
012 SIGE*
012 SIGF*
012 SIGG*
012 SIGH*
012 SIGI*
012 SIGJ*
012 SIGK*
012 SIGL*
012 SIGM*
012 SIGN*
012 SIGO*
012 SIGP*
012 SIGQ*
012 SIGR*
012 SIGS*
012 SIGT*
012 SIGU*
012 SIGV*
012 SIGW*
012 SIGX*
012 SIGY*
012 SIGZ*
12 sa_*
12 SA_*
12 *_t
012 signal.h H
012 va_list
012 va_start
012 va_arg
012 va_end
12 *_t
012 stdarg.h H
012 _IOFBF
012 _IOLBF
012 _IONBF
012 BUFSIZ
012 EOF
012 FILE
012 FILENAME_MAX
012 FOPEN_MAX
012 fpos_t
012 L_tmpnam
012 NULL
012 SEEK_CUR
012 SEEK_END
012 SEEK_SET
012 size_t
012 TMP_MAX
12 L_ctermid
12 L_cuserid
12 STREAM_MAX
12 *_t
2 P_tmpdir
012 stdio.h H
012 EXIT_FAILURE
012 EXIT_SUCCESS
012 MB_CUR_MAX
012 NULL
012 RAND_MAX
012 div_t
012 ldiv_t
012 size_t
012 wchar_t
12 *_t
2 WIFSIGNALED
2 WTERMSIG
2 WUNTRACED
2 WNOHANG
2 WIFEXITED
2 WIFSTOPPED
2 WSTOPSIG
2 WEXITSTATUS
012 stdlib.h H
012 NULL
012 size_t
12 *_t
012 string.h H
012 CLOCKS_PER_SEC
012 NULL
012 tm
12 CLK_TCK
12 *_t
012 time.h H
012 CHAR_BIT
012 CHAR_MAX
012 CHAR_MIN
012 INT_MAX
012 INT_MIN
012 LONG_MAX
012 LONG_MIN
012 MB_LEN_MAX
012 SCHAR_MAX
012 SCHAR_MIN
012 SHRT_MAX
012 SHRT_MIN
012 UCHAR_MAX
012 UCHAR_MIN
012 UINT_MAX
012 ULONG_MAX
012 USHRT_MAX
12 ARG_MAX
12 CHILD_MAX
12 LINK_MAX
12 MAX_CANON
12 MAX_INPUT
12 NAME_MAX
12 NGROUPS_MAX
12 OPEN_MAX
12 PATH_MAX
12 PIPE_BUF
12 SSIZE_MAX
12 STREAM_MAX
12 TZNAME_MAX
12 *_t
12 *_MAX
2 NL_TEXTMAX
2 DBL_MIN
2 NL_MSGMAX
2 NL_ARGMAX
2 NL_NMAX
2 WORD_BIT
2 NL_LANGMAX
2 LONG_BIT
2 NZERO
2 NL_SETMAX
2 FLT_DIG
2 FLT_MIN
2 DBL_DIG
012 limits.h H
012 DBL_DIG
012 DBL_MANT_DIG
012 DBL_MAX_10_EXP
012 DBL_MAX_EXP
012 DBL_MIN_10_EXP
012 DBL_MIN_EXP
012 FLT_DIG
012 FLT_MANT_DIG
012 FLT_MAX_10_EXP
012 FLT_MAX_EXP
012 FLT_MIN_10_EXP
012 FLT_MIN_EXP
012 LDBL_DIG
012 LDBL_MANT_DIG
012 LDBL_MAX_10_EXP
012 LDBL_MAX_EXP
012 LDBL_MIN_10_EXP
012 LDBL_MIN_EXP
012 DBL_MAX
012 FLT_MAX
012 LDBL_MAX
012 DBL_EPSILON
012 DBL_MIN
012 FLT_EPSILON
012 FLT_MIN
012 LDBL_EPSILON
012 LDBL_MIN
012 FLT_ROUNDS
012 FLT_RADIX
12 *_t
012 float.h H
012 and
012 and_eq
012 bitand
012 bitor
012 compl
012 not
012 not_eq
012 or
012 or_eq
012 xor
012 xor_eq
12 *_t
012 iso646.h H
012 wctrans_t
012 wctype_t
012 WEOF
012 wint_t
12 *_t
012 wctype.h H
012 mbstate_t
012 NULL
012 size_t
012 tm
012 wchar_t
012 WCHAR_MAX
012 WCHAR_MIN
012 WEOF
012 wint_t
12 *_t
012 wchar.h H
12 DIR
12 d_*
12 *_t
12 dirent.h H
12 l_*
12 F_*
12 O_*
12 S_*
12 FD_CLOEXEC
12 SEEK_CUR
12 SEEK_END
12 SEEK_SET
2 st_atime
2 st_mtime
2 st_ctime
12 *_t
12 fcntl.h H
12 group
12 *_t
12 gr_*
12 grp.h H
12 passwd
12 pw_*
12 *_t
12 pwd.h H
12 stat
12 st_*
12 S_*
12 *_t
12 sys/stat.h H
12 clock_t
12 tms
12 tms_*
12 *_t
12 sys/times.h H
12 *_t
12 sys/types.h H
12 utsname
12 *_t
12 sys/utsname.h H
12 WEXITSTATUS
12 WIFEXITED
12 WIFSIGNALED
12 WIFSTOPPED
12 WNOHANG
12 WSTOPSIG
12 WTERMSIG
12 WUNTRACED
12 *_t
12 sys/wait.h H
12 BRKINT
12 CLOCAL
12 CREAD
12 CS5
12 CS6
12 CS7
12 CS8
12 CSIZE
12 CSTOPB
12 ECHO
12 ECHOE
12 ECHOK
12 ECHONL
12 HUPCL
12 NCCS
12 NOFLSH
12 PARENB
12 PARMRK
12 PARODD
12 TOSTOP
12 c_*
12 V*
12 I*
12 O*
12 TC*
12 B0*
12 B1*
12 B2*
12 B3*
12 B4*
12 B5*
12 B6*
12 B7*
12 B8*
12 B9*
2 FFDLY
2 CRDLY
2 BS0
2 BS1
2 FF0
2 CR0
2 FF1
2 CR1
2 CR2
2 CR3
2 XCASE
2 NL0
2 NL1
2 TABDLY
2 NLDLY
2 TAB0
2 TAB1
2 TAB2
2 TAB3
2 BSDLY
12 termios
12 *_t
12 termios.h H
12 F_OK
12 NULL
12 R_OK
12 SEEK_CUR
12 SEEK_END
12 SEEK_SET
12 STDERR_FILENO
12 STDIN_FILENO
12 STDOUT_FILENO
12 W_OK
12 X_OK
# _* is in the allowed namespace anyway.
12 *_t
12 unistd.h H
12 utimbuf
12 *_t
12 utime.h H
+39
View File
@@ -0,0 +1,39 @@
AlWuzEre 228
-1.5 -1 1 -1.5 1 1
-1.5 -1 1 -1.5 -1 -1
-1.5 -1 1 -1 -1 1
-1.5 1 1 -1 1 1
-1.5 1 1 -1.5 1 -1
-1.5 1 1 1.5 1 1
1 -1 1 1 -1 -1
1 -1 1 1 1 1
1 -1 1 1 .75 1
1 -1 -1 1 1 -1
1 -1 -1 1 .75 -1
-1 1 -1 1 1 -1
-1 1 -1 -1 .75 -1
1 1 -1 1 .75 -1
-1 1 1 1 1 1
-1 1 1 -1 .75 1
1 1 1 1 .75 1
-1 .75 -1 1 .75 -1
-1 .75 -1 -1 .75 1
1 .75 -1 1 .75 1
1 .75 1 -1 .75 1
-1.5 1 -1 -1 1 -1
-1.5 1 -1 -1.5 -1 -1
-1.5 1 -1 1.5 1 -1
-1.5 -1 -1 -1 -1 -1
1.5 1 1 1 1 1
1.5 1 1 1.5 1 -1
1.5 1 1 1.5 -1 1
1.5 1 -1 1 1 -1
1.5 1 -1 1.5 -1 -1
1.5 -1 -1 1 -1 -1
1.5 -1 -1 1.5 -1 1
1.5 -1 1 1 -1 1
-1 -1 -1 -1 1 -1
-1 -1 -1 -1 .75 -1
-1 -1 -1 -1 -1 1
-1 -1 1 -1 1 1
-1 -1 1 -1 .75 1
+39
View File
@@ -0,0 +1,39 @@
#ifndef int
#ifdef while
char s[234],d[56],*p=s,m='m';
#define int typedef (*define)();\
define O [6]={getc,putchar,(y)memmove,(y)printf,(y)n,(y)l};
#include __FILE__
signed short n(short bz){
short pb=0,Md=1,ih=2,sfp=3,sjs=4,fo,u=5,scp=6,t,gq=7,oh,r=8,pcf=9,rs=10;
char o=1,i=1,l,pc=i,b=r+o/2,_f=6,m=7,s=8,g,q,od=o*rs+4^s,js=_f/*3-m*'c',bs='g';
return 1; }
#y FILE c[a]+s,p[c],r[m]+u[i+4*o|f]-r[wob][wad]+s*f-!w|o,L+x | cut
;}int main(i,love_unix){*/;}int main(i,love_unix){/*;}int main(i,love_unix){*\;}| here */
while(FILE)for(;9-(i=0[O](f)););
for(;32-(i=0[O](f));0&& 3[O]("-->%s<--", "gxdgbtgxsxpcctvpixktedhiedcte"));
for(;'\n'-(i=O[0](f));)(i>='a'&&i<'z')?*
#include __FILE__
"Demonic Smiley" );} /* <g> */
#else
#define while(int) short c=0;int*f=fopen(__##int##__,"r");for(i=0;i<25;i _)i[d]='A'+(13+i)%26;main:
#define y define
#define _ ++
#include <stdio.h>
#include <string.h>
#include <time.h>
#include __FILE__
#endif
#elif defined(signed)
(p _)=(i-'a')[d]:!(i-'z')?*(p _)=32:(i>='A'&&i<='Z')&&((3&8|2)[O](d+1,d,24L),*(p _)=0[d]=i);/*
#y FILE t,ra|js+t*gj,at[qdd]-=K,is _,qv _,veb _,ti _,ao[mqht] _*/
if(c _<6) goto main; 5[O](
#else
#define signed short l(){char q='_';p=s+4*(time(NULL)%24)*2,m=(char)p+1;\
*(p+8)=0; for(d[3]=10,d[33]=3[d]-10;d[3]<18;3[d] _) d[3][p]=q;3[d][p]=0;\
hell: printf("\t[%s]\n",p+10);if(!m) goto stoned;\
froze: d[8]=(scanf("%c",&(2[d+__STDC__])),2[d+!NULL])&223;if(!(3[d+5]-'\n')) goto froze;\
for(m=1[d]=0;d[1]<8;2[d-1] _) (p[d[1]]-d[8]||(p[3[d-2]+10]=4[d+4]))+(p[d[1]+10]-q||m _);\
goto hell;stoned:;}
FILE *X(FILE s){ char i,iev,jmqhu,xqht,mqh,ujek,sxydw,kdj,yjb,utou,qhre,eamy,jxxe,bt;}
#endif
+144
View File
@@ -0,0 +1,144 @@
Best Data Hiding:
Daniel Fischer
VNetx.com GbR
Salenbergstrasse 11 (home address)
D 72250 Freudenstadt
German Federal Republic
Judge's Comments:
To build:
make df
To use:
./df
Everyone talks about how data hiding can produce clearer code; I am
pleased to offer this charming refutation.
The program is a simple game. A bit of observation reveals that the
game has some data - but where? It's unclear which of the contents of
the program are used.
Curiously, the program only works if its source is in the directory
it's run in. More curiously, the program will fail if the program's
name's second letter isn't "r" (the source has been changed for your
convenience and this restriction does no longer exist).
Modern design has come a long way since the unreadable, tightly-coupled
systems we used to have.
Extra credit questions:
Where are the words stored?
How many words does this entry use?
Can you add more words to the program and still make it work?
Selected Author's Comments:
This program lets you guess English words. It displays an underscore
for each letter in the word; guessing a letter that actually is in
the word replaces the corresponding underscores with the letter
itself. You can guess a letter simply by typing it in. If your C
implementation requires it, you may have to hit Return before it
is recognized. In this case, you can also type multiple guesses
on the same line (completely solve it by entering
"abcdefghijklmnopqrstuvwxyz"). Execution stops when all underscores
have been replaced.
The program offers a number of different words to guess, time() is
used to pick one at random. All words are eight characters long.
The source should compile with any ANSI C compiler (I used CodeWarrior
w/ ANSI strict). Using non-ANSI compilers that implement the ANSI
features it uses will not work (unless they defined __STDC__ 1
which they shouldn't). Due to space restrictions, I did not use
any trigraph sequences. It does not require any special -D defines.
The source passes lint without any complaint (if invoked with
>/dev/null). (My lclint is unable to recover from some parts of it.)
Actually, the code not only is compliant with the ANSI specifications,
but uses a near minimum subset of them. C keywords that were not
used have been re(de)fined to avoid unnecessary introduction of
new, unknown character patterns. The source also includes all ANSI
headers it needs (after most of the functions have been used), and
the declaration of main() follows the guidelines (but the return
type has a different meaning and the arguments are either mis- or
unused). There also may be some compiler warnings. These are not
bugs, but features. The more warnings, the better the compiler.
There wouldn't be any if I had been allowed to use some extra space
for prototypes etc.
Multiple defines are used (but not all of them define), and #define
y define is used with #y but the code doesn't assume #y to expand
to #define. I have also included comments in the code, and vital
code in the comments. And of course there is code that doesn't do
anything but will crash the program if it is removed (just like
those comments I mentioned above). Additionally, since you said
you'd be preprocessing entries ignoring includes I figured I should
use some more of them instead of other obfuscation methods. Did
I mention that preprocessed or beautified sources will crash or
hang your system? The program will also crash on non-ASCII machines.
The executable needs its source file present in the current directory
or, depending on your system, in your path. The name of the source
file is not hard-coded, __FILE__ is used instead.
In the original version which was sent in to the contest, there were
some restrictions on the file name:
The second letter had to be a lowercase 'r'.
The third letter could never be a '+' or a 'b'.
Valid names would have been "pr4.c", "pr.c", "prog.c", "brownie.c" etc.
My first private version would only run when compiled on a Friday.
I decided it would be better this way...
These restrictions have been removed for your convenience.
The following lines describe how this program works; if you don't
want to know it at this time, please skip them. If this entry would
by some mistake win the contest, please do not rot13 this - I hate
rot13'd spoilers since it is somewhat complicated on a Mac to
reverse them. Anyone out there should have enough discipline and
rot13 shouldn't be required, really. After all, we are no children
anymore :-)
This paragraph is not part of the author's comments, but is a helpful
gift from the judges; if you read too fast to stop yourself, this should
give you enough time to stop, which you really need to do RIGHT NOW if
you don't want to read the spoilers, which really do spoil everything,
we mean it.
The source file needs to be present because the words are read from
it. The wordlist is encoded within the source using a 24 entry
sliding dictionary where lowercase letters are offsets into the
dictionary, uppercase letters are new letters not yet in the
dictionary, and all other characters are ignored. The words are
spread over six lines in the source; decoding starts on a line
after a tab and a whitespace have been found, and stops on a newline.
The grin after the "Demonic Smiley" actually is one encoded letter
while the string is completely ignored; and the "cut" in "cut here"
is required while "here" is not.
"For extra credit", explain why the words are sorted alphabetically
(because I extracted them from a dictionary :-)
The file name had to fulfill the restrictions mentioned above
because __FILE__+1 was used as a second parameter to fopen(). (It
essentially was fopen(__FILE__,__FILE__+1) ). This was an extra joke
that does no longer exist in the released version.
You probably discovered that the while(FILE) in main is not a while loop
but the statement that opens the file and initializes the dictionary.
Similarly, int and signed have been redefined (to save space, of
course).
The main function (the guessing part) is between the last #else..#endif,
but still is declared before main(). The 5[O]() in main() calls
this function. Similarly, Most indexing operations have been
changed to this form; and I tried to write each such operation
different.
+18
View File
@@ -0,0 +1,18 @@
#include <stdio.h>
#define PO(o,t)\
(((o>64)&&(o<91))?(((t>96)&&(t<123))?(t-32):(t)):(((t>64)&&(t<91))?(t+32):(t)))
void main() { char *poo= "poot",
*Poo="pootpoot" ,O[9];int o,t,T,p;(t=p =0)||(*O='\0');while
((o= getc( stdin ))!=( EOF))if ((p== 0)&& (((o>64 )&& (
o<91 )) || ((o> 96 ) &&(o< 123) ))) (
t!=8 )&&(O [t]= o)&& (O[++ t] = '\0')
;else {if (t>7) {for (T = 0 ; T <=7; T++ )
printf("%c", PO(*( O+T), *(Poo+ T))); printf
("%c", o);}else if (t>3){for (T =0;T<=
3;T++) printf
("%c", PO(*(O
+T),*( poo+T)
) ) ; printf( "%c" , o ) ; } else printf ( "%s%c" , O , o ) ; ( t = 0 ) || (
* O = '\0' ) ; ( o == 60 ) && ( ++p ) ; ( o == 62 ) && (p!=0) && ( --p ) ; } }
+83
View File
@@ -0,0 +1,83 @@
Best Utility:
David Lowe
Pootpoot
67-D Manchester Street
San Francisco, CA 94110
USA
http://pootpoot.com/
Judges' Comments:
To build:
make dlowe
To use:
./dlowe < anyfile > pootfile
Why is this entry would be considered a utility? Well because it
is able to convert content-free web pages into useful web pages.
To see why, try using an online version, modified for use as
a CGI program:
http://pootpoot.com/poot/pootify?URL=http%3A%2F%2Fwww.microsoft.com
We are sure that you will find that new web page to make a much
more consistent level of quality. :-)
A CGI script such as:
#!/bin/sh
# pootify - a sample CGI pootifier
#
POOT="/usr/local/bin/dlowe"
LYNX="/usr/local/bin/lynx"
ECHO="/usr/bin/echo"
EXPR="/usr/bin/expr"
${ECHO} "Content-type: text/html"
${ECHO}
if [ -z "${QUERY_STRING}" ]; then
${ECHO} "QUERY_STRING not found"
else
URL=`${EXPR} "$QUERY_STRING" : '[Uu][Rr][Ll]=\(.*\)'`
if [ -z "${URL}" ]; then
${ECHO} "No URL given in QUERY_STRING"
elif [ X`${EXPR} "${URL}" : '[Ff][Ii][Ll][Ee]:'` != X0 ]; then
${ECHO} "file: based URLs are not allowed"
else
${LYNX} -restrictions=all -source "${URL}" | ${POOT}
fi
fi
can be used to pootify web pages.
For further information see:
http://pootpoot.com/poot/pootify?URL=http%3A%2F%2Fwww.ioccc.org
NOTE: The original entry was just a text based pootifier. To build
that version try:
make dlowe.orig
./dlowe.orig < anyfile > pootfile
Selected Author's Comments:
This program is a text filter, it reads stdin and outputs the
"corrected" text to stdout.
It is obfuscated in that the code is painful to look at and
its purpose and mode of operation are not terribly obvious.
More importantly, it is a tool for further obfuscation, in that it
can take any text and render it unintelligible.
Suggested uses: add to your MANROFFSEQ environment variable for man page
enjoyment; use it to turn the GPL into the PPL; see what happens when you
run perl4 programs after they've been run through it; "encrypt" sensitive
(but unnecessary) documents...
+18
View File
@@ -0,0 +1,18 @@
#include <stdio.h>
#define PO(o,t)\
(((o>64)&&(o<91))?(((t>96)&&(t<123))?(t-32):(t)):(((t>64)&&(t<91))?(t+32):(t)))
void main() { char *poo="poot",
*Poo="pootpoot" ,O[9],o;int t, T;(t=0)|| (*O='\0');while(
(o= getc( stdin ))!=( EOF))if (((o> 64)&&
(o< 91)) ||(( o>96 )&&(o <123 ))) (
t!=8 )&&(O [t]= o)&& (O[++ t] = '\0')
;else {if (t>7) {for (T = 0 ; T <=7; T++ )
printf("%c", PO(*( O+T), *(Poo+ T))); printf
("%c", o);}else if (t>3){for (T =0;T<=
3;T++) printf
("%c", PO(*(O
+T),*( poo+T)
) ); printf( "%c", o ) ; } else printf("%s%c", O, o); ( t =0) || (*O='\0'); } }
+67
View File
@@ -0,0 +1,67 @@
#include<curses.h>
#include<stdlib.h>
#include<unistd.h>
#define E x/Y
#define F x%Y
#define P( o , O , t ) move ( o + 3 , O + 3 ) ; addch ( t );
#define I(n) ( 2 * ( n / ( X + Y ) ) - 1 + ( ( n % ( X + Y ) - X ) < 0 ? 1 :2))
#define D(T) switch(I(p)){ case 3:P(2*(X+Y)-1-p,-2,T); break; case 2:P(Y+1,2*X\
+ Y-p -1, T); break; case 1:P(p-X, 1 +X, T); break; case 0: P( -2, p, T); }
#define R for(x=0; x<X*Y; x++){ P(F,E,(L[E][F]>84)?42:L[E][F]); } move(5+Y,2) \
; clrtoeol(); printw("score: %d", s); move(0, 0); clrtoeol() ; refresh() ;
int main(int t, char *u[]) { char c, *C="POOT", L[99
][ 99
]; int X, Y, n, x, a, b, A, B, p, s, S ; X = Y= p=
s= 0; if (t
== 3) { X=
atoi ( u[ 1])
; Y = atoi(u[2]); } if
(X <6
|| X > 98|| Y > 98 ||
Y < 6 ) { X = 15 ; Y = 12; }
initscr (); for
(x =0; x < X * Y; x++ ){
L[ E][F ]=32 ; P
(- 1, E, 45
); P( Y, E,
45 ); P (F,- 1,
124 ); P(F, X, 124); } P(
-1, -1, 43); P(
-1, X, 43) ; P(Y, -1, 43 ) ;
P(Y,X,43); c=C[random()%4];
D(c); R ; for(;
; ) { switch (x = getch ()
){ case 97 : D(
32 ); if (--
p< 0) p= (X
+Y )*2-1; break; case
115 : D(32); if (++p > (X
+Y)* 2- 1) p =0
; break ; case 100: a = ( (
n=I(p))%2)
?X +(
n/2)*( 1-
X) -1
:( 1-
n)*p+(n/2)*(2*X+Y-1); b = (n%2)?((n/2)?(2* (X
+Y )-
p-1): (p-X)) :Y+ ((2-n) /2) *(1-Y)-1; if(L [a
][ b]
!= 32
)break ; A
=( n%
2)?n-2:(n-
1)*((c%3-1)*-1); B=(n%2)?(n-2)*((c%3-1)*(-1)):(n-1)*-1; D(32); for(; ; ){ P(b,
a,32); if((!a)&&A<0)if(!B){ A=0; B=1; } else A*=-1; if((!b)&&B<0)B*=-1; if(( a
==(X-1))&&A>0)if(!B){ A=0; B=1; } else A*=-1; if(((b==(Y-1))&&B>0)||(L[a+A][b+
B]!=32))break; a+=A; b+=B; P(b,a,c); move(0,0); refresh(); usleep(5000); } ++s
; L[a][b]=c; c=C[random()%4]; p=0; f:for(S=1,x=0; x<X*Y; x++)for(A=-1; A<2; ++
A)for(B=-1; B<2; ++B)for(n=0; n<4; n++){ a=E+n*A; b=F+n*B; if((!(a<X&&b<Y&&a>=
0&&b>=0))||((L[a][b]!=C[n])&&((L[a][b]-9)!=C[n])))break; if(n==3)for(n=0; n<4;
n++,S*=2)L[E+n*A][F+n*B]+=9; } if(S>1){ R; sleep(1); s+=S; for(x=0; x<X; x++ )
do for(n=0,a=Y-1; a>=0; a--){ if(L[x][a]>84)n=1; if(n)L[x][a]=a>0?L[x][a-1]:32
; } while ( n ) ; R ; goto f ; } } D ( c ) ; R ; } }
+107
View File
@@ -0,0 +1,107 @@
Most Fun:
David Lowe Neil Mix
Pootpoot Pootpoot
67-D Manchester Street 1490 Sacramento Street #4G
San Francisco, CA 94110 San Francisco, CA 94110
USA USA
http://pootpoot.com/
Judge's Comments:
To build:
make dloweneil
To use:
./dloweneil
Read the the Author's comments below. We believe that your experience
may mirror one of our experiences:
Originally, I didn't appreciate the game. Then I actually read the
description of the controls. I started playing. I struggled.
I spelled my first "poot". I was hooked ...
Selected Author's comments:
Usage:
pootris [X size of board] [Y size of board]
Synopsis:
The object of this game is to spell "POOT" as much as possible. There
is no time pressure. You're given one letter at a time (sort of randomly
chosen from the set 'P', 'O', and 'T') and you get to move it freely
around the border of the playing board, and decide when and where to drop
it into the board. Sound easy? Of course, there's a catch...
Controls:
. Only three controls:
'a' moves the current letter one position counterclockwise around
the border of the playing field.
's' moves the current letter one position clockwise around the border
of the playing field.
'd' drops the current letter onto the board.
. To quit, send a fatal signal to the process.
Rules of motion:
. The different letters move in different directions once dropped onto
the board:
'P' moves diagonally, at a 45 degree angle and in a clockwise
direction around the board once dropped.
'O' moves in a straight line perpendicular to the border from which
it is dropped.
'T' moves diagonally, at a 45 degree angle and in a counterclockwise
direction around the board once dropped.
. The letters bounce off the top and sides of the board. They bounce
in a 'natural' way, with the exception that 'O's will fall straight
down if they hit a side wall.
. The letters stop when they hit another letter or the bottom of the
board.
Rules of spelling:
. When you spell 'POOT' on the board, in any direction, the letters
comprising the word will disappear, and any letters which may have
accumulated above the disappeared letters will 'fall'.
. Letters can be used in multiple spellings of 'POOT'.
. Chain reactions are possible.
Rules of scoring:
. You get one (1) point for each letter you drop onto the board.
. You get a bunch of points for spelling 'POOT'. More if you spell
it in more than one way simultaneously.
Some of the obfuscations:
. Several different coordinate systems are used. There's the "real" X
by Y system used for curses, the "inside the box" X by Y system used
for moving things around and finding instances of "POOT" inside the
box, and the position of the current letter, which is a single value
from 0 to 2 * xsize + 2 * ysize - 1.
. The fact that x%3 is a perfect hash function for x values 'P', 'O'
and 'T' is used.
. Of course, the code is as hideous as possible, and spells poot for
fun (It's also exactly 3217 bytes in length, with exactly 1536
counted characters for purposes of this contest.)
. Love that modulus operator! Mmmm...
. There are some equations used which are really unnecessarily ugly,
which served the dual purposes of compacting the code and making it
trickier to understand. I'm thinking of the equations used to convert
between coordinate systems when dropping pieces into the game board.
. Simple and silly ones: short, meaningless (and sometimes misleading
(see 'x')) variable names; hard-coded ASCII numeric values used for
character constants; using goto for fun and profit; reusing and
re-purposing variables in different places.
. The game itself is simple, but still weird and quite difficult.
Some things I wish I could have fit into this, but didn't have the space:
. Seeding the random number generator (doh!)
. Something to detect when the game is over.
. Some kind of scoreboard.
. Sound.
. Some way of quitting gracefully.
Good Luck!
+18
View File
@@ -0,0 +1,18 @@
#include<stdio.h>
#include<string.h>
main()
{
char*O,l[999]="'`acgo\177~|xp .-\0R^8)NJ6%K4O+A2M(*0ID57$3G1FBL";
while(O=fgets(l+45,954,stdin)){
*l=O[strlen(O)[O-1]=0,strspn(O,l+11)];
while(*O)switch((*l&&isalnum(*O))-!*l){
case-1:{char*I=(O+=strspn(O,l+12)+1)-2,O=34;
while(*I&3&&(O=(O-16<<1)+*I---'-')<80);
putchar(O&93?*I&8||!(I=memchr(l,O,44))?'?':I-l+47:32);
break;
case 1: ;}*l=(*O&31)[l-15+(*O>61)*32];
while(putchar(45+*l%2),(*l=*l+32>>1)>35);
case 0: putchar((++O,32));}
putchar(10);}
}
+95
View File
@@ -0,0 +1,95 @@
Obsolescent Feature:
Frans van Dorsselaer
Bakker Industrial Automation
Kaiserstraat 35
NL-2311 GP Leiden
The Netherlands
Judges' comments:
To build:
make dorssel
To use:
echo Simple as 123 | ./dorssel
echo '.... --- .-- -.. --- . ... .. - -.. --- - .... .- -'|./dorssel
How does the program decide which way to convert?
What obsolescent feature are we talking about? (No, it's not a
C language feature.)
The author suggests that you try to answer the following questions:
- Which character in the initializing string is totally irrelevant?
- Which two relevant characters in the initializing string may be
exchanged without altering the behavior?
- Which characters in the initializing string are somewhat irrelevant,
and to what values may they be changed without altering the behavior?
- Which characters may be used to enlarge the initializing string by
one without altering the behavior ?
Extra credit: Change the program so that it does not SHOUT IN ALL CAPS.
You might also want to read the dorssel.hint2 file.
Selected author's notes:
Usage
=====
This program converts ASCII to Morse code, and vice versa.
The program reads in lines from standard input and writes its result to
standard output. The direction of conversion is determined on a per
line basis. Each line must consist of a maximum of 952 characters
followed by a new line character, they must not contain any NUL
characters. Otherwise, some characters may be lost in the conversion.
- Encoding to Morse code:
The program knows the Morse codes for all Latin letters (a-z, case
insensitive) and decimal digits (0-9). Any other characters are
replaced by an ASCII space ' '. Morse code per converted character is
written as a sequence of '.' and '-' characters, each sequence
followed by a space.
- Decoding from Morse code:
Morse code should be typed as sequences of '.' and '-' characters,
separated by a space. Extra spaces will be echoed back (to separate
words). Unknown sequences will be converted to a '?' character.
Notes
=====
The program assumes both source and execution character sets to be
ASCII. As far as I can tell, the program is conforming and does not
invoke undefined behavior.
Hints
=====
- Try
./dorssel < dorssel.c | ./dorssel
to see what variables, numbers, and functions are used. (Does a
better job than most C beautifiers).
- Filter your text twice (as in the previous sample) to obtain a version
of your text that can be reversibly morsified, i.e.
./dorssel | ./dorssel | ./dorssel | ./dorssel
is the same as
./dorssel | ./dorssel
- The file "dorssel.hint2" contains all the information needed to
understand this program. For an obfuscated spoiler, try
./dorssel < dorssel.hint2
+184
View File
@@ -0,0 +1,184 @@
Morse codes for letters and digits use sequences of 1 to 5 (inclusive)
Morse symbols (denoted as '.' or '-'), e.g.
E .
Z --..
3 ...--
(BTW: digits always have 5 symbols, letters 1 to 4. I didn't use this fact)
Of course we can encode these symbols with bits in a byte. I chose '-'
to be a bit set to 0, '.' to be a bit set to 1. Characters in C are at
least 8 bits, but they are either signed or unsigned. To be portable,
I've used only values from 0 to 127 (inclusive) (both in the encoding
of Morse codes, as well as in subexpressions in the program). Hence we
can use type char (using unsigned char for an extra bit would have made
the source code excessively large ;-)
The least significant bit contains the first symbol of a Morse code, so
we have
E > 0......1
Z > 0...1100
3 > 0..00111
The dots have still to be determined. But we also need to encode the
length of the sequence. Since there are only 4 different kind of lengths,
two bits would suffice, e.g.
E > 000....1
Z > 010.1100
3 > 01100111
That means bits 6 and 5 set to 00 is length 1, set to 01 is length 2, etc.
But this would mean that we would have to extract the length into a
counter before shifting out each symbol, such as
length = (encoding & 96) >> 5;
do {
putchar(encoding & 1 ? '-' : '.');
encoding >>= 1;
} while (length--);
We can also use the remaining bits to *include* the counter
length 1: 00000.1x E > 00000.11
length 2: 0000.1xx
length 3: 000.1xxx
length 4: 00.1xxxx Z > 00.11100
length 5: 0.1xxxxx 3 > 0.100111
With 1 bit still to be chosen freely (let's assume it is 0). Now we can do
do {
putchar(encoding & 1 ? '-' : '.');
encoding >>= 1;
while (encoding > 1);
As you see, the encoded Morse sequence can be the counter itself. But
this is not very pleasant, as some Morse sequences will end up having
an ASCII value < 32, i.e. they will be control codes. This would make
the initializing (encoding) string awkward. Hence I came up with the
following
length 1: 0010010x E > 00100101 (= '%')
length 2: 001010xx
length 3: 00110xxx
length 4: 0100xxxx Z > 01001100 (= 'L')
length 5: 011xxxxx 3 > 01100111 (= 'g')
Notice these encodings in the initialization string. Only the coding for
'5' needs an escape (5 = ..... > 01111111 = '\177'). The way the length
is encoded still allows the encoding to be its own counter:
do {
putchar(encoding & 1 ? '-' : '.');
encoding = (encoding + 32) >> 1;
} while (encoding > 35);
The last shift will always result in 00100010, hence the test for >35.
Note that the calculation for the next value of `encoding' is done at int
precision, so that the actual value of the char remains <= 127.
The character '-' (ASCII 45) and '.' (ASCII 46) are conveniently in
sequence, so the putchar can simply be
putchar(45 + encoding % 2);
I used the modulo operator this time, because '+' takes precedence over '&'.
The assignment can be incorporated into the while control test, and a
do-while loop with a body of a single expression statement can be written
as a while loop with a comma operator in the test:
while(putchar(45 + encoding % 2), encoding = encoding + 32 >> 1);
Voila.
Now, the decoding of Morse codes is just the reverse. We shift in 0's
and 1's as we scan the line. But: we have to scan from back to front
(the left most Morse symbol is in the least significant bit, and thus
has to shifted in last). The test for the scanning while loop must
stop when there are no more '.' or '-' on the left. Hence we need a
terminating character in front of the line. The input line is read one
past the encoding string (into the same character array) the terminating
character for the reverse scan is therefore provided by the implicit '\0'
of the array initializer ! The test also stops when at most 5 symbols
have been shifted in.
The encoded character is then looked up in the encoding string with
memchr (why memchr is explained later). Either a '?' (when there are
more than 5 consecutive Morse symbols, or if the sequence is unknown)
or the decoded character is printed. Or a ' ' if there was an extra
space in the source line. Note the use of "or" in these last sentences,
as they explain the use of the conditional operator.
The strspn calls need either " .-" or ".-" as argument. Of course they
are overlapped. I put these strings between the encodings for digits
and letters. This is OK, since neither of these characters, or the '\0',
is a valid encoding ! We must, however, use memchr instead of strchr in
the decoding lookup because of this '\0'. Since it is far more obscure
this way, I hope you'll forgive me.
The outline of the program is roughly as follows
while (more lines) {
if (line is in morse) {
while (more characters) {
skip next sequence
if (' ')
putchar(' ');
else
decode_sequence; /* backwards */
}
} else {
while (more characters) {
if (isalnum)
encode_character;
putchar(' ');
}
}
Because of the *two* while(more characters) loops are the same, I've
exchanged the if(line is in morse) and the two while loops (so there
is *single* while loop). However, we must now store the if(line is in
morse) test for efficiency (it would be stupid to test the entire line
for every character). This is done in l[0] ! (the first encoding is
thus in l[1]). The memchr decoding lookup is not disturbed, because the
test is always 0 for Morse lines, and '\0' is not a possible encoding.
l[0] is also used as the temporary shift character while encoding a
line of text. This does not disturb the if (line is in morse) test,
as the temporary l[0] will remain != 0.
I've put the if's in the above layout into a single switch. Hope you don't
mind ;-)
Summary of the use of l[999]:
l[0] result of "is this line in morse" test
l[0] temporary shift during encoding
l[0] - l[33] Morse codings (letters and digits, plus garbage)
l[11] - l[14] strspn argument
l[12] - l[14] strspn argument
l[34] terminator for backward decoding
l[35] - l[998] input line
*****
Selected notes:
- We don't need to declare isalnum() (or include ctype.h) as its implicit
declaration is correct (int argument, int result). This is not so for
strlen(), strspn(), and memchr() as they use size_t.
- During development, my gcc 2.7.2.3 had an internal compiler error (signal
6) on code that was correct !
- lclint 2.4b thinks that "the observer is modified" a couple of times,
whereas it is not. Well, it is, but there is a sequence point in between.
- lclint 2.4b parses line 13 as <error>, whereas it is correct code.
- lclint 2.4b is positive the second while loop is infinite, whereas it is
not.
*****
.. - .... .. -. -.- - .... .. ... ... .--. --- .. .-.. . .-. .. ... -- --- .-. . --- -... ..-. ..- ... -.-. .- - . -.. - .... .- -. - .... . .--. .-. --- --. .-. .- --
. -..- . .-. -.-. .. ... .
-.-. .... .- -. --. . - .... . .--. .-. --- --. .-. .- -- ... --- .. - -.. --- . ... -. --- - ... .... --- ..- -
+120
View File
@@ -0,0 +1,120 @@
#include <stdlib.h>
#include <stdio.h>
#define l #define
#define p(p) l p b ( m p u X )
l i int
l n struct n
l x ){ return (
l A ->
l N n*
n { i c ; N L ; N R ; N U ; N ( * F ) ( N ) ; } ;
l F A F
l U A U
l R A R
l L A L
l m q = malloc(sizeof * q ) Z F =
l e z F ( p ) ) ; }
l f e N
l g z L Q s f
l h ( N p x
l H h p L U Q
l s R z R = q
l t ) ? p : (
l z , p
l Z , q
l Q = p
l w ! p U t p U L Q z Q U ,
l D W p R U = 0 z R Q R F ( p R ) z R F != E t
l W h w
l X z = q , 0
l V w p F = v z L Q
l O m o Z L Q
l M m E Z A c =
l r Z R Q
l u Z U Q
l a ) ) ) ? 0 : j ( !
l k ( i c x
l y 0 ) ; } i
N q ; N
o H z Q L f
v H U z Q L f
K W V L R f
J W V R f
I h V R f
#if 0
Y W q Q g
#endif
S W w w O L L R r s , O L R r R R g
E D p F Q L A c - p R A c ? J : K f
P D w putchar ( p L R A c ) , m I g
G W M getchar ( ) g
p ;
i j k c ? O U r u U U X : y b k y d k y
l d(d) ( ( d a b
l b(b) ( ( b a d
l E(E) b ( M E u X )
main k i ) ! (
p (I)
p (J)
p (K)
#if 0
p (Y)
#endif
p (P)
p (G)
p (S)
l B b (S (K S) K)
l SS b (B (B S) B)
l C b (SS B S (K K))
l CC b (B (B C) B)
l BB b (CC B (B B B) B)
l Y b (S (C B (S I I)) (C B (S I I)))
l CI b (C I)
l ef E(EOF)
l sp E(' ')
l ob E('(')
l cb E(')')
l lm E('\\')
l nl E('\n')
l ht E('\t')
l qs E('S')
l qk E('K')
l qi E('I')
l pair b (BB (B (B K)) C CI)
l atom b (B K CI)
l bind b (CC B B C)
l ore b (SS (CI K))
l gns b (Y (B (bind G) (CC S (C (ore sp (ore nl ht))) CI)))
l pr b (Y (CC C (BB CI (B (BB (bind (P ob)) K)) (SS C (CC C (BB BB bind) K) (C (CC bind) (K (P cb))))) P))
l trans b (Y (B (bind gns) (S (BB S (C lm) lam) (C (BB S (C ob) brac) (S (C cb (CI (atom sp))) (S (C ef (CI (atom sp))) (B CI atom)))))))
l brac b (S bind (B Y (C (BB B B bind) (S (BB S (BB S (S I)) (CC (BB (B K)) (BB K) pair)) (CC S (CC BB (BB C (C (CI sp)) CI)) pair)))))
l lam b (B (bind gns) (C (CC BB bind (B CI)) abs))
l abs b (Y (C (BB S (BB C CI) (SS S (BB C (BB B opt)) I)) (CC S (C C (atom qi)) (B (pair (atom qk)) atom))))
l make b (B pair (pair (atom qs)))
l opt b (S (S I (S (BB (CC B) CI (BB K K make)) (S (BB C (BB C (C (CI qk))) (SS (SS S) (S (BB (BB (S I)) S (BB (BB (CC B) CI) (BB K K) make)) (B (CC B (BB (CC C) (BB (C (CI qk)) (pair (atom qk))) pair)) make)) (B (C (BB B C (C (CI qi)))) make))) make))) (B K make))
(bind (bind trans pr) (P nl) I)
e
+388
View File
@@ -0,0 +1,388 @@
Most Obfuscated Translator:
Tony Finch
Demon Internet
322 Regent's Park Road
Finchley
London N3 2QQ
United Kingdom
http://www.inch.demon.co.uk/
Judges' comments:
To build:
make fanf
Some systems may have problems building this entry because
of the system resources can require.
To use:
Enter an expression on standard input. Here are some
sample expressions that you can use:
((\a(\b(\c(d)))) e)
(\f\g\x
(
(g x) (f x)
) K K z
)
(\f(\f\g\x( (f((\a(g(b))) e)) (g x) ) K K z))
(Y\f\n
((= n 0)
1
(* n (f (- n 1)))
)
)
This program translares lambda expressions into combinator
expressions. But you do not need to know Lambda Calculus to be
impressed by this program!
See the file:
fanf.lambda
for more examples of lambda calculus source.
Notice how large the code grows from the fanf.c into the final
fanftmp2.c C program. Take a look at that final C program again,
can you begin to understand what it is doing?
Look at the first stage of the C pre-processing:
gcc -ansi fanf.c -E > fanftmp1.c
Skip to the bottom of fanftmp1.c (after all of the #include header
stuff ... look for a line of the form: # 2 "fanf.c" near the bottom)
and look at the resulting code. This code, when C pre-processed
will expand into over 342 times the original code (ignoring #include
headers) to produce fanftmp2.c. That program in turn, when compiled
translates a single lambda expression on standard input into
combinator expressions on standard output.
Extra credit question:
What do you have to do to make this program work with an
old non-ANSI C preprocessor?
Selected Author's comments:
My program is a demonstration of some practical applications of
theoretical computer science. The application it implements is a program
for translating lambda expressions into combinator expressions.
What the program does
=====================
The syntax of lambda expressions recognised by the program is as
follows: The basic atoms are variables which are single characters other
than backslash or parentheses, e.g. `a' or `b' or `@'. Variables are
combined by function application which is written e.g. `(f a)' which is
the function `f' applied to the argument `a'. Application groups to the
left, so `(f a b c)' is equivalent to `(((f a) b) c)'. Functions are
created from lambda terms which are written in the form `\a(expr)' which
is the function taking argument `a' and having value `expr'. Lambda is
spelt `\' because ASCII isn't good enough. Lambda binds tightly, so
`\a\bcd' is equivalent to `((\a(\b(c))) d)'. Whitespace is ignored.
For example, the identity function, called `I', is written `\x(x)'. A
simple expression is `(I a)' which is equivalent to `(\x(x) a)', which
has the value `a'. Another function called `K' is defined as `\x\y(x)'
and it evaluates as follows:
K p q
-> \x\y(x) p q
-> \y(p) q
-> p
Another function of interest is `S', defined as `\f\g\x((f x) (g x))'.
My program demonstrates the fact that any lambda expression can be
translated into an equivalent "combinator expression" which involves
only `S', `K', `I' (the combinators), and application, with no
variables or lambda abstractions. In fact, even `I' is unnecessary,
since it is equivalent to `S K K':
I z
-> \a(a) z
-> z
S K K z
-> \f\g\x((f x) (g x)) K K z
-> (K z) (K z)
-> \x\y(x) z (K z)
-> z
The algorithm for translating lambda expressions into combinator
expressions works as follows. There are three forms of lambda expression
to consider: variables, applications, and abstractions.
trans `v' -> `v' (variable)
trans `a b' -> (trans `a') (trans `b') (application)
trans `\ab' -> abs a (trans `b') (abstraction)
There are a further three cases to consider for the body of lambda
expressions, where we need to do the magic that transforms away the
variables.
abs a `f x' -> `S' (abs a `f') (abs a `x')
abs a `b' -> `K b' (b != a)
abs a `a' -> `I'
E.g. suppose we had combinator expressions for `+' and `3' and we wanted
to see what the combinator expression for doubling 3 looked like:
trans `\x(+ x x) 3'
-> (trans `\x(+ x x)') (trans `3')
-> (abs x (trans `+ x x')) `3'
-> (abs x `+ x x') `3'
-> `S' (abs x `+ x') (abs x `x') `3'
-> `S' (`S' (abs x `+') (abs x `x')) `I' `3'
-> `S' (`S' (`K +') `I') `I' `3'
-> `S (S (K +) I) I 3'
We can then check that this evaluates to the expected result:
S (S (K +) I) I 3
-> S (K +) I 3 (I 3)
-> K + 3 (I 3) (I 3)
-> + (I 3) (I 3)
-> + 3 3
It is possible to perform a slightly more compact translation with a
couple of simple optimisations. For example, note that `K (a b)' is the
same as `S (K a) (K b)', because
K (a b) x
-> a b
and
S (K a) (K b) x
-> K a x (K b x)
-> a b
Also, `S (K a) I' is the same as just `a' because
S (K a) I x
-> K a x (I x)
-> a x
The program simply reads a lambda expression from the standard input,
translates it into a combinator expression using the transformation and
optimisations described above, and prints out the result.
Why this is a practical application
===================================
Combinator expressions are easier to evaluate than lambda expressions
because there are no problems with variables. For example, if I naively
evaluated the expression `\x\y(x y) y' I might get `\y(y y)' which is
not the same as the correct result because the first `y' in the body
should refer to a global `y' rather than the local one. David Turner was
the first person to realise that because of this fact, SK combinators
provide a simple way to implement non-strict functional programming
languages, either in software or directly in hardware.
My program demonstrates this by being based on a combinator evaluation
engine which is used to implement a language called "OFL" (pronounced
like "offal" and short for "Obfuscated Functional Language"). I then
used OFL to implement all the high-level functionality described above.
This contributes a lot to the obfuscation because even small amounts of
OFL are quite unpalatable, and large expressions are completely
incomprehensible.
It is fairly well known that the lambda calculus (and hence SK
combinators) can compute anything, but mere computation is no use if you
cannot communicate with the world. This is why OFL includes a few
concessions to reality: a combinator `E' for representing characters and
testing them for equality, two IO combinators, `G' and `P', for reading
and writing characters respectively, and a combinator `J' for
representing "false". I also implemented the `Y' combinator directly
rather than in terms of the primitive combinators, since it only
required five characters to do so (viz. `Y W q Q g'). However this code
is not enabled because the definition of Y in terms of other combinators
is more cute.
The `E' combinator comes in a large number of forms, one for each
character and one for end of file. It is written `E(c)' for the variant
of `E' corresponding to the character `c'. An expression of the form
`E(c) x' is evaluated by first evaluating `x'. If `x' doesn't evaluate
to some form of `E', then evaluation of the expression terminates. If
`x' evaluates to `E(c)', then the expression evaluates to `K'. If `x'
evaluates to `E(d)' (where `d' is a different character to `c'), then
the expression evaluates to `J'.
`K' and `J' are used to represent "true" and "false" respectively; they
correspond exactly to the standard lambda calculus representations of
true and false, viz. `\t\f(t)' and `\t\f(f)' respectively. In this way a
conditional expression can just be written `cond then else', which is
even more terse than C's `cond ? then : else'. An expression that
compares a character with `a', say, can be written in the rather
obfuscated form `E('a') char then else'.
The `P' combinator, like the `E' combinator, starts off by evaluating
its first argument and checking that it is some form of `E'. It then
writes that character on stdout, and finally it calls its second
argument as a function with the argument `I', i.e.
P x f -> f I
with a side-effect.
The `G' combinator just reads a character from stdin then calls its
argument as a function with the appropriate `E' combinator as an
argument, i.e.
G f -> f E(c)
with a side-effect.
One of the problems with non-strict languages is that it is hard to
predict in advance in which order side-effects will occur. In my program
I used a monadic IO structure like that used by the programming language
Haskell; this allows one to write programs that manipulate external
state in a manner remarkably similar to imperative programming languages
like C. An examination of my program should provide an illustration of
how well this technique works in practice. (In particular, I used the
CPS form of the IO monad from page 6 of "Imperative Functional
Programming".)
The `Y' combinator is used for implementing recursive functions. It has
the evaluation rule
Y f -> f (Y f)
so that it can be used to call a function with itself as an argument.
For example, if I had the appropriate arithmetic operators defined, I
could write a factorial function in the lambda calculus like this:
Y \f\n((= n 0) 1 (* n (f (- n 1))))
OFL provides a facility for naming expressions so that they can be used
more than once without writing them in full. A definition must be written
on one line in the form `l name b expression' where `l' is short for
"let" and `b' is short for "be". Names must be more than one character
long. A complete OFL program starts off by defining the primitives it
will use with likes of the form `p (S)' etc., then goes on to define the
names it will use, and finishes off with the main expression followed by
a single `e' short for "end". OFL expressions must use the minimum
number of brackets needed to be unambiguous, except that the whole
expression must be surrounded by brackets.
OFL has a standard library which adds another five combinators to the
basic eight. These combinators provide greater scope for optimisation
when translating an expression from the lambda calculus to combinators,
and therefore more compact programs. Their evaluation rules are:
B f g x -> f (g x)
C f g x -> (f x) g
BB c f g x -> c (f (g x))
CC c f g x -> c (f x) g
SS c f g x -> c (f x) (g x)
I used them to help fit my program into the required space; unfortunately
I couldn't fit the version that fully optimises the lambda expressions
it reads into the required space. The complete optimisation rules
including the ones it doesn't use are:
S (K p) I -> p
S (K p) (K r) -> K ( p r )
S (K p) (B r s) -> BB p r s
S (K p) r -> B p r
S (B p q) (K r) -> CC p q r
S p (K r) -> C p r
S (B p q) r -> SS p q r
S p r -> S p r
The implementation of OFL
=========================
Although OFL has completely different syntax and semantics to C, all you
need to compile OFL programs is a C compiler and a header file (which in
my entry to the competition has been included in-line). The header file
implements a two-pass optimising compiler which produces a representation
of the program that is then interpreted.
The first pass of the compiler is implemented via the C preprocessor. It
implements one optimisation, namely function in-lining. Unfortunately,
this optimisation always increases object code size and execution time.
The opposite optimisation, common sub-expression elimination, (which
would offer improvements in code size and execution time) has not been
implemented. The output of this pass is a C program that may be compiled
by a normal C compiler.
The second pass is performed by the initialisation phase of the C
program. It builds a data structure representing the abstract syntax
tree of the program.
The program is then executed by an interpreter. This operates by
performing manipulations on the AST that correspond to the evaluation
rules of the combinators that I described above.
The first 54 lines of the program are mostly the interpreter; the next 8
lines are pass one of the compiler; the next nine declare the OFL
primitives; the next five define the OFL standard library; and the rest
implement the application described in the first part of this document.
This part of the program is transformed into the second pass of the
compiler by the first pass of the compiler.
The first pass of the compiler relies on some magic macros that expand
in a mutually-overlapping and almost recursive way in order to
perpetrate a complete change of syntax. Interestingly enough, if I
hadn't used the same identifier for more than one thing in various
places in the program this transformation would work with old-style cpp
as well and ANSI cpp. It expands the program from about 2.2KB to about
740KB. The resulting code does some tricky stuff to build a data
structure of the same form as the code itself.
The interpreter is written in fairly straightforward C, although it is
highly compressed. The C itself is written in a fairly functional style,
in that every function consists of a single expression. In the tradition
of functional programming languages it assumes that memory is infinite
and so never frees anything. It also assumes that the C compiler
implements the tail recursion optimisation, which is probably not true.
References
==========
I used these references in the course of writing this program and they
explain some of the ideas behind it in more detail. Arthur Norman (one
of the authors of the first paper) did a lot to enthuse me about this
topic.
Clarke, T. J. W., et al., 1980. SKIM - the S, K, I Reduction Machine.
Proceedings of the 1980 ACM LISP Conference, pp. 128-135.
Curry, H. B. and Feys, R., 1958. Combinatory Logic, Vol. 1.
North-Holland.
Gordon, M. J. C., 1988. Programming Language Theory and its
Implementation. Prentice-Hall.
Peterson, J, et al., 1997. Report on the Programming Language Haskell,
version 1.4.
Peyton Jones, S. L., 1987. The implementation of Functional
Programming Languages, Chapters 2, 11, 12, 16. Prentice-Hall.
Peyton Jones, S. L., and Wadler, P., 1992. Imperative Functional
Programming. Proceedings of the ACM Symposium on the Principles of
Programming Languages 1993, pp. 71-84.
Turner, D. A., 1979. A new implementation technique for applicative
languages. Software- Practice and Experience. Vol. 9, pp. 31-49.
Turner, D. A., 1979. Another algorithm for bracket abstraction. Journal
of Symbolic Logic. Vol. 44, no. 2, pp. 67-270.
Wadler, P., 1990. Comprehending Monads. Proceedings of the ACM
conference on Lisp and Functional Programming, 1990.
Wadler, P., 1995. How to Declare an Imperative. Proceedings of the ACM
International Logic Programming Symposium, 1995.
+262
View File
@@ -0,0 +1,262 @@
-----------------------------------------------------------------------------
--
-- This file contains the original source code for my entry, which was
-- written in the lambda calculus using a slightly extended syntax
-- compared to that accepted by my entry (in particular, it has
-- multi-character identifiers and uses ` instead of \ because that's
-- easier to enter inside a Haskell string). It also contains the Haskell
-- code I used to translate the lambda calculus into combinators using
-- the fully optimising algorithm described in the .hint file.
--
-- Tony Finch <dot@dotat.at>
--
-----------------------------------------------------------------------------
--
-- Source code for my entry
--
unit = `val`k(k val)
= CI
bind = `op`fop`k(op `res(fop res k))
= (CC B B C)
revacc = Y `f(`acc`list(list `nil(acc)
`head`tail(f tail (pair head acc))))
rev = revacc I
fold = `atomf`pairf(Y `rec(`list(list atomf (pairf rec))))
= (B (B Y) (BB B C CI))
pair = `x`y`f`g( f x y )
atom = `a`f`g( g a )
ore = `a`b`c(a c K (b c)) = (SS (CI K))
gns = Y `f(bind G `c(ore sp (ore nl ht) c f (C I c)))
pr = Y `f`e(e `x`y(bind (P ob) `i(bind (f x) `i(bind (f y) `i(P cb))))
`a(P a))
trans = Y `f(bind gns `c( lm c (lambda f)
ob c (brac f)
cb c (unit (atom sp))
ef c (unit (atom sp))
(unit (atom c)) ))
brac = `f(bind f (Y `l`ea(bind f `eb(eb `x`y(l (pair ea eb))
`a(a sp (unit ea)
(l (pair ea eb)))))))
lam = `f(bind gns `v(bind f `e(unit (abstract v e))))
abs = Y `r`v`e(e `x`y(optimise (r v x) (r v y))
`a(a v (atom i)
(pair (atom k) (atom a)) ))
make = `x`y(pair (pair (atom s) x) y)
unopt = `a`b(pair (pair (atom s) a) b)
opt = `x(x `xx`xy(xx `xxx`xxy(make x)
`xxa(xxa k `y(y `yx`yy(yx `yxx`yxy(make x y)
`yxa(yxa k (pair (atom k) (pair xy yy))
(make x y)))
`ya(ya i xy (make x y)))
(make x)))
`xa(make x))
(Y `f(bind (bind trans pr) `i(f i)) I)
-----------------------------------------------------------------------------
--
-- Haskell lambda and combinator utilities
--
infixl 9 :@:
data Expr = Expr :@: Expr | Lambda String Expr | Var String
| Y | I | J | K | S | C | B | SS | CC | BB
| P | G | E Int
deriving (Eq, Read, Show)
data EType = EFun | EArg | ELam deriving Eq
isGraph c = c >= '!' && c <= '~'
isToken c = isAlphanum c || '_' == c
disp e = display ELam e ""
exec e = do e' <- execute (compile (fst (parse e)))
putStr (disp e')
comp = disp . compile . fst . parse
simp = disp . simplify . fst . parse
-- turn String into Expr
parse (a : as) | isSpace a = parse as
| a == '`' = let (var, bs) = span isToken (dropWhile isSpace as)
(expr, cs) = parse bs
in (Lambda var expr, cs)
| a == '(' = let (left, bs) = parse as
fun left (c : cs) | isSpace c = fun left cs
| c == ')' = (left, cs)
| otherwise = let (right, ds) = parse (c:cs)
in fun (left :@: right) ds
in fun left bs
| a == '\'' = case as of
c:cs -> (E (ord c), cs)
[] -> (E (-1), [])
| isDigit a = let (bs, cs) = span isDigit as
n = read (a:bs)
in (E n, cs)
| a == '-' = let (bs, cs) = span isDigit as
n = read (if bs == "" then "1" else bs)
in (E (-n), cs)
| isToken a = let (bs, cs) = span isToken as
in (case a:bs of
"Y" -> Y; "I" -> I; "J" -> J; "K" -> K; "S" -> S; "C" -> C; "B" -> B
"SS" -> SS; "CC" -> CC; "BB" -> BB; "P" -> P; "G" -> G; x -> Var x
, cs)
-- pretty printer
display t (Lambda v e) = showChar '`' . showString v . display ELam e
display t (a :@: b) = showParen (t /= EFun) (display EFun a . showChar ' ' . display EArg b)
display t (Var v) = showParen (t == ELam) (showString v)
display t (E n) = let c = chr n in if isGraph c then showChar '\'' . showChar c else shows n
display t e = showParen (t == ELam) (shows e)
-- translate into optimised combinators
compile (a :@: b) = compile a :@: compile b
compile (Lambda var e) = abstract var (compile e)
compile e = e
abstract v (a :@: b) = optimise (abstract v a) (abstract v b)
abstract v e | e == Var v = I
| otherwise = K :@: e
optimise (K :@: p) I = p
optimise (K :@: p) (K :@: r) = K :@: ( p :@: r )
optimise (K :@: p) (B :@: r :@: s) = BB :@: p :@: r :@: s
optimise (K :@: p) r = B :@: p :@: r
optimise (B :@: p :@: q) (K :@: r) = CC :@: p :@: q :@: r
optimise p (K :@: r) = C :@: p :@: r
optimise (B :@: p :@: q) r = SS :@: p :@: q :@: r
optimise p r = S :@: p :@: r
-- do combinator reduction
execute ( Y :@: f) = let g = f :@: g in execute g
execute ( I :@: f ) = execute f
execute ( J :@: f :@: g) = execute g
execute ( K :@: f :@: g ) = execute f
execute ( S :@: f :@: g :@: x) = execute ((f :@: x) :@: (g :@: x))
execute ( C :@: f :@: g :@: x ) = execute ((f :@: x) :@: g)
execute ( B :@: f :@: g :@: x ) = execute (f :@: (g :@: x))
execute (SS :@: c :@: f :@: g :@: x) = execute (c :@: (f :@: x) :@: (g :@: x))
execute (CC :@: c :@: f :@: g :@: x ) = execute (c :@: (f :@: x) :@: g)
execute (BB :@: c :@: f :@: g :@: x ) = execute (c :@: (f :@: (g :@: x)))
execute (G :@: f) = do c <- getChar
execute (f :@: E (ord c))
execute (P :@: f :@: g) = do f' <- execute f
case f' of
E n -> do putChar (chr n)
execute (I :@: g)
_ -> return (f' :@: g)
execute (E n :@: f) = do f' <- execute f
case f' of
E m -> if n == m then return K else return J
_ -> return (E n :@: f')
execute (f :@: g) = do f' <- execute f
if f' == f then return (f' :@: g)
else execute (f' :@: g)
execute e = return e
-- translate into lambda calculus and do beta reduction
simplify I = fst (parse " `f f ")
simplify J = fst (parse " `f`g g ")
simplify K = fst (parse " `f`g f ")
simplify S = fst (parse " `f`g`x ((f x) (g x)) ")
simplify C = fst (parse " `f`g`x ((f x) g) ")
simplify B = fst (parse " `f`g`x (f (g x)) ")
simplify CC = fst (parse " `c`f`g`x (c (f x) g) ")
simplify SS = fst (parse " `c`f`g`x (c (f x) (g x)) ")
simplify BB = fst (parse " `c`f`g`x (c (f (g x))) ")
simplify (Lambda v b) = Lambda v (simplify b)
simplify (Lambda v b :@: a) = simplify (substitute v a b)
simplify (a :@: b) = let a' = simplify a
b' = simplify b
in if a' == a then (a' :@: b')
else simplify (a' :@: b')
simplify x = x
-- replace instances of variable v in body b with argument a, avoiding variable capture
substitute v a b = let wf b = newvar (merge (vars a) (vars b))
subst (Var v') | v == v' = a
| otherwise = Var v'
subst (Lambda v' b) | v == v' = Lambda v' b
| otherwise = let w = wf b in Lambda w (subst (substitute v' (Var w) b))
subst (b :@: c) = (subst b) :@: (subst c)
subst x = x
in subst b
-- return a variable not in vs (which is sorted)
newvar vs = let x `isin` [] = False
x `isin` (y:ys) | x < y = False
| x == y = True
| otherwise = x `isin` ys
try v = if v `isin` vs then try (next v) else v
next (v:vs) = if v < 'z' then (succ v):vs else 'a':(next vs)
next [] = "a"
in try "a"
-- get (sorted, unrepetitive) list of variables in an Expr
vars (Lambda v b) = merge [v] (vars b)
vars (a :@: b) = merge (vars a) (vars b)
vars (Var v) = [v]
vars _ = []
-- combine two sorted lists, omitting duplicates
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) | x < y = x : merge (xs) (y:ys)
| x == y = x : merge (xs) (ys)
| otherwise = y : merge (x:xs) (ys)
+802
View File
@@ -0,0 +1,802 @@
14th International Obfuscated C Code Contest Guidelines, Hints and Comments |
Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and |
Peter Seebach, 1998. |
All Rights Reserved. Permission for personal, education or non-profit use is |
granted provided this this copyright and notice are included in its entirety |
and remains unaltered. All other uses must receive prior permission in |
writing from the contest judges. |
ABOUT THIS FILE:
This file is intended to help people who wish to submit entries to
the International Obfuscated C Code Contest (IOCCC for short).
This is not the IOCCC rules, though it does contain comments about
them. The guidelines should be viewed as hints and suggestions.
Entries that violate the guidelines but remain within the rules are
allowed. Even so, you are safer if you remain within the guidelines.
You should read the current IOCCC rules, prior to submitting entries.
The rules are typically sent out with these guidelines.
Changes from the 1996 rules are denoted by change bars. ---> |
Not every change is marked in this file is marked, but
most are. :-)
WHAT IS NEW IN 1998:
The EMail addresses (entry@ioccc.org and questions@ioccc.org) are |
different. Contest entries (in the proper form) go to entry@ioccc.org |
and questions to the judges go to questions@ioccc.org. |
There is a new web URL: http://www.ioccc.org |
We have a new IOCCC judging team. See http://www.ioccc.org/judges.html |
for more information.
We added a more explicit comment against using gzip to get around the |
contest entry size limit. |
We warn against assuming that string constants are writable. |
There are some stuff about exit() returning void in the guidelines. |
There are some stuff about #'s as the first char of a line in |
C-preprocessor directives. See below. |
Titles can be 31 chars now ... but please try to keep then short. |
To provide you with a little more time, we have extended the deadline |
to 31-Jan-99, which due to the leap second of 31-Dec-98 23:59:60 UTC |
gives you just a little more time to complete your entry. |
Some may complain about the use of 2 digit years in our contest start |
and stop dates. These dates have nothing to do with the current Y2K |
hype. In fact this contest is currently certified 99.9% Y2K hype free! |
We use 2 digit years because they are more obfuscated. :-) |
HINTS AND SUGGESTIONS:
You are encouraged to examine the winners of previous contests. See
FOR MORE INFORMATION for details on how to get previous winners.
Keep in mind that rules change from year to year, so some winning entries
may not be valid entries this year. What was unique and novel one year
might be 'old' the next year.
An entry is usually examined in a number of ways. We typically apply
a number of tests to an entry:
* look at the original source
* convert ANSI tri-graphs to ASCII
* C pre-process the source ignoring '#include' lines
* C pre-process the source ignoring '#define' and '#include' lines
* run it through a C beautifier
* examine the algorithm
* lint it
* compile it
* execute it
You should consider how your entry looks in each of the above tests.
You should ask yourself if your entry remains obscure after it has been
'cleaned up' by the C pre-processor and a C beautifier.
Your entry need not pass all of the above tests. In certain
cases, a test is not important. Entries that compete for the
'strangest/most creative source layout' need not do as well as
others in terms of their algorithm. On the other hand, given
two such entries, we are more inclined to pick the entry that
does something interesting when you run it.
We try to avoid limiting creativity in our rules. As such, we leave
the contest open for creative rule interpretation. As in real life
programming, interpreting a requirements document or a customer request
is important. For this reason, we often award 'worst abuse of the
rules' to an entry that illustrates this point in an ironic way.
We do realize that there are holes in the rules, and invite entries
to attempt to exploit them. We will award 'worst abuse of the rules'
and then plug the hole next year. Even so, we will attempt to use
the smallest plug needed, if not smaller. :-)
Check out your program and be sure that it works. We sometimes make
the effort to debug an entry that has a slight problem, particularly
in or near the final round. On the other hand, we have seen some
of the best entries fall down because they didn't work.
We tend to look down on a prime number printer, that claims that
16 is a prime number. If you do have a bug, you are better off
documenting it. Noting "this entry sometimes prints the 4th power
of a prime by mistake" would save the above entry. And sometimes,
a strange bug/feature can even help the entry! Of course, a correctly
working entry is best.
People who are considering to just use some complex mathematical
function or state machine to spell out something such as "hello,
world!" may want to try and be more creative.
Ultra-obfuscated programs are in some cases some cases easier to
deobfuscate than subtly-obfuscated programs. Consider using
misleading or subtle tricks layered on top of or under an
appropriate level of obfuscation.
Programs that use VTxxx/ANSI sequences that are NOT limited to a
specific terminal brand and that can also work in a standard xterm
are considered portable.
OUR LIKES AND DISLIKES:
Doing masses of #defines to obscure the source has become 'old'. We
tend to 'see thru' masses of #defines due to our pre-processor tests
that we apply. Simply abusing #defines or -Dfoo=bar won't go as far
as a program that is more well rounded in confusion.
Many ANSI C compilers dislike the following code, and so do we:
#define d define
#d foo <-- don't expect this to turn into #define foo
When declaring local or global variables, you should declare the type:
int this_is_ok;
this_is_not; <-- don't use such implicit type declaration
We suggest that you compile your entry with an ANSI C compiler. If you
must use non-ANSI C, such as K&R C, you must avoid areas that result in
compile/link errors for ANSI C compilers. For example, using gcc
local function declarations, such as:
int |
main() { |
void blah() { printf("blah\n"); }
blah();
}
are not allowed even though their existence seems tailor made for
this contest! But for now, since they are not in wide spread use
we cannot accept entries that use them.
If your entry uses functions that have a variable number of
arguments, be careful. Systems implement va_list as a wide variety
of ways. Because of this, a number of operations using va_list are
not portable and must not be used:
* assigning a non-va_list variable to/from a va_list variable
* casting a non-va_list variable into/from a va_list variable
* passing a va_list variable to a function expecting a non-va_list arg
* passing a non-va_list variable to a function expecting a va_list arg
* performing arithmetic on va_list variables
* using va_list as a structure or union
In particular, do not treat va_list variables as if they were a char **'s.
Avoid using <varargs.h>. Use <stdarg.h> instead.
If you use C preprocessor directives (#define, #if, #ifdef, ...), |
the leading '#' must be the first non-whitespace character on a line. |
While some broken C preprocessors do not allow whitespace before a |
'#', most do. |
The exit() function returns void. On some broken systems have exit() |
return int. Your entry should assume that exit() returns a void. |
Small programs are best when they are short, obscure and concise.
While such programs are not as complex as other winners, they do
serve a useful purpose. They are often the only program that people
attempt to completely understand. For this reason, we look for
programs that are compact, and are instructional.
One line programs should be short one line programs, say around 80
bytes long. Getting close to 160 bytes is a bit too long in our opinion.
We tend to dislike programs that:
* are very hardware specific
* are very OS version specific
(index/strchr differences are ok, but socket/streams specific
code is likely not to be)
* dump core or have compiler warnings
(it is ok only if you warn us in the 'remark' header item)
* won't compile or run under a POSIX P1003.1/P1003.2 like systems
* depend on a utility or application not normally found on most
most POSIX P1003.1/P1003.2 like systems
* abuse the build file to get around the size limit
* obfuscate by excessive use of ANSI tri-graphs
* are longer than they need to be
* are similar to previous winners
* are identical to previous losers :-)
* are identical to future losers (Windows 95) :-)
Unless you are cramped for space, or unless you are entering the
'best one liner' category, we suggest that you format your program
in a more creative way than simply forming excessively long lines.
The build file should not be used to try and get around the size
limit. It is one thing to make use of a several -D's to help out,
but it is quite another to use 200+ bytes of -D's in order to
try and squeeze the source under the size limit. You should feel
free to make use of the build file space, but you are better off
if you show some amount of restraint.
We want to get away from source that is simply a compact blob of
characters. To help, we give a break to source that contains
whitespace, and in certain cases ; { or } characters. While the
number of characters excluding whitespace (tab, space, newline),
and excluding any ; { or } followed immediately by either whitespace
or end of file, must be <= 1536, the total size may be less than 3217
bytes. This means that one may use "free of charge" up to 1681
bytes of whitespace, or ; { or } followed by either whitespace
or end of file. [[Q: What is special about 1681?]]
Please do not use things like gzip to get around the size limit. |
Given two versions of the same program, one that is a compact blob
of code, and the other that is formatted more like a typical C
program, we tend to favor the second version. Of course, a third
version of the same program that is formatted in an interesting
and/or obfuscated way, would definitely win over the first two!
We suggest that you avoid trying for the 'smallest self-replicating'
source. The smallest, a zero byte entry, won in 1994.
We do not like writable strings. That is, we don't want stuff like: |
char *T = "So many primes, so little time!";
...
T[14] = ';';
Please don't make use of this feature, even if your system allows it. |
X client entries should be as portable as possible. Entries that
adapt to a wide collection of environments will be favored. Don't
depend on a particular type of display. For example, don't depend
on color or a given size. Don't require backing store.
X client entries should avoid using X related libraries and
software that is not in wide spread use. We ask that such X client
entries restrict themselves to only the low level Xlib and the
Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a).
Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone
has them. Avoid depending on a particular window manager. Not
everyone has X11r5, and some people are stuck back in X11r4 (or
earlier), so try to target X11r5 without requiring X11r5. Better
yet, try to make your entry run on all version 11 X Window Systems.
X client entries should not to depend on particular items on
.Xdefaults. If you must do so, be sure to note the required lines
in the ---remark--- section.
While we recognize that UN*X is not a universal operating system, the
contest does have a bias towards such systems. In an effort to expand
the scope of the contest, we phrase our bias in terms of POSIX P1003.1
and P1003.2 standards. This will allow certain non-UN*X OS users to
submit entries. On the other hand, this is a guideline and not a rule.
We will not reject an entry based on some POSIX technicality.
When dealing with OS and application environments, we suggest that you
be reasonable with a nod towards vanilla UN*X-like systems. POSIX will
evolve but not as much as the contest, so avoid stuff like POSIX real
time, security, etc.
We like programs that:
* are as concise and small as they need to be
* do something at least quasi-interesting
* pass lint without complaint (not a requirement, but it is nice)
* are portable
* are unique or novel in their obfuscation style
* MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! |
* make us laugh and/or throw up :-) (humor helps!) |
Some types of programs can't excel (tm) in some areas. Of course, your
program doesn't have to excel in all areas, but doing well in several
areas really does help.
You are better off explaining what your entry does in the
---remark--- section rather than leaving it obscure for the judges
as we might miss something and/or be too tired to notice.
We freely admit that interesting, creative or humorous comments in
the ---remark--- section help your chances of winning. If you had to
read so many twisted entries, you too would enjoy a good laugh or two.
We think the readers of the contest winners do as well. We do read
the ---remark--- section during the judging process, so it is worth
your while to write a remarkable ---remark--- section.
Be creative!
ABUSING THE RULES:
Legal abuse of the rules is somewhat encouraged. Legal rule abuse may
involve, but is not limited to, doing things that are technically
allowed by the rules and yet do not fit the spirit of what we
intended to be submitted.
Legal rule abuse is encouraged to help promote creativity. Rule
abuse entries, regardless of if they receive an award, result in
changes to the next year's rules and guidelines.
Legal abuse of the rules is NOT an invitation to violate the
rules. An entry that violates the rules in the opinion of the
judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL
OF RISK! If you have an entry that might otherwise be interesting,
you might want to submit two versions; one that does not abuse the
rules and one that does.
If you intend to abuse the rules, indicate so in the ---remark---
section. You must try to justify why you consider your rule abuse
to be allowed under the rules. That is, you must plead your case
as to why your entry is valid. Humor and/or creativity help plead
a case.
Abusing the entry format tends to annoy us more than amuse us.
We are often asked why the contest rules and guidelines seem too
strange or contain mistakes, flaws or grammatical errors.
One reason is that we sometimes make genuine mistakes. But in many
cases such problems, flaws or areas of confusion are deliberate.
Changes to rules and guidelines in response to rule abuses, are
done in a minimal fashion. Often we will deliberately leave
behind holes (or introduce new ones) so that future rule abuse may
continue.
At the risk of stating the obvious, this contest is a parity of the
software development process. The rules and guidelines are
only a small part of the overall contest. Even so, one may think
the contest rule and guideline process as a parody of the sometimes
tragic mismatch between what a customer (or marketing) wants and
what engineering delivers.
ENTRY FORMAT:
In order to help us process the many entries, we must request your
assistance by formatting your entries in a certain way. This format,
in addition, allows us to quickly separate information about the
author from the program itself. (see JUDGING PROCESS)
We have provided the program, mkentry, as an example of how to
format entries. You should be aware of the following warning that
is found in mkentry.c:
This program attempts to implement the IOCCC rules. Every
attempt has been made to make sure that this program produces
an entry that conforms to the contest rules. In all cases,
where this program differs from the contest rules, the
contest rules will be used. Be sure to check with the
contest rules before submitting an entry.
You are not required to use mkentry. It is convenient, however,
as it attempts to uuencode the needed files, and attempt to check
the entry against the size rules.
If you have any suggestions, comments, fixes or complaints about
the mkentry.c program, please send EMail to the judges. (see below)
The following is a sample entry (the | change bars are not part
of the example, don't add them to your entry!)
---entry---
rule: 1998
fix: y
title: chlejhse
entry: 0
date: Mon Oct 28 00:47:00 1998
host: Un*x v6, pdp11/45
2.9BSD, pdp11/70
---remark---
This is a not-very-obfuscated C program. It is likely not to win a
prize, because it doesn't have what it takes to win and because the
author plans to forget to send it in before the deadline! :-)
---author---
name: Landon Curt Noll
org: IOCCC Judging Group
addr: Toad Hall
PO Box 170608
San Francisco, California
94117-0608
USA
Earth
email: chongo@no_spam.fake.address
nobody@toad.com
url: http:///www.isthe.com/chongo
anon: y
---author---
name: Leonid A. Broukhis
org: IOCCC Judging Group
addr: Toad Hall
PO Box 170608
San Francisco, California
94117-0608
USA
email: leob@no_spam.fake_org
url: http://www.mailcom.com/main.shtml
anon: n
---author---
name: Jeremy Horn
org: IOCCC Judging Group
addr: Toad Hall
PO Box 170608
San Francisco, California
94117-0608
USA
email: jhorn@no_spam.fake_edu
url: none
anon: n
---author---
name: Peter Seebach
org: IOCCC Judging Group
addr: Toad Hall
PO Box 170608
San Francisco, California
94117-0608
USA
email: seebs@no_spam.fake_com
url: none
anon: y
---info---
begin 444 info.file
M5&AI<R!F:6QE(&ES(&EN('1H92!P=6)L:6,@9&]M86EN+@H*:'1T<#HO+W)E
M86QI='DN<V=I+F-O;2]C:&]N9V\*:'1T<#HO+W=W=RYI;V-C8RYO<F<*"E1H
M870@=&AA="!I<RP@:7,N"E1H870@=&AA="!I<R!N;W0L"B`@("!I<R!N;W0@
M=&AA="!T:&%T(&YO="!I<RX*5&AA="!I<RP@=&AA="!T:&%T(&ES(&YO="P@
M:7,A"@H)"2TM(&-H;VYG;R`Q.3<T"@I);B`Q.3DW+"!W:&5R92!T:&5R92!W
M87,@;F\@8V]N=&5S="`Z+2@@9'5E('1O(%-R:7)A;2!D<F]P<&EN9R!O9F8@
M=&AE"F9A8V4@;V8@=&AE($5A<G1H("AA;GEO;F4@:VYO=R!W:&5R92!3<FER
M86T@4W)I;FEV87-A;B!W96YT/R`@268@=&\@<V5N9`I%36%I;"!T;R!Q=65S
M=&EO;G-`:6]C8V,N;W)G*2!A;F0@3&%R<GD@0F%S<V5L(&)E:6YG('5N86)L
M92!T;R!C;VYT:6YU90HH9'5E('1O(&AI<R!C=7)R96YT(%!H1"!W;W)K("XN
M+B!B97-T('=I<VAE<R!,87)R>2$I+"!O;F4@;6EG:'0@<V%Y.@H*"3(@:7,@
M=&AE(&=R96%T97-T(&]D9"!P<FEM92!B96-A=7-E(&ET(&ES('1H92!L96%S
M="!E=F5N('!R:6UE+@H*06YD(&9O<B`Q.3DX(&]N92!M:6=H="!S87DZ"@H)
M4V\@;6%N>2!P<FEM97,@+BXN('-O(&QI='1L92!T:6UE(0H*26X@,3DY,BP@
M;VYE('!E<G-O;B!T;VQD('5S('1H870@=&AE>2!A8W1U86QL>2!D96-O9&5D
M('1H:7,@9FEL92X@($EN"C$Y.3,@86YD(#$Y.30@82!F97<@;6]R92!D:60@
M=&AE('-A;64N("!);B`Q.3DU+"!A(&YU;6)E<B!O9B!P96]P;&4@9G)O;0I%
M87-T97)N($5U<F]P92!T;VQD('5S('1H870@=&AE>2!D96-O9&5D('1H:7,@
M9FEL92X@(%-E96US('1H97)E(&ES(&$*<VUA;&P@=75D96-O9&4@9W)O=7`@
M:6X@16%S=&5R;B!%=7)O<&4A("`Z+2D*"E=H>2!D;VXG="!Y;W4@=&5L;"!U
M<R!W:'D@>6]U(&1E8V]D960@=&AI<R!F:6QE(&)Y('-E;F1I;F<@14UA:6P@
M=&\Z"@H)<75E<W1I;VYS0&EO8V-C+F]R9PH*4&5R:&%P<R!Y;W4@;6EG:'0@
M<W5G9V5S="!A(&)E='1E<B!E>&%M<&QE(&9I;&4@86YD('!R;V=R86T@9F]R
M('1H:7,*<V%M<&QE(&5N=')Y/R`@268@>6]U(&1O('-E;F0@:7,@82!B971T
M97(@97AA;7!L92!F:6QE+"!B92!W87)N960@+BXN"G1H870@:70@8V%N;F]T
M(&)E(&-O;G-I9&5R960@87,@82!C;VYT97-T(&5N=')Y+B`@4V\@>6]U(&UI
M9VAT(&YO=`IW86YT('1O('-E;F0@:6X@>6]U<B!B97-T('=O<FL@+BXN('-A
M=F4@=&AA="!F;W(@=&AE(&-O;G1E<W0N("!/;B!T:&4@"F]T:&5R(&AA;F0@
M+BXN('EO=2!M:6=H="!W86YT('1O('-E;F0@=7,@>6]U<B!M;W-T(&AU;6]R
M;W5S('=O<FLN("`@.BTI"E5U96YC;V1E9"!C<F5D:70@=VEL;"!B92!G:79E
;;B!I9B!W92!P:6-K('EO=7(@97AA;7!L92X*
`
end
---build---
begin 444 build
K9V-C("UA;G-I('!R;V<N8R`M3R`M1%-)3$Q97T1%1DE.12`M;R!P<F]G"@``
`
end
---program---
begin 444 prog.c
M;6%I;B@I"GL*("`@("\J"B`@("`@*B!.;W0@=F5R>2!O8F9U<V-A=&5D(&)U
M="!T:&5N('=H870@9&ED('EO=2!E>'!E8W0@+BXN('1H:7,@:7,@:G5S=`H@
M("`@("H@82!P;&%C96AO;&1E<B!E>&%M<&QE+@H@("`@("HO"B`@("!P<FEN
M=&8H(E-O;65D87D@22!M:6=H="!W<FET92!A(&)E='1E<B!E>&%M<&QE+EQN
M(BD["B`@("!P<FEN=&8H(D]N('-E8V]N9"!T:&]G=6AT("XN+B!N86@A7&XB
M*3L*("`@('!R:6YT9B@B4V5N9"!U<R!A(&=O;V0@97AA;7!L92!B=70@8F4@
M=V%R;F5D+"!A;GD@97AA;7!L92!Y;W5<;B(I.PH@("`@<')I;G1F*")S96YD
M('5S('=I;&P@;F]T(&)E(&-O;G-I9&5R960@87,@86X@96YT<GD@9F]R('1H
M92!C;VYT97-T(5QN(BD["B`@("!P<FEN=&8H(E-O('EO=2!M:6=H="!N;W0@
M=V%N="!T;R!S96YD(&%N(&5X86UP;&4@;V8@>6]U<B!B97-T('=O<FM<;B(I
M.PH@("`@<')I;G1F*"(N+BX@<V%V92!T:&%T(&9O<B!T:&4@8V]N=&5S="X@
M($)U="!A(&=O;V0@:'5M;W)O=7,@<')O9R!M:6=H=%QN(BD["B`@("!P<FEN
M=&8H(F1O("XN+B!A;F0@=V4@=VEL;"!G:79E('EO=2!U=65N8V]D960@8W)E
M9&ET(&EN(')E='5R;BY<;B(I.PH@("`@+RH@14UA:6PZ('%U97-T:6]N<T!I
M;V-C8RYO<F<@*B\*(VEF("%D969I;F5D*%-)3$Q97T1%1DE.12D*("`@(&UA
F:6XH*3L*(V5N9&EF"B`@("!E>&ET*#(Q-S`Q("4@,3(W*3L*?0H`
`
end
---end---
Your entry's sections must be the same order as in the above example.
Typically the build file should assume that the source is prog.c
and will compile into prog. If an entry wins, we will rename
its source and binary to avoid filename collision. By tradition,
we use the name of the entry's title, followed by an optional
digit in case of name conflicts.
Please note that the title must match the following regexp:
^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$
and must be 1 to 31 chars in length. Titles such as: |
foo.c
this_invalid_title_is_too_long !
/dev/null
are right out! :-)
Titles can be 31 chars long now, but please try to keep them short. |
Why 31? Because at lesst one of the judges likes Mersenne primes! |
It is suggested, but not required, that the title should incorporate
the author(s) username(s).
If the above entry somehow won the 'least likely to win' award,
we would use chonglab.c and chonglab.
If your entry depends on, or requires that your build, source
and/or binary files be a particular name, please say so in the
---remark--- section. If this case applies, it would be be helpful
if you did one of the following:
* Tell us how to change the filename(s) in your entry.
* Have the build file make copies of the files. For example:
cc prog.c -o special_name
or rm -f special_src.c
cp prog.c special_src.c
cc special_src.c -o special_name
or rm -f special_build
tail +4 build > special_build
sh < special_build
* Assume that we will use the entry title. Send us a version of
your build/program files that uses the name convention. You
should uuencode these files in ---info--- sections.
If your entry needs to modify its source, info or binary files,
please say so in the ---remark--- section. You should try to avoid
touching your original build, source and binary files. You should
arrange to make copies of the files you intend to modify. This
will allow people to re-generate your entry from scratch.
Remember that your entry may be built without a build file. We
typically incorporate the build lines into a Makefile. If the
build file must exist, say so in the ---remark--- section.
Typically the ---build--- command will contain a "cc" command.
It is also ok to use a "gcc" command (and gcc args). However keep
in mind that your entry should be compilable by any standard ANSI C
compiler and thus should not depend on a special gcc feature.
If your entry needs special info files, you should uuencode them
into ---info--- sections. In the case of multiple info files,
use multiple ---info--- sections. If no info files are needed,
then skip the ---info--- section.
Info files are intended to be input, or detailed information that
does not fit well into the ---remark--- section. For example, an
entry that implements a compiler might want to provide some sample
programs for the user to compile. An entry might want to include a
lengthy design document, that might not be appropriate for a
'hints' file.
Info files should be used only to supplement your entry. For
example, info files may provide sample input or detailed
information about your entry. Because they are supplemental,
the entry should not require them exist.
In some cases, your info files might be renamed to avoid name
conflicts. If info files should not be renamed for some reason,
say so in the ---remark--- section.
Info files must uudecode into the current directory. If they
absolutely must be renamed, or moved into a sub-directory, say
so in the ---remark--- section.
When submitting multiple entries, be sure that each entry has
a unique entry number from 0 to 7. Your first entry should
have entry number 0.
With the exception of the header, all text outside of the entry
format may be ignored. That is, don't place text outside of the
entry and expect us to see it. (Our decoding tools are not AI
progs!) If you need tell the judges something, put it in the
---remark--- section, or send a EMail to:
questions@ioccc.org (not the address for submitting entries) |
You must include the words ``ioccc question'' in the subject of your
EMail message when sending EMail to the judges.
The date should be given with respect to UTC. (Some systems refer
to this as GMT or GMT0) The format of the date should be that as
returned by asctime() in the C locale. An example of such a string is:
Mon Oct 28 00:47:00 1998
This format is similar to the output of the date(1) command. The
string does not include the timezone name before the year. On many
systems, one of the following command will produce a similar string:
date -u "+%a %h %d %T 19%y"
date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/'
sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"'
sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"'
sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"'
You are allowed to update/fix/revise your entry. To do so, set
the 'fix' line in the ---entry--- section to 'y' instead of 'n'.
Be sure that the resubmission uses the same title and entry number
as well, as these are used to determine which entry is to be
replaced.
JUDGING PROCESS:
Entries are judged by Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll |
and Peter Seebach. |
Entries are unpacked into individual directories. The EMail message
is unpacked into individual files, each containing:
---entry--- section
all ---author--- sections
all ---info--- sections
---build--- section
---program--- section
any other text, including the EMail message headers
Prior to judging, the 'any other text' file is scanned to be sure
it does not contain useful information (or in case the entry was
malformed and did not unpack correctly). Information from the
---author--- sections and the title from the ---entry--- section
are not read until the judging process is complete, and then only
from entries that have won an award.
The above process helps keep us biased for/against any one particular
individual. We are usually kept in the dark as much as you are
until the final awards are given. We like the surprise of finding
out in the end, who won and where they were from.
We attempt to keep all entries anonymous, unless they win an award.
Because the main 'prize' of winning is being announced, we make all
attempts to send non-winners into oblivion. We remove all non-winning
files, and shred all related paper. By tradition, we do not even
reveal the number of entries that we received. (For the curious,
we do indicate the volume of paper consumed when presenting the IOCCC
winners at talks)
After the Usenix announcement, we attempt to send EMail to the
authors of the winning entries. One reason we do this is to give
the authors a chance to comment on the way we have presented their
entry. They are given the chance to correct mistakes and typos. We
often accept their suggestions/comments about our remarks as well.
This is done prior to posting the winners to the wide world.
Judging consists of a number of elimination rounds. During a round,
the collection of entries are divided into two roughly equal piles;
the pile that advances on to the next round, and the pile that does
not. We also re-examine the entries that were eliminated in the
previous round. Thus, an entry gets at least two readings.
A reading consists of a number of actions:
* reading the ---entry--- section
* reading the uudecoded ---build--- section
* reading the uudecoded ---program--- section
* reading the uudecoded ---info--- section(s), if any
* passing the source thru the C pre-processor
skipping over any #include files
* performing a number of C beautify/cleanup edits on the source
* passing the beautified source thru the C pre-processor
skipping over any #include files
In later rounds, other actions are performed:
* linting the source
* compiling/building the source
* running the program
* performing miscellaneous tests on the source and binary
Until we reduce the stack of entries down to about 25 entries, entries
are judged on an individual basis. An entry is set aside because it
does not, in our opinion, meet the standard established by the round.
When the number of entries thins to about 25 entries, we begin to form
award categories. Entries begin to compete with each other for awards.
An entry often will compete in several categories.
The actual award category list will vary depending on the types of entries
we receive. A typical category list might be:
* best small one line program
* best small program
* strangest/most creative source layout
* most useful obfuscated program
* best game that is obfuscated
* most creatively obfuscated program
* most deceptive C code
* best X client (see OUR LIKES AND DISLIKES)
* best abuse of ANSI C
* worst abuse of the rules
* <anything else so strange that it deserves an award>
We do not limit ourselves to this list. For example, a few entries are so
good/bad that they are declared winners at the start of the final round.
We will invent awards categories for them, if necessary.
In the final round process, we perform the difficult tasks of
reducing the remaining entries (typically about 25) down to 8 or 10
winners. Often we are confident that the entries that make it into
the final round are definitely better than the ones that do not
make it. The selection of the winners out of the final round, is
less clear cut.
Sometimes a final round entry os good enough to win, but is beat out
by a similar, but slightly better entry. For this reason, it is
sometimes worthwhile to re-enter an improved version of an entry
that failed to win in a previous year. This assumes, of course,
that the entry is worth improving in the first place!
More often than not, we select a small entry (usually one line), a
strange/creative layout entry, and an entry that abuses the contest
rules in some way.
In the end, we traditionally pick one entry as 'best'. Sometimes such
an entry simply far exceeds any of the other entries. More often, the
'best' is picked because it does well in a number of categories.
ANNOUNCEMENT OF WINNERS:
The first announcement, occurs at the main Usenix conference. By
tradition, this is done during the IOCCC BOF. However due to the |
schedule change of 1998, an announcement may take place on the |
web first in early 1999. |
Winning entries will be posted in February to the following groups:
comp.lang.c comp.lang.c.moderated alt.sources |
In addition, pointers to these postings are posted to the following
comp.sources.misc comp.windows.x comp.programming |
misc.misc comp.std.c alt.folklore.computers |
Winning entries will be deposited into the uunet archives. See
below for details.
Often, winning entries are published in selected magazines from around
the world. Winners have appeared in books ("The New Hackers Dictionary")
and on T-Shirts.
Last, but not least, winners receive international fame and flames! :-)
FOR MORE INFORMATION:
You may contact the judges by sending EMail to the following address:
questions@ioccc.org (not the address for submitting entries) |
Questions and comments about the contest are welcome. Comments about
confusing rules and guidelines are also welcome.
You must include the words ``ioccc question'' in the subject of your
EMail message when sending EMail to the judges.
The rules and the guidelines may (and often do) change from year to
year. You should be sure you have the current rules and guidelines
prior to submitting entries.
Check out the IOCCC Web page:
http://www.ioccc.org |
It has rules, guidelines and winners of previous contests (1984 to date). |
Leonid A. Broukhis |
Jeremy Horn |
chongo <Landon Curt Noll> /\cc/\
Peter Seebach |
+22
View File
@@ -0,0 +1,22 @@
1000000 0 0
951057 309017 0
809017 587785 0
587785 809017 0
309017 951057 0
0 1000000 0
-309017 951057 0
-587785 809017 0
-809017 587785 0
-951057 309017 0
-1e+06 0 0
-951057 -309017 0
-809017 -587785 0
-587785 -809017 0
-309017 -951057 0
0 -1000000 0
309017 -951057 0
587785 -809017 0
809017 -587785 0
951057 -309017 0
1000000 0 0
0 0 0
+931
View File
@@ -0,0 +1,931 @@
AlWuzEre 5580
0.104638 -1.025458 0.533203 0.104591 -1.102728 0.533203
0.104591 -1.102728 0.533203 0.104591 -1.102728 0.000000
0.104638 -1.025458 0.533203 0.104591 -1.102728 0.000000
0.104638 -1.025458 0.533203 0.104591 -1.102728 0.000000
0.104591 -1.102728 0.000000 0.104638 -1.025458 0.000000
0.104638 -1.025458 0.533203 0.104638 -1.025458 0.000000
0.104591 -1.102728 0.533203 0.104638 -1.025458 0.533203
0.104638 -1.025458 0.533203 0.104638 -1.025458 0.000000
0.104591 -1.102728 0.533203 0.104638 -1.025458 0.000000
0.104591 -1.102728 0.533203 0.104638 -1.025458 0.000000
0.104638 -1.025458 0.000000 0.104591 -1.102728 0.000000
0.104591 -1.102728 0.533203 0.104591 -1.102728 0.000000
0.104844 -0.684881 0.543823 0.104812 -0.737661 0.538925
0.104812 -0.737661 0.538925 0.104877 -0.630911 0.538925
0.104844 -0.684881 0.543823 0.104877 -0.630911 0.538925
0.104877 -0.630911 0.538925 0.104812 -0.737661 0.538925
0.104812 -0.737661 0.538925 0.104783 -0.786871 0.524231
0.104877 -0.630911 0.538925 0.104783 -0.786871 0.524231
0.104877 -0.630911 0.538925 0.104783 -0.786871 0.524231
0.104783 -0.786871 0.524231 0.104907 -0.581060 0.524231
0.104877 -0.630911 0.538925 0.104907 -0.581060 0.524231
0.104907 -0.581060 0.524231 0.104783 -0.786871 0.524231
0.104783 -0.786871 0.524231 0.104755 -0.832144 0.500015
0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015
0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015
0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832
0.104907 -0.581060 0.524231 0.104935 -0.535330 0.499832
0.104935 -0.535330 0.499832 0.104755 -0.832144 0.500015
0.104755 -0.832144 0.500015 0.104730 -0.873114 0.466553
0.104935 -0.535330 0.499832 0.104730 -0.873114 0.466553
0.104935 -0.535330 0.499832 0.104730 -0.873114 0.466553
0.104730 -0.873114 0.466553 0.104844 -0.685614 0.466553
0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553
0.104844 -0.685614 0.466553 0.104730 -0.873114 0.466553
0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271
0.104844 -0.685614 0.466553 0.104801 -0.757391 0.452271
0.104801 -0.757391 0.452271 0.104730 -0.873114 0.466553
0.104730 -0.873114 0.466553 0.104709 -0.909185 0.423798
0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798
0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798
0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889
0.104801 -0.757391 0.452271 0.104764 -0.817816 0.410889
0.104764 -0.817816 0.410889 0.104709 -0.909185 0.423798
0.104709 -0.909185 0.423798 0.104693 -0.935369 0.376099
0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099
0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099
0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337
0.104764 -0.817816 0.410889 0.104738 -0.860662 0.345337
0.104738 -0.860662 0.345337 0.104693 -0.935369 0.376099
0.104693 -0.935369 0.376099 0.104683 -0.951300 0.324463
0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463
0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463
0.104683 -0.951300 0.324463 0.104680 -0.956610 0.269897
0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897
0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897
0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165
0.104738 -0.860662 0.345337 0.104729 -0.876043 0.269165
0.104729 -0.876043 0.269165 0.104680 -0.956610 0.269897
0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247
0.104729 -0.876043 0.269165 0.104737 -0.862127 0.190247
0.104737 -0.862127 0.190247 0.104680 -0.956610 0.269897
0.104680 -0.956610 0.269897 0.104690 -0.939032 0.166809
0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809
0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809
0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977
0.104737 -0.862127 0.190247 0.104761 -0.822210 0.125977
0.104761 -0.822210 0.125977 0.104690 -0.939032 0.166809
0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665
0.104761 -0.822210 0.125977 0.104800 -0.758856 0.081665
0.104800 -0.758856 0.081665 0.104690 -0.939032 0.166809
0.104690 -0.939032 0.166809 0.104722 -0.887396 0.080933
0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933
0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933
0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918
0.104800 -0.758856 0.081665 0.104844 -0.685614 0.065918
0.104844 -0.685614 0.065918 0.104722 -0.887396 0.080933
0.104722 -0.887396 0.080933 0.104748 -0.844503 0.041107
0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107
0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553
0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820
0.104935 -0.535330 0.499832 0.104960 -0.493719 0.465820
0.104960 -0.493719 0.465820 0.104844 -0.685614 0.466553
0.104844 -0.685614 0.466553 0.104891 -0.608893 0.450989
0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989
0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989
0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523
0.104960 -0.493719 0.465820 0.104982 -0.458105 0.423523
0.104982 -0.458105 0.423523 0.104891 -0.608893 0.450989
0.104891 -0.608893 0.450989 0.104930 -0.543890 0.402832
0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832
0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832
0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465
0.104982 -0.458105 0.423523 0.104997 -0.432562 0.376465
0.104997 -0.432562 0.376465 0.104930 -0.543890 0.402832
0.104930 -0.543890 0.402832 0.104954 -0.504889 0.341125
0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125
0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125
0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104
0.104997 -0.432562 0.376465 0.105007 -0.417181 0.325104
0.105007 -0.417181 0.325104 0.104954 -0.504889 0.341125
0.104954 -0.504889 0.341125 0.104962 -0.491522 0.270630
0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630
0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630
0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897
0.105007 -0.417181 0.325104 0.105010 -0.412054 0.269897
0.105010 -0.412054 0.269897 0.104962 -0.491522 0.270630
0.104962 -0.491522 0.270630 0.104953 -0.505438 0.190567
0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567
0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567
0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344
0.105010 -0.412054 0.269897 0.104999 -0.429632 0.165344
0.104999 -0.429632 0.165344 0.104953 -0.505438 0.190567
0.104953 -0.505438 0.190567 0.104928 -0.547186 0.124695
0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695
0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695
0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980
0.104999 -0.429632 0.165344 0.104986 -0.451605 0.119980
0.104986 -0.451605 0.119980 0.104928 -0.547186 0.124695
0.104928 -0.547186 0.124695 0.104890 -0.609625 0.080612
0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612
0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612
0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468
0.104986 -0.451605 0.119980 0.104967 -0.482367 0.079468
0.104967 -0.482367 0.079468 0.104890 -0.609625 0.080612
0.104890 -0.609625 0.080612 0.104844 -0.685614 0.065918
0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918
0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918
0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107
0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107
0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107
0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283
0.104967 -0.482367 0.079468 0.104941 -0.526175 0.040283
0.104941 -0.526175 0.040283 0.104748 -0.844503 0.041107
0.104748 -0.844503 0.041107 0.104777 -0.796392 0.012451
0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451
0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451
0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085
0.104941 -0.526175 0.040283 0.104911 -0.574835 0.012085
0.104911 -0.574835 0.012085 0.104777 -0.796392 0.012451
0.104777 -0.796392 0.012451 0.104809 -0.743338 -0.004852
0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852
0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852
0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944
0.104911 -0.574835 0.012085 0.104879 -0.628073 -0.004944
0.104879 -0.628073 -0.004944 0.104809 -0.743338 -0.004852
0.104809 -0.743338 -0.004852 0.104844 -0.685614 -0.010620
0.104879 -0.628073 -0.004944 0.104844 -0.685614 -0.010620
0.104844 -0.684881 0.543823 0.104877 -0.630911 0.538925
0.104877 -0.630911 0.538925 0.104812 -0.737661 0.538925
0.104844 -0.684881 0.543823 0.104812 -0.737661 0.538925
0.104812 -0.737661 0.538925 0.104877 -0.630911 0.538925
0.104877 -0.630911 0.538925 0.104907 -0.581060 0.524231
0.104812 -0.737661 0.538925 0.104907 -0.581060 0.524231
0.104812 -0.737661 0.538925 0.104907 -0.581060 0.524231
0.104907 -0.581060 0.524231 0.104783 -0.786871 0.524231
0.104812 -0.737661 0.538925 0.104783 -0.786871 0.524231
0.104783 -0.786871 0.524231 0.104907 -0.581060 0.524231
0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015
0.104783 -0.786871 0.524231 0.104755 -0.832144 0.500015
0.104755 -0.832144 0.500015 0.104907 -0.581060 0.524231
0.104907 -0.581060 0.524231 0.104935 -0.535330 0.499832
0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832
0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832
0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553
0.104755 -0.832144 0.500015 0.104844 -0.685614 0.466553
0.104755 -0.832144 0.500015 0.104844 -0.685614 0.466553
0.104844 -0.685614 0.466553 0.104730 -0.873114 0.466553
0.104755 -0.832144 0.500015 0.104730 -0.873114 0.466553
0.104730 -0.873114 0.466553 0.104844 -0.685614 0.466553
0.104844 -0.685614 0.466553 0.104801 -0.757391 0.452271
0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271
0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271
0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798
0.104730 -0.873114 0.466553 0.104709 -0.909185 0.423798
0.104709 -0.909185 0.423798 0.104801 -0.757391 0.452271
0.104801 -0.757391 0.452271 0.104764 -0.817816 0.410889
0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889
0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889
0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099
0.104709 -0.909185 0.423798 0.104693 -0.935369 0.376099
0.104693 -0.935369 0.376099 0.104764 -0.817816 0.410889
0.104764 -0.817816 0.410889 0.104738 -0.860662 0.345337
0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337
0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337
0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463
0.104693 -0.935369 0.376099 0.104683 -0.951300 0.324463
0.104683 -0.951300 0.324463 0.104738 -0.860662 0.345337
0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897
0.104683 -0.951300 0.324463 0.104680 -0.956610 0.269897
0.104680 -0.956610 0.269897 0.104738 -0.860662 0.345337
0.104738 -0.860662 0.345337 0.104729 -0.876043 0.269165
0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165
0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165
0.104729 -0.876043 0.269165 0.104737 -0.862127 0.190247
0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247
0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247
0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809
0.104680 -0.956610 0.269897 0.104690 -0.939032 0.166809
0.104690 -0.939032 0.166809 0.104737 -0.862127 0.190247
0.104737 -0.862127 0.190247 0.104761 -0.822210 0.125977
0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977
0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977
0.104761 -0.822210 0.125977 0.104800 -0.758856 0.081665
0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665
0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665
0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933
0.104690 -0.939032 0.166809 0.104722 -0.887396 0.080933
0.104722 -0.887396 0.080933 0.104800 -0.758856 0.081665
0.104800 -0.758856 0.081665 0.104844 -0.685614 0.065918
0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918
0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918
0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107
0.104722 -0.887396 0.080933 0.104748 -0.844503 0.041107
0.104844 -0.685614 0.466553 0.104935 -0.535330 0.499832
0.104935 -0.535330 0.499832 0.104960 -0.493719 0.465820
0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820
0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820
0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989
0.104844 -0.685614 0.466553 0.104891 -0.608893 0.450989
0.104891 -0.608893 0.450989 0.104960 -0.493719 0.465820
0.104960 -0.493719 0.465820 0.104982 -0.458105 0.423523
0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523
0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523
0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832
0.104891 -0.608893 0.450989 0.104930 -0.543890 0.402832
0.104930 -0.543890 0.402832 0.104982 -0.458105 0.423523
0.104982 -0.458105 0.423523 0.104997 -0.432562 0.376465
0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465
0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465
0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125
0.104930 -0.543890 0.402832 0.104954 -0.504889 0.341125
0.104954 -0.504889 0.341125 0.104997 -0.432562 0.376465
0.104997 -0.432562 0.376465 0.105007 -0.417181 0.325104
0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104
0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104
0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630
0.104954 -0.504889 0.341125 0.104962 -0.491522 0.270630
0.104962 -0.491522 0.270630 0.105007 -0.417181 0.325104
0.105007 -0.417181 0.325104 0.105010 -0.412054 0.269897
0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897
0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897
0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567
0.104962 -0.491522 0.270630 0.104953 -0.505438 0.190567
0.104953 -0.505438 0.190567 0.105010 -0.412054 0.269897
0.105010 -0.412054 0.269897 0.104999 -0.429632 0.165344
0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344
0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344
0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695
0.104953 -0.505438 0.190567 0.104928 -0.547186 0.124695
0.104928 -0.547186 0.124695 0.104999 -0.429632 0.165344
0.104999 -0.429632 0.165344 0.104986 -0.451605 0.119980
0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980
0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980
0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612
0.104928 -0.547186 0.124695 0.104890 -0.609625 0.080612
0.104890 -0.609625 0.080612 0.104986 -0.451605 0.119980
0.104986 -0.451605 0.119980 0.104967 -0.482367 0.079468
0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468
0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468
0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918
0.104890 -0.609625 0.080612 0.104844 -0.685614 0.065918
0.104844 -0.685614 0.065918 0.104967 -0.482367 0.079468
0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107
0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107
0.104748 -0.844503 0.041107 0.104967 -0.482367 0.079468
0.104967 -0.482367 0.079468 0.104941 -0.526175 0.040283
0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283
0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283
0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451
0.104748 -0.844503 0.041107 0.104777 -0.796392 0.012451
0.104777 -0.796392 0.012451 0.104941 -0.526175 0.040283
0.104941 -0.526175 0.040283 0.104911 -0.574835 0.012085
0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085
0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085
0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852
0.104777 -0.796392 0.012451 0.104809 -0.743338 -0.004852
0.104809 -0.743338 -0.004852 0.104911 -0.574835 0.012085
0.104911 -0.574835 0.012085 0.104879 -0.628073 -0.004944
0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944
0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944
0.104879 -0.628073 -0.004944 0.104844 -0.685614 -0.010620
0.104809 -0.743338 -0.004852 0.104844 -0.685614 -0.010620
0.105346 0.143121 0.133667 0.105289 0.047907 0.133667
0.105289 0.047907 0.133667 0.105272 0.020853 0.104599
0.105346 0.143121 0.133667 0.105272 0.020853 0.104599
0.105346 0.143121 0.133667 0.105272 0.020853 0.104599
0.105272 0.020853 0.104599 0.105252 -0.012701 0.083313
0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313
0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313
0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915
0.105346 0.143121 0.133667 0.105321 0.101694 0.071915
0.105321 0.101694 0.071915 0.105252 -0.012701 0.083313
0.105252 -0.012701 0.083313 0.105202 -0.095282 0.065918
0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918
0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918
0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107
0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107
0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107
0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550
0.105321 0.101694 0.071915 0.105288 0.046991 0.026550
0.105288 0.046991 0.026550 0.105106 -0.254172 0.041107
0.105106 -0.254172 0.041107 0.105135 -0.206061 0.012451
0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451
0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451
0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328
0.105288 0.046991 0.026550 0.105248 -0.019247 -0.001328
0.105248 -0.019247 -0.001328 0.105135 -0.206061 0.012451
0.105135 -0.206061 0.012451 0.105167 -0.153006 -0.004852
0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852
0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852
0.105167 -0.153006 -0.004852 0.105202 -0.095282 -0.010620
0.105248 -0.019247 -0.001328 0.105202 -0.095282 -0.010620
0.105113 -0.241812 0.500015 0.105088 -0.282782 0.466553
0.105088 -0.282782 0.466553 0.105202 -0.095282 0.466553
0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105088 -0.282782 0.466553
0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271
0.105202 -0.095282 0.466553 0.105158 -0.167059 0.452271
0.105158 -0.167059 0.452271 0.105088 -0.282782 0.466553
0.105088 -0.282782 0.466553 0.105066 -0.318854 0.423294
0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294
0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294
0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889
0.105158 -0.167059 0.452271 0.105122 -0.227484 0.410889
0.105122 -0.227484 0.410889 0.105066 -0.318854 0.423294
0.105066 -0.318854 0.423294 0.105050 -0.345038 0.375549
0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549
0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549
0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337
0.105122 -0.227484 0.410889 0.105096 -0.270331 0.345337
0.105096 -0.270331 0.345337 0.105050 -0.345038 0.375549
0.105050 -0.345038 0.375549 0.105041 -0.360968 0.324142
0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142
0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142
0.105041 -0.360968 0.324142 0.105038 -0.366278 0.269897
0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897
0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897
0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165
0.105096 -0.270331 0.345337 0.105086 -0.285712 0.269165
0.105086 -0.285712 0.269165 0.105038 -0.366278 0.269897
0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247
0.105086 -0.285712 0.269165 0.105095 -0.271796 0.190247
0.105095 -0.271796 0.190247 0.105038 -0.366278 0.269897
0.105038 -0.366278 0.269897 0.105048 -0.348700 0.166809
0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809
0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809
0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977
0.105095 -0.271796 0.190247 0.105119 -0.231879 0.125977
0.105119 -0.231879 0.125977 0.105048 -0.348700 0.166809
0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665
0.105119 -0.231879 0.125977 0.105157 -0.168524 0.081665
0.105157 -0.168524 0.081665 0.105048 -0.348700 0.166809
0.105048 -0.348700 0.166809 0.105080 -0.297064 0.080933
0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933
0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933
0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918
0.105157 -0.168524 0.081665 0.105202 -0.095282 0.065918
0.105202 -0.095282 0.065918 0.105080 -0.297064 0.080933
0.105080 -0.297064 0.080933 0.105106 -0.254172 0.041107
0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107
0.105202 -0.094550 0.543823 0.105170 -0.147330 0.538925
0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119
0.105202 -0.094550 0.543823 0.105249 -0.017508 0.534119
0.105249 -0.017508 0.534119 0.105170 -0.147330 0.538925
0.105170 -0.147330 0.538925 0.105140 -0.196539 0.524231
0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231
0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231
0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005
0.105249 -0.017508 0.534119 0.105290 0.049554 0.505005
0.105290 0.049554 0.505005 0.105140 -0.196539 0.524231
0.105140 -0.196539 0.524231 0.105113 -0.241812 0.500015
0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015
0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015
0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553
0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553
0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130
0.105290 0.049554 0.505005 0.105323 0.103983 0.458130
0.105323 0.103983 0.458130 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105253 -0.010687 0.448608
0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608
0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608
0.105253 -0.010687 0.448608 0.105274 0.023737 0.426270
0.105323 0.103983 0.458130 0.105274 0.023737 0.426270
0.105323 0.103983 0.458130 0.105274 0.023737 0.426270
0.105274 0.023737 0.426270 0.105291 0.052301 0.395142
0.105323 0.103983 0.458130 0.105291 0.052301 0.395142
0.105323 0.103983 0.458130 0.105291 0.052301 0.395142
0.105291 0.052301 0.395142 0.105346 0.143121 0.395142
0.105323 0.103983 0.458130 0.105346 0.143121 0.395142
0.105289 0.047907 0.133667 0.105346 0.143121 0.133667
0.105346 0.143121 0.133667 0.105272 0.020853 0.104599
0.105289 0.047907 0.133667 0.105272 0.020853 0.104599
0.105272 0.020853 0.104599 0.105346 0.143121 0.133667
0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313
0.105272 0.020853 0.104599 0.105252 -0.012701 0.083313
0.105252 -0.012701 0.083313 0.105346 0.143121 0.133667
0.105346 0.143121 0.133667 0.105321 0.101694 0.071915
0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915
0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915
0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918
0.105252 -0.012701 0.083313 0.105202 -0.095282 0.065918
0.105202 -0.095282 0.065918 0.105321 0.101694 0.071915
0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107
0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107
0.105106 -0.254172 0.041107 0.105321 0.101694 0.071915
0.105321 0.101694 0.071915 0.105288 0.046991 0.026550
0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550
0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550
0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451
0.105106 -0.254172 0.041107 0.105135 -0.206061 0.012451
0.105135 -0.206061 0.012451 0.105288 0.046991 0.026550
0.105288 0.046991 0.026550 0.105248 -0.019247 -0.001328
0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328
0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328
0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852
0.105135 -0.206061 0.012451 0.105167 -0.153006 -0.004852
0.105167 -0.153006 -0.004852 0.105248 -0.019247 -0.001328
0.105248 -0.019247 -0.001328 0.105202 -0.095282 -0.010620
0.105167 -0.153006 -0.004852 0.105202 -0.095282 -0.010620
0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105088 -0.282782 0.466553
0.105113 -0.241812 0.500015 0.105088 -0.282782 0.466553
0.105088 -0.282782 0.466553 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105158 -0.167059 0.452271
0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271
0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271
0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294
0.105088 -0.282782 0.466553 0.105066 -0.318854 0.423294
0.105066 -0.318854 0.423294 0.105158 -0.167059 0.452271
0.105158 -0.167059 0.452271 0.105122 -0.227484 0.410889
0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889
0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889
0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549
0.105066 -0.318854 0.423294 0.105050 -0.345038 0.375549
0.105050 -0.345038 0.375549 0.105122 -0.227484 0.410889
0.105122 -0.227484 0.410889 0.105096 -0.270331 0.345337
0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337
0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337
0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142
0.105050 -0.345038 0.375549 0.105041 -0.360968 0.324142
0.105041 -0.360968 0.324142 0.105096 -0.270331 0.345337
0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897
0.105041 -0.360968 0.324142 0.105038 -0.366278 0.269897
0.105038 -0.366278 0.269897 0.105096 -0.270331 0.345337
0.105096 -0.270331 0.345337 0.105086 -0.285712 0.269165
0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165
0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165
0.105086 -0.285712 0.269165 0.105095 -0.271796 0.190247
0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247
0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247
0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809
0.105038 -0.366278 0.269897 0.105048 -0.348700 0.166809
0.105048 -0.348700 0.166809 0.105095 -0.271796 0.190247
0.105095 -0.271796 0.190247 0.105119 -0.231879 0.125977
0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977
0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977
0.105119 -0.231879 0.125977 0.105157 -0.168524 0.081665
0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665
0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665
0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933
0.105048 -0.348700 0.166809 0.105080 -0.297064 0.080933
0.105080 -0.297064 0.080933 0.105157 -0.168524 0.081665
0.105157 -0.168524 0.081665 0.105202 -0.095282 0.065918
0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918
0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918
0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107
0.105080 -0.297064 0.080933 0.105106 -0.254172 0.041107
0.105170 -0.147330 0.538925 0.105202 -0.094550 0.543823
0.105202 -0.094550 0.543823 0.105249 -0.017508 0.534119
0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119
0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119
0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231
0.105170 -0.147330 0.538925 0.105140 -0.196539 0.524231
0.105140 -0.196539 0.524231 0.105249 -0.017508 0.534119
0.105249 -0.017508 0.534119 0.105290 0.049554 0.505005
0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005
0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005
0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015
0.105140 -0.196539 0.524231 0.105113 -0.241812 0.500015
0.105113 -0.241812 0.500015 0.105290 0.049554 0.505005
0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553
0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553
0.105202 -0.095282 0.466553 0.105290 0.049554 0.505005
0.105290 0.049554 0.505005 0.105323 0.103983 0.458130
0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130
0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130
0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608
0.105202 -0.095282 0.466553 0.105253 -0.010687 0.448608
0.105253 -0.010687 0.448608 0.105323 0.103983 0.458130
0.105323 0.103983 0.458130 0.105274 0.023737 0.426270
0.105253 -0.010687 0.448608 0.105274 0.023737 0.426270
0.105274 0.023737 0.426270 0.105323 0.103983 0.458130
0.105323 0.103983 0.458130 0.105346 0.143121 0.395142
0.105274 0.023737 0.426270 0.105346 0.143121 0.395142
0.105274 0.023737 0.426270 0.105346 0.143121 0.395142
0.105346 0.143121 0.395142 0.105291 0.052301 0.395142
0.105274 0.023737 0.426270 0.105291 0.052301 0.395142
0.105688 0.707086 0.133667 0.105631 0.611871 0.133667
0.105631 0.611871 0.133667 0.105614 0.584817 0.104599
0.105688 0.707086 0.133667 0.105614 0.584817 0.104599
0.105688 0.707086 0.133667 0.105614 0.584817 0.104599
0.105614 0.584817 0.104599 0.105594 0.551263 0.083313
0.105688 0.707086 0.133667 0.105594 0.551263 0.083313
0.105688 0.707086 0.133667 0.105594 0.551263 0.083313
0.105594 0.551263 0.083313 0.105663 0.665659 0.071915
0.105688 0.707086 0.133667 0.105663 0.665659 0.071915
0.105663 0.665659 0.071915 0.105594 0.551263 0.083313
0.105594 0.551263 0.083313 0.105544 0.468683 0.065918
0.105663 0.665659 0.071915 0.105544 0.468683 0.065918
0.105663 0.665659 0.071915 0.105544 0.468683 0.065918
0.105544 0.468683 0.065918 0.105447 0.309793 0.041107
0.105663 0.665659 0.071915 0.105447 0.309793 0.041107
0.105663 0.665659 0.071915 0.105447 0.309793 0.041107
0.105447 0.309793 0.041107 0.105630 0.610956 0.026550
0.105663 0.665659 0.071915 0.105630 0.610956 0.026550
0.105630 0.610956 0.026550 0.105447 0.309793 0.041107
0.105447 0.309793 0.041107 0.105477 0.357904 0.012451
0.105630 0.610956 0.026550 0.105477 0.357904 0.012451
0.105630 0.610956 0.026550 0.105477 0.357904 0.012451
0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328
0.105630 0.610956 0.026550 0.105590 0.544717 -0.001328
0.105590 0.544717 -0.001328 0.105477 0.357904 0.012451
0.105477 0.357904 0.012451 0.105509 0.410959 -0.004852
0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852
0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852
0.105509 0.410959 -0.004852 0.105544 0.468683 -0.010620
0.105590 0.544717 -0.001328 0.105544 0.468683 -0.010620
0.105455 0.322153 0.500015 0.105430 0.281183 0.466553
0.105430 0.281183 0.466553 0.105544 0.468683 0.466553
0.105455 0.322153 0.500015 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105430 0.281183 0.466553
0.105430 0.281183 0.466553 0.105500 0.396906 0.452271
0.105544 0.468683 0.466553 0.105500 0.396906 0.452271
0.105500 0.396906 0.452271 0.105430 0.281183 0.466553
0.105430 0.281183 0.466553 0.105408 0.245111 0.423294
0.105500 0.396906 0.452271 0.105408 0.245111 0.423294
0.105500 0.396906 0.452271 0.105408 0.245111 0.423294
0.105408 0.245111 0.423294 0.105464 0.336481 0.410889
0.105500 0.396906 0.452271 0.105464 0.336481 0.410889
0.105464 0.336481 0.410889 0.105408 0.245111 0.423294
0.105408 0.245111 0.423294 0.105392 0.218927 0.375549
0.105464 0.336481 0.410889 0.105392 0.218927 0.375549
0.105464 0.336481 0.410889 0.105392 0.218927 0.375549
0.105392 0.218927 0.375549 0.105438 0.293634 0.345337
0.105464 0.336481 0.410889 0.105438 0.293634 0.345337
0.105438 0.293634 0.345337 0.105392 0.218927 0.375549
0.105392 0.218927 0.375549 0.105383 0.202997 0.324142
0.105438 0.293634 0.345337 0.105383 0.202997 0.324142
0.105438 0.293634 0.345337 0.105383 0.202997 0.324142
0.105383 0.202997 0.324142 0.105379 0.197687 0.269897
0.105438 0.293634 0.345337 0.105379 0.197687 0.269897
0.105438 0.293634 0.345337 0.105379 0.197687 0.269897
0.105379 0.197687 0.269897 0.105428 0.278253 0.269165
0.105438 0.293634 0.345337 0.105428 0.278253 0.269165
0.105428 0.278253 0.269165 0.105379 0.197687 0.269897
0.105379 0.197687 0.269897 0.105437 0.292169 0.190247
0.105428 0.278253 0.269165 0.105437 0.292169 0.190247
0.105437 0.292169 0.190247 0.105379 0.197687 0.269897
0.105379 0.197687 0.269897 0.105390 0.215265 0.166809
0.105437 0.292169 0.190247 0.105390 0.215265 0.166809
0.105437 0.292169 0.190247 0.105390 0.215265 0.166809
0.105390 0.215265 0.166809 0.105461 0.332086 0.125977
0.105437 0.292169 0.190247 0.105461 0.332086 0.125977
0.105461 0.332086 0.125977 0.105390 0.215265 0.166809
0.105390 0.215265 0.166809 0.105499 0.395441 0.081665
0.105461 0.332086 0.125977 0.105499 0.395441 0.081665
0.105499 0.395441 0.081665 0.105390 0.215265 0.166809
0.105390 0.215265 0.166809 0.105421 0.266901 0.080933
0.105499 0.395441 0.081665 0.105421 0.266901 0.080933
0.105499 0.395441 0.081665 0.105421 0.266901 0.080933
0.105421 0.266901 0.080933 0.105544 0.468683 0.065918
0.105499 0.395441 0.081665 0.105544 0.468683 0.065918
0.105544 0.468683 0.065918 0.105421 0.266901 0.080933
0.105421 0.266901 0.080933 0.105447 0.309793 0.041107
0.105544 0.468683 0.065918 0.105447 0.309793 0.041107
0.105544 0.469415 0.543823 0.105512 0.416635 0.538925
0.105512 0.416635 0.538925 0.105591 0.546457 0.534119
0.105544 0.469415 0.543823 0.105591 0.546457 0.534119
0.105591 0.546457 0.534119 0.105512 0.416635 0.538925
0.105512 0.416635 0.538925 0.105482 0.367426 0.524231
0.105591 0.546457 0.534119 0.105482 0.367426 0.524231
0.105591 0.546457 0.534119 0.105482 0.367426 0.524231
0.105482 0.367426 0.524231 0.105632 0.613519 0.505005
0.105591 0.546457 0.534119 0.105632 0.613519 0.505005
0.105632 0.613519 0.505005 0.105482 0.367426 0.524231
0.105482 0.367426 0.524231 0.105455 0.322153 0.500015
0.105632 0.613519 0.505005 0.105455 0.322153 0.500015
0.105632 0.613519 0.505005 0.105455 0.322153 0.500015
0.105455 0.322153 0.500015 0.105544 0.468683 0.466553
0.105632 0.613519 0.505005 0.105544 0.468683 0.466553
0.105632 0.613519 0.505005 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105665 0.667947 0.458130
0.105632 0.613519 0.505005 0.105665 0.667947 0.458130
0.105665 0.667947 0.458130 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105595 0.553278 0.448608
0.105665 0.667947 0.458130 0.105595 0.553278 0.448608
0.105665 0.667947 0.458130 0.105595 0.553278 0.448608
0.105595 0.553278 0.448608 0.105616 0.587701 0.426270
0.105665 0.667947 0.458130 0.105616 0.587701 0.426270
0.105665 0.667947 0.458130 0.105616 0.587701 0.426270
0.105616 0.587701 0.426270 0.105633 0.616266 0.395142
0.105665 0.667947 0.458130 0.105633 0.616266 0.395142
0.105665 0.667947 0.458130 0.105633 0.616266 0.395142
0.105633 0.616266 0.395142 0.105688 0.707086 0.395142
0.105665 0.667947 0.458130 0.105688 0.707086 0.395142
0.105631 0.611871 0.133667 0.105688 0.707086 0.133667
0.105688 0.707086 0.133667 0.105614 0.584817 0.104599
0.105631 0.611871 0.133667 0.105614 0.584817 0.104599
0.105614 0.584817 0.104599 0.105688 0.707086 0.133667
0.105688 0.707086 0.133667 0.105594 0.551263 0.083313
0.105614 0.584817 0.104599 0.105594 0.551263 0.083313
0.105594 0.551263 0.083313 0.105688 0.707086 0.133667
0.105688 0.707086 0.133667 0.105663 0.665659 0.071915
0.105594 0.551263 0.083313 0.105663 0.665659 0.071915
0.105594 0.551263 0.083313 0.105663 0.665659 0.071915
0.105663 0.665659 0.071915 0.105544 0.468683 0.065918
0.105594 0.551263 0.083313 0.105544 0.468683 0.065918
0.105544 0.468683 0.065918 0.105663 0.665659 0.071915
0.105663 0.665659 0.071915 0.105447 0.309793 0.041107
0.105544 0.468683 0.065918 0.105447 0.309793 0.041107
0.105447 0.309793 0.041107 0.105663 0.665659 0.071915
0.105663 0.665659 0.071915 0.105630 0.610956 0.026550
0.105447 0.309793 0.041107 0.105630 0.610956 0.026550
0.105447 0.309793 0.041107 0.105630 0.610956 0.026550
0.105630 0.610956 0.026550 0.105477 0.357904 0.012451
0.105447 0.309793 0.041107 0.105477 0.357904 0.012451
0.105477 0.357904 0.012451 0.105630 0.610956 0.026550
0.105630 0.610956 0.026550 0.105590 0.544717 -0.001328
0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328
0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328
0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852
0.105477 0.357904 0.012451 0.105509 0.410959 -0.004852
0.105509 0.410959 -0.004852 0.105590 0.544717 -0.001328
0.105590 0.544717 -0.001328 0.105544 0.468683 -0.010620
0.105509 0.410959 -0.004852 0.105544 0.468683 -0.010620
0.105455 0.322153 0.500015 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105430 0.281183 0.466553
0.105455 0.322153 0.500015 0.105430 0.281183 0.466553
0.105430 0.281183 0.466553 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105500 0.396906 0.452271
0.105430 0.281183 0.466553 0.105500 0.396906 0.452271
0.105430 0.281183 0.466553 0.105500 0.396906 0.452271
0.105500 0.396906 0.452271 0.105408 0.245111 0.423294
0.105430 0.281183 0.466553 0.105408 0.245111 0.423294
0.105408 0.245111 0.423294 0.105500 0.396906 0.452271
0.105500 0.396906 0.452271 0.105464 0.336481 0.410889
0.105408 0.245111 0.423294 0.105464 0.336481 0.410889
0.105408 0.245111 0.423294 0.105464 0.336481 0.410889
0.105464 0.336481 0.410889 0.105392 0.218927 0.375549
0.105408 0.245111 0.423294 0.105392 0.218927 0.375549
0.105392 0.218927 0.375549 0.105464 0.336481 0.410889
0.105464 0.336481 0.410889 0.105438 0.293634 0.345337
0.105392 0.218927 0.375549 0.105438 0.293634 0.345337
0.105392 0.218927 0.375549 0.105438 0.293634 0.345337
0.105438 0.293634 0.345337 0.105383 0.202997 0.324142
0.105392 0.218927 0.375549 0.105383 0.202997 0.324142
0.105383 0.202997 0.324142 0.105438 0.293634 0.345337
0.105438 0.293634 0.345337 0.105379 0.197687 0.269897
0.105383 0.202997 0.324142 0.105379 0.197687 0.269897
0.105379 0.197687 0.269897 0.105438 0.293634 0.345337
0.105438 0.293634 0.345337 0.105428 0.278253 0.269165
0.105379 0.197687 0.269897 0.105428 0.278253 0.269165
0.105379 0.197687 0.269897 0.105428 0.278253 0.269165
0.105428 0.278253 0.269165 0.105437 0.292169 0.190247
0.105379 0.197687 0.269897 0.105437 0.292169 0.190247
0.105379 0.197687 0.269897 0.105437 0.292169 0.190247
0.105437 0.292169 0.190247 0.105390 0.215265 0.166809
0.105379 0.197687 0.269897 0.105390 0.215265 0.166809
0.105390 0.215265 0.166809 0.105437 0.292169 0.190247
0.105437 0.292169 0.190247 0.105461 0.332086 0.125977
0.105390 0.215265 0.166809 0.105461 0.332086 0.125977
0.105390 0.215265 0.166809 0.105461 0.332086 0.125977
0.105461 0.332086 0.125977 0.105499 0.395441 0.081665
0.105390 0.215265 0.166809 0.105499 0.395441 0.081665
0.105390 0.215265 0.166809 0.105499 0.395441 0.081665
0.105499 0.395441 0.081665 0.105421 0.266901 0.080933
0.105390 0.215265 0.166809 0.105421 0.266901 0.080933
0.105421 0.266901 0.080933 0.105499 0.395441 0.081665
0.105499 0.395441 0.081665 0.105544 0.468683 0.065918
0.105421 0.266901 0.080933 0.105544 0.468683 0.065918
0.105421 0.266901 0.080933 0.105544 0.468683 0.065918
0.105544 0.468683 0.065918 0.105447 0.309793 0.041107
0.105421 0.266901 0.080933 0.105447 0.309793 0.041107
0.105512 0.416635 0.538925 0.105544 0.469415 0.543823
0.105544 0.469415 0.543823 0.105591 0.546457 0.534119
0.105512 0.416635 0.538925 0.105591 0.546457 0.534119
0.105512 0.416635 0.538925 0.105591 0.546457 0.534119
0.105591 0.546457 0.534119 0.105482 0.367426 0.524231
0.105512 0.416635 0.538925 0.105482 0.367426 0.524231
0.105482 0.367426 0.524231 0.105591 0.546457 0.534119
0.105591 0.546457 0.534119 0.105632 0.613519 0.505005
0.105482 0.367426 0.524231 0.105632 0.613519 0.505005
0.105482 0.367426 0.524231 0.105632 0.613519 0.505005
0.105632 0.613519 0.505005 0.105455 0.322153 0.500015
0.105482 0.367426 0.524231 0.105455 0.322153 0.500015
0.105455 0.322153 0.500015 0.105632 0.613519 0.505005
0.105632 0.613519 0.505005 0.105544 0.468683 0.466553
0.105455 0.322153 0.500015 0.105544 0.468683 0.466553
0.105544 0.468683 0.466553 0.105632 0.613519 0.505005
0.105632 0.613519 0.505005 0.105665 0.667947 0.458130
0.105544 0.468683 0.466553 0.105665 0.667947 0.458130
0.105544 0.468683 0.466553 0.105665 0.667947 0.458130
0.105665 0.667947 0.458130 0.105595 0.553278 0.448608
0.105544 0.468683 0.466553 0.105595 0.553278 0.448608
0.105595 0.553278 0.448608 0.105665 0.667947 0.458130
0.105665 0.667947 0.458130 0.105616 0.587701 0.426270
0.105595 0.553278 0.448608 0.105616 0.587701 0.426270
0.105616 0.587701 0.426270 0.105665 0.667947 0.458130
0.105665 0.667947 0.458130 0.105688 0.707086 0.395142
0.105616 0.587701 0.426270 0.105688 0.707086 0.395142
0.105616 0.587701 0.426270 0.105688 0.707086 0.395142
0.105688 0.707086 0.395142 0.105633 0.616266 0.395142
0.105616 0.587701 0.426270 0.105633 0.616266 0.395142
0.106030 1.271051 0.133667 0.105972 1.175836 0.133667
0.105972 1.175836 0.133667 0.105956 1.148782 0.104599
0.106030 1.271051 0.133667 0.105956 1.148782 0.104599
0.106030 1.271051 0.133667 0.105956 1.148782 0.104599
0.105956 1.148782 0.104599 0.105936 1.115228 0.083313
0.106030 1.271051 0.133667 0.105936 1.115228 0.083313
0.106030 1.271051 0.133667 0.105936 1.115228 0.083313
0.105936 1.115228 0.083313 0.106005 1.229623 0.071915
0.106030 1.271051 0.133667 0.106005 1.229623 0.071915
0.106005 1.229623 0.071915 0.105936 1.115228 0.083313
0.105936 1.115228 0.083313 0.105886 1.032648 0.065918
0.106005 1.229623 0.071915 0.105886 1.032648 0.065918
0.106005 1.229623 0.071915 0.105886 1.032648 0.065918
0.105886 1.032648 0.065918 0.105789 0.873758 0.041107
0.106005 1.229623 0.071915 0.105789 0.873758 0.041107
0.106005 1.229623 0.071915 0.105789 0.873758 0.041107
0.105789 0.873758 0.041107 0.105972 1.174921 0.026550
0.106005 1.229623 0.071915 0.105972 1.174921 0.026550
0.105972 1.174921 0.026550 0.105789 0.873758 0.041107
0.105789 0.873758 0.041107 0.105818 0.921869 0.012451
0.105972 1.174921 0.026550 0.105818 0.921869 0.012451
0.105972 1.174921 0.026550 0.105818 0.921869 0.012451
0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328
0.105972 1.174921 0.026550 0.105932 1.108682 -0.001328
0.105932 1.108682 -0.001328 0.105818 0.921869 0.012451
0.105818 0.921869 0.012451 0.105851 0.974924 -0.004852
0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852
0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852
0.105851 0.974924 -0.004852 0.105886 1.032648 -0.010620
0.105932 1.108682 -0.001328 0.105886 1.032648 -0.010620
0.105797 0.886118 0.500015 0.105772 0.845148 0.466553
0.105772 0.845148 0.466553 0.105886 1.032648 0.466553
0.105797 0.886118 0.500015 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.105772 0.845148 0.466553
0.105772 0.845148 0.466553 0.105842 0.960870 0.452271
0.105886 1.032648 0.466553 0.105842 0.960870 0.452271
0.105842 0.960870 0.452271 0.105772 0.845148 0.466553
0.105772 0.845148 0.466553 0.105750 0.809076 0.423294
0.105842 0.960870 0.452271 0.105750 0.809076 0.423294
0.105842 0.960870 0.452271 0.105750 0.809076 0.423294
0.105750 0.809076 0.423294 0.105805 0.900446 0.410889
0.105842 0.960870 0.452271 0.105805 0.900446 0.410889
0.105805 0.900446 0.410889 0.105750 0.809076 0.423294
0.105750 0.809076 0.423294 0.105734 0.782892 0.375549
0.105805 0.900446 0.410889 0.105734 0.782892 0.375549
0.105805 0.900446 0.410889 0.105734 0.782892 0.375549
0.105734 0.782892 0.375549 0.105779 0.857599 0.345337
0.105805 0.900446 0.410889 0.105779 0.857599 0.345337
0.105779 0.857599 0.345337 0.105734 0.782892 0.375549
0.105734 0.782892 0.375549 0.105725 0.766962 0.324142
0.105779 0.857599 0.345337 0.105725 0.766962 0.324142
0.105779 0.857599 0.345337 0.105725 0.766962 0.324142
0.105725 0.766962 0.324142 0.105721 0.761652 0.269897
0.105779 0.857599 0.345337 0.105721 0.761652 0.269897
0.105779 0.857599 0.345337 0.105721 0.761652 0.269897
0.105721 0.761652 0.269897 0.105770 0.842218 0.269165
0.105779 0.857599 0.345337 0.105770 0.842218 0.269165
0.105770 0.842218 0.269165 0.105721 0.761652 0.269897
0.105721 0.761652 0.269897 0.105779 0.856134 0.190247
0.105770 0.842218 0.269165 0.105779 0.856134 0.190247
0.105779 0.856134 0.190247 0.105721 0.761652 0.269897
0.105721 0.761652 0.269897 0.105732 0.779230 0.166809
0.105779 0.856134 0.190247 0.105732 0.779230 0.166809
0.105779 0.856134 0.190247 0.105732 0.779230 0.166809
0.105732 0.779230 0.166809 0.105803 0.896051 0.125977
0.105779 0.856134 0.190247 0.105803 0.896051 0.125977
0.105803 0.896051 0.125977 0.105732 0.779230 0.166809
0.105732 0.779230 0.166809 0.105841 0.959406 0.081665
0.105803 0.896051 0.125977 0.105841 0.959406 0.081665
0.105841 0.959406 0.081665 0.105732 0.779230 0.166809
0.105732 0.779230 0.166809 0.105763 0.830866 0.080933
0.105841 0.959406 0.081665 0.105763 0.830866 0.080933
0.105841 0.959406 0.081665 0.105763 0.830866 0.080933
0.105763 0.830866 0.080933 0.105886 1.032648 0.065918
0.105841 0.959406 0.081665 0.105886 1.032648 0.065918
0.105886 1.032648 0.065918 0.105763 0.830866 0.080933
0.105763 0.830866 0.080933 0.105789 0.873758 0.041107
0.105886 1.032648 0.065918 0.105789 0.873758 0.041107
0.105886 1.033380 0.543823 0.105854 0.980600 0.538925
0.105854 0.980600 0.538925 0.105933 1.110422 0.534119
0.105886 1.033380 0.543823 0.105933 1.110422 0.534119
0.105933 1.110422 0.534119 0.105854 0.980600 0.538925
0.105854 0.980600 0.538925 0.105824 0.931390 0.524231
0.105933 1.110422 0.534119 0.105824 0.931390 0.524231
0.105933 1.110422 0.534119 0.105824 0.931390 0.524231
0.105824 0.931390 0.524231 0.105973 1.177484 0.505005
0.105933 1.110422 0.534119 0.105973 1.177484 0.505005
0.105973 1.177484 0.505005 0.105824 0.931390 0.524231
0.105824 0.931390 0.524231 0.105797 0.886118 0.500015
0.105973 1.177484 0.505005 0.105797 0.886118 0.500015
0.105973 1.177484 0.505005 0.105797 0.886118 0.500015
0.105797 0.886118 0.500015 0.105886 1.032648 0.466553
0.105973 1.177484 0.505005 0.105886 1.032648 0.466553
0.105973 1.177484 0.505005 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.106006 1.231912 0.458130
0.105973 1.177484 0.505005 0.106006 1.231912 0.458130
0.106006 1.231912 0.458130 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.105937 1.117242 0.448608
0.106006 1.231912 0.458130 0.105937 1.117242 0.448608
0.106006 1.231912 0.458130 0.105937 1.117242 0.448608
0.105937 1.117242 0.448608 0.105958 1.151666 0.426270
0.106006 1.231912 0.458130 0.105958 1.151666 0.426270
0.106006 1.231912 0.458130 0.105958 1.151666 0.426270
0.105958 1.151666 0.426270 0.105975 1.180231 0.395142
0.106006 1.231912 0.458130 0.105975 1.180231 0.395142
0.106006 1.231912 0.458130 0.105975 1.180231 0.395142
0.105975 1.180231 0.395142 0.106030 1.271051 0.395142
0.106006 1.231912 0.458130 0.106030 1.271051 0.395142
0.105972 1.175836 0.133667 0.106030 1.271051 0.133667
0.106030 1.271051 0.133667 0.105956 1.148782 0.104599
0.105972 1.175836 0.133667 0.105956 1.148782 0.104599
0.105956 1.148782 0.104599 0.106030 1.271051 0.133667
0.106030 1.271051 0.133667 0.105936 1.115228 0.083313
0.105956 1.148782 0.104599 0.105936 1.115228 0.083313
0.105936 1.115228 0.083313 0.106030 1.271051 0.133667
0.106030 1.271051 0.133667 0.106005 1.229623 0.071915
0.105936 1.115228 0.083313 0.106005 1.229623 0.071915
0.105936 1.115228 0.083313 0.106005 1.229623 0.071915
0.106005 1.229623 0.071915 0.105886 1.032648 0.065918
0.105936 1.115228 0.083313 0.105886 1.032648 0.065918
0.105886 1.032648 0.065918 0.106005 1.229623 0.071915
0.106005 1.229623 0.071915 0.105789 0.873758 0.041107
0.105886 1.032648 0.065918 0.105789 0.873758 0.041107
0.105789 0.873758 0.041107 0.106005 1.229623 0.071915
0.106005 1.229623 0.071915 0.105972 1.174921 0.026550
0.105789 0.873758 0.041107 0.105972 1.174921 0.026550
0.105789 0.873758 0.041107 0.105972 1.174921 0.026550
0.105972 1.174921 0.026550 0.105818 0.921869 0.012451
0.105789 0.873758 0.041107 0.105818 0.921869 0.012451
0.105818 0.921869 0.012451 0.105972 1.174921 0.026550
0.105972 1.174921 0.026550 0.105932 1.108682 -0.001328
0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328
0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328
0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852
0.105818 0.921869 0.012451 0.105851 0.974924 -0.004852
0.105851 0.974924 -0.004852 0.105932 1.108682 -0.001328
0.105932 1.108682 -0.001328 0.105886 1.032648 -0.010620
0.105851 0.974924 -0.004852 0.105886 1.032648 -0.010620
0.105797 0.886118 0.500015 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.105772 0.845148 0.466553
0.105797 0.886118 0.500015 0.105772 0.845148 0.466553
0.105772 0.845148 0.466553 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.105842 0.960870 0.452271
0.105772 0.845148 0.466553 0.105842 0.960870 0.452271
0.105772 0.845148 0.466553 0.105842 0.960870 0.452271
0.105842 0.960870 0.452271 0.105750 0.809076 0.423294
0.105772 0.845148 0.466553 0.105750 0.809076 0.423294
0.105750 0.809076 0.423294 0.105842 0.960870 0.452271
0.105842 0.960870 0.452271 0.105805 0.900446 0.410889
0.105750 0.809076 0.423294 0.105805 0.900446 0.410889
0.105750 0.809076 0.423294 0.105805 0.900446 0.410889
0.105805 0.900446 0.410889 0.105734 0.782892 0.375549
0.105750 0.809076 0.423294 0.105734 0.782892 0.375549
0.105734 0.782892 0.375549 0.105805 0.900446 0.410889
0.105805 0.900446 0.410889 0.105779 0.857599 0.345337
0.105734 0.782892 0.375549 0.105779 0.857599 0.345337
0.105734 0.782892 0.375549 0.105779 0.857599 0.345337
0.105779 0.857599 0.345337 0.105725 0.766962 0.324142
0.105734 0.782892 0.375549 0.105725 0.766962 0.324142
0.105725 0.766962 0.324142 0.105779 0.857599 0.345337
0.105779 0.857599 0.345337 0.105721 0.761652 0.269897
0.105725 0.766962 0.324142 0.105721 0.761652 0.269897
0.105721 0.761652 0.269897 0.105779 0.857599 0.345337
0.105779 0.857599 0.345337 0.105770 0.842218 0.269165
0.105721 0.761652 0.269897 0.105770 0.842218 0.269165
0.105721 0.761652 0.269897 0.105770 0.842218 0.269165
0.105770 0.842218 0.269165 0.105779 0.856134 0.190247
0.105721 0.761652 0.269897 0.105779 0.856134 0.190247
0.105721 0.761652 0.269897 0.105779 0.856134 0.190247
0.105779 0.856134 0.190247 0.105732 0.779230 0.166809
0.105721 0.761652 0.269897 0.105732 0.779230 0.166809
0.105732 0.779230 0.166809 0.105779 0.856134 0.190247
0.105779 0.856134 0.190247 0.105803 0.896051 0.125977
0.105732 0.779230 0.166809 0.105803 0.896051 0.125977
0.105732 0.779230 0.166809 0.105803 0.896051 0.125977
0.105803 0.896051 0.125977 0.105841 0.959406 0.081665
0.105732 0.779230 0.166809 0.105841 0.959406 0.081665
0.105732 0.779230 0.166809 0.105841 0.959406 0.081665
0.105841 0.959406 0.081665 0.105763 0.830866 0.080933
0.105732 0.779230 0.166809 0.105763 0.830866 0.080933
0.105763 0.830866 0.080933 0.105841 0.959406 0.081665
0.105841 0.959406 0.081665 0.105886 1.032648 0.065918
0.105763 0.830866 0.080933 0.105886 1.032648 0.065918
0.105763 0.830866 0.080933 0.105886 1.032648 0.065918
0.105886 1.032648 0.065918 0.105789 0.873758 0.041107
0.105763 0.830866 0.080933 0.105789 0.873758 0.041107
0.105854 0.980600 0.538925 0.105886 1.033380 0.543823
0.105886 1.033380 0.543823 0.105933 1.110422 0.534119
0.105854 0.980600 0.538925 0.105933 1.110422 0.534119
0.105854 0.980600 0.538925 0.105933 1.110422 0.534119
0.105933 1.110422 0.534119 0.105824 0.931390 0.524231
0.105854 0.980600 0.538925 0.105824 0.931390 0.524231
0.105824 0.931390 0.524231 0.105933 1.110422 0.534119
0.105933 1.110422 0.534119 0.105973 1.177484 0.505005
0.105824 0.931390 0.524231 0.105973 1.177484 0.505005
0.105824 0.931390 0.524231 0.105973 1.177484 0.505005
0.105973 1.177484 0.505005 0.105797 0.886118 0.500015
0.105824 0.931390 0.524231 0.105797 0.886118 0.500015
0.105797 0.886118 0.500015 0.105973 1.177484 0.505005
0.105973 1.177484 0.505005 0.105886 1.032648 0.466553
0.105797 0.886118 0.500015 0.105886 1.032648 0.466553
0.105886 1.032648 0.466553 0.105973 1.177484 0.505005
0.105973 1.177484 0.505005 0.106006 1.231912 0.458130
0.105886 1.032648 0.466553 0.106006 1.231912 0.458130
0.105886 1.032648 0.466553 0.106006 1.231912 0.458130
0.106006 1.231912 0.458130 0.105937 1.117242 0.448608
0.105886 1.032648 0.466553 0.105937 1.117242 0.448608
0.105937 1.117242 0.448608 0.106006 1.231912 0.458130
0.106006 1.231912 0.458130 0.105958 1.151666 0.426270
0.105937 1.117242 0.448608 0.105958 1.151666 0.426270
0.105958 1.151666 0.426270 0.106006 1.231912 0.458130
0.106006 1.231912 0.458130 0.106030 1.271051 0.395142
0.105958 1.151666 0.426270 0.106030 1.271051 0.395142
0.105958 1.151666 0.426270 0.106030 1.271051 0.395142
0.106030 1.271051 0.395142 0.105975 1.180231 0.395142
0.105958 1.151666 0.426270 0.105975 1.180231 0.395142
+1280
View File
File diff suppressed because it is too large. Load diff
+42
View File
@@ -0,0 +1,42 @@
1e+06 0 -18084
987688 156434 -15630
951056 309016 -201
891006 453990 5139
809017 587785 24594
707106 707106 -19208
587785 809016 -21229
453990 891006 -15010
309017 951056 -13161
156434 987688 20032
0 999999 -20092
-156434 987688 -7521
-309016 951056 18472
-453990 891006 8668
-587785 809017 -12963
-707106 707106 -22986
-809016 587785 -19944
-891006 453990 15048
-951056 309017 20336
-987688 156434 6819
-999999 0 13015
-987688 -156434 7485
-951056 -309016 -15857
-891006 -453990 6584
-809017 -587785 21741
-707106 -707106 -1338
-587785 -809016 -1247
-453990 -891006 2410
-309017 -951056 14432
-156434 -987688 12342
0 -999999 5533
156434 -987688 2973
309016 -951056 21713
453990 -891006 -19668
587785 -809017 -16888
707106 -707106 21307
809016 -587785 -13876
891006 -453990 -13116
951056 -309017 -18702
987688 -156434 -2036
1e+06 0 -18084
0 0 0
+781
View File
@@ -0,0 +1,781 @@
-4851 33852 0
-5301 32379 0
-5487 31325 0
-5115 30101 0
-4014 29062 0
-2573 28675 0
-1498 28633 0
-423 28592 0
651 28551 0
1790 27985 0
2929 27419 0
3632 26603 0
4334 25786 0
5037 24970 0
5409 23699 0
5781 22428 0
6153 21157 0
5928 20173 0
5704 19189 0
5680 17693 0
5657 16197 0
6122 15255 0
6587 14314 0
7052 13372 0
7517 12431 0
8401 11237 0
8571 11268 0
8982 12710 0
9393 14151 0
9889 15213 0
10385 16275 0
11185 17205 0
11986 18135 0
12787 19065 0
13516 19785 0
14244 20506 0
14973 21227 0
15701 21948 0
16729 22630 0
17757 23312 0
18786 23994 0
19741 24490 0
20697 24986 0
21653 25482 0
22924 26737 0
23420 27677 0
23916 28618 0
24412 29558 0
24893 30907 0
25373 32255 0
0 0 0
-5890 33991 0
-6083 32666 0
-6277 31341 0
-5936 29822 0
-4557 28380 0
-2836 27838 0
-1756 27796 0
-676 27755 0
403 27714 0
1689 27233 0
2658 26427 0
3627 25621 0
4185 24668 0
4743 23715 0
4983 22475 0
5223 21235 0
5073 20155 0
4923 19075 0
4774 17995 0
4758 16833 0
4743 15670 0
5266 14779 0
5789 13888 0
6312 12996 0
6835 12105 0
7445 11160 0
8054 10214 0
8664 9269 0
9362 7471 0
10049 6680 0
10736 5890 0
11423 5099 0
12282 4274 0
13140 3450 0
13999 2625 0
14858 1801 0
15717 976 0
16972 573 0
18197 1007 0
18631 1550 0
19623 1472 0
20599 1069 0
21917 -124 0
0 0 0
22707 620 0
21343 1875 0
20049 2348 0
18755 2821 0
17786 3410 0
16817 3999 0
15748 4611 0
14678 5223 0
13632 5332 0
12586 5440 0
11578 6262 0
10431 7657 0
9842 9114 0
9455 11051 0
9594 11981 0
10075 13857 0
10586 14911 0
11098 15965 0
12152 17329 0
13004 18160 0
13857 18992 0
14709 19824 0
15593 20320 0
16476 20816 0
17360 21312 0
18135 22041 0
18910 22769 0
19741 23343 0
20573 23916 0
21405 24490 0
22482 25443 0
23560 26396 0
24288 27435 0
25017 28473 0
25347 29455 0
25678 30436 0
26009 31418 0
26210 32767 0
26412 34115 0
0 0 0
6525 21638 -30
6335 20611 -30
6145 19584 -30
5955 18557 -30
5766 17530 -30
5797 16259 -30
6401 16523 -30
7540 16918 -30
8680 17313 -30
9594 17825 -30
10462 17747 -30
11353 16941 -30
12245 16135 -30
12973 17019 -30
0 0 0
10385 17577 -30
9625 17654 -30
8742 17251 -30
7571 16848 -30
6401 16445 -30
5828 16182 -30
6296 15236 -30
6765 14291 -30
7234 13345 -30
7703 12400 -30
8881 12570 -30
10059 12245 -30
10788 12849 -30
11160 14678 -30
12152 15996 -30
11268 16786 -30
10385 17577 -30
10385 17577 -30
0 0 0
10323 13903 -30
9331 14182 -30
9346 14229 -30
10338 13950 -30
10323 13903 -30
10323 13903 -30
0 0 0
10571 14430 -30
9579 14709 -30
9594 14756 -30
10586 14477 -30
10571 14430 -30
10571 14430 -30
0 0 0
10757 14880 -30
9765 15159 -30
9780 15205 -30
10772 14926 -30
10757 14880 -30
10757 14880 -30
0 0 0
0 0 0
8602 16492 -30
8602 16492 -841
8525 16678 -841
8602 16492 -570
8525 16678 -570
8602 16492 -300
8525 16678 -300
8602 16492 -30
8525 16678 -30
8525 16678 -841
8711 16647 -841
8525 16678 -570
8711 16647 -570
8525 16678 -300
8711 16647 -300
8525 16678 -30
8711 16647 -30
8711 16647 -841
8602 16492 -841
8711 16647 -570
8602 16492 -570
8711 16647 -300
8602 16492 -300
8711 16647 -30
8602 16492 -30
8602 16492 -841
8602 16492 -841
8602 16492 -570
8602 16492 -570
8602 16492 -300
8602 16492 -300
8602 16492 -30
8602 16492 -30
0 0 0
7905 16151 -30
7905 16151 -725
7827 16182 -725
7905 16151 -377
7827 16182 -377
7905 16151 -30
7827 16182 -30
7827 16182 -725
7781 16275 -725
7827 16182 -377
7781 16275 -377
7827 16182 -30
7781 16275 -30
7781 16275 -725
7812 16337 -725
7781 16275 -377
7812 16337 -377
7781 16275 -30
7812 16337 -30
7812 16337 -725
7889 16383 -725
7812 16337 -377
7889 16383 -377
7812 16337 -30
7889 16383 -30
7889 16383 -725
7967 16352 -725
7889 16383 -377
7967 16352 -377
7889 16383 -30
7967 16352 -30
7967 16352 -725
8013 16259 -725
7967 16352 -377
8013 16259 -377
7967 16352 -30
8013 16259 -30
8013 16259 -725
7982 16182 -725
8013 16259 -377
7982 16182 -377
8013 16259 -30
7982 16182 -30
7982 16182 -725
7905 16151 -725
7982 16182 -377
7905 16151 -377
7982 16182 -30
7905 16151 -30
7905 16151 -725
7905 16151 -725
7905 16151 -377
7905 16151 -377
7905 16151 -30
7905 16151 -30
0 0 0
8246 13082 -30
8246 13082 -250
8277 13159 -250
8246 13082 -30
8277 13159 -30
8277 13159 -250
8556 13082 -250
8277 13159 -30
8556 13082 -30
8556 13082 -250
8525 13004 -250
8556 13082 -30
8525 13004 -30
8525 13004 -250
8246 13082 -250
8525 13004 -30
8246 13082 -30
8246 13082 -250
8246 13082 -250
8246 13082 -30
8246 13082 -30
0 0 0
8416 13981 -30
8416 13981 -450
8478 14151 -450
8416 13981 -240
8478 14151 -240
8416 13981 -30
8478 14151 -30
8478 14151 -450
8649 14089 -450
8478 14151 -240
8649 14089 -240
8478 14151 -30
8649 14089 -30
8649 14089 -450
8587 13919 -450
8649 14089 -240
8587 13919 -240
8649 14089 -30
8587 13919 -30
8587 13919 -450
8416 13981 -450
8587 13919 -240
8416 13981 -240
8587 13919 -30
8416 13981 -30
8416 13981 -450
8416 13981 -450
8416 13981 -240
8416 13981 -240
8416 13981 -30
8416 13981 -30
0 0 0
7657 13640 -30
7657 13640 -630
7595 13795 -630
7657 13640 -330
7595 13795 -330
7657 13640 -30
7595 13795 -30
7595 13795 -630
7750 13857 -630
7595 13795 -330
7750 13857 -330
7595 13795 -30
7750 13857 -30
7750 13857 -630
7812 13702 -630
7750 13857 -330
7812 13702 -330
7750 13857 -30
7812 13702 -30
7812 13702 -630
7657 13640 -630
7812 13702 -330
7657 13640 -330
7812 13702 -30
7657 13640 -30
7657 13640 -630
7657 13640 -630
7657 13640 -330
7657 13640 -330
7657 13640 -30
7657 13640 -30
0 0 0
6882 15267 -30
6882 15267 -600
6820 15422 -600
6882 15267 -410
6820 15422 -410
6882 15267 -220
6820 15422 -220
6882 15267 -30
6820 15422 -30
6820 15422 -600
6975 15484 -600
6820 15422 -410
6975 15484 -410
6820 15422 -220
6975 15484 -220
6820 15422 -30
6975 15484 -30
6975 15484 -600
7037 15329 -600
6975 15484 -410
7037 15329 -410
6975 15484 -220
7037 15329 -220
6975 15484 -30
7037 15329 -30
7037 15329 -600
6882 15267 -600
7037 15329 -410
6882 15267 -410
7037 15329 -220
6882 15267 -220
7037 15329 -30
6882 15267 -30
6882 15267 -600
6882 15267 -600
6882 15267 -410
6882 15267 -410
6882 15267 -220
6882 15267 -220
6882 15267 -30
6882 15267 -30
0 0 0
8339 14461 -30
8339 14461 -500
8261 14647 -500
8339 14461 -265
8261 14647 -265
8339 14461 -30
8261 14647 -30
8261 14647 -500
8401 14709 -500
8261 14647 -265
8401 14709 -265
8261 14647 -30
8401 14709 -30
8401 14709 -500
8478 14523 -500
8401 14709 -265
8478 14523 -265
8401 14709 -30
8478 14523 -30
8478 14523 -500
8339 14461 -500
8478 14523 -265
8339 14461 -265
8478 14523 -30
8339 14461 -30
8339 14461 -500
8339 14461 -500
8339 14461 -265
8339 14461 -265
8339 14461 -30
8339 14461 -30
0 0 0
7440 13500 -30
7440 13500 -350
7300 13438 -350
7440 13500 -190
7300 13438 -190
7440 13500 -30
7300 13438 -30
7300 13438 -350
7223 13609 -350
7300 13438 -190
7223 13609 -190
7300 13438 -30
7223 13609 -30
7223 13609 -350
7362 13671 -350
7223 13609 -190
7362 13671 -190
7223 13609 -30
7362 13671 -30
7362 13671 -350
7440 13500 -350
7362 13671 -190
7440 13500 -190
7362 13671 -30
7440 13500 -30
7440 13500 -350
7440 13500 -350
7440 13500 -190
7440 13500 -190
7440 13500 -30
7440 13500 -30
0 0 0
7192 11547 0
7192 11547 -30
7292 11698 -151
7393 11849 -191
7494 12000 -151
7595 12152 -30
7595 12152 0
0 0 0
7269 11501 0
7269 11501 -30
7366 11652 -149
7463 11803 -189
7560 11954 -149
7657 12105 -30
7657 12105 0
0 0 0
5688 14198 0
5688 14198 -80
5866 14291 -130
6223 14477 -30
6401 14570 -30
6223 14477 -130
5866 14291 -30
5688 14198 -80
0 0 0
6401 14570 -30
6401 14570 0
0 0 0
6370 14632 0
6370 14632 -80
6192 14539 -130
5835 14353 -30
5657 14260 -30
5835 14353 -130
6192 14539 -30
6370 14632 -80
0 0 0
5657 14260 -30
5657 14260 0
0 0 0
9641 12369 0
9641 12369 -30
9482 12411 -139
9323 12454 -176
9164 12496 -139
9005 12539 -30
9005 12539 0
0 0 0
9610 12260 0
9610 12260 -30
9451 12303 -139
9292 12345 -176
9133 12388 -139
8974 12431 -30
8974 12431 0
0 0 0
10168 13950 -30
10092 13971 -60
10016 13993 -150
9902 14025 -60
9788 14058 -35
9674 14091 -60
9560 14123 -150
9484 14145 -60
9408 14167 -30
0 0 0
10016 13993 -150
10016 13993 0
0 0 0
9560 14123 -150
9560 14123 0
0 0 0
10183 13996 -30
10107 14018 -60
10031 14039 -150
9917 14072 -60
9803 14105 -35
9689 14137 -60
9575 14170 -150
9499 14191 -60
9424 14213 -30
0 0 0
10031 14039 -150
10031 14039 0
0 0 0
9575 14170 -150
9575 14170 0
0 0 0
10369 14492 -30
10296 14512 -60
10223 14532 -150
10114 14563 -60
10005 14593 -35
9895 14623 -60
9786 14653 -150
9713 14673 -60
9641 14694 -30
0 0 0
10223 14532 -150
10223 14532 0
0 0 0
9786 14653 -150
9786 14653 0
0 0 0
10385 14539 -30
10312 14559 -60
10239 14579 -150
10130 14609 -60
10020 14639 -35
9911 14669 -60
9802 14700 -150
9729 14720 -60
9656 14740 -30
0 0 0
10239 14579 -150
10239 14579 0
0 0 0
9802 14700 -150
9802 14700 0
0 0 0
10602 14926 -30
10526 14948 -60
10450 14969 -150
10336 15002 -60
10222 15035 -35
10108 15067 -60
9994 15100 -150
9918 15121 -60
9842 15143 -30
0 0 0
10450 14969 -150
10450 14969 0
0 0 0
9994 15100 -150
9994 15100 0
0 0 0
10617 14973 -30
10541 14994 -60
10465 15016 -150
10351 15048 -60
10237 15081 -35
10123 15114 -60
10009 15146 -150
9933 15168 -60
9858 15190 -30
0 0 0
10465 15016 -150
10465 15016 0
0 0 0
10009 15146 -150
10009 15146 0
0 0 0
8416 11640 0
8277 11749 0
8385 11873 0
8509 11764 0
8416 11640 0
8416 11640 0
0 0 0
6432 21638 -30
6246 20626 -30
6060 19615 -30
5874 18603 -30
5688 17592 -30
5735 16213 -30
4107 15314 -30
4138 15236 -30
5766 16151 -30
6479 14694 -30
5099 13965 -30
5130 13903 -30
6510 14632 -30
7044 13531 -30
7579 12431 -30
7579 12136 -30
6789 10943 -30
6851 10881 -30
7781 12291 -30
8866 12462 -30
10106 12152 -30
10819 11516 -30
10839 10493 -30
10860 9470 -30
10881 8447 -30
11051 7827 -30
9300 7037 -30
9346 6959 -30
11098 7750 -30
11532 7083 -30
12198 6680 -30
0 0 0
12260 6820 -30
11640 7223 -30
11253 7812 -30
11051 8509 -30
11016 9567 -30
10981 10625 -30
10946 11683 -30
10912 12741 -30
11284 14601 -30
12183 15779 -30
13082 16957 -30
0 0 0
10788 11702 -30
10199 12198 -30
10757 12663 -30
10788 11702 -30
10788 11702 -30
0 0 0
10524 7579 0
10524 7579 -30
10261 7463 -222
9997 7347 -286
9734 7230 -222
9470 7114 -30
9470 7114 0
0 0 0
10602 7517 0
10602 7517 -30
10338 7401 -222
10075 7285 -286
9811 7168 -222
9548 7052 -30
9548 7052 0
0 0 0
16352 1581 0
15558 2305 0
14763 3030 0
13969 3754 0
13175 4479 0
14260 4495 0
15391 4045 0
16316 3410 0
17241 2774 0
18166 2139 0
18150 1720 0
17670 1457 0
16352 1581 0
16352 1581 0
0 0 0
20227 976 -30
20754 2402 -30
20692 2418 -30
20165 1038 -30
20227 976 -30
20227 976 -30
0 0 0
16724 21018 0
17507 21700 0
18290 22382 0
18150 22521 0
17088 21979 0
16027 21436 0
14802 20181 0
15763 20599 0
16724 21018 0
16724 21018 0
0 0 0
12400 17019 -30
11408 17949 -30
11470 17980 -30
12446 17050 -30
12400 17019 -30
12400 17019 -30
0 0 0
16414 20553 -30
15624 21963 -30
15686 22025 -30
16476 20599 -30
16414 20553 -30
16414 20553 -30
0 0 0
19654 23002 -30
18693 24242 -30
18770 24288 -30
19747 23048 -30
19654 23002 -30
19654 23002 -30
0 0 0
5704 17887 -30
4371 18228 -30
4402 18290 -30
5750 17933 -30
5704 17887 -30
5704 17887 -30
0 0 0
6138 22521 -30
4836 22335 -30
4836 22444 -30
6138 22614 -30
6138 22521 -30
6138 22521 -30
0 0 0
-4913 32472 -30
-6463 32643 -30
-6401 32736 -30
-4944 32581 -30
-4913 32472 -30
-4913 32472 -30
0 0 0
26365 31976 -30
24939 32302 -30
24986 32410 -30
26412 32069 -30
26365 31976 -30
26365 31976 -30
0 0 0
0 0 0
+9
View File
@@ -0,0 +1,9 @@
AlWuzEre 48
-1 -1 -1 -1 -1 1
-1 -1 -1 -1 1 -1
-1 1 1 -1 -1 1
-1 1 1 -1 1 -1
-1 -1 1 1 0 0
-1 -1 -1 1 0 0
-1 1 -1 1 0 0
-1 1 1 1 0 0
+264
View File
@@ -0,0 +1,264 @@
6511 -1785 -30
6267 -952 -30
7095 -739 -30
7339 -1571 -30
6511 -1785 -30
6803 -1262 -577
7095 -739 -30
0 0 0
6267 -952 -30
6803 -1262 -577
7339 -1571 -30
0 0 0
24046 -16204 -30
23575 -15543 -30
24236 -15072 -30
24707 -15732 -30
24046 -16204 -30
24141 -15638 -546
24236 -15072 -30
0 0 0
23575 -15543 -30
24141 -15638 -546
24707 -15732 -30
0 0 0
26090 -16254 -30
25960 -16064 -30
26150 -15934 -30
26280 -16124 -30
26090 -16254 -30
26120 -16094 -176
26150 -15934 -30
0 0 0
25960 -16064 -30
26120 -16094 -176
26280 -16124 -30
0 0 0
41193 -15685 -30
40827 -15165 -30
41348 -14799 -30
41714 -15320 -30
41193 -15685 -30
41271 -15242 -434
41348 -14799 -30
0 0 0
40827 -15165 -30
41271 -15242 -434
41714 -15320 -30
0 0 0
17255 -4645 -30
16887 -4140 -30
17410 -3759 -30
17776 -4280 -30
17255 -4645 -30
17332 -4206 -434
17410 -3759 -30
0 0 0
16887 -4140 -30
17332 -4206 -434
17776 -4280 -30
0 0 0
45863 -17213 -30
45495 -16708 -30
46018 -16327 -30
46383 -16848 -30
45863 -17213 -30
45940 -16774 -434
46018 -16327 -30
0 0 0
45495 -16708 -30
45940 -16774 -434
46383 -16848 -30
0 0 0
66583 -8805 -30
66112 -8145 -30
66772 -7673 -30
67243 -8334 -30
66583 -8805 -30
66678 -8239 -546
66772 -7673 -30
0 0 0
66112 -8145 -30
66678 -8239 -546
67243 -8334 -30
0 0 0
75995 -18851 -30
76008 -18777 -150
75338 -17822 -150
75264 -17810 -30
75995 -18851 -30
77039 -18105 -30
76008 -18777 -150
76964 -18092 -150
0 0 0
77039 -18105 -30
76292 -17062 -30
75264 -17810 -30
0 0 0
76964 -18092 -150
76280 -17136 -150
75338 -17822 -150
0 0 0
76280 -17136 -150
76292 -17062 -30
0 0 0
76021 -18702 -150
76033 -18628 -270
75485 -17847 -270
75412 -17835 -150
76021 -18702 -150
76890 -18080 -150
76033 -18628 -270
76816 -18068 -270
0 0 0
76890 -18080 -150
76268 -17211 -150
75412 -17835 -150
0 0 0
76816 -18068 -270
76256 -17285 -270
75485 -17847 -270
0 0 0
76256 -17285 -270
76268 -17211 -150
0 0 0
76046 -18553 -270
76059 -18479 -391
75632 -17871 -391
75559 -17859 -270
76046 -18553 -270
76742 -18055 -270
76059 -18479 -391
76667 -18043 -391
0 0 0
76742 -18055 -270
76244 -17360 -270
75559 -17859 -270
0 0 0
76667 -18043 -391
76232 -17435 -391
75632 -17871 -391
0 0 0
76232 -17435 -391
76244 -17360 -270
0 0 0
76072 -18404 -391
76084 -18330 -511
75780 -17896 -511
75706 -17884 -391
76072 -18404 -391
76593 -18031 -391
76084 -18330 -511
76519 -18019 -511
0 0 0
76593 -18031 -391
76220 -17509 -391
75706 -17884 -391
0 0 0
76519 -18019 -511
76208 -17584 -511
75780 -17896 -511
0 0 0
76208 -17584 -511
76220 -17509 -391
0 0 0
76097 -18255 -511
76110 -18180 -632
75927 -17920 -632
75853 -17908 -511
76097 -18255 -511
76445 -18006 -511
76110 -18180 -632
76370 -17994 -632
0 0 0
76445 -18006 -511
76196 -17658 -511
75853 -17908 -511
0 0 0
76370 -17994 -632
76184 -17733 -632
75927 -17920 -632
0 0 0
76184 -17733 -632
76196 -17658 -511
0 0 0
76122 -18106 -632
76135 -18031 -752
76074 -17945 -752
76000 -17932 -632
76122 -18106 -632
76296 -17982 -632
76135 -18031 -752
76222 -17969 -752
0 0 0
76296 -17982 -632
76172 -17808 -632
76000 -17932 -632
0 0 0
76222 -17969 -752
76160 -17882 -752
76074 -17945 -752
0 0 0
76160 -17882 -752
76172 -17808 -632
0 0 0
86332 -23736 -30
85964 -23231 -30
86486 -22850 -30
86852 -23371 -30
86332 -23736 -30
86408 -23297 -434
86486 -22850 -30
0 0 0
85964 -23231 -30
86408 -23297 -434
86852 -23371 -30
0 0 0
46429 -18090 -30
46299 -17900 -30
46489 -17770 -30
46619 -17960 -30
46429 -18090 -30
46459 -17930 -176
46489 -17770 -30
0 0 0
46299 -17900 -30
46459 -17930 -176
46619 -17960 -30
0 0 0
97292 -27848 -30
98318 -27115 -30
99051 -28141 -30
98025 -28874 -30
97292 -27848 -30
98171 -27994 -832
99051 -28141 -30
0 0 0
98318 -27115 -30
98171 -27994 -832
98025 -28874 -30
0 0 0
99469 -23347 -30
98998 -22687 -30
99659 -22216 -30
100130 -22876 -30
99469 -23347 -30
99564 -22782 -546
99659 -22216 -30
0 0 0
98998 -22687 -30
99564 -22782 -546
100130 -22876 -30
0 0 0
97982 -24924 -30
98832 -24323 -30
99434 -25173 -30
98583 -25775 -30
97982 -24924 -30
98708 -25049 -692
99434 -25173 -30
0 0 0
98832 -24323 -30
98708 -25049 -692
98583 -25775 -30
0 0 0
+464
View File
@@ -0,0 +1,464 @@
2114 800 0
2687 1012 0
3259 1225 0
3831 1437 0
4371 1643 0
4911 1850 0
5451 2056 0
5994 2188 0
6536 2319 0
7079 2451 0
7622 2582 0
8209 2583 0
8795 2583 0
9382 2583 0
9969 2584 0
10506 2538 0
11043 2492 0
11580 2446 0
12117 2400 0
12654 2354 0
13191 2308 0
13727 2263 0
14311 2479 0
14894 2695 0
15477 2911 0
16032 2778 0
16588 2646 0
17143 2514 0
17698 2381 0
18254 2249 0
18809 2117 0
19359 2161 0
19909 2206 0
20459 2251 0
21009 2295 0
21580 2303 0
22151 2311 0
22722 2319 0
23292 2327 0
23863 2335 0
24377 2205 0
24891 2074 0
25405 1944 0
25919 1813 0
26232 1326 0
26545 839 0
26857 352 0
27564 144 0
28270 -63 0
28746 -354 0
29222 -644 0
29698 -935 0
30195 -1072 0
30693 -1210 0
31190 -1347 0
31750 -1202 0
32310 -1057 0
32871 -912 0
33431 -767 0
33828 -421 0
34226 -75 0
34624 270 0
35297 270 0
35970 270 0
36578 138 0
37185 7 0
37571 -367 0
37957 -742 0
38305 -1111 0
38652 -1480 0
38865 -1972 0
39078 -2463 0
39658 -2795 0
40205 -2855 0
40752 -2916 0
41324 -2690 0
41895 -2465 0
42636 -2428 0
42638 -2412 0
43131 -2528 0
43623 -2643 0
44139 -2872 0
44655 -3100 0
45171 -3329 0
45687 -3557 0
46142 -3788 0
46598 -4018 0
47053 -4249 0
47509 -4479 0
47965 -4710 0
48420 -4940 0
48978 -5179 0
49535 -5417 0
50093 -5655 0
50650 -5893 0
51171 -6091 0
51691 -6289 0
52211 -6487 0
52731 -6684 0
53250 -6701 0
53768 -6717 0
54287 -6734 0
54806 -6750 0
55324 -6767 0
55843 -6783 0
56362 -6800 0
56873 -6702 0
57384 -6604 0
57895 -6507 0
58407 -6409 0
58918 -6311 0
59579 -6398 0
60240 -6485 0
60901 -6572 0
61338 -6873 0
61776 -7174 0
62214 -7476 0
62932 -7662 0
63649 -7848 0
64173 -8057 0
64697 -8265 0
65221 -8474 0
65624 -8836 0
66027 -9197 0
66602 -9340 0
67177 -9483 0
67810 -9430 0
68444 -9378 0
68978 -9462 0
69513 -9547 0
70047 -9631 0
70582 -9716 0
71116 -9800 0
71651 -9885 0
72185 -9970 0
72720 -10054 0
73255 -10139 0
73789 -10223 0
74324 -10308 0
74828 -10478 0
75332 -10648 0
75837 -10818 0
76341 -10988 0
76846 -11158 0
77350 -11329 0
77855 -11499 0
78359 -11669 0
78758 -12100 0
79157 -12531 0
79556 -12963 0
80006 -13234 0
80456 -13506 0
80906 -13777 0
81355 -14049 0
81805 -14320 0
82255 -14591 0
82807 -14806 0
83360 -15021 0
83912 -15236 0
84464 -15451 0
85016 -15665 0
85522 -15740 0
86028 -15815 0
86534 -15891 0
87040 -15966 0
87546 -16041 0
88052 -16116 0
88558 -16191 0
89172 -16276 0
89786 -16362 0
90400 -16448 0
91014 -16534 0
91601 -16424 0
92187 -16314 0
92774 -16204 0
93361 -16094 0
93916 -16151 0
94472 -16207 0
95027 -16264 0
95546 -16284 0
96065 -16304 0
96584 -16325 0
97103 -16345 0
97621 -16365 0
98140 -16385 0
98611 -16597 0
99083 -16809 0
99554 -17021 0
100083 -17023 0
100612 -17025 0
101142 -17027 0
101671 -17029 0
102200 -17031 0
102729 -17034 0
103258 -17036 0
103788 -17038 0
104317 -17040 0
104846 -17042 0
105375 -17044 0
105904 -17046 0
0 0 0
2162 465 0
2734 677 0
3306 889 0
3878 1102 0
4401 1258 0
4923 1415 0
5446 1571 0
5998 1713 0
6550 1856 0
7102 1998 0
7654 2140 0
8223 2185 0
8793 2231 0
9363 2277 0
9933 2323 0
10498 2255 0
11063 2187 0
11628 2120 0
12193 2052 0
12759 1984 0
13324 1916 0
13889 1849 0
14383 1940 0
14877 2032 0
15371 2123 0
15865 2215 0
16455 2139 0
17046 2062 0
17636 1986 0
18226 1910 0
18817 1834 0
19430 1895 0
20044 1955 0
20657 2016 0
21197 1992 0
21736 1969 0
22275 1946 0
22815 1923 0
23354 1900 0
23893 1877 0
24403 1566 0
24912 1255 0
25422 944 0
25885 597 0
26348 251 0
26811 -94 0
27425 -399 0
28040 -704 0
28486 -1100 0
28931 -1496 0
29377 -1892 0
29988 -1852 0
30598 -1812 0
31209 -1772 0
31785 -1571 0
32361 -1369 0
32937 -1168 0
33512 -967 0
34119 -597 0
34727 -228 0
35398 -181 0
36070 -134 0
36579 -299 0
37088 -464 0
37479 -800 0
37871 -1137 0
38329 -1889 0
38658 -2561 0
38931 -2959 0
39401 -3181 0
39994 -3193 0
40587 -3206 0
41154 -3066 0
41721 -2926 0
42286 -2919 0
42850 -2911 0
43446 -3127 0
44042 -3344 0
44578 -3575 0
45115 -3806 0
45651 -4038 0
46108 -4294 0
46565 -4551 0
47022 -4808 0
47480 -5065 0
47937 -5322 0
48394 -5578 0
48957 -5806 0
49520 -6033 0
50083 -6260 0
50646 -6487 0
51144 -6619 0
51642 -6752 0
52140 -6884 0
52638 -7016 0
53145 -7033 0
53653 -7050 0
54160 -7067 0
54667 -7084 0
55175 -7101 0
55682 -7119 0
56189 -7136 0
56738 -7062 0
57287 -6988 0
57835 -6915 0
58384 -6841 0
58933 -6767 0
59564 -6876 0
60196 -6985 0
60828 -7094 0
61438 -7485 0
62049 -7875 0
62552 -7971 0
63055 -8068 0
63558 -8164 0
64060 -8458 0
64561 -8752 0
65062 -9047 0
65504 -9304 0
65945 -9561 0
66561 -9804 0
67177 -10046 0
67811 -9876 0
68445 -9707 0
68973 -9801 0
69502 -9895 0
70030 -9989 0
70558 -10083 0
71087 -10177 0
71615 -10271 0
72143 -10365 0
72672 -10459 0
73200 -10553 0
73728 -10647 0
74205 -10818 0
74682 -10989 0
75159 -11160 0
75636 -11331 0
76113 -11502 0
76590 -11673 0
77067 -11843 0
77544 -12014 0
78021 -12185 0
78467 -12581 0
78912 -12977 0
79358 -13373 0
79777 -13661 0
80196 -13949 0
80614 -14237 0
81033 -14525 0
81452 -14813 0
81871 -15101 0
82336 -15302 0
82801 -15502 0
83266 -15703 0
83731 -15903 0
84196 -16104 0
84661 -16304 0
85179 -16361 0
85696 -16418 0
86214 -16474 0
86732 -16531 0
87250 -16587 0
87767 -16644 0
88285 -16700 0
88803 -16757 0
89320 -16814 0
89838 -16870 0
90356 -16927 0
90873 -16983 0
91376 -17028 0
91879 -17074 0
92382 -17119 0
92885 -17164 0
93388 -17209 0
93890 -17254 0
94393 -17299 0
94896 -17344 0
95399 -17389 0
95902 -17435 0
96405 -17480 0
96908 -17525 0
97410 -17570 0
97913 -17615 0
98416 -17660 0
98945 -17654 0
99473 -17647 0
100002 -17640 0
100530 -17633 0
101059 -17627 0
101588 -17620 0
102116 -17613 0
102645 -17606 0
103173 -17600 0
103702 -17593 0
104230 -17586 0
104759 -17579 0
105288 -17573 0
105816 -17566 0
0 0 0
92115 -16718 0
92688 -16767 0
93260 -16816 0
93832 -16864 0
94152 -16705 0
94092 -16462 0
93530 -16337 0
92812 -16440 0
92133 -16705 0
92115 -16718 0
92115 -16718 0
0 0 0
94634 -16835 0
94977 -17071 0
95769 -17228 0
96425 -17179 0
97082 -17130 0
97609 -17274 0
98137 -17418 0
98557 -17210 0
98398 -16891 0
97556 -16758 0
97062 -16595 0
96519 -16730 0
95976 -16866 0
95484 -16688 0
94993 -16510 0
94618 -16614 0
94582 -16765 0
94634 -16835 0
94634 -16835 0
0 0 0
24830 1637 0
24832 1762 0
24979 1804 0
25332 1755 0
25641 1617 0
26002 1176 0
26128 845 0
25983 818 0
25463 1126 0
25129 1423 0
24830 1637 0
24830 1637 0
0 0 0
30671 -1587 0
30754 -1443 0
30609 -1360 0
30151 -1280 0
29513 -1144 0
28801 -747 0
28260 -359 0
27538 -39 0
27392 -81 0
27936 -439 0
28549 -759 0
28991 -1181 0
29395 -1535 0
29709 -1641 0
30334 -1650 0
30671 -1587 0
30671 -1587 0
0 0 0
+214
View File
@@ -0,0 +1,214 @@
14th International Obfuscated C Code Contest Rules |
Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and |
Peter Seebach, 1998. |
All Rights Reserved. Permission for personal, education or non-profit use is |
granted provided this this copyright and notice are included in its entirety |
and remains unaltered. All other uses must receive prior permission in |
writing from the contest judges. |
Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure.
b. To darken. 2. To confuse: his emotions obfuscated his
judgment. [LLat. obfuscare, to darken : ob(intensive) +
Lat. fuscare, to darken < fuscus, dark.] -obfuscation n.
obfuscatory adj.
GOALS OF THE CONTEST:
* To write the most Obscure/Obfuscated C program under the rules below.
* To show the importance of programming style, in an ironic way.
* To stress C compilers with unusual code.
* To illustrate some of the subtleties of the C language.
* To provide a safe forum for poor C code. :-)
The 14th IOCCC contest window is: |
26-Nov-98 12:00 UTC to 31-Jan-99 23:59:59 UTC |
NOTE: Some of the changes from the 1998 rules are denoted by change bars. ---> |
However some changes such as 1996 to 1998 are not marked. |
RULES:
To help us with the volume of entries, we ask that you follow these rules:
1) Your entry must be a complete program.
2) Your entry must be <= 3217 bytes in length. The number of characters
excluding whitespace (tab, space, newline), and excluding any ; { or }
immediately followed by whitespace or end of file, must be <= 1536.
3) Your entry must be submitted in the following format:
---entry---
rule: 1998
fix: y or n (n => this is a new entry, y => this replaces an older entry)
title: title of entry (see comments below)
entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0)
date: Date/time of submission in UTC (see comments below)
host: Machine(s) and OS(s) under which your entry was tested
Use tab indented lines if needed
---remark---
Place remarks about this entry in this section. It would be helpful if
you were to indent your remarks with 4 spaces, though it is not a
requirement. Also, if possible, try to avoid going beyond the 79th
column. Blank lines are permitted.
---author---
name: your name
org: School/Company/Organization
addr: postal address
use tab indented lines to continue
don't forget to include the country
email: EMail address from a well known site or registered domain.
If you give several forms, list them on separate tab indented lines.
url: http://your/home/page.html or say none if you don't have one
anon: y or n (y => remain anonymous, n => OK to publish this info)
---info---
If your program needs an info file, place a uuencoded copy of it in
this section. In the case of multiple info files, use multiple info
sections. If your entry does not need a info file, skip this section.
---build---
Place a uuencoded copy of the command(s) used to compile/build your program
in this section. It must uudecode into a file named 'build'. The resulting
file must be 255 bytes or less.
---program---
Place a uuencoded copy of your program in this section. It must uudecode
into a file named is 'prog.c'. The resulting file must follow rule #2.
---end---
Regarding the above format:
* The title must match the expression: |
^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ |
and must be 1 to 31 characters in length. |
It is suggested, but not required, that the title should
incorporate the author(s) username(s).
* The date in the ---entry--- section should be given with respect
to UTC. The format of the date should be as returned by asctime()
using the C locale. (see guidelines for more info)
* You may correct/revise a previously submitted entry by sending
it to the contest email address. Be sure to set 'fix' in the
---entry--- section to 'y'. The corrected entry must use the same
title and entry number as submission that is being corrected. Be
sure that you note the re-submission in the ---remark--- as well.
* With the exception of the header, all text outside of the above
format may be ignored by the judges. If you need to tell the judges
something, put it in the ---remark--- section, or send a separate
EMail message to the judges.
* Information from the ---author--- section will be published unless
'y' was given to the respective author's 'anon' line.
* To credit multiple authors, include an ---author--- section for
each author. Each should start with ---author--- line, and
should be found between the ---entry--- and ---build--- sections.
* The home page URL in the ---author--- section must be fully |
qualified or must be the word `none'. |
* The entry's remarks should include:
- note if this entry is a re-submission of a previous entry.
- what this program does
- how to run the program (sample args or input)
- special compile or execution instructions, if any
- special filename requirements (see rule 4 and 5)
- information about any ---info--- files
- why you think the program is obfuscated
- any other remarks (humorous or otherwise)
* Do not rot13 your entry's remarks. You may suggest that certain
portions of your remarks be rot13ed if your entry wins an award.
* Info files should be used only to supplement your entry. They
should not be required to exist.
* If your entry does not need an info file, skip the ---info---
section. If your entry needs multiple info files, use multiple
---info--- sections, one per info file. You should describe
each info file in the ---remark--- section.
* Your sections must in the same order as in the above template.
4) If your entry is selected as a winner, it will be modified as follows:
'build' is incorporated into a makefile, and 'build' is removed
'prog.c' is renamed to your entry's title, followed by an optional
digit, followed by '.c'
your entry is compiled into a file with the name of your entry's
title, possibly followed by a digit
If your entry requires that a build file exist, state so in your
entry's remark section. The makefile will be arranged to execute a
build shell script containing the 'build' information. The name of
this build shell script will be your entry's title, possibly followed
by a digit, followed by '.sh'.
If needed, your entry's remarks should indicate how your entry must
be changed in order to deal with the new filenames.
5) The build file, the source and the resulting executable should be
treated as read-only files. If your entry needs to modify these files,
it should make and modify a copy of the appropriate file. If this
occurs, state so in your entry's remarks.
6) The uudecoded ---program--- section must be able to be compiled
cleanly by an ANSI C compiler, or if there are any compile errors,
they must be documented in the ---remark--- section.
7) The program must be of original work. All programs must be in the
public domain. All copyrighted programs will be rejected.
8) Entries must be received prior to 31-Jan-99 23:59:59 UTC. (UTC is |
essentially equivalent to Greenwich Mean Time) EMail your entries to:
entry@ioccc.org |
You must include the words ``ioccc entry'' in the subject
of your EMail when sending in your entry! Failure to do so may
result in the loss of your entry!
If possible, we request that you hold off on EMailing your entries
until 26-Nov-98 12:00 UTC. Early entries will be accepted, however. |
We will attempt to EMail a confirmation to the sender of any entry
received after 26-Nov-98 12:00 UTC and before the close of the contest. |
9) Each person may submit up to 8 entries per contest year. Each entry
must be sent in a separate EMail letter.
10) Entries requiring human interaction to be built are not allowed.
11) Programs that require special privileges (setuid, setgid, super-user,
special owner or group) are not allowed.
12) Legal abuse of the rules is somewhat encouraged. An entry that, in
the opinion of the judges, violates the rules will be disqualified.
Entries that attempt to abuse the rules must try to justify why
their rule abuse is legal in the ---remark--- section.
FOR MORE INFORMATION:
The judging will be done by Leonid A. Broukhis, Jeremy Horn, Landon
Curt Noll and Peter Seebach. Please send questions or comments
about the contest, to:
questions@ioccc.org (not the address for submitting entries) |
Comments about confusing rules and guidelines are also welcome.
The rules and the guidelines may (and often do) change from year to
year. You should be sure you have the current rules and guidelines
prior to submitting entries. To obtain them, visit the IOCCC web page: |
http://www.ioccc.org |
It has rules, guidelines and winners of previous contests (1984 to date).
+116
View File
@@ -0,0 +1,116 @@
.\"
.\" To format this file into a text file say
.\"
.\" nroff -man samefile.1 or
.\" groff -man -Tascii samefile.1
.\"
.TH SAMEFILE 1 "OCTOBER 1997" IOCCC "User Manuals"
.SH NAME
samefile \- find identical files
.SH SYNOPSIS
.B samefile
.SH DESCRIPTION
.B samefile
reads a list of file names (one file name per line) from stdin.
For each file name pair with identical contents, a
line consisting of six tab separated fields is output:
The size in bytes, two file names, the character ``='' if
the two files are on the same device, ``X'' otherwise,
and the link counts of the two files.
The output is sorted in reverse order by size.
.B samefile
uses two stages to give optimum performance.
In the first stage, all non-plain files are silently
ignored (directories, devices, FIFOs, sockets,
symbolic links) as well as files for which
.BR stat (2)
or
.BR open (2)
fails.
The result of the first stage (the file names) is written into
a binary tree with one node for every file size. Each node
is in turn a linked list of file names along with inode and
device information.
It is also at this first stage where checks for hard links are done.
For any inode only one filename will be added to the binary tree.
In the second stage all files having the same
size are compared against each other. The rules
of mathematical logic are applied to reduce work
and output noise: if files A, B, and C have the same size and
.B samefile
finds that A = B and A = C then it will not
compare B against C (and will not
output a line for B and C) but only
for A = B and A = C. The algorithm will detect
equality across arbitrarily long chains.
Note however, that because
only the first filename per inode gets into the
first stage, the output for a group of identical files
with different inode numbers is also minimized. Suppose
you have six identical files of size 100
in an inode group consisting of the three
inodes with numbers 10, 20 and 30:
.nf
$ ls -i # output edited for readabilty:
10 file1 20 file4 30 file6
10 file2 20 file5
10 file3
$ ls | samefile
100 file1 file4 = 3 2
100 file1 file6 = 3 1
.fi
The sum of the sizes in the first column is the amount of disk space
you could gain by making all 6 files links to only one
file or remove all but one of the files. To be precise,
disk space is allocated in blocks - you will probably gain
two blocks here, rather than 200 bytes.
Note that it is not enough to just remove file4 and
file6 (you would gain only 100 bytes because file5
still exists.)
.SH LIMITATIONS
.B Samefile
was written with no limits in mind. The number of input lines is
unlimited. The size of the actual files is only limited by
available virtual memory needed to compare one pair of files.
The only hard limit is the constraint that there should not
be more than about 8192 files having the same size. Experience
has shown that there are rarely more than a couple dozen
files of the same size.
.SH EXAMPLES
.nf
For everybody:
What are the duplicates under my home directory?
$ find $HOME | samefile
For the sysadmin folks:
Report all duplicate files under /usr larger than 16k:
$ find /usr -size +16384c -a -type f | samefile
For the ftp and WWW admins:
How much space is wasted below our site's /pub directory?
$ find /pub -type f | samefile | awk '{sum += $1} END {print sum}'
.fi
.SH "EXIT STATUS"
If
.B samefile
runs out of memory the exit status is 1,
zero otherwise.
.fi
.SH "SEE ALSO"
.BR find (1),
.BR ln (1),
.BR rm (1)
.\"
.\" End Of Man Page
+56
View File
@@ -0,0 +1,56 @@
typedef void e();
e *w,*l,*u,*_o,*j,*t,*O,exit,b,c_,b_,a_,c,a,z_,x_,d,y_,_m;
int q,m,_d,z,k,h,f[99];
char y[26],_p[40][26],_q,r[2],*_,**s,*i,
*x[]= { "\n", ")", "if (", "}\n", ");\n\n", " ", ",&", "\"",
",", " %%d", ";\n\n scanf(\"%%d", "%%d ", "else ", ",", "<",
");\n", "printf(\"", "main()\n{\n int a" };
void g(){ O=j; printf(_); }
void _j(){ O=_o; m=!m; h=h+m*(long)t; }
void _u(){ O=g; _=x[0]; j=b; }
void _r(){ O=g; _=x[1]; j=_u; }
void _f(){ O=g; *r=y[k-1]; _=r; j=_r; }
void _l(){ O=g; _=x[2]; j=x_; }
void _c(){ O=(e*)h; }
void n(){ O=_j; t=w; _o=_c; }
void p(){ O=_j; h=0; t=l; _o=n; }
void _b(){ O=p; q=*i+q*10-'0'; i=i+1; m=*i; w=_b; l=c; }
void _s(){ O=g; _=x[3]; j=exit; }
void v(){ O=p; z=z-1; m=z; w=z_; l=_s; }
void _a(){ O=g; _=x[4]; *y=x[17][1]; z=0; j=b; }
void _z(){ O=g; _=x[5]; j=p; k=k-1; m=k; w=_z; l=u; }
void _h(){ O=g; _=x[6]; j=a_; }
void _e(){ O=g; _=x[7]; k=0; j=_h; }
void _t(){ O=g; _=x[8]; j=d; }
void _g(){ O=g; _=x[7]; j=_t; k=0; }
void _k(){ O=_z; k=f[z]; _q=y[k]; y[k]=y[k-1]; y[k-1]=_q; u=b_; k=z; }
void d_(){ O=_k; y[z+1]=x[17][1]+z; f[z]=z+1; }
void b (){ O=p; z=z+1; m=q-z; w=c_; k=z; l=_z; u=a; }
void e_(){ O=g; _=x[9]; k=k+1; m=k<q; w=e_; l=_e; j=p; }
void f_(){ O=g; _=x[10]; k=1; j=e_; }
void g_(){ O=g; _=x[11]; j=p; k=k-1; m=k; w=g_; l=_g; }
void h_(){ O=p; _p[z][k]=y[k]; k=k+1; m=k<=z; w=h_; l=d_; }
void i_(){ O=p; y[k]=_p[z][k]; k=k+1; m=k<=z; w=i_; l=v; }
void j_(){ O=i_; k=0; }
void k_(){ O=p; m=k>1; w=_l; l=_u; }
void l_(){ O=g; _=x[12]; j=k_; }
void m_(){ O=g; _=x[13]; j=y_; }
void n_(){ O=p; k=k+1; m=k<q; w=_h; l=_a; }
void o_(){ O=g; _=x[14]; j=_f; }
void c_(){ O=h_; k=0; }
void p_(){ O=g; _=x[15]; j=v; }
void b_(){ O=p; k=f[z]; m=k<=z; w=l_; l=k_; }
void a_(){ O=g; *r=x[17][1]+k; _=r; j=n_; }
void q_(){ O=p; k=k+1; m=k<q; w=m_; l=f_; }
void c (){ O=g; r[1]=0; k=1; j=m_; }
void a (){ O=g; k=z; j=g_; _=x[16]; }
void z_(){ O=p; f[z]=f[z]-1; m=f[z]; w=_k; l=j_; }
void x_(){ O=g; *r=y[k-2]; _=r; j=o_; }
void d (){ O=g; *r=y[k]; _=r; k=k+1; m=k<z; w=_t; l=p_; j=p; }
void y_(){ O=g; *r=x[17][1]+k; _=r; j=q_; }
void r_(){ O=_b; _=x[17]; s=(char**)_d; s=s+1; i=*s; q=0; }
main(v,c){ O=r_; _d=c;
x: (O)(); goto x; }
+92
View File
@@ -0,0 +1,92 @@
Best Flow Control:
Mark Schnitzius
ISX Corporation
1280 West Peachtree St. Apt. 1507
Atlanta, GA 30309
USA
http://east.isx.com/~schnitzi/
Judge's Comments:
To build:
make schnitzi
To use:
./schnitzi 5 > sort.c
cc sort.c -o sort
echo 123 > data
echo 234 >> data
echo 413 >> data
echo 134 >> data
echo 324 >> data
./sort < data
This is a beautiful program. How can a program with no conditional
behavior at all have output which depends on anything?
For hints on deciphering this, see below past the Author's Comments;
they're a nice summary, but they leave the mystery intact.
Selected Author's Comments:
In literary circles, there is a poetic form called a "lipogram",
which is a poem in which a specific letter has been distinctly
avoided. This principle can be applied in other ways. For
instance, in this paragraph, the vowel which immediately follows
't' in the alphabet is nowhere to be seen. There is even an
entire novel (E. V. Wright's "Gadsby") in which no word contains
the letter 'e'.
The IOCCC has been no stranger to this concept. Several winning
entries from years past have accomplished interesting feats while
completely avoiding the use of certain C constructs thought to
be essential (e.g. 1988's robison.c). If you have to ask why they
would do it this way, then this contest just isn't for you.
In continuing with this fine tradition, this program suggests to
the ANSI committee some new practical simplifications for the C
language. For instance, it appears that CONDITIONAL BRANCHING isn't
really necessary. So, we can do away with while, do...while, for,
if/else, switch, ?:, or anything else that might cause any kind of
nondeterministic jump in the code. There's too much uncertainty
in the world anyway.
Function parameters and return types just confuse people anyway, so
get rid of them. Same with local variables. In fact, all you really
need are assignment statements, and maybe one printf() and one goto.
This style of programming is also ideal for systems with limited
memory capacity, since the function call stack never goes beyond
a depth of one.
So what does it do? Give it an integer (1 < n < 27) on the command
line, such as
schnitzi 5
The output will itself be a lipographic program, one which inputs
(in this case) five numbers and prints them out sorted. It sorts
them, however, using only "if/else" statements, without arrays or
looping. To see the resulting program run, redirect the output from
"schnitzi" into another file, like this
schnitzi 4 > sort.c
and then compile it.
Spoilers And Hints:
The big key to this program is figuring out what the names of the
functions ought to be; a bit of research may allow you to guess at
a few crucial ones.
The only function ever called is "O", but "O" is just set to point to
other functions all the time. Or, almost all the time.
So how does 'h' get set, and what to?
+70
View File
@@ -0,0 +1,70 @@
%:define H(x) <st%:%:x##.h>
#include H(dio)
#include H(dlib)
#include H(ring)
#define x ) == 0 ?__LINE__:0){O =__LINE__;break;} }
#define X(x) __LINE__ x __LINE__
#define t(a)\
for (c = 0; c <n##a; ++c) { \
if (strchr (a[c], 0[__FILE__])) { if (*a[c] == 0[__FILE__]) { \
if (strcmp (a[c]+__LINE__, I + strlen (I) + __LINE__ - strlen (a[c]) x else { \
if (strncmp (a[c], I, strlen (a[c])-__LINE__ x \
} else { if (strcmp (a[c], I x }
#line 4 "info\0r"
int
main (int C, char **V)
{
FILE *H;
int c, ne, nn, S = C < 2 ? 060 : *V[1];
char f[__LINE__][X(*)], K[X(*)], L[X(<<)],
e[X(<<)][3*__LINE__], n[X(<<)][3*__LINE__], F[__LINE__];
if (freopen (__FILE__, 5+__FILE__, stdin) == 0) return __LINE__-13;
for (c = 0;;) {
#line 1 "#\n"
if (!fgets (f[c], (int)sizeof *f, stdin)) return __LINE__; if (*f[c] == 0[__FILE__]) continue; if (*f[c] != __LINE__[__FILE__]) { f[c][strlen (f[c]) - __LINE__] = 2[__FILE__];
++c;
} else
break;
}
for (ne = 0;;) {
do {
#line 1 "#%s%s"
if (!fgets (L, (int)sizeof L, stdin)) return __LINE__; } while (*L == 0[__FILE__]); switch (sscanf (L, __LINE__+__FILE__, F, e[ne])) { default: goto O;
case __LINE__: switch (strchr (F, S)!=0) case 1: ++ne;
}
}
O:
nn = 0;
while ((fgets (L, (int) sizeof L, stdin)) != 0) {
char A[__LINE__], f3; if (*L == 0[__FILE__]) continue;
#line 1 "%s%s %c"
switch (sscanf (L, __FILE__, A, n[nn], &f3)) {
case __LINE__: if (strchr (A, S)) ++nn; break;
case __LINE__:
if (strchr (A, S)) {
#line 8 "<%s>:\n"
char *I = L + __LINE__;
int O = printf (__FILE__, n[nn]) +
#line 2 "0gcc -ansi -E -dM -undef %s /usr/include/%s>r\0 ("
sprintf (K, 1+__FILE__, f[S-*__FILE__] + __LINE__, n[nn]);
O += system (K);
if ((H = fopen (__FILE__+44, 44+__FILE__)) == 0) return 1;
while ((fgets (L, (int)sizeof L, H)) != 0) {
I[strcspn (I, 46+__FILE__)] = O = 0;
#line 1 "*r"
t (n) t (e)
if (0 == O) O = puts (L);
}
nn = fclose (H);
}
}
}
return remove (1+__FILE__);
}
+222
View File
@@ -0,0 +1,222 @@
CPP Abuse:
Jens Schweikhardt
DFN Network Operation Center
Schlartaeckerweg 3 (Home address)
D-71384 Weinstadt
Germany
http://www.shuttle.de/schweikh/
Judge's Comments:
To build:
make schweikh1
To use:
./schweikh1
What does it do? It seems to print a list of system headers, perhaps
with words after them. Curiously, if you look at the list of words
defined in a given standard header, they are never printed directly
after that header's name. Ah-hah! It's a conformance test for the
standard headers.
This code is a wonder; it's a wonder that it compiles. I wonder
whether or not it should. The innovative realization that you can
use special characters, such as '\n', in #file directives alone
merits some recognition.
I've included most of the author's comments; they're fairly thorough.
Do not read them if you want to figure this out yourself. "Amendment
One" refers to "NA1", the add-on to C89 which added some fairly
crufty internationalization support.
NOTE: Some non-gcc compilers that are not fully ANSI standard do not
compile this entry correctly. Using cc by default is not helpful
most of the time on this entry, because the program has a hardcoded
gcc invocation anyway. Anyone who uses egcs and has no plain gcc
will need to frob the source anyway and can be expected to do the
right thing with ${CC}. So use gcc.
NOTE: One may build the original entry, which incorrectly used
^K's and ^L's after a # cpp-directive. While this works under
gcc, it is not ISO C89. One may build this original entry by:
make schweikh1.orig
Selected Author's Comments:
Important! This program, if it compiles at all, is mis-compiled by many
compilers due to compiler bugs. It could be the "least likely
to compile and execute" in conjunction with preprocessor abuse.
When run, it is likely to uncover bugs in your system headers.
The program is run without arguments. If your compiler is buggy,
the most likely result is no output and/or an exit status of 1.
If Amendment One headers are missing you will see
<iso646.h>:
gcc: /usr/include/iso646.h: No such file or directory
gcc: No input files specified
<wctype.h>:
gcc: /usr/include/wctype.h: No such file or directory
gcc: No input files specified
<wchar.h>:
gcc: /usr/include/wchar.h: No such file or directory
gcc: No input files specified
Bug your vendor for an upgrade.
The format of the info file is straightforward and described in the file
itself. Just load it in your favorite editor.
Requirements
------------
Gcc (the GNU C compiler) must be available at runtime. It is assumed
that your C implementation keeps headers as files in the /usr/include
directory. The info file must be readable and reside in the current
working directory. The current working directory must be writable in
order to create a temporary file (which is removed upon program
termination). In case you don't have gcc at runtime, not all is lost
if your compiler or preprocessor can produce a list of defined macros
in the format output by gcc -dM, i.e. lines of the form
#define MACRO value
Edit the source at line 55 in this case.
Background
----------
ISO C has a very strict idea of visibility of identifiers. All possible
macros are explicitly enumerated. In a compliant implementation no other
macros can be defined, because you could write strictly conforming
programs that may fail to compile due to syntax errors: suppose
<stdio.h> defines PIPE_BUF, then the conforming
#include <assert.h>
#include <stdio.h> /* <- or where the bogus macro is defined */
#include <string.h>
#define STR(x) #x
#define XSTR(x) STR(x)
int main (void)
{
int PIPE_BUF = 0;
assert (strcmp ("PIPE_BUF", XSTR (PIPE_BUF)) == 0);
return 0;
}
is expected to compile and meet the assertion. If it does not, your
compiler compiles some other language than ISO C.
Why I think my program is obfuscated
------------------------------------
Not only is the program's purpose a thorough standard conformance
test. The source itself is a beast and has uncovered bugs in many
C compilers.
1. The token sequence after #include can consist of pp-tokens and
"are processed just as in normal text." [ISO 6.8.2] The result
must resemble one of the canonical forms, "foo.h" or <bar.h>.
This lets us write things like
#define HEADER "foo.h"
#include HEADER
I could not find a compiler rejecting this. However, if we're
torturing the preprocessor a little more, by using token pasting,
at least one compiler falls over.
#define H(x) <st##x##.h>
#include H(dio) /* expands to <stdio.h> */
is rejected by tcc version 4.1.2, the TenDRA compiler:
"t.c", line 3: Error:
[ISO 6.8.3.3]: Invalid result for '##' operator in macro 'H'.
To be honest, I don't know if the rules for pp-tokens and token
pasting don't forbid what I do (and tcc is correct in rejecting it).
In this case, all other compilers I tried are buggy, or the Standard
itself :-)
2. The #line directive allows to set a line number, and optionally
a file name, i.e. modify __LINE__ and __FILE__. Strange things
happen if the file name contains a NUL byte -- which the Standard
allows: in #line num "file" the "file" is an s-char-sequence per
ISO 6.8.4. ISO 6.1.4 defines string literals as s-char-sequences,
which may include octal escape sequences. Let's look at
#include <stdio.h>
#line 42 "foo\0bar"
int main (void) {
printf ("%s %d\n", __FILE__, (int)sizeof __FILE__);
return 0;
}
This is supposed to output 'foo 8'. Here's what happens in RL:
foo 4 gcc 2.7.2.1, lcc
foo\0bar 9 tcc 4.1.2, Sunsoft cc turn "\0" into "\\0", ugh!
(I have written a bug report for gcc. Newer versions and egcs are ok.)
3. The %: and %:%: digraphs test for conformance to Amendment One.
Ask your local guru if C allows the same case label in the same switch
statement to appear more than once. Ask him/her to think real hard.
The answer will be "no". The true guru will cite a constraint in
ISO 6.6.4.2. Then make fun of the guru's answer by waving 'case __LINE__:'
under his/her nose. Easy money from a bet! Make sure your guru has
no chance to use Standardese weasel words as an escape: can I have
case <some_token>:
case <some_token>:
in the same switch? (Note that you need the [invisible] newline. You
can generously allow the additional constraint that no #undefs or
#defines are allowed between the two cases.)
Lots of integer constants and string literals come into the source
via __LINE__ and __FILE__ which are redefined at various places.
Sometimes the __FILE__ contains \0 bytes; different strings or
characters are then accessed with offsets, say 10+__FILE__ or
__LINE__+__FILE__ or 2[__FILE__]. One integral constant in octal.
This makes the source and header input depend on ASCII.
A few old obfuscations, like one character identifiers, not too
many macros, a goto O, "needless" assignments to satisfy lint
with its "function value ignored" warnings. My lint has nothing
to complain.
There's more whitespace in the Standard than just space, tab and
newline. In particular, there are vertical tab and formfeed that
can be used in certain places (outside of preprocessing directives,
i.e. they are not allowed from just after the # up to the final
newline. See 6.8 for details.)
On many implementations these appear as ^L and ^K. My source starts
with an extremely uncommon 32bit word consisting of ^L, ^K, % and :.
I have grepped old winning entries for ^K, none of them contains one,
so this is something new -- after 14 years of IOCCC. Be sure to have
enough paper in your printer when you make a hardcopy of the source...
While I'm at it, the rules state that only space, tab and newline
are ignored for the count (plus '{', '}', ';' followed by
whitespace). The mkentry.c program, however, uses isspace() which
returns nonzero for vtab and formfeed and other characters as well.
I could have used a lot more ^K and ^L probably undetected by your
counter but decided to err on the side of safety. I use a perl
script to compute the character count according to the rules.
The advantages of an independent clean room approach...
#!/usr/bin/perl -w
$/ = "\0";
$_ = <>;
s/[;{}][ \t\n]/\n/g;
s/[ \t\n]+//g;
print length ($_),"\n";
I have tried, as suggested in the guidelines, to let the code look
like ordinary C code. Apart from a few long lines I think I left
the indentation like I would in RL. You should however not try to
use indent on the source. The code is extremely fragile because of the
myriads of __LINE__ macros -- indenting is a sure way to break
the program. Don't even think of maintaining that beast; I've
had my share of core dumps during development :-) A test suite
was used after every minor change to find out if the program still
does what it should.
From the goals: "To stress C compilers with unusual code."
That describes exactly my modest attempts...
+70
View File
@@ -0,0 +1,70 @@
%: define H(x) <st%:%:x##.h>
#include H(dio)
#include H(dlib)
#include H(ring)
#define x ) == 0 ?__LINE__:0){O =__LINE__;break;} }
#define X(x) __LINE__ x __LINE__
#define t(a)\
for (c = 0; c <n##a; ++c) { \
if (strchr (a[c], 0[__FILE__])) { if (*a[c] == 0[__FILE__]) { \
if (strcmp (a[c]+__LINE__, I + strlen (I) + __LINE__ - strlen (a[c]) x else { \
if (strncmp (a[c], I, strlen (a[c])-__LINE__ x \
} else { if (strcmp (a[c], I x }
#line 4 "info\0r"
int
main (int C, char **V)
{
FILE *H;
int c, ne, nn, S = C < 2 ? 060 : *V[1];
char f[__LINE__][X(*)], K[X(*)], L[X(<<)],
e[X(<<)][3*__LINE__], n[X(<<)][3*__LINE__], F[__LINE__];
if (freopen (__FILE__, 5+__FILE__, stdin) == 0) return __LINE__-13;
for (c = 0;;) {
#line 1 "#\n"
if (!fgets (f[c], (int)sizeof *f, stdin)) return __LINE__; if (*f[c] == 0[__FILE__]) continue; if (*f[c] != __LINE__[__FILE__]) { f[c][strlen (f[c]) - __LINE__] = 2[__FILE__];
++c;
} else
break;
}
for (ne = 0;;) {
do {
#line 1 "#%s%s"
if (!fgets (L, (int)sizeof L, stdin)) return __LINE__; } while (*L == 0[__FILE__]); switch (sscanf (L, __LINE__+__FILE__, F, e[ne])) { default: goto O;
case __LINE__: switch (strchr (F, S)!=0) case 1: ++ne;
}
}
O:
nn = 0;
while ((fgets (L, (int) sizeof L, stdin)) != 0) {
char A[__LINE__], f3; if (*L == 0[__FILE__]) continue;
#line 1 "%s%s %c"
switch (sscanf (L, __FILE__, A, n[nn], &f3)) {
case __LINE__: if (strchr (A, S)) ++nn; break;
case __LINE__:
if (strchr (A, S)) {
#line 8 "<%s>:\n"
char *I = L + __LINE__;
int O = printf (__FILE__, n[nn]) +
#line 2 "0gcc -ansi -E -dM -undef %s /usr/include/%s>r\0 ("
sprintf (K, 1+__FILE__, f[S-*__FILE__] + __LINE__, n[nn]);
O += system (K);
if ((H = fopen (__FILE__+44, 44+__FILE__)) == 0) return 1;
while ((fgets (L, (int)sizeof L, H)) != 0) {
I[strcspn (I, 46+__FILE__)] = O = 0;
#line 1 "*r"
t (n) t (e)
if (0 == O) O = puts (L);
}
nn = fclose (H);
}
}
}
return remove (1+__FILE__);
}
+20
View File
@@ -0,0 +1,20 @@
#define _POSIX_SOURCE /* you are not supposed to understand this */
#define O(OOO,OO0,O00,O0O,OO,O0)\0##O0O%:%:OO\0##O0%:%:OOO\0##OO0%:%:O00
#include<signal.h>
static volatile sig_atomic_t One;
#include<stdlib.h>
#include<unistd.h>
#define Zero(NULL)#NULL
#define ONE(One) Zero(One)
in??/
t
#line 10 "01\015"
main (register zero, char **ONE)
%:
<% switch (sizeof __FILE__ < zero) case 1: return One /= zero;
{ auto one = zero = atoi (ONE<:zero-1:>);
do for (one += alarm (One |= (signal (__LINE__, (void(*)(register))main)
!= SIG_ERR)); One; ++one);
while (zero -= write (1, __FILE__+(one&1), 1));
return write (1, 1+__FILE__+1, 1) != 1;
%>}
+180
View File
@@ -0,0 +1,180 @@
Most Erratic Behavior:
Jens Schweikhardt
DFN Network Operation Center
Schlartaeckerweg 3 (Home address)
D-71384 Weinstadt
Germany
http://www.shuttle.de/schweikh/
Judges' comments:
To build:
make schweikh2
Almost every compiler is supposed to be able to accept the code in
schweikh2.c; try compiling schweikh2.orig.c to see if your compiler
is fully standard-compliant.
To use:
./schweikh2
or
./schweikh2 integer_number
Run the program with a small argument, like 5 or 10, several times.
Are the results different? Why?
Some non-gcc compilers that are not fully ANSI standard do not
compile this entry correctly.
At the time this hint file was written, some gcc and egcs
implementations ran into problem when building the original entry:
make schweikh2.orig
This program often will produce an error of the form:
gcc -ansi schweikh2.orig.c -o schweikh2.orig
as: Error: cca00NzV.s, line 58: Missing " at end of string
"
as: Error: cca00NzV.s, line 58: malformed statement
*** Error code 1 (bu21)
because the line:
??=line 10 ONE(O(1,1,2,6,0,6))
turns into the line:
# 9 "01\012"
which causes gcc to give to the assembler the following two lines:
.stabs "whey.c
",132,0,0,Ltext1
and the lone " after the #.file line results in an assembler syntax error.
In some cases one must compile using 'gcc -g':
make schweikh2.orig CFLAGS=-g
to trigger this error.
And with the proper text beyond the \012, it may be possible to have
all kinds of fun adding ``inline assembly'' via #line directives. :-)
For extra credit:
If your compiler has this bug, transform the line in the C
program to inject assembly instructions in such a way that
the program will compile.
If you are able to do the above, try adding assembly instructions
so that it will compile, execute and do something interesting.
If you succeed in doing this (especially on FreeBSD, Linux or Sparc),
email the author for a free pat on the back.
Selected author's comments:
What this program does
----------------------
My entry is a yarng, which stands for, you guessed it, yet another
random number generator, and is pronounced 'yawn' due to its
incredible speed. Seriously, it exploits the randomness of quantum
mechanical events that build up the hardware as well as some other
non-deterministic factors. Here's how it works:
1) an alarm is scheduled to be delivered in a second
2) an infinite loop is entered that just increments a counter
3) on delivery of the alarm signal, the counter's LSB is printed.
4) while some other counter is not zero, go to 1)
5) exit
The yarng therefore produces output at a rate of 1 baud. The number of
bits may be specified by an argument and defaults either to UINT_MAX
(least likely) or UINT_MAX+1 (most likely). Extra credit: why the
different values? How long would you need for an empirical test?
For example:
$ yarng 32
10111001010101110110010101001111
$ yarng 5
10011
Why I think this is obfuscated
------------------------------
-Ever seen a 'do for ... while' loop?
-I avoided 'int' like the plague. Instead I used storage class specifiers
(register, auto) to get implicit int. The Standard allows implicit int
even in casts as you can see in '(void(*)(register))main'. Where implicit
int is impossible, like in the 'int main' declaration I have int split
across two lines. All indent programs I use insert space at the beginning
of the continuation line and thereby introduce a syntax error.
-main (ab)used as a signal handler. Shocking. Yeah, this leads to undefined
behaviour. I have yet to see a system where it does not work. If it
doesn't work for you, I'd appreciate if you mail me about it.
Uh-oh, schweikh did it, uttered "Works for me". Don't quote me on that!
-Even if you know how the program works, you just can't predict the output.
-Chained use of token pasting operators ## with shuffled arguments
-So you think you can't assign to __LINE__ and __FILE__? Not so. The
#line preprocessor directive does the trick. But saying '#line 10 "01\n"'
is a little lame and I came up with '??=line 10 ONE(O(1,1,2,6,0,6))'
-__LINE__ is used as the signal number argument to signal(). If indenting
or other editing changes the number of lines the program is likely to be
killed after one second... Thanks to POSIX for specifying SIGALRM as 14.
You're SOL if your system does not conform. Get a real OS.
-All strings (or characters) needed are crammed into __FILE__ using
octal notation and then extracted using pointer + offset notation.
-Use of a # (null) preprocessor directive (hidden as a %: digraph)
Delete this line and prepare for a core dump.
-Identifiers reused with different capitalization: one, One, ONE, zero,
Zero. ONE is particularly nasty because it appears as a macro taking
an arg and as a plain identifier in main's parameters. The rule is that
whenever ONE is followed by '(' it must be the macro.
-A quote from Kernighan and Plauger, "The Elements of Programming Style",
2nd Ed., page 21: "A useful way to decide if some piece of code is
clear or not is the ``telephone test.'' If someone could understand your
code when read aloud over the telephone, it's clear enough. If not then
it needs rewriting."
Now try the telephone test for 'one = zero = atoi (ONE[zero-1])'
-Don't you love the aesthetics of symmetry: write (1, 1+__FILE__+1, 1)
(telephone test this as well; is it 1, One, ONE, one? Maybe won?).
Where does the randomness come from?
------------------------------------
Each bit obviously depends on the number of times the loop body is
executed between two calls of the signal handler. But what determines
this number?
+ The accuracy of the clock driving the CPU
+ The accuracy of the clock driving the timer responsible for alarm signals
+ On multitasking OS's: The total time the process is scheduled
to run between successive invocations of the signal handler.
How about the randomness of the yarng? To measure these properties I
counted the number of bit sequences and compared them to what I would
expect from a generator with uniform distribution (all sequences
equally likely to occur).
It is interesting to note that yarng's maximum deviations are less
than or equal to rand()'s. Randomness however tends to degrade under
high load averages on my system (Linux). This could be avoided by
allowing the process one second of execution time instead of wall
clock time (using the SIGVTALRM sent by the virtual timer
instead of SIGALRM).
I'm not surprised. Yarng in the end depends on fluctuations of the
electrical field and the heat distribution in the oscillators, the
implementation and state of the scheduling algorithm, the system
load, number and temporal distribution of asynchronous events and
last but not least the phase of the moon. God _does_ play dice.
Type yarng and watch Him roll.
+20
View File
@@ -0,0 +1,20 @@
#define _POSIX_SOURCE /* you are not supposed to understand this */
#define O(OOO,OO0,O00,O0O,OO,O0)\0##O0O%:%:OO\0##O0%:%:OOO\0##OO0%:%:O00
#include<signal.h>
static volatile sig_atomic_t One;
#include<stdlib.h>
#include<unistd.h>
#define Zero(NULL)#NULL
#define ONE(One) Zero(One)
in??/
t
??=line 10 ONE(O(1,1,2,6,0,6))
main (register zero, char **ONE)
%:
<% switch (sizeof __FILE__ < zero) case 1: return One /= zero;
{ auto one = zero = atoi (ONE<:zero-1:>);
do for (one += alarm (One |= (signal (__LINE__, (void(*)(register))main)
!= SIG_ERR)); One; ++one);
while (zero -= write (1, __FILE__+(one&1), 1));
return write (1, 1+__FILE__+1, 1) != 1;
%>}
+61
View File
@@ -0,0 +1,61 @@
%:define _POSIX_SOURCE
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#define D(N,t)Z t*N V<%t*z U M0*z); H z)u z; X}
#define k(x,y)x<0||fstat(x,&y)||
#define h(x)=open(x,O_RDONLY)
#define b(x),(int)x.st_nlink
#define B ;typedef g
#define X exit (1);
#define O .st_size
#define U =malloc(
#define Y S.st_ino
#define v ;%>else
#define W .st_dev
#define o ||read(
#define Z static
#define g struct
#define u return
#define I char*
#define V (M2)
#define H if(
#define _ ->
/* HE WHO SAYS */
Z I A<:32767/ M0(I )]; Z g stat S,T; Z size_t y B f{
I n ; g f * x ; dev_t d ; ino_t i; } f B t{ M1 s,c; f
*l; g t*L,*R; } t; D(a,t)D(E ,f)Z t*J(t*p,I n){ H! p){ p=
a(); p _ s =S O; p _ c=1; p _ L=p _ R=0;
p _ l= E(); p _ l _ n=n; p _ l _ x=0; p
_ l _ d=S W; p _ l _ i= Y v H S O==p _
s){ f* e; for (e=p _ l; e; e=e _ x) { H S W==e _
d&&Y== e _ i) { u p; } } e=E(); e _ x=p _ l; e _
n=n; e _ d =S W; e _ i=Y; p _ l=e; ++p _
c v H S O< p _ s) { p _ L= J( p _ L,n)v{
p _ R= J (p _ R,n ); } u p ; } Z int Q(
I G,I F){ int d h(G),D h(F); I m,*M; H k(d,S )k(D,T )(y =S
O)-T O){ y= 0; goto d; } H! (m U y))||!(M U y))o d ,m,y)-
y o D,M,y)-y) X y=!memcmp( m,M,y); M5(m) ; M5(M ); d:V
close (d );V close(D); u y; } Z M2 C(M1 z,M1 N){ M1 i=N*(N-1)/2,
j=1,s; I q,*e,* p,*w,*l; e=q= M4((size_t)i,1); H!e) X p=q+i; for(i=0; e-p
; ++e){ H!*e&&Q (A[i:>,A[j])){ V printf("%""l""d" "\t""%" "s""\t" "%""s"
"??/t" "%""c" "\11" "%""d" "??/t" "%""d" "\n", z,A[i]
,A[j], S W -T W?'X' :'='b( S)b(T) ); H j -i-1) { s=N-
i-3; w =e+s+1; l=q+N* (j-1)- j*(j-1 )/ 2 ; do{ *w
=1; H w==l) break; w+= s; } while( s-->0); } } H++j ==N){ j=i+++
2; } } M5(q); } Z M2 P(t*p ){ H p){ P(p _ R); H p _ c>1){ M1 i=0
; f*l= p _ l; for (; i< p _ c; ++i ){ A[i
]= l _ n; l=l _ x; } C (p _ s, p _ c); } P (p _
L) ; } } int main V { t*r= 0; I F ; for (; ; )
{ H!(F U 1024)) )X H ! fgets( F,1024 ,stdin) )break; *(F+(y
=strlen(F))-1)= 0; H!( F=M3(F, y)))X H stat(F,&S)==0 &&S_ISREG(S.
st_mode)&&S O )r=J(r ,F ); } H r)P(r ); u 0; }/* Obfuscated C
IS FREE THINKS MONEY GROWS ON DIRECTORY TREE */
+193
View File
@@ -0,0 +1,193 @@
Most Space Efficient:
Jens Schweikhardt
DFN Network Operation Center
Schlartaeckerweg 3 (Home address)
D-71384 Weinstadt
Germany
http://www.shuttle.de/schweikh/
Judges' comments:
To build:
make schweikh3
To use:
If "dir" is the directory (or a directory tree) where you keep
all your favorite pictures off the Internet or from
alt.binaries.pictures.*, do
find dir -type f -print | ./schweikh3
Maybe you will not need to buy another 10 Gb disk to store them. :-)
Also Try:
cp schweikh3 file1
cp schweikh3 file2
cp schweikh3.c file3
ln file3 file4
ls -1 file? | ./schweikh3
NOTE: this program is not as smart as to detect identity of JPEG
files with the same picture but with different compression levels.
NOTE: Some non-gcc compilers that are not fully ANSI standard do
not compile this entry correctly.
Selected author's comments:
The source is expected to conform to IEEE Std 1003.1-1990 ("POSIX").
Thank God the IEEE does not standardize a coding style...
What this program does
----------------------
This is best explained in the man page. The troff source for this
man page can be found in the file samefile.1.
SAMEFILE(1) User Manuals SAMEFILE(1)
NAME
samefile - find identical files
SYNOPSIS
samefile
DESCRIPTION
samefile reads a list of file names (one file name per
line) from stdin. For each file name pair with identical
contents, a line consisting of six tab separated fields is
output: The size in bytes, two file names, the character
``='' if the two files are on the same device, ``X'' oth-
erwise, and the link counts of the two files. The output
is sorted in reverse order by size.
samefile uses two stages to give optimum performance.
In the first stage, all non-plain files are silently
ignored (directories, devices, FIFOs, sockets, symbolic
links) as well as files for which stat(2) or open(2)
fails. The result of the first stage (the file names) is
written into a binary tree with one node for every file
size. Each node is in turn a linked list of file names
along with inode and device information. It is also at
this first stage where checks for hard links are done.
For any inode only one filename will be added to the
binary tree.
In the second stage all files having the same size are
compared against each other. The rules of mathematical
logic are applied to reduce work and output noise: if
files A, B, and C have the same size and samefile finds
that A = B and A = C then it will not compare B against C
(and will not output a line for B and C) but only for A =
B and A = C. The algorithm will detect equality across
arbitrarily long chains. Note however, that because only
the first filename per inode gets into the first stage,
the output for a group of identical files with different
inode numbers is also minimized. Suppose you have six
identical files of size 100 in an inode group consisting
of the three inodes with numbers 10, 20 and 30:
$ ls -i # output edited for readability:
10 file1 20 file4 30 file6
10 file2 20 file5
10 file3
$ ls | samefile
100 file1 file4 = 3 2
100 file1 file6 = 3 1
The sum of the sizes in the first column is the amount of
disk space you could gain by making all 6 files links to
only one file or remove all but one of the files. To be
precise, disk space is allocated in blocks - you will
probably gain two blocks here, rather than 200 bytes.
Note that it is not enough to just remove file4 and file6
(you would gain only 100 bytes because file5 still
exists.)
LIMITATIONS
Samefile was written with no limits in mind. The number of
input lines is unlimited. The size of the actual files is
only limited by available virtual memory needed to compare
one pair of files. The only hard limit is the constraint
that there should not be more than about 8192 files having
the same size. Experience has shown that there are rarely
more than a couple dozen files of the same size.
EXAMPLES
For everybody:
What are the duplicates under my home directory?
$ find $HOME | samefile
For the sysadmin folks:
Report all duplicate files under /usr larger than 16k:
$ find /usr -size +16384c -a -type f | samefile
For the ftp and WWW admins:
How much space is wasted below our site's /pub directory?
$ find /pub -type f | samefile | awk '{sum += $1} END {print sum}'
EXIT STATUS
If samefile runs out of memory the exit status is 1, zero
otherwise.
SEE ALSO
find(1), ln(1), rm(1)
Why I think it is obfuscated
----------------------------
- the code is commented but this gives only an *extremely* faint clue.
- the layout does not reflect the program structure, or does it?
- The data structure the program builds is an ordered binary tree
where each node consists of a linked list. This is probably too
heavy to comprehend for N percent of all programmers ;-)
- The tree is built and traversed by recursive function calls.
- Why does this program look at dev_t and ino_t? Heavy wizardry.
- Can you find out how the algorithm works that detects identity
of files across arbitrarily long chains? In my private unobfuscated
source there are 17 lines describing just that. A classical case for
the well known /* You're not supposed to understand this */ comment.
- Would Dijkstra consider this goto harmful?
- The only string literal is split in more than a dozen substrings
- For the task at hand the code is pretty terse. Some dynamic memory
is even freed as soon as it's no longer needed. I have tried to
make the preprocessor directives as short as possible. This means
no spaces after #include and no spaces after some of the macro
names.
Are you an algorithms guru? If so you should know why the output
appears sorted without any use of qsort() or system("sort").
Rewrite (hah!) the program to use memory mapping of files instead
of read(). Does this affect performance noticeably?
It's easy to write a script that takes samefile's output and
hardlinks (or symlinks) identical files. Writing such a script is
left as an exercise for the deobfuscator.
When you run samefile on some directory tree, try to estimate
how much you think it will find. Is the actual result anywhere
near your estimate? How many copies of the GPL COPYING file
are there on your filesystems? :-)
In the remote event that the input has more than 8192 files with
the same size (on systems where sizeof (char *) == 4, or 4096 when
sizeof (char *) == 8), increase the manifest constant 32767 on line
31.
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
#include <stdlib.h>
int main(int a,char **A){FILE*B;typedef unsigned long C;C b
[8]; if(!(a==7&&(B= fopen(1[A],"rb")))) return 1;for(7[b]=0
;7[b]<5;7[b]++)b[7[ b]]=strtoul(A[2+7[b ]],0,16-!7[b]*6);5[
b]=3[b] ; while ((6[b]= getc(B)
)!=(C)- 1){if(2 [b])for (7[b]=0
;7[b]<4 ;7[b]++ )if(((6 [b]>>7[
b])^(6[ b]>>(7-7[b])))&1)6[ b] ^=(1
<<7[b]) ^(1<<(7-7[b]));5[b] ^= 6[b]
<<(0[b] -8);for(7[b]=0;7[b] <8;7[b]
++)if(( 5[b]>>(0[b]- 1))&1)5
[b]=(5[ b]<<1)^ 1[b]; else 5[
b]<<=1; }5[b]&=((((C)1 <<(0[b]
-1))-1) <<1)|1; if(2[b] )for(7[
b]=0;7[ b]<(0[b ]>>1);7 [b] ++)
if(((5[b]>>7[b])^(5 [b]>>(0 [b]-1-7 [b])))&1)5[b]^=((C)
1<<7[b])^((C)1<<(0[ b]-1-7[ b]));5[ b]^=4[b];fclose(B);
printf("%0*lX\n", ( int)(0[ b]+3)>> 2,5[b]); return 0;}
+104
View File
@@ -0,0 +1,104 @@
Best Self-Documenting:
Tom Torfs
De Nayer Instituut
Cuperuslei 12 (home address)
2220 Heist-op-den-Berg
Belgium
http://members.xoom.com/tomtorfs
Judges' comments:
To build:
make tomtorfs
To use:
./tomtorfs tomtorfs.c 32 04C11DB7 1 FFFFFFFF FFFFFFFF
Also try:
echo "abscond conferrable" > file.A
echo "adorn condolence" > file.B
echo "adorn condolence too" > file.C
./tomtorfs file.A 32 04C11DB7 1 FFFFFFFF FFFFFFFF
./tomtorfs file.B 32 04C11DB7 1 FFFFFFFF FFFFFFFF
./tomtorfs file.C 32 04C11DB7 1 FFFFFFFF FFFFFFFF
If you don't believe the program is correct, try and compare the output
of the program with the value of CRC computed by PKZIP or any other
archiver that uses the CRC-32 algorithm.
Selected author's comments:
Usage:
crc filename bitwidth polynom reflected init xor
filename : file to calculate the CRC of
bitwidth : width of the CRC in bits (decimal)
polynom : polynomial used for the CRC (hexadecimal)
reflected : 0 if the CRC is not reflected, 1 if it is
init : initial value for the CRC (hexadecimal)
xor : value to xor the final CRC with (hexadecimal)
Examples:
CRC-16: crc filename 16 1021 0 FFFF 0000
CRC-32: crc filename 32 04C11DB7 1 FFFFFFFF FFFFFFFF
XMODEM: crc filename 16 8408 1 0000 0000
ARC: crc filename 16 8005 1 0000 0000
Portability notes:
The program assumes CHAR_BIT==8. Results are undefined if
bitwidth > sizeof(unsigned long) * 8. It is also assumed
that EOF is -1 and 1 is a valid exit value to indicate
failure (replace them with EOF resp. EXIT_FAILURE if the
assumptions are false). Otherwise ANSI/ISO C.
No special build options required.
Special notes:
Count the number of non-whitespace characters in the source
file to find out what dark force drove me to write this ;-).
Spoiler:
First of all, if you run a C beautifier on the program
(thereby of course losing the nice code shape I worked
so hard on ;-) the code will become a bit more readable.
The variable names are not very descriptive. They have the
following meanings:
a = argc
A = argv
b = array of unsigned long variables
b[0] = bit-width of the CRC (argv[2])
b[1] = CRC polynomial (argv[3])
b[2] = nonzero if CRC is reflected (argv[4])
b[3] = initial value of CRC (argv[5])
b[4] = value final CRC is XORed with (argv[6])
b[5] = CRC value
b[6] = byte from file
b[7] = counter
B = FILE * through which the file argv[1] is opened
C = typedef for unsigned long
The first for loop simply reads the command-line arguments
in the b[] array. The third parameter to strtoul() causes
all arguments to be in base-16 (hex) except the first one,
which will be in base-10 (decimal).
The rest of the program "simply" calculates the crc in b[5]
and then prints it to stdout. The bit reflection loops may
appear a bit tricky at first, but if you have a good look
at them they should become obvious also.
Acknowledgments:
Ross N. Williams, whose CRC guide was very useful to me
for writing this. You can find it as CRC.TXT in Snippets.
+3751
View File
File diff suppressed because it is too large. Load diff