Get 1989 entries to compile

There were some which cannot be compiled under clang. One entry we used
a patch from Yusuke Endoh to get the entry to compile; thank you Yusuke
for your assistance! Another one we used a patch from Yusuke (thank
you!) but I further fixed it so that it would work with clang. It had to
be done: IOCCC Tetris has to work! This was done by changing the
environment arg to main() to be a char * in main() itself rather than a
char **. Using a char ** in main() third arg got it to compile but only
one key worked with clang so I changed it to be not the third argument
but a regular char * in main(). **a (third arg) evaluated correctly but
*a[1] and onward was actually part of the environment. Again IOCCC
Tetris has to work!

I also fixed fubar to work which took a few tweaks.

README.md files were also updated.
This commit is contained in:
Cody Boone Ferguson committed 2023-03-06 09:04:46 -08:00
1 parent b6be01bdc6
commit 9d63c37f49
23 files changed
+353 -280

No files matched your search

-2
View File
@@ -182,7 +182,6 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry is likely to fail and/or dump core on modern computers."
${RM} -f $@
${CP} -f fubar.sh $@
${CHMOD} +x $@
@@ -198,7 +197,6 @@ data: ${DATA}
@${TRUE}
${PROG}.orig: ${PROG}.orig.c
@echo "NOTE: This entry is likely to fail and/or dump core on modern computers."
${RM} -f $@
${CP} -f fubar.orig.sh $@
${CHMOD} +x $@
+6 -3
View File
@@ -17,10 +17,13 @@
## Judges' comments
Run this with a single digit argument (or wait a long time).
Run this with a single digit argument (or wait a long time).
The blank line at the beginning of the source is mandatory.
Do you know why?
The blank line at the beginning of the source is mandatory.
Do you know why?
With a bit of tinkering Cody Boone Ferguson got this to work on modern systems.
We thank him for his assistance!
## Author's comments
+6 -5
View File
@@ -1,19 +1,20 @@
#include <stdio.h>
#include <stdlib.h>
#define QQ 1
#define TT 1
#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f;
#define cc int main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f;
#define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f
#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else
if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);}
cc ouroboros.c -o x
#define zxc ;{/*
cat ouroboros.c | x $1 > x1
cat ./ouroboros.c | ./x $1 > x1
if [ $? -ne 0 ]; then
exit
fi
mv x1 ouroboros.c
chmod +x ouroboros.c
exec ouroboros.c $1
mv x1 ./ouroboros.c
chmod +x ./ouroboros.c
exec ./ouroboros.c $1
exit
*/
+2 -2
View File
@@ -11,9 +11,9 @@ fi
rm -f ouroboros.c x1 x
ex - <<EOF
r fubar.c
7,8j
8,9j
w ouroboros.c
EOF
chmod +x ouroboros.c
./ouroboros.c $1
rm -f ouroboros.c x1 x
#rm -f ouroboros.c x1 x
+2
View File
@@ -182,9 +182,11 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo NOTE: this compilation results in running the program itself.
${RM} -f $@
${CP} jar.1.sh $@
${CHMOD} +x $@
${CC} -c -o /dev/tty jar.1.c
# alternative executable
#
+20 -19
View File
@@ -1,4 +1,4 @@
Strangest abuse of the rules:
## Strangest abuse of the rules:
Jari Arkko
Laboratory of Information Processing Science
@@ -7,31 +7,32 @@ Strangest abuse of the rules:
02150 Espoo
Finland
Judges notes:
## Judges notes:
On many systems the compiler will not allow you to send the
object file to /dev/tty. The author suggested:
On many systems the compiler will not allow you to send the
object file to /dev/tty. The author suggested:
cc -c -o /dev/tty jar.1.c
cc -c -o /dev/tty jar.1.c
On systems that have symbolic links, we suggest:
On systems that have symbolic links, we suggest:
ln -s /dev/tty jar.1.o
cc -c jar.1.c
if your system has symbolic links. The shell script run
by the makefile simply cats the .o file to the terminal
which can be used as a last resort.
ln -s /dev/tty jar.1.o
cc -c jar.1.c
Abuse of the rules winners usually result in a change of the
rules. Starting in 1990, compiling entries must result an
regular file which can be executed.
if your system has symbolic links. The shell script run
by the Makefile simply cats the .o file to the terminal
which can be used as a last resort.
Selected notes from the author:
Abuse of the rules winners usually result in a change of the
rules. Starting in 1990, compiling entries must result an
regular file which can be executed.
## Selected notes from the author:
This program is (supposedly) the smallest C program able to
print "Hello world.". The compilation itself produces the
desired printout and the program need not be actually run.
This program is (supposedly) the smallest C program able to
print "Hello world.". The compilation itself produces the
desired printout and the program need not be actually run.
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+1
View File
@@ -182,6 +182,7 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo NOTE: invalid input will cause this entry to dump core.
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+44 -38
View File
@@ -1,4 +1,4 @@
Best of show:
## Best of show:
Jari Arkko, Ora Lassila, Esko Nuutila
Laboratory of Information Processing Science
@@ -7,33 +7,38 @@ Best of show:
02150 Espoo
Finland
Judges notes:
## To build:
This is the most useful program entered this year. It is a
rather large subset of lisp. It has no error recovery, and
performs rather poorly in a number of cases. Even so, placing
all this functionality in such a small, densely packed program,
is impressive enough to win the Best of show award.
make all
To have a chance to compile under a modern CPP, we had to
replace `#D` with `#define`.
NOTE: To have a chance to compile under a modern CPP, we had to
replace `#D` with `#define` and `#a` with `#include`.
Selected notes from the author:
## Judges' comments:
This is the most useful program entered this year. It is a
rather large subset of lisp. It has no error recovery, and
performs rather poorly in a number of cases. Even so, placing
all this functionality in such a small, densely packed program,
is impressive enough to win the Best of show award.
## Selected notes from the author:
This program implements a Lisp interpreter in 1465 bytes of source.
Some sophisticated features supported, eg. functionals and recursion.
The special-forms/functions/variables implemented are:
+ - * < ()
car cdr cons defun equal
function if lambda quote t
Below are sample lisp expressions you might choose to try as input.
The program implements a conventional lisp listener, i.e. you type in
lisp expressions (followed by CR), the program evaluates them and
prints out the return values. End execution by typing an end-of-file
character.
This program implements a Lisp interpreter in 1465 bytes of source.
Some sophisticated features supported, eg. functionals and recursion.
The special-forms/functions/variables implemented are:
+ - * < ()
car cdr cons defun equal
function if lambda quote t
Below are sample lisp expressions you might choose to try as input.
The program implements a conventional lisp listener, i.e. you type in
lisp expressions (followed by CR), the program evaluates them and
prints out the return values. End execution by typing an end-of-file
character.
(+ 2.5 3.1)
(defun fib (n)
(if (< n 2)
@@ -52,20 +57,21 @@ Selected notes from the author:
(cons (quote (f)) ())
(car (quote (a b c)))
(cdr (cdr (quote (g h i))))
Please do not leave any whitespace before the first parenthesis when
you type your input, or any other unnecessary whitespace. Please try to
avoid any undefined variables or functions, wrong number of arguments
etc. All these errors are likely to dump core (i.e. there are no error
checks in the program).
Traditional Lisp implementations use cons cells as the main data
structure. Lists are organized of pointer chains of these cells.
In this program, an alternate representation was chosen: char*'s.
All list operations, including the ones in the interpreter, are
made using string representations of the lists. These operations
must count parentheses and skip whitespace. This leads to extremely
poor performance!
Please do not leave any whitespace before the first parenthesis when
you type your input, or any other unnecessary whitespace. Please try to
avoid any undefined variables or functions, wrong number of arguments
etc. All these errors are likely to dump core (i.e. there are no error
checks in the program).
Traditional Lisp implementations use cons cells as the main data
structure. Lists are organized of pointer chains of these cells.
In this program, an alternate representation was chosen: `char*'`s.
All list operations, including the ones in the interpreter, are
made using string representations of the lists. These operations
must count parentheses and skip whitespace. This leads to extremely
poor performance!
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+15 -17
View File
@@ -1,20 +1,18 @@
#define d define
#d a include
#a <stdio.h>
#a <string.h>
#a <ctype.h>
#d p char*
#d P ,(p)
#d T(E) !strcmp(E,"()")
#d U return
#d W while
#d X sbrk(199)
#d z atof
#d e isspace
#d D A(_)
#d E S(C(_))
#d B(y) p y(_)p _;{
#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define p char*
#define P ,(p)
#define T(E) !strcmp(E,"()")
#define U return
#define W while
#define X sbrk(199)
#define z atof
#define e isspace
#define D A(_)
#define E S(C(_))
#define B(y) p y(_)p _;{
#define G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;}
p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double
z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e
-1
View File
@@ -186,7 +186,6 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry requires a non-standard K&R C compiler to compile."
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+32 -27
View File
@@ -1,4 +1,4 @@
Most humorous output:
## Most humorous output:
Oskar von der Luehe
Institut fuer Astronomie
@@ -6,40 +6,45 @@ Most humorous output:
8092 Zuerich
Switzerland
Judges notes:
## To build:
Run this program using your favorite text file as input. Files
such as mailboxes, man pages and usenet articles are especially
recommended. You will get different output each time you run it.
make all
Run the program this way:
To get this to compile with a modern CPP, we had to replace `#D` with `#define`.
ovdluhe < textfile
## Judges' comments:
The program stops when it reaches the end of the template buffer
by chance or is killed.
Run this program using your favorite text file as input. Files
such as mailboxes, man pages and usenet articles are especially
recommended. You will get different output each time you run it.
To have a chance to compile under a modern CPP, we had to
replace `#D` with `#define`.
Run the program this way:
Selected notes from the author:
ovdluhe < textfile
This program implements an "Eddington ape" - it generates
random text from a supplied template. The template text file
is read through stdin. The larger the template, the better the
result. A maximum of 2**12 chars are used. From the template,
the program calculates the statistics of chars that immediately
follow a given string (correlator string) of a certain length
(currently 4 - can be varied by changing the definition for P
accordingly). A character is randomly chosen, weighted by its
probability to occur after the correlator string. That
character is printed to stdout and placed at the end of the
correlator string, whose first character is discarded.
Meaningful words are therefore usually preserved, the effect on
sentences can be dramatically random.
The program stops when it reaches the end of the template buffer
by chance or is killed.
You might want to vary the definition of P between 2 and 10 and
observe the result.
## Selected notes from the author:
This program implements an "Eddington ape" - it generates
random text from a supplied template. The template text file
is read through stdin. The larger the template, the better the
result. A maximum of `2**12` chars are used. From the template,
the program calculates the statistics of chars that immediately
follow a given string (correlator string) of a certain length
(currently 4 - can be varied by changing the definition for P
accordingly). A character is randomly chosen, weighted by its
probability to occur after the correlator string. That
character is printed to stdout and placed at the end of the
correlator string, whose first character is discarded.
Meaningful words are therefore usually preserved, the effect on
sentences can be dramatically random.
You might want to vary the definition of P between 2 and 10 and
observe the result.
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+1 -1
View File
@@ -185,7 +185,7 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry is likely to fail and/or dump core on modern computers."
@echo "NOTE: this entry will likely dump core with arm64 chips."
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+90 -81
View File
@@ -1,4 +1,4 @@
Most complex algorithm:
## Most complex algorithm:
Paul E. Black
CIRRUS LOGIC, Inc.
@@ -7,100 +7,109 @@ Most complex algorithm:
95035
USA
Judges notes:
## To build:
The original source contained a long line which caused many
mailers to barf. The original file may be re-constructed by
removeing the trailing "\" on line 12 and joining lines 12 and
13 together without a space.
make all
WHAT FOLLOWS IS A DETAILED PROGRAM EXPLINATION AND SPOILER.
IF YOU WANT A REAL CHALLENGE, DON'T READ ANY FURTHER AND TRY
TO UNDERSTAND THE PROGRAM VIA THE SOURCE.
NOTE: this entry will likely dump core with arm64 chips. We could get it to work
with modern systems with x86_64 but systems but we at least with macOS arm64
this program dumps core. We could not test Intel Macs.
## Judges' comments:
The original source contained a long line which caused many
mailers to barf. The original file may be re-constructed by
removing the trailing "\" on line 12 and joining lines 12 and
13 together without a space.
WHAT FOLLOWS IS A DETAILED PROGRAM EXPLANATION AND SPOILER.
IF YOU WANT A REAL CHALLENGE, DON'T READ ANY FURTHER AND TRY
TO UNDERSTAND THE PROGRAM VIA THE SOURCE.
Selected notes from the author:
This programs computes and prints Fibonacci numbers by
simulating a Turing machine with the proper program.
Understanding the C program, i.e., a Turing machine simulator,
is only the first and simplest step. The Turing machine
program must be understood, too! (it is trivial, perhaps even
natural to write incredibly obscure Turing programs.)
This programs computes and prints Fibonacci numbers by
simulating a Turing machine with the proper program.
Understanding the C program, i.e., a Turing machine simulator,
is only the first and simplest step. The Turing machine
program must be understood, too! (it is trivial, perhaps even
natural to write incredibly obscure Turing programs.)
If the program is invoked with an operand, the operand is used
as the Turing program. It includes a "trace" facility,
subroutine r (commented out for obscurity), to help write and
debug Turing programs. Just the thing for some fun in a Theory
of Computation class.
If the program is invoked with an operand, the operand is used
as the Turing program. It includes a "trace" facility,
subroutine r (commented out for obscurity), to help write and
debug Turing programs. Just the thing for some fun in a Theory
of Computation class.
The Turing machine tape is represented as a doubly linked list
of pointers. The forward and backward links are XOR'd together
and stored in one pointer. If we always keep one of the links
on hand, we can recover the other link at any time. The
variable q is the scan head (and a pointer at some tape cell),
and p is a "previous" link. The state of the tape is stored in
the low order bit of the pointer. Since we always allocate an
even number of bytes, the low order bit carries no information
(see portability below.) Memory representing a tape cell is
allocated when the cell is first scanned. Thus the simulation
begins with a tape effectively the size of virtual memory set
to all zeros. Since a header can be added to any Turing
program to write initial data and position the scan head, this
is little loss of generality.
The Turing machine tape is represented as a doubly linked list
of pointers. The forward and backward links are XOR'd together
and stored in one pointer. If we always keep one of the links
on hand, we can recover the other link at any time. The
variable q is the scan head (and a pointer at some tape cell),
and p is a "previous" link. The state of the tape is stored in
the low order bit of the pointer. Since we always allocate an
even number of bytes, the low order bit carries no information
(see portability below.) Memory representing a tape cell is
allocated when the cell is first scanned. Thus the simulation
begins with a tape effectively the size of virtual memory set
to all zeros. Since a header can be added to any Turing
program to write initial data and position the scan head, this
is little loss of generality.
The simulated Turing machine has a single tape with either an 1
or a 0 in each cell. The Turing machine language format is a
string of three bytes. The first byte is the current state.
The second byte is the next state. (The last bit of states is
ignored, e.g., B and C are the same state, in an attempt to be
able to have interesting words in the program.) The third byte
is composed of bits. Bit 1 (2&byte) is the symbol scanned,
i.e. an instruction is selected for state and for a match with
the symbol under the scan head. Bit 2 (4&byte) is the new
symbol to be written to the cell. Bit 3 (8&byte) is the
direction to move the scan head: 0 for left and 1 for right.
If bit 4 (16&byte) is true, the next character is sent to
stdout. (I added this feature so programs could print
results.)
The simulated Turing machine has a single tape with either an 1
or a 0 in each cell. The Turing machine language format is a
string of three bytes. The first byte is the current state.
The second byte is the next state. (The last bit of states is
ignored, e.g., B and C are the same state, in an attempt to be
able to have interesting words in the program.) The third byte
is composed of bits. Bit 1 (2&byte) is the symbol scanned,
i.e. an instruction is selected for state and for a match with
the symbol under the scan head. Bit 2 (4&byte) is the new
symbol to be written to the cell. Bit 3 (8&byte) is the
direction to move the scan head: 0 for left and 1 for right.
If bit 4 (16&byte) is true, the next character is sent to
stdout. (I added this feature so programs could print
results.)
The Turing machine has next state 'j' when it begins. The
cycle is 1) exit if the state is 'x', 2) find the next
instruction (given the state and the character under the scan
head). [The program string is searched forward for the next
matching instruction. If the end of the string is reached, the
search begins again at the first of the string. Thus states
can be used as local labels in different places.] 3) change to
the next state, 4) print a character if indicated, 5) write the
tape symbol, and 6) move the scan head. The cycle then repeats
with step 1. A call to the trace routine is just before step
2, but is commented out.
The Turing machine has next state 'j' when it begins. The
cycle is 1) exit if the state is 'x', 2) find the next
instruction (given the state and the character under the scan
head). [The program string is searched forward for the next
matching instruction. If the end of the string is reached, the
search begins again at the first of the string. Thus states
can be used as local labels in different places.] 3) change to
the next state, 4) print a character if indicated, 5) write the
tape symbol, and 6) move the scan head. The cycle then repeats
with step 1. A call to the trace routine is just before step
2, but is commented out.
The following ROT13'ed text is a quick outline of the actual
Turing program:
The following ROT13'ed text is a quick outline of the actual
Turing program:
Urer vf n dhvpx bhgyvar bs gur Ghevat cebtenz: gur
cerivbhf naq pheerag Svobanppv ahzoref ner xrcg va onfr
1 sbez jvgu gur pheerag ba gur evtug. Gur svefg guerr
fgrcf frg hc gur svefg gjb ahzoref, 1 naq 1. Gura
[ortvaavat jvgu "@ ("] n znexre bs VVV vf perngrq naq
gur pheerag ahzore vf pbcvrq gb gur evtug bs gur
znexre. Gura [ortvaavat jvgu "BI "] gur ahzore vf
pbairegrq gb ovanel ol ercrngrq qvivqvat ol 2 yrnivat V
sbe erznvaqre 1, naq VV sbe erznvaqre 0. Arkg
[ortvaavat jvgu "JI "] gur ovanel ercerfragngvba vf
cevagrq naq vgf flzobyf naq gur znexre ner renfrq.
Svanyyl [ortvaavat jvgu "RRa"] gur gjb ahzoref ner
nqqrq naq gur pheerag ahzore pbcvrq gb gur yrsg gb
orpbzr gur cerivbhf. Gura gur plpyr ercrngf.
Urer vf n dhvpx bhgyvar bs gur Ghevat cebtenz: gur
cerivbhf naq pheerag Svobanppv ahzoref ner xrcg va onfr
1 sbez jvgu gur pheerag ba gur evtug. Gur svefg guerr
fgrcf frg hc gur svefg gjb ahzoref, 1 naq 1. Gura
[ortvaavat jvgu "@ ("] n znexre bs VVV vf perngrq naq
gur pheerag ahzore vf pbcvrq gb gur evtug bs gur
znexre. Gura [ortvaavat jvgu "BI "] gur ahzore vf
pbairegrq gb ovanel ol ercrngrq qvivqvat ol 2 yrnivat V
sbe erznvaqre 1, naq VV sbe erznvaqre 0. Arkg
[ortvaavat jvgu "JI "] gur ovanel ercerfragngvba vf
cevagrq naq vgf flzobyf naq gur znexre ner renfrq.
Svanyyl [ortvaavat jvgu "RRa"] gur gjb ahzoref ner
nqqrq naq gur pheerag ahzore pbcvrq gb gur yrsg gb
orpbzr gur cerivbhf. Gura gur plpyr ercrngf.
The program requires that the lowest bit of a pointer to be 0.
The program requires that the lowest bit of a pointer to be 0.
I could have squeezed the program under 1024 bytes without the
trace subroutine, but I felt it was important for understanding
the program. Besides it is fun to watch the tape zooming back
and forth as the program runs. A much better debugger or trace
could easily be added.
I could have squeezed the program under 1024 bytes without the
trace subroutine, but I felt it was important for understanding
the program. Besides it is fun to watch the tape zooming back
and forth as the program runs. A much better debugger or trace
could easily be added.
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+8 -1
View File
@@ -121,6 +121,13 @@ OPT= -O3
#
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# FORCE use of -include stdlib.h
#
CFLAGS+= -include stdlib.h
## FORCE
# Libraries needed to build
#
LIBS=
@@ -183,7 +190,7 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry requires a non-standard K&R C compiler to compile."
@echo "NOTE: This entry will likely dump core on invalid input."
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+36 -25
View File
@@ -1,4 +1,4 @@
Best minimal use of C:
## Best minimal use of C:
Arch D. Robison
University of Illinois
@@ -7,42 +7,53 @@ Best minimal use of C:
61801
USA
Judges notes:
## To build:
Sites with punch card facilities will be happy to note that
the source deck can be re-collated with an ASCII sort.
make all
Note that this program uses only a small subset of the
constructs that the C language supports.
Selected notes from the author:
NOTE: we were able to get this to compile under modern systems with a patch from
Yusuke Endoh. Thank you for your assistance Yusuke!
This program is a handy picoAPL interpreter written in C--. It
outputs the evaluation of an APL expression from standard
input. Functions are limited to dyadic +,-,x, and unary -;
numerals must be binary. Parentheses may be used for
grouping. For example:
## Judges' comments:
Sites with punch card facilities will be happy to note that
the source deck can be re-collated with an ASCII sort.
Note that this program uses only a small subset of the
constructs that the C language supports.
NOTE: this entry will likely dump core with invalid input.
## Selected notes from the author:
This program is a handy picoAPL interpreter written in C--. It
outputs the evaluation of an APL expression from standard
input. Functions are limited to dyadic +,-,x, and unary -;
numerals must be binary. Parentheses may be used for
grouping. For example:
101x111-100
prints:
prints:
1111
That is 5x(7-4) is 15. (APL groups from right to left.)
Extending it to the full APL language should be trivial.
That is 5x(7-4) is 15. (APL groups from right to left.)
Extending it to the full APL language should be trivial.
The C-- language improves the C language by removing superfluous
and confusing features: arithmetic, logical operations, shifts,
relationals, address-of, and flow control. In fact, the only
expressions retained are function calls, indirection, array
assignments, the ',' operator, and sizeof. Despite these
restrictions, the C-- program does arithmetic on arbitrarily
large binary numbers.
The C-- language improves the C language by removing superfluous
and confusing features: arithmetic, logical operations, shifts,
relationals, address-of, and flow control. In fact, the only
expressions retained are function calls, indirection, array
assignments, the ',' operator, and sizeof. Despite these
restrictions, the C-- program does arithmetic on arbitrarily
large binary numbers.
To obtain a C-- reference, simply rip out the irrelevant pages
from your K&R C manual. To obtain a C-- compiler, simply rip
out the irrelevant bytes from your cc compiler.
To obtain a C-- reference, simply rip out the irrelevant pages
from your K&R C manual. To obtain a C-- compiler, simply rip
out the irrelevant bytes from your cc compiler.
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+1 -1
View File
@@ -6,7 +6,7 @@
#define Y(_,A)B _(d,e)B d,e;X(A)
#define Z(P)C P(f,g,h,i)C f,g,h,i;X(P)
#define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b)
#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e))
#define _(D,E,F,G,H)B D();Y(D##f,E)Y(D##g,F)Y(D##h,G)Y(D##i,H)Y(D,(*(*d->d)(D##f,D##g,D##h,D##i))(d,e))
Z(f)
Z(g)
Z(h)
+17 -12
View File
@@ -1,4 +1,4 @@
Best layout:
## Best layout:
Lievaart, Roemer B.
VU-Informatica, Amsterdam
@@ -6,21 +6,26 @@ Best layout:
NL 1091 TJ Amsterdam
Netherlands
Judges notes:
## To build:
Do you know what this program does? If you do, look again,
there is more here than meets the PI.
make all
Selected notes from the author:
## Judges' comments:
Passes lint, but not with the strictest options, for it
contains some "null-statements", as well two identifiers
which are, if compilers only take 6 characters, the same. It
also uses write(2), so not totally system independent.
Do you know what this program does? If you do, look again,
there is more here than meets the PI.
## Selected notes from the author:
Passes lint, but not with the strictest options, for it
contains some "null-statements", as well two identifiers
which are, if compilers only take 6 characters, the same. It
also uses write(2), so not totally system independent.
You are very much invited to pass this program through a
C-beautifier. (First strip newlines and tabs, if your cb can't
do that.)
You are very much invited to pass this program through a
C-beautifier. (First strip newlines and tabs, if your cb can't
do that.)
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+1 -1
View File
@@ -186,7 +186,7 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry uses non-standard args to main() that do not work with modern compilers."
@echo "NOTE: this entry uses a non-standard arg to main() that will not work some modern compilers."
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+36 -22
View File
@@ -10,37 +10,51 @@
make all
NOTE: This entry might not compile when using modern compilers.
NOTE: we used a patch from Yusuke Endoh to get this to compile under gcc. Thank
you Yusuke for your assistance! Cody Boone Ferguson got this to work with clang
by further changing the variable `a` to be not the third argument to `main()` to
a variable declared in `main()`. We thank you for your assistance Cody (he
cynically notes that he did it because tetris just has to work)!
### To run
./tromp [drops_per_sec [cmd_string]]
NOTE: after this game is finished you will likely get an error along the lines
of:
Segmentation fault: 11
stty: stdin isn't a terminal
and a file `HI` will be in the directory.
## Judges' comments
This is a character terminal version of the TETRIS program.
It runs on a VT100 compatible terminal or emulator. It is
best used at 4800 baud or more.
By default, "drops_per_sec", the number of times an object
will drop in a second, is 2. The default "cmd_string" is
"jkl pq". The first 6 characters of "cmd_string" relate
to the following 6 game commands:
This is a character terminal version of the TETRIS program.
It runs on a VT100 compatible terminal or emulator. It is
best used at 4800 baud or more.
j - left
k - rotate
l - right
<space> - drop
p - pause
q - quit
Specifying "cmd_string" allows one to re-define the commands.
The pause command pauses the game, clears the screen and
prints the current score. To un-pause, type the pause
character again, which by default is "p".
By default, "drops_per_sec", the number of times an object
will drop in a second, is 2. The default "cmd_string" is
"jkl pq". The first 6 characters of "cmd_string" relate
to the following 6 game commands:
As was stated last year, we are likely to be more strict about
portability in the future. [ We mean it this time :-) ]
j - left
k - rotate
l - right
<space> - drop
p - pause
q - quit
Specifying "cmd_string" allows one to re-define the commands.
The pause command pauses the game, clears the screen and
prints the current score. To un-pause, type the pause
character again, which by default is "p".
As was stated last year, we are likely to be more strict about
portability in the future. [ We mean it this time :-) ]
## Author's comments
+4 -4
View File
@@ -1,13 +1,13 @@
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}long c,d,l,v[]={0,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V)char**
V;{char *a;*v=(long)t;h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigaction(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
+23 -17
View File
@@ -1,4 +1,4 @@
Best one liner:
## Best one liner:
David Van Brackle
Department of Computer Science
@@ -7,31 +7,37 @@ Best one liner:
32816
USA
Judges notes:
This program computes all proper subsets of the set of
arguments passed to it. Each subset is printed with one
element on each line, followed by a line of ten dashes.
## To build:
Try:
make all
vanb the rug gary lent
vanb unix is better than os/2
## Try:
Selected notes from the author:
./vanb the rug gary lent
./vanb unix is better than os/2
The program has the following charming and possibly
non-portable features:
## Judges' comments:
* It has no local or global variables,
only the command-line parameters.
This program computes all proper subsets of the set of
arguments passed to it. Each subset is printed with one
element on each line, followed by a line of ten dashes.
* It calls main recursively.
* It alters the command-line parameters.
* It uses the fact that if the high bit is set in a character
variable, the value is negative.
## Selected notes from the author:
The program has the following charming and possibly
non-portable features:
* It has no local or global variables, only the command-line parameters.
* It calls main recursively.
* It alters the command-line parameters.
* It uses the fact that if the high bit is set in a character variable, the
value is negative.
Copyright (c) 1989, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
+1 -1
View File
@@ -184,7 +184,7 @@ all: data ${TARGET}
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
@echo "NOTE: This entry uses non-standard args to main() that do not work with modern compilers."
@echo "NOTE: This entry uses non-standard args to main() that do not work with some modern compilers."
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
+7
View File
@@ -3093,6 +3093,13 @@ a window manager that does not obscure the root window.
<LI><A HREF="1989/tromp/Makefile">Makefile</A>
<LI><A HREF="1989/tromp/tromp.c">tromp.bsd.c</A>
<LI><A HREF="1989/tromp/tromp.orig.c">tromp.s5.c</A>
<LI><a href="winners.html#Yusuke_Endoh">Yusuke Endoh</a> provided a patch to get
this to compile with modern compilers.
<a href="winners.html#Cody_Boone_Ferguson">Cody Boone Ferguson</a> fixed this so
it will compile and work under clang ('IOCCC Tetris must work!'). Thank you Yusuke and
Cody!</LI>
</UL>
</UL>
<A NAME="1989_vanb"></A>
<P><B>vanb</B> - one-liner prints all subsets of arguments</P>