home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3923 < prev    next >
Text File  |  1991-08-28  |  61KB  |  1,656 lines

  1. Xref: wupost comp.lang.c:26413 comp.sources.d:3892 comp.unix.wizards:3350 alt.sources:3923 misc.misc:8113
  2. Path: wupost!uunet!hoptoad!chongo
  3. From: chongo@hoptoad.uucp (Landon C. Noll)
  4. Newsgroups: comp.lang.c,comp.sources.d,comp.unix.wizards,alt.sources,misc.misc
  5. Subject: 1991 International Obfuscated C Code Contest winners, 2 of 2
  6. Message-ID: <20429@hoptoad.uucp>
  7. Date: 28 Aug 91 01:42:01 GMT
  8. Expires: 28 Nov 91 00:00:00 GMT
  9. Reply-To: chongo@hoptoad.UUCP (Landon C. Noll)
  10. Distribution: world
  11. Organization: Nebula Consultants in San Francisco
  12. Lines: 1641
  13. Keywords: ioccc
  14.  
  15. Enclosed is part 2 of a 2 part shar file containing the winners of the 1991
  16. International Obfuscated C Code Contest.
  17.  
  18. First, we congratulate the winners for doing a fine job.  Their efforts
  19. and feedback have resulted in a number of suggested changes for the
  20. 1992 contest.
  21.  
  22. Second, we will be posting, sometime in early October 1991, a proposed
  23. set of rules for the 1992 contest.  At that time, we will be requesting
  24. feedback on the proposed 1992 rules.  Sometime later, perhaps in early
  25. November 1991, the official 1992 IOCCC rules will be posted.
  26.  
  27. Last, we would like to make an apology to the 1991 winners and to the
  28. net for the delay in posting of these results.  The poster of this
  29. article (chongo) went on vacation (Eclipse watching in Hawaii), held
  30. extended discussions with several of the contest winners, attempted to
  31. formulate the 1992 rules, and just plain ran out of time.  We hope to
  32. avoid such delays in the future.
  33.  
  34. If you find problems with some of the contest entries, or find typos
  35. in our notes, please send PATCH FILES containing the corrections to:
  36.  
  37.     judges@toad.com   -or-   ...!{sun,uunet,utzoo,pyramid}!hoptoad!judges
  38.  
  39. chongo <Landon Curt Noll> /\cc/\        hoptoad!chongo
  40. Larry Bassel                            {uunet,ucbvax,cbosgd}|sun!lab
  41.  
  42. p.s. previous winners are available on uunet.uu.net via anonymous ftp
  43.      under the directory ~/pub/ioccc.  The updated and corrected 1991 
  44.      set will be deposited there when the 1992 rules are posted.
  45.  
  46. Submitted-by: chongo@toad.com (Landon Curt Noll)
  47. #
  48. # Send comments, questions, bugs to: 
  49. #
  50. #    judges@toad.com   -or-   ...!{sun,uunet,utzoo,pyramid}!hoptoad!judges
  51. #
  52. # You are strongly encouraged to read the new contest rules before
  53. # sending any entries.  The rules, and sometimes the contest Email
  54. # address itself, change over time.  A valid entry one year may
  55. # be rejected in a later year due to changes in the rules.  The typical 
  56. # deadline date for the contest is late May.  Check with the current year's
  57. # rules for details.
  58. #
  59. # The contest rules are posted to comp.unix.wizards, comp.lang.c,
  60. # misc.misc, alt.sources and comp.sources.d.  If you do not have access 
  61. # to these groups, you may request a copy from the judges, via Email, 
  62. # from the address above.
  63. #
  64. # The 1992 contest rules will differ from the 1991 contest in several
  65. # important ways.  Due to these changes, there will be a delay in
  66. # the posting of the 1992 rules.  We expect the 1992 rules to be ready
  67. # by early October 1991.
  68. #
  69. Archive-name: ioccc.1991/part02
  70.  
  71. ---- Cut Here and unpack ----
  72. #!/bin/sh
  73. # This is part 02 of ioccc.1991
  74. if touch 2>&1 | fgrep 'amc' > /dev/null
  75.  then TOUCH=touch
  76.  else TOUCH=true
  77. fi
  78. # ============= 1991/sorta.idup ==============
  79. echo "x - extracting 1991/sorta.idup (Text)"
  80. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.idup &&
  81. X[ld#1_+1=y]:x
  82. X[uD1+=x]:y
  83. X0""1=y`
  84. SHAR_EOF
  85. $TOUCH -am 0622130991 1991/sorta.idup &&
  86. chmod 0444 1991/sorta.idup ||
  87. echo "restore of 1991/sorta.idup failed"
  88. set `wc -c 1991/sorta.idup`;Wc_c=$1
  89. if test "$Wc_c" != "33"; then
  90.     echo original size 33, current size $Wc_c
  91. fi
  92. # ============= 1991/sorta.iecho ==============
  93. echo "x - extracting 1991/sorta.iecho (Text)"
  94. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.iecho &&
  95. X[" "$ld]:sld                    [ print a space ]ld
  96. X[1s1+DA$ld1s1_+D=sD=x]:xld      [ given n (argc-n), print args ]ld
  97. X0a1_+D=x""`                     [ simulation of /bin/echo ]ld
  98. SHAR_EOF
  99. $TOUCH -am 0622130991 1991/sorta.iecho &&
  100. chmod 0444 1991/sorta.iecho ||
  101. echo "restore of 1991/sorta.iecho failed"
  102. set `wc -c 1991/sorta.iecho`;Wc_c=$1
  103. if test "$Wc_c" != "181"; then
  104.     echo original size 181, current size $Wc_c
  105. fi
  106. # ============= 1991/brnstnd_ansi.c ==============
  107. echo "x - extracting 1991/brnstnd_ansi.c (Text)"
  108. sed 's/^X//' << 'SHAR_EOF' > 1991/brnstnd_ansi.c &&
  109. X#include <stdio.h>
  110. X#define H(x,y,z) f(p){--p;c=x-_+1];f(c>0){y+1]=z[c];z[c]=y];y]=y+1];}}
  111. X#define O(x,y) F(x,int U;int T=0;d=M(U=1);W{f(c==y)b g[T++]=c;f(T==U)g=realloc(g,U<<=1);}g[T]=0;)
  112. X#define W Y((c=k?K[--k]:getchar())-EOF)
  113. X#define S i[q
  114. X#define F(w,z) f(c==w){z h}
  115. X#define f if
  116. X#define P p>1&&(c=u,
  117. X#define _ s[p
  118. X#define C =G
  119. X#define g S]
  120. X#define J(x,y) F(I[x],y)
  121. X#define Q P e
  122. X#define Y while
  123. X#define b break;
  124. X#define u _--]
  125. X#define m p&&
  126. X#define R char*
  127. X#define l Z[c]
  128. X#define L strlen
  129. X#define d i[++q]
  130. X#define G c)
  131. X#define h ;continue;
  132. X#define N s[++p]
  133. X#define e _]
  134. X#define j x;{R r=M(L(
  135. X#define v return
  136. X#define w [256]
  137. X#define V f(k>o||p>o||q>o)v 2;
  138. XR I="I'd love ta win: the most useful !$>%`/#<&*|^ _OBFUSCATED_ utility. Pleez?";U(y,x)R y;R*j*x)+L(y)+1);sprintf(r,"%s%s",*x,y);*x=r;}R T(x)R j x)+1);strcpy(r,x);v
  139. Xr;}R(i w);static R(Z w);int K w;main(a,A)int a;R*A;{int s w,p=0,q=0,n=0,c,k=0;W{V
  140. Xf(c>='0'&&c<='9'){f(!n)N=0;n=1;e=10*e+(c-'0')h}n=0;J(39,m
  141. Xsprintf(d=M(13),"%d",e))
  142. XJ(37,q&&puts(g))J(34,q&&printf("%s",g))J(27,H(p,_,s))O('[',']')J(56,f(p){c=e;N=c;})J(2,m--p)J(10,N=a)J(4,f(q){N=L(g);X(S--]);})J(1,f(q){S+1]=T(g);++q;})J(53,m
  143. Xe>=0&&e<a&&(d=T(A[u])))
  144. XJ(54,q>1&&(--q,U(S+1],i+q)))J(5,q&&p>1&&(_-1]=open(g,_-1],e),--p,X(S--])))J(47,m
  145. Xclose(u))
  146. XJ(26,m(e=dup(e)))O('"','"')J(51,H(q,S,i))J(49,N=fork())J(12,wait(&N)+1||(e=-1))J(68,{++p;pipe(s+p++)==-1&&(e=-1);})F('q',v
  147. X0)
  148. XF('=',W{R x;f(m u)f(x=l){k+=n=L(x);V;Y(*x)K[--k]=*x++;k+=n;n=0;}b})J(15,f(q)W{l&&X(l);l=T(g);b})J(33,f(c=q){*i=g;g=0;Y(--q&&**(i+q))g++;f(q){N=execvp(*i,i+q+1);q=c;}})J(38,P
  149. Xc&&(e/C))
  150. XJ(35,Q=e>G)F('+',Q+C)J(42,Q*C)J(41,Q=~(e&G))J(57,m(e=-e))J(3,)F('\n',)putchar(c);puts(73+I);}}
  151. SHAR_EOF
  152. $TOUCH -am 0807171891 1991/brnstnd_ansi.c &&
  153. chmod 0444 1991/brnstnd_ansi.c ||
  154. echo "restore of 1991/brnstnd_ansi.c failed"
  155. set `wc -c 1991/brnstnd_ansi.c`;Wc_c=$1
  156. if test "$Wc_c" != "1669"; then
  157.     echo original size 1669, current size $Wc_c
  158. fi
  159. # ============= 1991/cdupont_ansi.c ==============
  160. echo "x - extracting 1991/cdupont_ansi.c (Text)"
  161. sed 's/^X//' << 'SHAR_EOF' > 1991/cdupont_ansi.c &&
  162. X   /* common sense  to nohonest programmer */
  163. X#include <stdio.h>
  164. Xmain(){int x  ,gi=4,i,f,ri=1,httxkbl=1,m=012;long cd=0x5765248d,n;
  165. X   char u[0x50][032];FILE *ind;
  166. X      ind=fopen(s,t); for(i=0; i<0x1a; i++){goto daswjhkls;vhjsgfdy1l1gjhd:;}
  167. X/*borntorun.*/goto c0g0;cOgO:i=0;fclose(ind);c0gO:
  168. Xx=  u [gi][m]; sorryfor_this_unused_but_very_needed_label:
  169. X     if(  m==gi){x=0x70;f=0x68;}else goto cOg0 ; b:putchar(x); if(
  170. X!(n-httxkbl++))
  171. X#define yank(x) putchar(x)
  172. X  {httxkbl=1;       yank(' ');goto
  173. X   hxi;}goto bl;
  174. X           /* hardlyundrstandable, but
  175. Xlikely to be missed if removed */
  176. X    daswjhkls:    fgets(u[i], 0120, ind);
  177. X  /*obfuscated, eh? */goto
  178. X    vhjsgfdy1l1gjhd;
  179. X          c0g0 : n=cd&0x40000000L>>0x1e;
  180. X goto         cOgO;   g6w:
  181. X                 if(x!=0x2e){i++;goto c0gO;}else /*
  182. Xinjail*/yank('\n');goto vhjsgfdyl1lgjhd;
  183. XcOg0 :
  184. Xf=u[m][gi];goto b;bl:m=(i+1)*(4*
  185. Xx+3*f)%032;gi=(i+1)*(x+2*f)%0x1a; goto g6w;
  186. X  hxi:cd^=        n=  cd&(7<<3*(014-++ri));
  187. Xn >>=3*(12-ri); goto bl;vhjsgfdyl1lgjhd:;}
  188. SHAR_EOF
  189. $TOUCH -am 0527202891 1991/cdupont_ansi.c &&
  190. chmod 0444 1991/cdupont_ansi.c ||
  191. echo "restore of 1991/cdupont_ansi.c failed"
  192. set `wc -c 1991/cdupont_ansi.c`;Wc_c=$1
  193. if test "$Wc_c" != "1009"; then
  194.     echo original size 1009, current size $Wc_c
  195. fi
  196. # ============= 1991/ttt.sh ==============
  197. echo "x - extracting 1991/ttt.sh (Text)"
  198. sed 's/^X//' << 'SHAR_EOF' > 1991/ttt.sh &&
  199. X#!/bin/sh
  200. X#
  201. X# play tic-tac-toe
  202. X
  203. X# parse args
  204. X#
  205. Xif [ $# -gt 1 ]; then
  206. X    echo "usage: ttt [move_digit]" 1>&2
  207. X    echo "       ttt quitgame" 1>&2
  208. X    echo "       ttt clobber" 1>&2
  209. X    exit 1
  210. Xelif [ $# -eq 1 ]; then
  211. X    move="$1"
  212. Xelse
  213. X    move=
  214. Xfi
  215. X
  216. X# catch the clobber case
  217. X#
  218. Xif [ clobber = "$move" ]; then
  219. X    echo "ttt: rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c" 1>&2
  220. X    rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c
  221. X    echo "ttt: rm -f merlyn.c merlyn.o merlyn" 1>&2
  222. X    rm -f merlyn.c merlyn.o merlyn
  223. X    echo "ttt: removed all but the original source" 1>&2
  224. X    exit 0
  225. Xfi
  226. X
  227. X# catch the quitgame case
  228. X#
  229. Xif [ quitgame = "$move" ]; then
  230. X    echo "ttt: rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c" 1>&2
  231. X    rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c
  232. X    echo "ttt: current game removed, perhaps you were going to lose? :-)" 1>&2
  233. X    exit 0
  234. Xfi
  235. X
  236. X# watch for bad args
  237. X#
  238. Xif [ $# -eq 1 ]; then
  239. X    case "$move" in
  240. X    1|2|3|4|5|6|7|8|9) ;;
  241. X    *)  echo "ttt: bad argument" 1>&2
  242. X    echo "usage: ttt [move_digit]" 1>&2
  243. X    echo "       ttt quitgame" 1>&2
  244. X    echo "       ttt clobber" 1>&2
  245. X    exit 2 ;;
  246. X    esac
  247. Xfi
  248. X
  249. X# be sure that we have the merlyn.c source
  250. X#
  251. Xif [ ! -f merlyn.c ]; then
  252. X    if [ -f westley.c ]; then
  253. X    echo "ttt: No merlyn.c around these parts, using a copy of westley.c" 1>&2
  254. X    cp westley.c merlyn.c
  255. X    chmod +w merlyn.c
  256. X    else
  257. X    echo "ttt: Ouch!  merlyn.c and no westley.c are gone!" 1>&2
  258. X    exit 3
  259. X    fi
  260. X    # check to see if the copy worked
  261. X    if [ ! -f merlyn.c ]; then
  262. X    echo "ttt: Darn, coundn't copy westley.c to merlyn.c" 1>&2
  263. X    exit 4
  264. X    fi
  265. Xfi
  266. X
  267. X# be sure we have the merlyn program
  268. X#
  269. Xif [ ! -f merlyn ]; then
  270. X    echo "ttt: make merlyn" 1>&2
  271. X    make merlyn
  272. X    status=$?
  273. X    if [ "$status" -ne 0 ]; then
  274. X    echo "ttt: something is wrong, fix merlyn.c and build it yourself!" 1>&2
  275. X    echo "     or maybe type:  ttt clobber" 1>&2
  276. X    exit 5
  277. X    fi
  278. X    rm -f ttt_game.c
  279. Xfi
  280. X
  281. X# If we don't have a ttt_game.c, or we cannot write it, make a new ttt_game.c
  282. X#
  283. Xif [ ! -w ttt_game.c ]; then
  284. X    rm -f ttt_game.c 
  285. X    if [ -z "$move" ]; then
  286. X    merlyn | tee ttt_game.c
  287. X    else
  288. X    merlyn "$move" | tee ttt_game.c
  289. X    fi
  290. X    chmod +w ttt_game.c
  291. X
  292. X# If we have a ttt_game.c, then assume that we are in the process of playing
  293. X#
  294. Xelse
  295. X    rm -f ttt_game ttt_new.c
  296. X    echo "ttt: make ttt_game" 1>&2
  297. X    make ttt_game
  298. X    status=$?
  299. X    if [ "$status" -ne 0 ]; then
  300. X    echo "ttt: something is wrong, fix ttt_game.c and build it yourself!" 1>&2
  301. X    echo "     or maybe type:  ttt quitgame" 1>&2
  302. X    exit 6
  303. X    fi
  304. X    if [ -z "$move" ]; then
  305. X    ttt_game | tee ttt_new.c
  306. X    else
  307. X    ttt_game "$move" | tee ttt_new.c
  308. X    fi
  309. X    chmod +w ttt_new.c
  310. X    if [ -s ttt_new.c ]; then
  311. X    mv ttt_game.c ttt_old.c
  312. X    mv ttt_new.c ttt_game.c
  313. X
  314. X# Check for win, lose, or draw
  315. X# For a win or draw, copy merlyn.c to ttt_game.c
  316. X# For a loss, copy ttt_game.c to merlyn.c, as it is now better
  317. X# Also remove the executable for the file replaced
  318. X# For anything else, game in progress, do not do anything
  319. X
  320. X    if [ -n "`grep ':-(' ttt_game.c`" ]; then
  321. X        echo
  322. X        echo "ttt: I lose...I won't make THAT mistake again!"
  323. X        chmod +w merlyn.c
  324. X        mv ttt_game.c merlyn.c
  325. X        rm -f merlyn ttt_game
  326. X    else
  327. X        if [ -n "`grep ':-)' ttt_game.c`" ]; then
  328. X        echo
  329. X        echo "ttt: I win!"
  330. X        cp merlyn.c ttt_game.c
  331. X        rm -f ttt_game
  332. X        else
  333. X        if [ -z "`grep 'X=-. ' ttt_game.c`" -a -z "`grep '^. ' ttt_game.c`" ]; then
  334. X            echo
  335. X            echo "ttt: It's a draw - play again?"
  336. X            cp merlyn.c ttt_game.c
  337. X            rm -f ttt_game
  338. X        fi
  339. X        fi
  340. X    fi
  341. X
  342. X    else
  343. X    echo "ttt: something is wrong, maybe ttt_old.c will help" 1>&2
  344. X    echo "     or maybe type:  ttt quitgame" 1>&2
  345. X    echo "     or maybe type:  ttt clobber" 1>&2
  346. X    exit 7
  347. X    fi
  348. Xfi
  349. X
  350. SHAR_EOF
  351. $TOUCH -am 0814033991 1991/ttt.sh &&
  352. chmod 0444 1991/ttt.sh ||
  353. echo "restore of 1991/ttt.sh failed"
  354. set `wc -c 1991/ttt.sh`;Wc_c=$1
  355. if test "$Wc_c" != "3704"; then
  356.     echo original size 3704, current size $Wc_c
  357. fi
  358. # ============= 1991/westley.hint ==============
  359. echo "x - extracting 1991/westley.hint (Text)"
  360. sed 's/^X//' << 'SHAR_EOF' > 1991/westley.hint &&
  361. XGrand Prize: <merlyn@digibd.com> Brian Westley
  362. X
  363. X    Brian Westley (Merlyn LeRoy on usenet)
  364. X    DigiBoard, Inc.
  365. X    1026 Blair Ave.
  366. X    St. Paul, MN  55104  USA
  367. X
  368. X
  369. XJudges' comments:
  370. X
  371. X    Make and run as follows:
  372. X
  373. X    make westley
  374. X    westley [move_location] | tee nextmove.c
  375. X    
  376. X    where the 'move_location' is a digit from 1 to 9 that represents
  377. X    a move on a tic-tac-toe board:
  378. X
  379. X        1 2 3
  380. X        4 5 6
  381. X        7 8 9
  382. X
  383. X    If you omit 'move_location', then the computer moves first.  For your 
  384. X    next move, recompile nextmove.c and play it again:
  385. X
  386. X    make nextmove
  387. X    nextmove move_location | tee nextmove.c
  388. X
  389. X    We have provided the shell script, ttt, to make it easier to play the game:
  390. X
  391. X    make ttt
  392. X    ttt [first_move]    <- omit first arg to have it move first
  393. X    ttt next_move
  394. X
  395. X    The shell script determines when the game is over, and automatically 
  396. X    replaces merlyn.c with an improved version after a loss.  The ttt script 
  397. X    has two other modes:
  398. X
  399. X    ttt quitgame    <- cancel any game in process, revert to merlyn.c
  400. X    ttt clobber    <- remove all game files, revert to original source
  401. X    Try not to cheat, the computer has not learned how to catch you doing it.
  402. X
  403. X
  404. XSelected notes from the author:
  405. X
  406. X    A tic-tac-toe self-modifying program that "learns".  This C program
  407. X    plays standard tic-tac-toe on itself.  The code is written as a
  408. X    tic-tac-toe grid; moves are carried out within the code.
  409. X
  410. X    The human is X, the computer 0 [sic, "zero", not letter "O"].
  411. X
  412. X    The program, when run, reproduces itself with both the player's
  413. X    move and the computer's move added.  Recompile THIS program (using
  414. X    the same compile line) and repeat until the game is finished.
  415. X
  416. X    If the computer wins, the "straight face" in the upper right-hand
  417. X    corner ":-|" will change into a happy face ":-)".  If it is a draw,
  418. X    the face does not change.  If the computer loses, the board is
  419. X    blanked and the face changes into a sad face ":-(".  If this
  420. X    happens, the blank board should replace the original program; the
  421. X    computer changes its play and will continue to do so until it no
  422. X    longer loses games.
  423. X
  424. X    If you want a program that never loses, simply replace the string
  425. X    "9999999999  :-| " with "9883857753  :-| ".
  426. X
  427. X    How It Works (rot13 to read)
  428. X    ----------------------------
  429. X
  430. X    Gur iregvpny "onef" bs gur tevq ner vqragvpny shapgvbaf, jvgu gur
  431. X    anzr bs gur shapgvba nf n(), o(), be p().  Nsgre rnpu shapgvba vf
  432. X    pnyyrq, gur tybony inevnoyrf K naq B pbagnva ovgznfxf bs jurer nyy
  433. X    gur Kf naq Bf ner cynprq.  Gur fgngrzrag:
  434. X
  435. X    K=-   <pune>   -1;
  436. X
  437. X    rinyhngrf gb 1, -1, be -2 jura K vf 1 naq <pune> vf bar bs "K",
  438. X    "0", be " ".  Gur shapgvba F(&K) frgf gur nccebcevngr ovgf va
  439. X    (tybony ine) K naq B naq erfrgf gur inyhr bs &K gb 1.  Guvf vf ubj
  440. X    gur pheerag cbfvgvba vf pbzchgrq.
  441. X
  442. X    Gur cynlre'f zbir vf BE'q vagb gur K znfx, naq (vs vg vf gur
  443. X    bcravat zbir) gur fgengrtl fgevat'f svefg punenpgre vf frg gb gur
  444. X    cynlre'f svefg zbir (be "5" vs gur pbzchgre zbirf svefg).
  445. X
  446. X    Gur rinyhgvba shapgvba l(Z) purpxf vs gur znfx unf n jvaavat
  447. X    cnggrea (nal bs gur svefg rvtug ovgznfxf bs gur j[] neenl), naq
  448. X    frgf gur inevnoyr d gb 0 vs vg qbrf.
  449. X
  450. X    Gur cynlre'f zbir vf rinyhngrq gb frr vs gur uhzna unf jba.  Gur
  451. X    fzvyrl vf frg gb :-) be :-( qrcraqvat ba guvf.  Nyfb, vs gur uhzna
  452. X    unf jba, gur qvtvg va gur fgengrtl fgevat vf qrperzragrq gb punatr
  453. X    gur pbzchgre'f cynl sbe arkg tnzr.
  454. X
  455. X    Vs gur uhzna unf ABG jba, gur r(A,Z) shapgvba rinyhngrf vs NAL zbir
  456. X    abg va znfx A pna cebqhpr n jva va znfx Z.  Gur svefg rinyhngvba
  457. X    r(K,B) purpxf vs B pna znxr n yrtny jvaavat zbir.  Vs fb, gur
  458. X    pbzchgre unf n jvaavat zbir naq znxrf vg.  Vs abg, gur fzvyrl vf
  459. X    frg gb :-|, naq n aba-jvaavat zbir vf trarengrq.
  460. X
  461. X    N aba-jvaavat zbir svefg purpxf vs K pna jva va bar zbir; vs fb,
  462. X    guvf zbir vf fryrpgrq, oybpxvat gur jva.  Bgurejvfr, n zbir vf
  463. X    trarengrq ol ybbxvat qbja gur yvfg bs "zbir grzcyngrf".  Gur svefg
  464. X    zbir grzcyngr gung trarengrf n zbir gung vf ABG nyernql bpphcvrq ol
  465. X    na K be B vf erghearq.
  466. X
  467. X    Gur "zbir grzcyngrf" ner fgngvp gvp-gnp-gbr cbfvgvbaf gung trarengr
  468. X    cbffvoyr zbirf ol znxvat gur r() shapgvba erghea "jvaavat" zbirf,
  469. X    r.t. gur grzcyngr:
  470. X
  471. X    . . .
  472. X    B , B    (guvf vf gur inyhr 40; 2^3+2^5)
  473. X    . . .    ("B"f ner 1 ovgf, "." naq "," ner 0 ovgf)
  474. X
  475. X    ...jvyy znxr gur r() shapgvba erghea n pragre zbir, nf
  476. X    guvf vf gur bayl zbir gung cebqhprf guerr va n ebj.  Abgvpr gung
  477. X    gur pbzchgre qbrf abg pbafvqre juvpu pryyf pbagnva Kf naq Bf jura
  478. X    znxvat n grzcyngr zbir, bayl juvpu pryyf ner rzcgl naq abg-rzcgl.
  479. X    Guvf znxrf sbe hahfhny cynl.
  480. X
  481. X    Gur grzcyngrf ner pnershyyl pubfra gb riraghnyyl oybpx nyy gencf
  482. X    gung K pna gel, ol whfg oyhaqrevat va gur jnl.
  483. X
  484. X    Nyfb abgr gung gur jvaavat & fgengrtl grzcyngrf ner cneg bs gur
  485. X    pbzcvyr yvar, znxvat vg cbffvoyr gb punatr gur ehyrf bs gur tnzr ol
  486. X    punatvat gur pbzcvyr yvar.
  487. X
  488. X    Gur grzcyngrf ner:
  489. X
  490. X    B , B
  491. X    , , ,
  492. X    B , B
  493. X
  494. X    , . .
  495. X    . B .
  496. X    . . B
  497. X
  498. X    . . .
  499. X    B , B
  500. X    . . .
  501. X
  502. X    . . .
  503. X    B B ,
  504. X    . . .
  505. X
  506. X    . . .
  507. X    B , B
  508. X    . . .
  509. X
  510. X    . , ,
  511. X    . B .
  512. X    B B ,
  513. X
  514. X    B , B
  515. X    , , .
  516. X    B . .
  517. X
  518. X    , . B
  519. X    B , B
  520. X    B . ,
  521. X
  522. X    B . ,
  523. X    B , B
  524. X    , . B
  525. X
  526. X    B , B
  527. X    , , ,
  528. X    B , B
  529. X
  530. X    N qvtvg bs "9" zrnaf fgneg jvgu gur svefg grzcyngr, "8" fgnegf ng
  531. X    gur frpbaq, rgp.  Gur grzcyngrf ner fpnaarq hagvy n yrtny zbir vf
  532. X    sbhaq.  N grzcyngr vf fpnaarq sebz obggbz gb gbc, evtug gb yrsg
  533. X    (v.r.  zbir 9 vf grfgrq svefg, gura 8, qbja gb zbir 1).
  534. SHAR_EOF
  535. $TOUCH -am 0815181991 1991/westley.hint &&
  536. chmod 0444 1991/westley.hint ||
  537. echo "restore of 1991/westley.hint failed"
  538. set `wc -c 1991/westley.hint`;Wc_c=$1
  539. if test "$Wc_c" != "5435"; then
  540.     echo original size 5435, current size $Wc_c
  541. fi
  542. # ============= 1991/dds.hint ==============
  543. echo "x - extracting 1991/dds.hint (Text)"
  544. sed 's/^X//' << 'SHAR_EOF' > 1991/dds.hint &&
  545. XMost Well Rounded: <dds@doc.ic.ac.uk> Diomidis Spinellis
  546. X
  547. X    Diomidis Spinellis
  548. X    Imperial College, University of London
  549. X    Myrsinis 1
  550. X    GR-145 62 Kifissia
  551. X    Greece
  552. X
  553. X
  554. XJudges' comments:
  555. X
  556. X    Make and run as follows:
  557. X    
  558. X    make dds
  559. X    dds basic_program
  560. X    a.out
  561. X
  562. X    For example, the author suggests trying:
  563. X     
  564. X    dds LANDER.BAS
  565. X    a.out
  566. X
  567. X    Notice that a file a.c has been generated.  Can you tell how a.c was
  568. X    produced?  How does a.c relate to LANDER.BAS?
  569. X
  570. X    This obfuscated program translates BASIC programs into obfuscated
  571. X    C programs by way of an obfuscated algorithm.
  572. X
  573. X    NOTE: Due to minor problems with some strict ANSI C compilers, we 
  574. X      have supplied a more portable ANSI version.
  575. X
  576. X
  577. XSelected notes from the author:
  578. X
  579. X    This program is a companion to the DDS-BASIC interpreter program that
  580. X    was submitted to the contest in 1990.  This compiles BASIC programs into
  581. X    executable commands.  The input format is almost identical to the input
  582. X    format of the DDS-BASIC interpreter.  The program needs an executable C
  583. X    compiler called `cc' in your path in order to work.
  584. X
  585. X    Program commands:
  586. X
  587. X    variable names A to Z        variables initialized to 0 on RUN
  588. X    FOR var = exp TO exp        NEXT variable
  589. X    GOSUB exp            RETURN
  590. X    GOTO exp            IF exp THEN exp
  591. X    INPUT variable            PRINT string
  592. X    PRINT exp            var = exp
  593. X    REM any text            END
  594. X
  595. X    Expressions are the same as the expressions of the C language.
  596. X    Many system calls and C library calls can be used.
  597. X
  598. X    Input format:
  599. X
  600. X    - Free format positioning of tokens on the line.
  601. X    - No space is allowed before the line number.
  602. X    - Exactly one space is needed after the FOR and NEXT tokens
  603. X    - ALL INPUT MUST BE UPPERCASE.
  604. X
  605. X    Error checking / error reports:
  606. X
  607. X    The compiler silently ignores many errors.
  608. X    Other errors may produce errors in later phases of the compilation.
  609. X
  610. XCan you figure out how the compiler works?  Hint (rot13):
  611. X
  612. X    The compiler is NOT written in C, so this is really a meta-obfuscated
  613. X    program.  The C code is an intepreter for the four register, seven
  614. X    instruction COGNIMP$ machine that is contained in the s string.
  615. X    (COGNIMP$ is named after the symbolic names of the seven instructions it
  616. X    defines (Print Output Goto Match If, iNcrement and Copy).  The $ sign
  617. X    is used for labels.)  The actual compiler is written in COGNIMP$.
  618. X    Browsing through the COGNIMP$ code we encouriage you to examine the
  619. X    loops for scanning the expression in the IF statement and the way a
  620. X    decision tree is implemented in order to match the statements.  (Of
  621. X    course the 's' string is encoded by adding one to every character of it just
  622. X    to confuse you).
  623. SHAR_EOF
  624. $TOUCH -am 0814003291 1991/dds.hint &&
  625. chmod 0444 1991/dds.hint ||
  626. echo "restore of 1991/dds.hint failed"
  627. set `wc -c 1991/dds.hint`;Wc_c=$1
  628. if test "$Wc_c" != "2619"; then
  629.     echo original size 2619, current size $Wc_c
  630. fi
  631. # ============= 1991/LANDER.BAS ==============
  632. echo "x - extracting 1991/LANDER.BAS (Text)"
  633. sed 's/^X//' << 'SHAR_EOF' > 1991/LANDER.BAS &&
  634. X10 REM Lunar Lander
  635. X20 REM By Diomidis Spinellis
  636. X25 REM Compiler version
  637. X30 PRINT "You aboard the Lunar Lander about to leave the spacecraft."
  638. X60 GOSUB 4000
  639. X70 GOSUB 1000
  640. X80 GOSUB 2000
  641. X90 GOSUB 3000
  642. X100 LET H = H - V
  643. X110 LET V = ((V + G) * 10 - U * 2) / 10
  644. X120 LET F = F - U
  645. X130 IF H > 0 THEN 80
  646. X135 LET H = 0
  647. X140 GOSUB 2000
  648. X150 IF V > 5 THEN 200
  649. X160 PRINT "Congratulations!  This was a very good landing."
  650. X170 GOSUB 5000
  651. X180 GOTO 10
  652. X200 PRINT "You have crashed."
  653. X210 GOTO 170
  654. X1000 REM Initialise
  655. X1010 LET V = 70
  656. X1020 LET F = 500
  657. X1030 LET H = 1000
  658. X1040 LET G = 2
  659. X1050 RETURN
  660. X2000 REM Print values
  661. X2010 PRINT "        Meter readings"
  662. X2015 PRINT "        --------------"
  663. X2020 PRINT "Fuel (gal):"
  664. X2030 PRINT F
  665. X2040 GOSUB 2100 + 100 * (H != 0)
  666. X2050 PRINT V
  667. X2060 PRINT "Height (m):"
  668. X2070 PRINT H
  669. X2080 RETURN
  670. X2100 PRINT "Landing velocity (m/sec):"
  671. X2110 RETURN
  672. X2200 PRINT "Velocity (m/sec):"
  673. X2210 RETURN
  674. X3000 REM User input
  675. X3005 IF F == 0 THEN 3070
  676. X3010 PRINT "How much fuel will you use?"
  677. X3020 INPUT U
  678. X3025 IF U < 0 THEN 3090
  679. X3030 IF U <= F THEN 3060
  680. X3040 PRINT "Sorry, you have not got that much fuel!"
  681. X3045 PRINT F
  682. X3050 GOTO 3010
  683. X3060 RETURN
  684. X3070 LET U = 0
  685. X3080 RETURN
  686. X3090 PRINT "No cheating please!  Fuel must be >= 0."
  687. X3100 GOTO 3010
  688. X4000 REM Detachment
  689. X4005 PRINT "Ready for detachment"
  690. X4007 PRINT "-- COUNTDOWN --"
  691. X4010 FOR I = 1 TO 11
  692. X4020   PRINT 11 - I
  693. X4025   GOSUB 4500
  694. X4030 NEXT I
  695. X4035 PRINT "You have left the spacecraft."
  696. X4037 PRINT "Try to land with velocity less than 5 m/sec."
  697. X4040 RETURN
  698. X4500 REM Delay
  699. X4510 FOR J = 1 TO 500
  700. X4520 NEXT J
  701. X4530 RETURN
  702. X5000 PRINT "Do you want to play again? (0 = no, 1 = yes)"
  703. X5010 INPUT Y
  704. X5020 IF Y == 0 THEN 5040
  705. X5030 RETURN
  706. X5040 PRINT "Have a nice day."
  707. X5050 END
  708. SHAR_EOF
  709. $TOUCH -am 0527203391 1991/LANDER.BAS &&
  710. chmod 0444 1991/LANDER.BAS ||
  711. echo "restore of 1991/LANDER.BAS failed"
  712. set `wc -c 1991/LANDER.BAS`;Wc_c=$1
  713. if test "$Wc_c" != "1708"; then
  714.     echo original size 1708, current size $Wc_c
  715. fi
  716. # ============= 1991/sorta.ifact1 ==============
  717. echo "x - extracting 1991/sorta.ifact1 (Text)"
  718. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.ifact1 &&
  719. X1#`ld2*#`ld3*#`ld4*#`ld5*#`ld6*#`ld7*#`ld8*#`ld9*#`ld10*#`ld
  720. SHAR_EOF
  721. $TOUCH -am 0622130991 1991/sorta.ifact1 &&
  722. chmod 0444 1991/sorta.ifact1 ||
  723. echo "restore of 1991/sorta.ifact1 failed"
  724. set `wc -c 1991/sorta.ifact1`;Wc_c=$1
  725. if test "$Wc_c" != "61"; then
  726.     echo original size 61, current size $Wc_c
  727. fi
  728. # ============= 1991/sorta.iio ==============
  729. echo "x - extracting 1991/sorta.iio (Text)"
  730. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.iio &&
  731. X      [ a simple example of interpreting code on the fly ]ld
  732. X
  733. X["] "2 2+":xT ["]T " produces "T 1=x#T " which should be 4."T`
  734. SHAR_EOF
  735. $TOUCH -am 0622131091 1991/sorta.iio &&
  736. chmod 0444 1991/sorta.iio ||
  737. echo "restore of 1991/sorta.iio failed"
  738. set `wc -c 1991/sorta.iio`;Wc_c=$1
  739. if test "$Wc_c" != "125"; then
  740.     echo original size 125, current size $Wc_c
  741. fi
  742. # ============= 1991/ant.hint ==============
  743. echo "x - extracting 1991/ant.hint (Text)"
  744. sed 's/^X//' << 'SHAR_EOF' > 1991/ant.hint &&
  745. XBest Utility: <ant@mks.com> Anthony C Howe
  746. X
  747. X    Anthony C Howe
  748. X    Mortice Kern Systems Inc.    #CL-23
  749. X    35 King St. N            268 Phillip St.
  750. X    Waterloo, On            Waterloo, On        
  751. X    Canada, N2J 2W9            Canada, N2L 6G9
  752. X
  753. X
  754. XJudges' comments:
  755. X
  756. X    Make and run with a filename (writable or to be created) as an argument.
  757. X    For example, try:
  758. X
  759. X    make ant
  760. X    cp ant.hint hill
  761. X    ant hill
  762. X
  763. X    Note that some old BSD systems may have trouble compiling this entry.
  764. X    They may complain about 'idlok' being undefined.  You can fix this
  765. X    by changing line 26 from:
  766. X
  767. X    2;initscr();d=LINES;raw();noecho();idlok(stdscr,1);if(0<(i= ...
  768. X    to:
  769. X    2;initscr();d=LINES;raw();noecho();if(0<(i= ...
  770. X     
  771. X    ***or*** update to a modern version of Un*x.  :-)  If you have source,
  772. X    you can use this entry to help in your upgrade.
  773. X
  774. X    You may need to change the makefile depending on what type of system
  775. X    you are running.  See the notes in ansi.mk or common.mk.
  776. X
  777. X    The author was kind enough to supply a list of references below,
  778. X    in case you are still confused after read the source!  :-)
  779. X
  780. X
  781. XSelected notes from the author:
  782. X
  783. X    Ant's Editor vIOCCC91
  784. X
  785. X    Text files consists of lines of printable text or tab characters.  
  786. X    A line can be of arbitrary length and is delimited by either a 
  787. X    newline or the end of file.  Carriage return is mapped to newline 
  788. X    on input and ignored on output.  Tab stops are every eight columns.
  789. X    Non-printable characters may have unpredictable results depending
  790. X    on the implementation of CURSES.
  791. X    
  792. X    COMMANDS
  793. X    h j k l        left, down, up, right cursor movement
  794. X    H J K L        word left, page down, page up, word right
  795. X    [ ]        beginning and end of line
  796. X    t b        top and bottom of file
  797. X    i        enter insert mode, formfeed to quit
  798. X    x        delete character under the cursor
  799. X    W        write buffer to file
  800. X    R        refresh the screen
  801. X    Q        quit
  802. X    
  803. X    EXIT STATUS
  804. X    0    success
  805. X    2    missing edit filename
  806. X    
  807. X    The BUF size should be set at compile time to 32767.  This value
  808. X    was used because the Sozobon C compiler for the Atari ST has 16 
  809. X    bit ints and a limit on the size of arrays & structures of 32k.  
  810. X    Also the WatCom C compiler for the PC also has 16 bits ints.  On 
  811. X    machines that have 32 bit ints (most unix boxes), a larger value 
  812. X    for BUF could be used.
  813. X    
  814. X    It is recommend that compact memory model be used on PC class
  815. X    machines.  Small memory model may work too provided BUF is not
  816. X    too large.
  817. X    
  818. X    The character constants '\b', '\f', '\n', '\r', '\t' are used 
  819. X    in order to provide more portable code, since the compiler should
  820. X    handle the translation of them into the native character set.
  821. X    Note that '\f' (formfeed) was used to exit insert mode because
  822. X    K&R C had no escape constant for the escape-key.
  823. X    
  824. X    My goals for this project were to learn and experiment with the 
  825. X    Buffer Gap Scheme [Fin80][net90], write a useful and *portable* 
  826. X    programme, and meet the requirements of the IOCCC.  I initially 
  827. X    planned to have a mini CURSES built-in like the IOCCC Tetris entry 
  828. X    from a previous year, however this was not as portable as using a
  829. X    CURSES library with TERMINFO/TERMCAP support.  
  830. X
  831. X    I plan to post followups such as unobfuscated versions and bugs
  832. X    fixes to comp.editors.  Reposts of the editor.101, gap.doc, and
  833. X    editor.102 can be found in the same group every so often.
  834. X
  835. X    This entry will display a file with long lines, but has trouble
  836. X    scrolling the screen with long lines.  Paging up and down should
  837. X    work correctly, however.
  838. X
  839. X    REFERENCES
  840. X    [Fin80]    Craig A. Finseth, "Theory and Practice of Text Editors or 
  841. X        A Cookbook For An EMACS", TM-165, MIT Lab. for Computer 
  842. X        Science
  843. X    
  844. X    [KeP81]    Kernighan & Plauger, "Software Tools in Pascal", 
  845. X        Addison-Wesley, 81, chapter 6
  846. X    
  847. X    [Mil86]    Eugene W. Myers & Webb Miller, "Row-replacement Algorithms
  848. X        for Screen Editors", TR 86-19, Dept. of Computer Science, 
  849. X        U. of Arizona
  850. X    
  851. X    [MyM86]    Eugene W. Myers & Webb Miller, "A simple row-replacement 
  852. X        method", TR 86-28, Dept. of Computer Science, U. of Arizona
  853. X    
  854. X    [Mil87]    Webb Miller, "A Software Tools Sampler", Prentice Hall, 87
  855. X        ISBN 0-13-822305-X, chapter 5
  856. X    
  857. X    [net90]    "Editor 101/102" articles from comp.editors
  858. SHAR_EOF
  859. $TOUCH -am 0814003091 1991/ant.hint &&
  860. chmod 0444 1991/ant.hint ||
  861. echo "restore of 1991/ant.hint failed"
  862. set `wc -c 1991/ant.hint`;Wc_c=$1
  863. if test "$Wc_c" != "4255"; then
  864.     echo original size 4255, current size $Wc_c
  865. fi
  866. # ============= 1991/sorta.ifact2 ==============
  867. echo "x - extracting 1991/sorta.ifact2 (Text)"
  868. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.ifact2 &&
  869. X[1+D2s*#`ld1s]:f
  870. X1 0
  871. X1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f
  872. SHAR_EOF
  873. $TOUCH -am 0622130991 1991/sorta.ifact2 &&
  874. chmod 0444 1991/sorta.ifact2 ||
  875. echo "restore of 1991/sorta.ifact2 failed"
  876. set `wc -c 1991/sorta.ifact2`;Wc_c=$1
  877. if test "$Wc_c" != "61"; then
  878.     echo original size 61, current size $Wc_c
  879. fi
  880. # ============= 1991/buzzard.hint ==============
  881. echo "x - extracting 1991/buzzard.hint (Text)"
  882. sed 's/^X//' << 'SHAR_EOF' > 1991/buzzard.hint &&
  883. XBest Output: <buzzard@eng.umd.edu> Sean Barrett
  884. X
  885. X    Sean Barrett
  886. X    University of Maryland
  887. X    5407 20th Place 
  888. X    Hyattsville MD 20782 
  889. X    USA
  890. X
  891. X
  892. XJudges' comments:
  893. X
  894. X    Make and run as follows:
  895. X
  896. X    make buzzard
  897. X    buzzard
  898. X
  899. X    You will be A-mazed.
  900. X
  901. X    You are invited to try to cheat, ... if you can figure out how!  :-)
  902. X
  903. X
  904. XSelected notes from the author:
  905. X
  906. X    HOW TO PLAY:
  907. X
  908. X    When the game starts, you are at the far end of the maze from the
  909. X    exit, looking down a corridor.  To move forward, type 'f' and press
  910. X    return.  To turn 90 degrees right, type 'r'; left, 'l'.  You can
  911. X    put multiple commands on one line, and the new view will be drawn
  912. X    after all the moves.
  913. X
  914. X    The game ends if you get out the exit (you'll know it when you see
  915. X    it) or when you type ^D.
  916. X
  917. X    HINTS ON HOW TO CHEAT:  (rot13 to read)
  918. X
  919. X    Lbh pna, bs pbhefr, purng ol ybbxvat ng gur znmr znc.  Gur dhrfgvba
  920. X    lbh arrq gb nfx lbhefrys, gubhtu, vf jung frdhrapr bs punenpgref
  921. X    znexf gur cynpr jurer lbh pna rfpncr gur znmr?
  922. X
  923. X    Gur nytbevguz vf dhvgr ovmneer--gur cevznel arfgrq ybbc gung
  924. X    trarengrf vg tbrf gbc gb obggbz ba gur qvfcynl, ybbcvat sbejneq
  925. X    gura onpxjneq sebz gur pheerag cbfvgvba gb qenj gur yrsg fvqr naq
  926. X    gura gur evtug fvqr.
  927. X
  928. X    ADVANCED USAGE NOTES:  (rot13 to read)
  929. X
  930. X    Gur cebtenz pna nyfb or eha sebz bgure svyrf pbagnvavat znmrf.  Gur
  931. X    znmr fubhyq or ynvq bhg tencuvpnyyl va gur boivbhf sbezng; arjyvarf
  932. X    frcnengr culfvpny ebjf va gur znmr; n fcnpr vaqvpngrf n pbeevqbe,
  933. X    naq nal bgure punenpgre vf n jnyy.  Gnof ner nyfb pbafvqrerq jnyyf,
  934. X    fb znxr fher gb pbaireg gnof gb fcnprf orsber hfvat vg.
  935. X
  936. X    Hfntr: ohmmneq [svyranzr [rfpncr-pune [fgneg-k fgneg-l]]]
  937. X
  938. X    Svyranzr vf gur anzr bs gur svyr pbagnvavat gur znmr.  Guvf
  939. X    qrsnhygf gb 'ohmmneq.p'.
  940. X
  941. X    Rfpncr-pune vf gur punenpgre va gur znmr gung ercerfragf gur rkvg.
  942. X    Lbh pna chg zber guna bar rkvg va gur znmr (sbe rknzcyr, lbh pbhyq
  943. X    znxr nyy '!'f va gur znmr or rkvgf).
  944. X
  945. X    Fgneg-k naq fgneg-l znex gur pbbeqvangrf jurer lbh ortva cynlvat.
  946. X    L pbbeqvangr vf qbja gur ebjf va gur svyrf, K vf gb gur evtug
  947. X    guebhtu gur punenpgref bs rnpu yvar.  Obgu K naq L ortva pbhagvat
  948. X    sebz 0.  Gur qrsnhyg vf fgneg-k = 4, fgneg-l = 5, juvpu vf arrqrq
  949. X    sbe gur ohmmneq.p, ohg jbhyq cebonoyl or vanccebcevngr sbe bgure
  950. X    znmrf.
  951. X
  952. X    OHTF:
  953. X
  954. X    Lbh pna'g punatr gung ng fgneg lbh'er snpvat qbja ("fbhgu").
  955. X        
  956. X    Gur qenjvat nytbevguz pnaabg unaqyr bcra fcnprf (gjb fhpprfvir
  957. X    fvqr-pbeevqbef jvgu ab jnyy orgjrra gurz).  Va snpg, vg pnaabg unaqyr
  958. X    fznyy qbt-yrtf cebcreyl, nygubhtu gur reebe vf fhogyr.
  959. X
  960. X    Gur rkvg vf qenja yvxr n abezny pbeevqbe sebz gur fvqr ivrj;
  961. X    vg'f bayl qvfcynlrq nf gur rkvg jura lbh ner snpvat vg.
  962. X
  963. X    Vzcebcre pbzznaqyvar nethzragf ner abg unaqyrq avpryl.
  964. X
  965. X    Znmrf jvgu bcravatf ng gur rqtrf jvyy pnhfr gur qenjvat cebtenz
  966. X    gb ernpu vagb neovgenel cnepryf bs zrzbel.
  967. X
  968. X    Gur cebtenz nffhzrf gung gnof ner frg gb 8 punenpgref.
  969. SHAR_EOF
  970. $TOUCH -am 0814003191 1991/buzzard.hint &&
  971. chmod 0444 1991/buzzard.hint ||
  972. echo "restore of 1991/buzzard.hint failed"
  973. set `wc -c 1991/buzzard.hint`;Wc_c=$1
  974. if test "$Wc_c" != "2968"; then
  975.     echo original size 2968, current size $Wc_c
  976. fi
  977. # ============= 1991/cdupont.hint ==============
  978. echo "x - extracting 1991/cdupont.hint (Text)"
  979. sed 's/^X//' << 'SHAR_EOF' > 1991/cdupont.hint &&
  980. XMost Useful Label: <cdupont@ensl.ens-lyon.fr> Christian Dupont
  981. X
  982. X    Christian Dupont
  983. X    Ecole Normale Superieure de Lyon,
  984. X    Laboratoire d'Informatique Parallele
  985. X    42, Rue H.Berlioz 
  986. X    69009 Lyon 
  987. X    France
  988. X
  989. X
  990. XJudges' comments:
  991. X
  992. X    Make and run as follows:
  993. X
  994. X    make cdupont
  995. X    cdupont
  996. X
  997. X    Why is the following label necessary?
  998. X    
  999. X    sorryfor_this_unused_but_very_needed_label:
  1000. X
  1001. X    Notice that if you C beautify (cb) or pre-process this program, it
  1002. X    will no longer work correctly, or at all.  (go ahead, try it... :-))
  1003. X
  1004. X    NOTE: Due to minor problems with some ANSI C compilers, we have
  1005. X      supplied a more portable ANSI version.  See the top level
  1006. X      README file for details.
  1007. X
  1008. X    NOTE: One should remove the final trailing newline to obtain the
  1009. X      original source file.  This step is not needed to compile
  1010. X      this entry.
  1011. X
  1012. X
  1013. XSelected notes from the author:
  1014. X
  1015. X    Spoiler, rot13 to read:
  1016. X
  1017. X    Gur fbhepr pbqr ubyqf gur yrggref bs gur zrffntr. Rnpu yrggre, pbzovarq
  1018. X    jvgu nabgure xrl yrggre, vf hfrq gb pbzchgr gur pbbeqvangrf bs gur arkg
  1019. X    yrggre naq xrl. Guhf, gur zrffntr vf pbqr.  Gung vf jul V hfr fvyyl 
  1020. X    pbzzragf, zbfg bsgra onqyl fcnprq.
  1021. X
  1022. X    Gur fcnpr punenpgre frdhrapr orgjrra gur jbeqf vf tvira ol n fvzcyr
  1023. X    pbzchgngvba ba na bpgny pbafgnag (tvira urer nf na urk inyhr, bs
  1024. X    pbhefr).
  1025. X
  1026. X    Guvf jnl, nal zrffntr pna or zvkrq vagb n pbqr, fvapr gur xrlf nyybj
  1027. X    lbh gb cynpr gur zrnavatshy yrggref jurerire lbh jnag.
  1028. SHAR_EOF
  1029. $TOUCH -am 0814003191 1991/cdupont.hint &&
  1030. chmod 0444 1991/cdupont.hint ||
  1031. echo "restore of 1991/cdupont.hint failed"
  1032. set `wc -c 1991/cdupont.hint`;Wc_c=$1
  1033. if test "$Wc_c" != "1428"; then
  1034.     echo original size 1428, current size $Wc_c
  1035. fi
  1036. # ============= 1991/fine.hint ==============
  1037. echo "x - extracting 1991/fine.hint (Text)"
  1038. sed 's/^X//' << 'SHAR_EOF' > 1991/fine.hint &&
  1039. XBest One Liner: <fine@cis.ohio-state.edu> Thomas A. Fine
  1040. X
  1041. X    Thomas A. Fine
  1042. X    Ohio State University
  1043. X    Department of Computer and Information Science
  1044. X    2036 Neil Avenue Mall
  1045. X    Columbus, Ohio  43210
  1046. X    USA
  1047. X
  1048. X
  1049. XJudges' comments:
  1050. X
  1051. X    Make and run as follows:
  1052. X
  1053. X    make fine
  1054. X    echo "green terra
  1055. X    vex
  1056. X    tang
  1057. X    vend onyx
  1058. X    cheryl be flashy
  1059. X    rail
  1060. X    clerk" | fine
  1061. X
  1062. X    This filter, 80 chars plus a newline, fits into a single line on most 
  1063. X    terminals (unless your terminal has a line wrap mis-feature :-)).
  1064. X
  1065. X    This entry is likely one of the smallest C implementations of this
  1066. X    filter, excluding programs that resort to command line or include 
  1067. X    file tricks.
  1068. X
  1069. X    How does this program work?  Which 3 bytes of C code can be changed
  1070. X    into 2 bytes, allowing the program to still work, but also stripping 
  1071. X    the high bit off of some input?
  1072. X
  1073. X
  1074. XSelected notes from the author:
  1075. X
  1076. X    The author wishes to thank J Greely for the last 6 bytes.
  1077. X
  1078. X    Here's about how it does it:  [rot13 to read]
  1079. X
  1080. X    
  1081. X    ABGR:  Ovgf ner ersreerq gb nf 76543210, uvtu gb ybj.
  1082. X    
  1083. X    1.  Trg gur punenpgre va inevnoyr n.  Abgr gur sha jnl jr purpx sbe RBS.
  1084. X        (gunaxf W).
  1085. X    
  1086. X    2.  Erirefr ovg 6, naq fgevc ovg 5.  Ovg 6 qrgrezvarf (zbfgyl) jurgure
  1087. X        be abg guvf punenpgre vf n yrggre.  Ovg 5 jbhyq qrgrezvar pnfr vs
  1088. X        jr pnerq.  Nffvta guvf inyhr gb inevnoyr o (Jr arrq gb fnir vg,
  1089. X        fvapr jr arrq gb znxr 2 pbzcnevfbaf naq znlor bar bcrengvba jvgu
  1090. X        guvf inyhr).  Jr pna'g nohfr bhe svefg inevnoyr, fvapr vg fnirf gur
  1091. X        ovgf jr'er punatvat.
  1092. X    
  1093. X    3.  Purpx guvf inyhr gb frr vs vg vf n yrggre.  Vg zhfg or aba-mreb -
  1094. X        vs vg vf mreb, gura jr unir rvgure gur ng-fvta (64) be gur
  1095. X        onpxdhbgr (96).  Vg nyfb zhfg or yrff guna 27 - guvf purpxf gur
  1096. X        enatr sbe yrggref nf jryy nf vzcyvpvgyl purpxvat gur inyhr bs ovg 6
  1097. X        (vs vg jnf bevtvanyyl pyrne, vg vf frg abj, fb o jbhyq or gb ovt).
  1098. X    
  1099. X    4.  Vs vg vf abg n yrggre, gur pbaqvgvbany rkcerffvba vafvqr bs gur
  1100. X        chgpune() ergheaf gur bevtvany punenpgre (n).  Bgurejvfr, vg
  1101. X        ergheaf n ernyyl zrffl rkcerffvba gung cresbezf gur npghny ebgngvba
  1102. X        naq svkrf gur svsgu naq fvkgu ovgf:
  1103. X    
  1104. X        N.  Fhogenpg 1, gb trg vagb gur enatr 0-25 (sbe gur zbqhyb bcrengvba).
  1105. X        O.  Nqq 13 gb gur punenpgre.  Fgrcf N naq O ner pbzovarq.
  1106. X        P.  Gnxr guvf zbqhyb 26 gb znxr gur nqqvgvba jenc nebhaq.
  1107. X        Q.  Svk ovgf 5 naq 6, onfrq ba inevnoyr n.
  1108. X        R.  Nqq 1 onpx va (jr gbbx vg bhg va fgrc N.)  Guvf vf bxnl gb qb
  1109. X        *nsgre* fgrc Q, orpnhfr jr xabj gur nqqvgvba jba'g gevpxyr hc
  1110. X        cnfg gur sbhegu ovg (o jbhyq unir gb or 31 sbe guvf gb unccra).
  1111. X    
  1112. X    Abgvpr gung guvf vzcyrzragngvba bcrengrf bayl ba punenpgref jvgu gur
  1113. X    uvtu ovg pyrne.  Gur uvtu ovg pna or vtaberq jvgubhg punatvat gur fvmr
  1114. X    bs gur cebtenz.  Nyfb, vs lbh xabj lbh ner bayl qrnyvat jvgu frira ovg
  1115. X    qngn, gur fvmr pna or erqhprq ol bar olgr.  Gurfr ner yrsg nf rkrepvfrf
  1116. X    sbe gur fghqrag.
  1117. X    
  1118. SHAR_EOF
  1119. $TOUCH -am 0814003291 1991/fine.hint &&
  1120. chmod 0444 1991/fine.hint ||
  1121. echo "restore of 1991/fine.hint failed"
  1122. set `wc -c 1991/fine.hint`;Wc_c=$1
  1123. if test "$Wc_c" != "2987"; then
  1124.     echo original size 2987, current size $Wc_c
  1125. fi
  1126. # ============= 1991/rince.hint ==============
  1127. echo "x - extracting 1991/rince.hint (Text)"
  1128. sed 's/^X//' << 'SHAR_EOF' > 1991/rince.hint &&
  1129. XBest Game: <rince@cs.warwick.ac.uk> James Bonfield
  1130. X
  1131. X    James Bonfield
  1132. X    University of Warwick
  1133. X    7 Water End,
  1134. X    Wrestlingworth,
  1135. X    Sandy Beds,
  1136. X    SG19 2HA
  1137. X    England
  1138. X
  1139. X
  1140. XJudges' comments:
  1141. X
  1142. X    Make and run as follows:
  1143. X
  1144. X    make rince
  1145. X    rince
  1146. X
  1147. X    This entry exposed a number of bugs in a number of ANSI C compilers!
  1148. X    Because of this, we have provided a number of different versions:
  1149. X
  1150. X    rince.orig.c    - James Bonfield entry
  1151. X              (many non-GNU ANSI compilers can't grok this code)
  1152. X    rince.c        - our non-ANSI version of rince.orig.c
  1153. X    rince_ansi.c    - same as rince.c
  1154. X              (most ANSI C compilers can deal with this)
  1155. X    
  1156. X    You may need to change the makefile depending on what type of system
  1157. X    you are running.  See the notes in ansi.mk or common.mk.
  1158. X
  1159. X
  1160. XSelected notes from the author:
  1161. X
  1162. X    This program is a simple puzzle type game. (I'll leave you to play
  1163. X    it to see the rest of it .. :-) .)  The general idea was to try and
  1164. X    write the smallest playable game, but keep the playability and
  1165. X    enjoyment high. 
  1166. X    
  1167. X            Instructions (rot 13 to read).
  1168. X            ==============================
  1169. X
  1170. X    Xrl gb znc:-
  1171. X
  1172. X                |
  1173. X     ######                 | | | /\   /--\  ==|    /\ | |  Qverpgbany xrlf 
  1174. X     ######  Fbyvq Jnyy     | ----||    \/     /\   ||----  (haybpx qbbef bs
  1175. X     ######                 |     \/  ==|     \--/  \/       gur fnzr qverpgvba)
  1176. X                |               
  1177. X                |   <<                    >>    Qbbef. Haybpxrq ol
  1178. X         Oynax fcnpr    |   <<   iiiiii  ^^^^^^   >>    gur nobir xrlf.
  1179. X                |   <<                    >>
  1180. X                |              
  1181. X       ___                  | b__B\   B__B   ^__^   /B__b   
  1182. X      /   \  'Pehfunoyr'    | \___/  /----\ /----\  \___/  Gur sbhe fcevgrf sbe
  1183. X      \___/    obhyqre      |  _/_\  _/  \_ _/  \_  /_\_   lbhe punenpgre :-)
  1184. X                |                    
  1185. X       ___   hapehfunoyr    |   /\   Qvnzbaqf. Gurl pna rvgure or sbhaq ylvat
  1186. X      /@@@\    obhyqre      |  <  >  nebhaq (vs bayl!) be znahsnpgher ol chfuvat
  1187. X      \@@@/                 |   \/   gjb 'pehfunoyr' ebpxf gbtrgure.
  1188. X                |              
  1189. X
  1190. X    Gur trareny vqrn bs gur tnzr vf gb pbyyrpg nyy gur qvnzbaqf. Guvf zhfg
  1191. X    or qbar va gur zvavzhz nzbhag bs zbirf. V'ir nyybjrq n znetva bs 5
  1192. X    zbirf juvpu oevatf gur zbirf nyybjrq gb 484. (nygre gur inyhr bs 'h' va
  1193. X    gur cebtenz gb frg gur znk zbirf nyybjrq)
  1194. X
  1195. X    Gurer ner gjb glcrf bs obhyqref. Obgu pna or chfurq nebhaq, ohg bayl
  1196. X    gur ubyybj (pehfunoyr) barf pna or ghearq vagb qvnzbaqf (ol chfuvat vg
  1197. X    bagb nabgure ubyybj bar).
  1198. X
  1199. X    Bs gur sbhe glcrf bs qbbef (naq xrlf) bayl 3 unir orra qrsvarq. Guvf
  1200. X    jnf qbar gb xrrc gur fbhepr nf ybj nf cbffvoyr (nf V bayl hfrq 3 va gur
  1201. X    znc).  Gb haybpx n qbbe fvzcyl chfu n xrl vagb gur pbeerfcbaqvat qbbe.
  1202. X    Gnxr pner gung vg'f snpvat va gur pbeerpg qverpgvba.
  1203. SHAR_EOF
  1204. $TOUCH -am 0814004091 1991/rince.hint &&
  1205. chmod 0444 1991/rince.hint ||
  1206. echo "restore of 1991/rince.hint failed"
  1207. set `wc -c 1991/rince.hint`;Wc_c=$1
  1208. if test "$Wc_c" != "2798"; then
  1209.     echo original size 2798, current size $Wc_c
  1210. fi
  1211. # ============= 1991/sorta.ifact3 ==============
  1212. echo "x - extracting 1991/sorta.ifact3 (Text)"
  1213. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.ifact3 &&
  1214. X[1+D2s*#`ld1s]:f       [ given (n-1)! (n-1), print n!, put n! n ]
  1215. X[2s1=f2s1_+D0>=x]:x    [ given n n! x, print (n+1)! through (n+x)! ]
  1216. X0 1 10 1=x
  1217. SHAR_EOF
  1218. $TOUCH -am 0622130991 1991/sorta.ifact3 &&
  1219. chmod 0444 1991/sorta.ifact3 ||
  1220. echo "restore of 1991/sorta.ifact3 failed"
  1221. set `wc -c 1991/sorta.ifact3`;Wc_c=$1
  1222. if test "$Wc_c" != "146"; then
  1223.     echo original size 146, current size $Wc_c
  1224. fi
  1225. # ============= 1991/sorta.irot13 ==============
  1226. echo "x - extracting 1991/sorta.irot13 (Text)"
  1227. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.irot13 &&
  1228. X"[] [.tr] "
  1229. X["]".[a-m][n-z][A-M][N-Z]"[" ]TTT ["]".[n-z][a-m][N-Z][A-M]"[" ]TTT
  1230. X"[tr] !q"T:xld
  1231. X["rot13: fatal: need exactly one argument"`q]:gld
  1232. X["rot13: fatal: cannot open "1ST`q]:hld
  1233. Xa2_+=g
  1234. X1A 0 [ that 0 is for RDONLY ]ld
  1235. X     0 'o D0 1s>=hld
  1236. X0Ou1=x  [ in a more complex spawner, this would be done under a fork ]ld
  1237. SHAR_EOF
  1238. $TOUCH -am 0622131091 1991/sorta.irot13 &&
  1239. chmod 0444 1991/sorta.irot13 ||
  1240. echo "restore of 1991/sorta.irot13 failed"
  1241. set `wc -c 1991/sorta.irot13`;Wc_c=$1
  1242. if test "$Wc_c" != "318"; then
  1243.     echo original size 318, current size $Wc_c
  1244. fi
  1245. # ============= 1991/sorta.isleep ==============
  1246. echo "x - extracting 1991/sorta.isleep (Text)"
  1247. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.isleep &&
  1248. X["" "+sleep" "+5" "sleep" !q]:S [F0>1_+=S]:s
  1249. X"forking sleep 5..."`ld
  1250. X1=s
  1251. X"waiting for sleep to finish..."`ld
  1252. Xw
  1253. X"done, sleep exit code " #T`
  1254. SHAR_EOF
  1255. $TOUCH -am 0622131091 1991/sorta.isleep &&
  1256. chmod 0444 1991/sorta.isleep ||
  1257. echo "restore of 1991/sorta.isleep failed"
  1258. set `wc -c 1991/sorta.isleep`;Wc_c=$1
  1259. if test "$Wc_c" != "140"; then
  1260.     echo original size 140, current size $Wc_c
  1261. fi
  1262. # ============= 1991/sorta.itailrec ==============
  1263. echo "x - extracting 1991/sorta.itailrec (Text)"
  1264. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.itailrec &&
  1265. X[3*#" "T$ldD=f]:f
  1266. X1=f
  1267. SHAR_EOF
  1268. $TOUCH -am 0622131091 1991/sorta.itailrec &&
  1269. chmod 0444 1991/sorta.itailrec ||
  1270. echo "restore of 1991/sorta.itailrec failed"
  1271. set `wc -c 1991/sorta.itailrec`;Wc_c=$1
  1272. if test "$Wc_c" != "22"; then
  1273.     echo original size 22, current size $Wc_c
  1274. fi
  1275. # ============= 1991/sorta.iwhosort ==============
  1276. echo "x - extracting 1991/sorta.iwhosort (Text)"
  1277. sed 's/^X//' << 'SHAR_EOF' > 1991/sorta.iwhosort &&
  1278. X[0Ou "" "+-u" "sort" !q]:S [F0>1_+=S]:s
  1279. X[1Ou "" "+-u" "who"  !q]:W [F0>1_+=W]:w
  1280. XP1=wO1=sOww
  1281. SHAR_EOF
  1282. $TOUCH -am 0622131091 1991/sorta.iwhosort &&
  1283. chmod 0444 1991/sorta.iwhosort ||
  1284. echo "restore of 1991/sorta.iwhosort failed"
  1285. set `wc -c 1991/sorta.iwhosort`;Wc_c=$1
  1286. if test "$Wc_c" != "92"; then
  1287.     echo original size 92, current size $Wc_c
  1288. fi
  1289. # ============= 1991/brnstnd.c ==============
  1290. echo "x - extracting 1991/brnstnd.c (Text)"
  1291. sed 's/^X//' << 'SHAR_EOF' > 1991/brnstnd.c &&
  1292. X#include <stdio.h>
  1293. X#define D define
  1294. X#D H(x,y,z) f(p){--p;c=x-_+1];f(c>0){y+1]=z[c];z[c]=y];y]=y+1];}}
  1295. X#D O(x,y) F(x,int U;int T=0;d=M(U=1);W{f(c==y)b g[T++]=c;f(T==U)g=realloc(g,U<<=1);}g[T]=0;)
  1296. X#D W Y((c=k?K[--k]:getchar())-EOF)
  1297. X#D S i[q
  1298. X#D F(w,z) f(c==w){z h}
  1299. X#D f if
  1300. X#D P p>1&&(c=u,
  1301. X#D _ s[p
  1302. X#D C =G
  1303. X#D g S]
  1304. X#D J(x,y) F(I[x],y)
  1305. X#D Q P e
  1306. X#D Y while
  1307. X#D b break;
  1308. X#D u _--]
  1309. X#D m p&&
  1310. X#D R char*
  1311. X#D l Z[c]
  1312. X#D L strlen
  1313. X#D d i[++q]
  1314. X#D G c)
  1315. X#D h ;continue;
  1316. X#D N s[++p]
  1317. X#D e _]
  1318. X#D j x;{R r=M(L(
  1319. X#D v return
  1320. X#D w [256]
  1321. X#D V f(k>o||p>o||q>o)v 2;
  1322. XR I="I'd love ta win: the most useful !$>%`/#<&*|^ _OBFUSCATED_ utility. Pleez?";U(y,x)R y;R*j*x)+L(y)+1);sprintf(r,"%s%s",*x,y);*x=r;}R T(x)R j x)+1);strcpy(r,x);v
  1323. Xr;}R(i w);static R(Z w);K w;main(a,A)int a;R*A;{int s w,p=0,q=0,n=0,c,k=0;W{V
  1324. Xf(c>='0'&&c<='9'){f(!n)N=0;n=1;e=10*e+(c-'0')h}n=0;J(39,m
  1325. Xsprintf(d=M(13),"%d",e))
  1326. XJ(37,q&&puts(g))J(34,q&&printf("%s",g))J(27,H(p,_,s))O('[',']')J(56,f(p){c=e;N=c;})J(2,m--p)J(10,N=a)J(4,f(q){N=L(g);X(S--]);})J(1,f(q){S+1]=T(g);++q;})J(53,m
  1327. Xe>=0&&e<a&&(d=T(A[u])))
  1328. XJ(54,q>1&&(--q,U(S+1],i+q)))J(5,q&&p>1&&(_-1]=open(g,_-1],e),--p,X(S--])))J(47,m
  1329. Xclose(u))
  1330. XJ(26,m(e=dup(e)))O('"','"')J(51,H(q,S,i))J(49,N=fork())J(12,wait(&N)+1||(e=-1))J(68,{++p;pipe(s+p++)==-1&&(e=-1);})F('q',v
  1331. X0)
  1332. XF('=',W{R x;f(m u)f(x=l){k+=n=L(x);V;Y(*x)K[--k]=*x++;k+=n;n=0;}b})J(15,f(q)W{l&&X(l);l=T(g);b})J(33,f(c=q){*i=g;g=0;Y(--q&&**(i+q))g++;f(q){N=execvp(*i,i+q+1);q=c;}})J(38,P
  1333. Xc&&(e/C))
  1334. XJ(35,Q=e>G)F('+',Q+C)J(42,Q*C)J(41,Q=~(e&G))J(57,m(e=-e))J(3,)F('\n',)putchar(c);puts(73+I);}}
  1335. SHAR_EOF
  1336. $TOUCH -am 0807142891 1991/brnstnd.c &&
  1337. chmod 0444 1991/brnstnd.c ||
  1338. echo "restore of 1991/brnstnd.c failed"
  1339. set `wc -c 1991/brnstnd.c`;Wc_c=$1
  1340. if test "$Wc_c" != "1542"; then
  1341.     echo original size 1542, current size $Wc_c
  1342. fi
  1343. # ============= 1991/davidguy.hint ==============
  1344. echo "x - extracting 1991/davidguy.hint (Text)"
  1345. sed 's/^X//' << 'SHAR_EOF' > 1991/davidguy.hint &&
  1346. XBest X11 Graphics: <david+@cs.cmu.edu>   David Applegate 
  1347. X           <guy@ulysses.att.com> Guy Jacobson
  1348. X
  1349. X    David Applegate            Guy Jacobson
  1350. X    School of Computer Science    AT&T Bell Laboratories
  1351. X    Carnegie Mellon University    600 Mountain Avenue
  1352. X    Pittsburgh PA 15213        Murray Hill NJ 07974
  1353. X    USA                USA
  1354. X
  1355. X
  1356. XJudges' comments:
  1357. X
  1358. X    Make and run as follows:
  1359. X
  1360. X    make davidguy
  1361. X    davidguy ip_address:server.screen
  1362. X
  1363. X    where 'ip_address' in an IP address of an X server.  For example, try:
  1364. X
  1365. X    davidguy 127.0.0.1:0.0
  1366. X
  1367. X    Of course, may need to supply a more reasonable address.  :-)
  1368. X
  1369. X    Also try:
  1370. X
  1371. X    cp davidguy guydavid
  1372. X    guydavid 127.0.0.1:0.0
  1373. X
  1374. X    Can you determine why this makes a difference.
  1375. X
  1376. X    We permitted this type of entry to win because:
  1377. X
  1378. X    - it did not require X to be on the host system
  1379. X    - both BSD and SVR4 have sockets
  1380. X    
  1381. X    Now that X11 and sockets have become 'standard', we plan to open
  1382. X    up the contest to programs that use them.  Future rules will
  1383. X    explain this further.
  1384. X
  1385. X    We are pleased that this entry has helped bring new 'life' into
  1386. X    the contest.
  1387. X
  1388. X    NOTE: The orignal program that won may be found in davidguy.orig.c.
  1389. X      The author supplied a second version of the program, which
  1390. X      we have placed in the default location davidguy.c.
  1391. X
  1392. XSelected notes from the authors:
  1393. X
  1394. X    The program is a fully-functional X client.  It talks directly to
  1395. X    the X server through a socket without using Xlib, Xt or any other
  1396. X    wussie toolkit junk.  With no arguments, it will try to run
  1397. X    locally using the unix-domain socket (only on BSD :-( ) or you can
  1398. X    give it a command line argument identifying a display host address
  1399. X    (in dotted octet notation, like 127.0.0.1:0.0) where the X server
  1400. X    is running.  It handles color and monochrome displays, and
  1401. X    performs whatever byte-swapping and bit-reversal is needed (so
  1402. X    that the program works even when the server and the client have
  1403. X    different architectures).  It buffers communication to the X
  1404. X    server for efficiency.
  1405. X
  1406. X    [[ NOTE: The original source in davidguy.c used only an IP address
  1407. X         argument (assumed :0.0) and assumed the color of black
  1408. X         and white. ]]
  1409. X
  1410. X    The program doesn't require any user interaction; you can just sit
  1411. X    back and watch it run.  All the action takes place in the root
  1412. X    window of the display.
  1413. X
  1414. X    We think the program is interesting for these reasons:
  1415. X
  1416. X    1) It belongs to a class of programs that programmers make 
  1417. X       the following complaints about:  they require a mountain 
  1418. X       of code to implement even the simplest program; and they 
  1419. X       must be linked with giant libraries of hard-to-understand 
  1420. X       functions.  In contrast to these complaints (made by wimps,
  1421. X       in our humble opinion), our program fits in under 1536 
  1422. X       bytes, doesn't need any external functions except for a few 
  1423. X       system calls, and doesn't need to include any header files.
  1424. X
  1425. X    2) It implements an extremely efficient algorithm for the 
  1426. X       computation it performs.  One cool feature of the algorithm 
  1427. X       (at least as far as this contest is concerned) is that its 
  1428. X       obscurity is fundamentally necessary for its efficiency.  
  1429. X       In other words, even if we took steps to present the algorithm 
  1430. X       clearly, (we haven't) the relation of the computation performed 
  1431. X       to the specification of what the program was supposed to do 
  1432. X       would still be hard to understand.
  1433. X
  1434. X    Quasi-spoiler on internals:
  1435. X
  1436. X    The program plays Conway's game of Life in the root window's
  1437. X    background pixmap.  It starts by setting the background to random
  1438. X    bits, and then plays Life, with one Life cell for each pixel of the
  1439. X    screen.  In the game of Life, a cell survives to the next round if
  1440. X    2 or 3 of its 8 neighbors are also alive, and a cell is born if
  1441. X    exactly 3 of its neighbors are alive.  Otherwise, a cell dies of
  1442. X    exposure if it has only 0 or 1 neighbors, and dies of overcrowding
  1443. X    if it has 4 or more neighbors.
  1444. X
  1445. X    The algorithm used to compute the next generation is based on the
  1446. X    observation that a cell's state in the next generation is a boolean
  1447. X    function of its current state, and the states of its 8 neighbors
  1448. X    (ie, a boolean function from 9 bits to 1 bit).  This function can
  1449. X    be computed by a boolean circuit.  In addition, intermediate values
  1450. X    computed by the circuit can be shared between neighboring cells,
  1451. X    reducing the number of gates per cell required.  These ideas
  1452. X    have been used before, to compute the next generation through a
  1453. X    series of bit blits.  Instead of doing this, we map values in the
  1454. X    circuit to bits in registers, so that the next generation can be
  1455. X    computed efficiently within registers, minimizing memory accesses.
  1456. X    As a result, the computation of the next generation is performed
  1457. X    with about 1.6 instructions per life cell, consisting of .125
  1458. X    memory accesses, .17 shifts, and 1.3 logic operations.  The net
  1459. X    result is that the time to transfer the bits to the X server, and
  1460. X    for the X server to draw them on the screen, dominates the time to
  1461. X    compute the next generation.
  1462. SHAR_EOF
  1463. $TOUCH -am 0814003291 1991/davidguy.hint &&
  1464. chmod 0444 1991/davidguy.hint ||
  1465. echo "restore of 1991/davidguy.hint failed"
  1466. set `wc -c 1991/davidguy.hint`;Wc_c=$1
  1467. if test "$Wc_c" != "5061"; then
  1468.     echo original size 5061, current size $Wc_c
  1469. fi
  1470. # ============= 1991/brnstnd.hint ==============
  1471. echo "x - extracting 1991/brnstnd.hint (Text)"
  1472. sed 's/^X//' << 'SHAR_EOF' > 1991/brnstnd.hint &&
  1473. XBest Of Show: <brnstnd@nyu.edu> Daniel J. Bernstein
  1474. X
  1475. X    Daniel J. Bernstein
  1476. X    New York University
  1477. X
  1478. X
  1479. XJudges' comments:
  1480. X
  1481. X    Make and run.  Try:
  1482. X
  1483. X    make brnstnd
  1484. X    brnstnd < sorta.i2+2
  1485. X
  1486. X    For info on more examples, read the sorta.README file.
  1487. X
  1488. X    The author wished to win the "most useful program" award and
  1489. X    documented this in the source code.  The judges were unmoved
  1490. X    by this blatant attempt to influence the contest and rejected
  1491. X    this idea...  so we gave it the Best of Show award instead!!
  1492. X
  1493. X    NOTE: Due to minor problems with some ANSI C compilers, we have
  1494. X      supplied a more portable ANSI version.  See the top level
  1495. X      README file for details.
  1496. X
  1497. X    NOTE: One should remove the final trailing newline to obtain the
  1498. X      original source file.  This step is not needed to compile
  1499. X      this entry.
  1500. X
  1501. X    
  1502. XSelected notes from the author:
  1503. X
  1504. X    This is an interpreter for the programming language SORTA, a systems
  1505. X    and numerical programming language with features sorta from C, sorta
  1506. X    from FORTH, and sorta from Ada.
  1507. X
  1508. X    SORTA lets you manipulate files and spawn programs easily, has bitwise
  1509. X    operators, and gives you absolutely brilliant error messages like '?'
  1510. X    (that's the C bit). SORTA programs work with a stack (that's the FORTH
  1511. X    bit)---actually two stacks, one for integers and one for strings. And
  1512. X    all SORTA operations are strongly typed, detect practically any failure,
  1513. X    and garbage-collect (that's the Ada bit).
  1514. X
  1515. X    SORTA also contains features you might not expect from such a small
  1516. X    interpreter: arbitrary-length string input and concatenation, for
  1517. X    instance, not to mention infinite-depth tail recursion.
  1518. X
  1519. X    SORTA ignores its arguments (though it makes them available to the
  1520. X    script); it takes all commands, character by character, from its
  1521. X    standard input. Unrecognized commands are repeated with a ?.
  1522. X
  1523. X    SORTA maintains an ``i stack'' for integers and an ``s stack'' for
  1524. X    strings. It also keeps track of ``programs,'' one for each character.
  1525. X    Operations are silently ignored if the relevant stacks are too low,
  1526. X    except as noted for s, S, and !. If the i stack or s stack (or the stack
  1527. X    of buffered macro commands) grows too high, SORTA will exit silently
  1528. X    with exit code 2. (Compile parameter -Do=250 controls what ``too high''
  1529. X    means; you should not make o larger than 250.) I don't think it's
  1530. X    possible to crash the interpreter.
  1531. X
  1532. X    Here, then, is the SORTA programming language. All non-digits delimit
  1533. X    numeric constants. Spaces and newlines are ignored except as numeric
  1534. X    delimiters.
  1535. X
  1536. X    Basic operations:
  1537. X
  1538. X     q: quit
  1539. X     number: push that number on top of the i stack
  1540. X     "string": push that string on top of the s stack, no length limit
  1541. X     [string]: push that string on top of the s stack, no length limit
  1542. X     #: make top of i stack non-destructively in ASCII, push result onto s stack
  1543. X     `: print top of s stack non-destructively
  1544. X     $: print top of s stack non-destructively without newline
  1545. X     d: drop (pop) top of i stack
  1546. X     D: dup (duplicate) top of i stack
  1547. X     ': dup top of s stack
  1548. X     s: pop top of i stack. If it is n, swap (n+1)th-top of i stack with top.
  1549. X        1s, for example, swaps the top two elements; 2s swaps the top with
  1550. X        the third down; etc. This always pops the top of the i stack, even
  1551. X    upon failure.
  1552. X     S: pop top of i stack, then act just like s but upon s stack
  1553. X     l: pop top of s stack, push its length onto i stack
  1554. X     a: push argc onto i stack
  1555. X     A: pop top of i stack, push argv[i] on top of s stack
  1556. X     T: concatenate top two elements of s stack
  1557. X     _: negate top of i stack
  1558. X     +: pop top two elements of i stack, add, push back sum
  1559. X     *: pop top two elements of i stack, multiply, push back product
  1560. X     /: pop top two elements of i stack, divide, push back quotient
  1561. X     >: pop top two elements of i stack, compare, push back 1 or 0 as in C
  1562. X     &: pop top two elements of i stack, nand, push back bitwise result
  1563. X    Note that nand is sufficient to construct all bitwise operations,
  1564. X    as demonstrated by icalc below.
  1565. X
  1566. X   System operations:
  1567. X
  1568. X     o: pop top of s stack and top two of i stack; open(s1,i2,i1); leave
  1569. X    result on i stack
  1570. X     O: pop top of i stack, close() it
  1571. X     u: pop top of i stack, dup() it, push result back on
  1572. X     F: fork(), push result on i stack. This is not always safe while SORTA
  1573. X    is reading keyboard input or a script, as the forked programs share
  1574. X    file descriptors. It is always safe inside a program (see below).
  1575. X     P: pipe(), push two ends <p0> <p1> onto i stack. In case of trouble,
  1576. X    push <?> <-1> onto i stack.
  1577. X     w: wait(), push successful result (or -1 if no children) on i stack
  1578. X     !: execvp() top of the s stack. Arguments are the next things down on
  1579. X    the s stack, in reverse order from popping; the first character of
  1580. X    each string is lopped off. There must be an empty string somewhere
  1581. X    in the s stack to terminate the argument list. If the execve()
  1582. X    fails, any operation involving current members of the s stack has
  1583. X    undefined effects, and -1 is pushed onto the i stack.
  1584. X
  1585. X   High-level language operations:
  1586. X
  1587. X     :x: copy the top of the s stack into a program labeled by character x
  1588. X     =x: pop the top of the i stack. If it was nonzero, execute the program
  1589. X     labeled by character x. Note that a digit at the end of a program
  1590. X     will merge with any digits after =x; in that case you usually want
  1591. X     to add a space at the end of the program.
  1592. X
  1593. X    Common idioms: To drop the top of the s stack, ld. To do a <, 1s>. To
  1594. X    unconditionally execute the program labeled by character x, 1=x (or any
  1595. X    nonzero number followed by =x). To print the top of the i stack
  1596. X    non-destructively, #` (or #$ if you don't want the newline). To
  1597. X    subtract, _+. To do mod or and or any of the other missing operations,
  1598. X    combine the available operations as illustrated below. To introduce a
  1599. X    comment, [ this is a comment string which is promptly eliminated ]ld.
  1600. X
  1601. X    SORTA's requirements: it wants fork(), execvp(), open(),
  1602. X    close(), dup(), pipe(), and wait(), so it obviously won't even compile
  1603. X    on a non-UNIX machine. It also assumes that you have a size-256
  1604. X    character set and that the characters between '0' and '9' are exactly
  1605. X    the digits in order. It does *not* depend on ASCII, despite the code
  1606. X    appearance. Also note that SORTA does not attempt to declare malloc(),
  1607. X    so you will get some warnings about illegal pointer combinations. Also
  1608. X    note that there are unreached statements in SORTA.
  1609. X
  1610. X    While the program source of course depends highly on #defines for
  1611. X    obfuscation, I like to think that this code has those little touches,
  1612. X    those professionally sharpened edges that mark true software
  1613. X    engineering. Observe, for instance, how i and s are the string and
  1614. X    integer stacks respectively. It's these little things that make you
  1615. X    feel at home in an otherwise utterly useless piece of code. They're
  1616. X    what make an obfuscation work.
  1617. X
  1618. X    The character pool (``I'' after cpp) makes it rather painful to
  1619. X    see the effect of commands at a glance. I can just imagine people
  1620. X    spending hours bouncing between the pool and the rest of the code,
  1621. X    or accidentally changing the pool without realizing its importance.
  1622. X    Without documentation and example scripts, someone would find it
  1623. X    a challenge to figure out what the arrays are used for, let alone
  1624. X    that SORTA is a scripting language.
  1625. X
  1626. X    Another nice feature is that the SORTA language itself encourages
  1627. X    you to write not merely obfuscated but plain incomprehensible
  1628. X    scripts (like the examples below---after working with the language
  1629. X    for a while, I guess I can read it pretty easily, but I also think
  1630. X    FORTH is a beautiful language). The numbers running around
  1631. X    everywhere will make people think of ASCII, even though the code is
  1632. X    not ASCII-dependent.  What's your first thought when you see
  1633. X    several arrays[256]? This is pretty standard obfuscation otherwise.
  1634. X    I like the way that unbalanced macro braces can throw off the
  1635. X    reader in ``if(c>0){y+1]=z[c];'', and I had fun covering the
  1636. X    alphabet with #defines, but that's nothing special.
  1637. X
  1638. X    Possible future extensions to SORTA include string extraction and
  1639. X    matching, reading from files into strings, and encrypting the string
  1640. X    pool to further confuse the judges. I don't think I can fit this into
  1641. X    the size limit, unfortunately.
  1642. SHAR_EOF
  1643. $TOUCH -am 0814003191 1991/brnstnd.hint &&
  1644. chmod 0444 1991/brnstnd.hint ||
  1645. echo "restore of 1991/brnstnd.hint failed"
  1646. set `wc -c 1991/brnstnd.hint`;Wc_c=$1
  1647. if test "$Wc_c" != "8418"; then
  1648.     echo original size 8418, current size $Wc_c
  1649. fi
  1650. exit 0
  1651.  
  1652. -- 
  1653. For a good prime, call:  391581 * 2^216193 - 1
  1654.