fix Makefile and README.md for 2018/burton1
This commit is contained in:
1 parent
2f89f5769b
commit
d30627e1e0
5 files changed
+246
-175
No files matched your search
@@ -1,2 +1,2 @@
|
|||||||
prog
|
prog
|
||||||
prog.nowarn
|
prog.alt
|
||||||
+150
-105
@@ -1,40 +1,52 @@
|
|||||||
#!/usr/bin/env make
|
#!/usr/bin/env make
|
||||||
#
|
#
|
||||||
# 2018 makefile
|
# IOCCC 2018 winning entry - burton1
|
||||||
|
|
||||||
|
################################################################################
|
||||||
#
|
#
|
||||||
# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis
|
# Regarding individual entries:
|
||||||
# is licensed under:
|
#
|
||||||
|
# IOCCC winning entry code may not work on your system. Even with standards,
|
||||||
|
# conditions and build environments change, especially when it comes to more
|
||||||
|
# extreme code such you might find in an IOCCC winner. Moreover, what was
|
||||||
|
# allowed and liked in one IOCCC contest may no longer be liked/allowed in
|
||||||
|
# later IOCCC years.
|
||||||
|
#
|
||||||
|
# Corrections on winning author and fixing typos in remarks are VERY WELCOME.
|
||||||
|
#
|
||||||
|
# GitHub pull requests are welcome:
|
||||||
|
#
|
||||||
|
# If you have a patch that might make running an entry work in modern Unix-like
|
||||||
|
# environments, please create a GitHub pull request for the IOCCC judges to
|
||||||
|
# consider.
|
||||||
|
#
|
||||||
|
# Suggestions and corrections regarding Makefiles, winning author information,
|
||||||
|
# fixing typos in remarks, and code patches are welcome via opening a GitHub
|
||||||
|
# issue or better yet, by creating a GitHub pull request for the IOCCC judges
|
||||||
|
# to consider. To form a GitHub issue or GitHub pull, please visit:
|
||||||
|
#
|
||||||
|
# https://github.com/ioccc-src/winner
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# This work by Landon Curt Noll and Leonid A. Broukhis is licensed under:
|
||||||
#
|
#
|
||||||
# Creative Commons Attribution-ShareAlike 3.0 Unported License.
|
# Creative Commons Attribution-ShareAlike 3.0 Unported License.
|
||||||
#
|
#
|
||||||
# See: http://creativecommons.org/licenses/by-sa/3.0/
|
# See: http://creativecommons.org/licenses/by-sa/3.0/
|
||||||
|
|
||||||
|
|
||||||
################
|
#############################
|
||||||
# tool locations
|
# shell used by this Makefile
|
||||||
################
|
#############################
|
||||||
#
|
#
|
||||||
SHELL= bash
|
SHELL= bash
|
||||||
CP= cp
|
|
||||||
CPP= cpp
|
#######################
|
||||||
GUNZIP= gunzip
|
# common tool locations
|
||||||
BUNZIP2= bunzip2
|
#######################
|
||||||
GZIP_PROG= gzip
|
#
|
||||||
BZIP2= bzip2
|
include ../../var.mk
|
||||||
CURL= curl
|
|
||||||
DD= dd
|
|
||||||
LD= ld
|
|
||||||
MAKE= make
|
|
||||||
RM= rm
|
|
||||||
SED= sed
|
|
||||||
TAR= tar
|
|
||||||
TRUE= true
|
|
||||||
MKDIR= mkdir
|
|
||||||
MV= mv
|
|
||||||
TR= tr
|
|
||||||
GREP= grep
|
|
||||||
SORT= sort
|
|
||||||
UNIQ= uniq
|
|
||||||
|
|
||||||
# Set X11_LIBDIR to the directory where the X11 library resides
|
# Set X11_LIBDIR to the directory where the X11 library resides
|
||||||
#
|
#
|
||||||
@@ -48,28 +60,26 @@ X11_LIBDIR= /opt/X11/lib
|
|||||||
#X11_INCDIR= /usr/X11/include
|
#X11_INCDIR= /usr/X11/include
|
||||||
X11_INCDIR= /opt/X11/include
|
X11_INCDIR= /opt/X11/include
|
||||||
|
|
||||||
# Compiler warnings
|
# Common C compiler warnings to silence
|
||||||
#
|
#
|
||||||
#CWARN=
|
#CSILENCE=
|
||||||
#CWARN= -Wall
|
CSILENCE= -Wno-char-subscripts -Wno-error -Wno-implicit-function-declaration \
|
||||||
#CWARN= -Wall -Wextra
|
-Wno-implicit-int -Wno-main
|
||||||
CWARN= -Wall -Wextra -pedantic ${CSILENCE}
|
|
||||||
#CWARN= -Wall -Wextra -Weverything
|
|
||||||
#CWARN= -Wall -Wextra -Weverything -pedantic
|
|
||||||
#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE}
|
|
||||||
|
|
||||||
# Silence warnings that ${CWARN} would normally complain about
|
# Common C compiler warning flags
|
||||||
#
|
#
|
||||||
CSILENCE=
|
#CWARN= ${CSILENCE}
|
||||||
#CSILENCE= -Wno-implicit-int
|
#CWARN= -Wall ${CSILENCE}
|
||||||
|
CWARN= -Wall -Wextra ${CSILENCE}
|
||||||
|
#CWARN= -Wall -Wextra -pedantic ${CSILENCE}
|
||||||
|
|
||||||
# compiler standard
|
# Compiler standard
|
||||||
#
|
#
|
||||||
#CSTD=
|
#CSTD=
|
||||||
#CSTD= -ansi
|
#CSTD= -ansi
|
||||||
CSTD= -std=c11
|
CSTD= -std=gnu17
|
||||||
|
|
||||||
# compiler bit architecture
|
# Compiler bit architecture
|
||||||
#
|
#
|
||||||
# Some entries require 32-bitness:
|
# Some entries require 32-bitness:
|
||||||
# ARCH= -m32
|
# ARCH= -m32
|
||||||
@@ -81,20 +91,21 @@ CSTD= -std=c11
|
|||||||
#
|
#
|
||||||
ARCH=
|
ARCH=
|
||||||
|
|
||||||
# defines that are needed to compile
|
# Defines that are needed to compile
|
||||||
#
|
#
|
||||||
CDEFINE=
|
CDEFINE=
|
||||||
#CDEFINE= -DIOCCC=25
|
#CDEFINE= -DIOCCC
|
||||||
|
|
||||||
# include files that are needed to compile
|
# Include files that are needed to compile
|
||||||
#
|
#
|
||||||
#CINCLUDE=
|
CINCLUDE=
|
||||||
#CINCLUDE= -include stdlib.h
|
#CINCLUDE= -include stdlib.h
|
||||||
CINCLUDE= -include stdio.h
|
#CINCLUDE= -include stdio.h
|
||||||
#CINCLUDE= -include stdlib.h -include stdio.h
|
#CINCLUDE= -include stdlib.h -include stdio.h
|
||||||
#CINCLUDE= -I ${X11_INCDIR}
|
#CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
|
||||||
|
#CINCLUDE= `${SDL2_CONFIG} --cflags`
|
||||||
|
|
||||||
# optimization
|
# Optimization
|
||||||
#
|
#
|
||||||
# Most compiles will safely use -O2. Some can use only -O1 or -O.
|
# Most compiles will safely use -O2. Some can use only -O1 or -O.
|
||||||
# A few compilers have broken optimizers or this entry make break
|
# A few compilers have broken optimizers or this entry make break
|
||||||
@@ -107,59 +118,81 @@ CINCLUDE= -include stdio.h
|
|||||||
#OPT= -O2
|
#OPT= -O2
|
||||||
OPT= -O3
|
OPT= -O3
|
||||||
|
|
||||||
# default flags for ANSI C compilation
|
# Default flags for ANSI C compilation
|
||||||
#
|
#
|
||||||
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
|
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
|
||||||
|
|
||||||
# Libraries needed to build
|
# Libraries needed to build
|
||||||
#
|
#
|
||||||
LIBS=
|
LIBS=
|
||||||
#LIBS= -L ${X11_LIBDIR}
|
#LIBS= -lm
|
||||||
|
#LIBS= -L ${X11_LIBDIR} -lX11
|
||||||
|
#LIBS= `${SDL2_CONFIG} --libs`
|
||||||
|
|
||||||
# ANSI compiler
|
# C compiler to use
|
||||||
#
|
|
||||||
# Set CC to the name of your ANSI compiler.
|
|
||||||
#
|
|
||||||
# Some entries seem to need gcc. If you have gcc, set
|
|
||||||
# both CC and MAY_NEED_GCC to gcc.
|
|
||||||
#
|
|
||||||
# If you do not have gcc, set CC to the name of your ANSI compiler, and
|
|
||||||
# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just :
|
|
||||||
# to disable such programs.
|
|
||||||
#
|
#
|
||||||
CC= cc
|
CC= cc
|
||||||
#CC=clang
|
#CC=clang
|
||||||
MAY_NEED_GCC= gcc
|
#CC=gcc
|
||||||
|
|
||||||
|
# Compiler add-ons or replacements for clang only
|
||||||
|
#
|
||||||
|
ifeq ($(CC),clang)
|
||||||
|
#
|
||||||
|
CSILENCE+= -Wno-implicit-int-conversion -Wno-missing-variable-declarations \
|
||||||
|
-Wno-pedantic -Wno-poison-system-directories
|
||||||
|
#
|
||||||
|
CWARN+= -Weverything
|
||||||
|
#
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Specific add-ons or replacements for gcc only
|
||||||
|
#
|
||||||
|
ifeq ($(CC),gcc)
|
||||||
|
#
|
||||||
|
#CSILENCE+=
|
||||||
|
#
|
||||||
|
#CWARN+=
|
||||||
|
#
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
# Special flags for this entry
|
# Special flags for this entry
|
||||||
##############################
|
##############################
|
||||||
#
|
#
|
||||||
OBJ= prog.o
|
ENTRY= burton1
|
||||||
DATA=
|
PROG= prog
|
||||||
TARGET= prog prog.nowarn
|
|
||||||
#
|
#
|
||||||
ALT_OBJ= prog.nowarn.o
|
OBJ= ${PROG}.o
|
||||||
ALT_TARGET= prog.nowarn
|
CSRC= ${PROG}.o
|
||||||
|
DATA= scripthd
|
||||||
|
TARGET= ${PROG}
|
||||||
|
#
|
||||||
|
ALT_OBJ= ${PROG}.alt.o
|
||||||
|
ALT_TARGET= ${PROG}.alt
|
||||||
|
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# build the entry
|
# build the entry
|
||||||
#################
|
#################
|
||||||
#
|
#
|
||||||
all: ${TARGET} ${DATA}
|
all: data ${TARGET}
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
prog: prog.c
|
.PHONY: all alt data everything clean clobber install \
|
||||||
|
love haste waste maker easter_egg sandwich \
|
||||||
|
supernova deep_magic magic charon pluto
|
||||||
|
|
||||||
|
${PROG}: ${PROG}.c
|
||||||
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
||||||
|
|
||||||
# alternative executable
|
# alternative executable
|
||||||
#
|
#
|
||||||
alt: ${ALT_TARGET}
|
alt: data ${ALT_TARGET}
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
prog.nowarn: prog.nowarn.c
|
${PROG}.alt: ${PROG}.alt.c
|
||||||
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
||||||
|
|
||||||
# data files
|
# data files
|
||||||
@@ -167,15 +200,21 @@ prog.nowarn: prog.nowarn.c
|
|||||||
data: ${DATA}
|
data: ${DATA}
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
|
# both all and alt
|
||||||
|
#
|
||||||
|
everything: all alt
|
||||||
|
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# utility rules
|
# utility rules
|
||||||
###############
|
###############
|
||||||
#
|
#
|
||||||
everything: all alt
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
${RM} -f ${OBJ} ${ALT_OBJ}
|
${RM} -f ${OBJ} ${ALT_OBJ}
|
||||||
|
@-if [ -f indent.c ]; then \
|
||||||
|
echo ${RM} -f indent.c; \
|
||||||
|
${RM} -f indent.c; \
|
||||||
|
fi
|
||||||
|
|
||||||
clobber: clean
|
clobber: clean
|
||||||
${RM} -f ${TARGET} ${ALT_TARGET}
|
${RM} -f ${TARGET} ${ALT_TARGET}
|
||||||
@@ -184,20 +223,28 @@ clobber: clean
|
|||||||
echo 'ate sandwich'; \
|
echo 'ate sandwich'; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
nuke: clobber
|
|
||||||
@${TRUE}
|
|
||||||
|
|
||||||
dist_clean: nuke
|
|
||||||
@${TRUE}
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@echo "Surely you are performing, Dr. May!"
|
@echo "Dr. Spock says that is not logical!"
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
# backwards compatibility
|
# you may be able to misunderstand the source by reading indent.c
|
||||||
#
|
#
|
||||||
build: all
|
indent.c: ${PROG}.c
|
||||||
@${TRUE}
|
@if which "${GINDENT}" >/dev/null 2>&1; then \
|
||||||
|
echo ${RM} -f $@; \
|
||||||
|
${RM} -f $@; \
|
||||||
|
echo "${GINDENT} < $< > $@"; \
|
||||||
|
${GINDENT} < $< > $@; \
|
||||||
|
elif which "${INDENT}" >/dev/null 2>&1; then \
|
||||||
|
echo ${RM} -f $@; \
|
||||||
|
${RM} -f $@; \
|
||||||
|
echo "${INDENT} < $< > $@"; \
|
||||||
|
${INDENT} < $< > $@; \
|
||||||
|
else \
|
||||||
|
echo "no intent tool found, ident $< yourself, sorry"; \
|
||||||
|
echo "exit 1"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
##################
|
##################
|
||||||
@@ -216,22 +263,19 @@ waste:
|
|||||||
@echo 'haste'
|
@echo 'haste'
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
make:
|
maker:
|
||||||
@echo 'Attend a maker faire'
|
@echo 'Participate in a maker faire'
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
easter_egg:
|
easter_egg:
|
||||||
@echo you expected to often mis-understand this $${RANDOM} magic
|
@echo "you expected to often misunderstand this $${RANDOM} magic"
|
||||||
@echo chongo '<was here>' "/\\oo/\\"
|
@echo "chongo '<was here>' /\\oo/\\"
|
||||||
@echo Eggy
|
@echo "Eggy"
|
||||||
|
|
||||||
fabricate fashion form frame manufacture produce: make
|
sandwich: easter_egg
|
||||||
@${TRUE}
|
|
||||||
|
|
||||||
sandwich:
|
|
||||||
@if [ `id -u` -eq 0 ]; then \
|
@if [ `id -u` -eq 0 ]; then \
|
||||||
echo 'Okay.'; \
|
echo 'Okay.'; \
|
||||||
echo $${RANDOM}`date +%s`$${RANDOM} > $@; \
|
echo "$${RANDOM}`date +%s`$${RANDOM}" > $@; \
|
||||||
else \
|
else \
|
||||||
echo 'What? Make it yourself.'; \
|
echo 'What? Make it yourself.'; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
@@ -241,18 +285,19 @@ sandwich:
|
|||||||
# as well as the West Coast Computer Faire and
|
# as well as the West Coast Computer Faire and
|
||||||
# you might be confused different. :-)
|
# you might be confused different. :-)
|
||||||
#
|
#
|
||||||
supernova: nuke
|
supernova: sandwich
|
||||||
@-if [ -r .code_anal ]; then \
|
@-if [ -r .code_anal ]; then \
|
||||||
${RM} -f .code_anal_v6; \
|
${RM} -f .code_anal_v6; \
|
||||||
else \
|
else \
|
||||||
echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \
|
echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \
|
||||||
fi
|
fi
|
||||||
@echo A $@ helps ${MAKE} the elements that help form planets
|
@echo "A $@ helps ${MAKE} the elements that help form planets"
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
deep_magic:
|
deep_magic: supernova
|
||||||
@-if [ -r .code_anal ]; then \
|
@-if [ -r .code_anal ]; then \
|
||||||
ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \
|
ccode_analysis --deep_magic 7889066cdbdf09b0408021754586e895be641cc9be29e7eafd3ca65359541f17 \
|
||||||
|
--FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
|
||||||
else \
|
else \
|
||||||
echo "Wrong! Do it again!"; \
|
echo "Wrong! Do it again!"; \
|
||||||
sleep 2; \
|
sleep 2; \
|
||||||
@@ -264,7 +309,7 @@ deep_magic:
|
|||||||
|
|
||||||
magic: deep_magic
|
magic: deep_magic
|
||||||
@-if [ -r .code_anal ]; then \
|
@-if [ -r .code_anal ]; then \
|
||||||
ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \
|
ccode_analysis --level 20003 --mode 5717175 --FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
|
||||||
else \
|
else \
|
||||||
echo "If you don't eat yer meat, you can't have any pudding!"; \
|
echo "If you don't eat yer meat, you can't have any pudding!"; \
|
||||||
echo "How can you have any pudding if you don't eat yer meat?!"; \
|
echo "How can you have any pudding if you don't eat yer meat?!"; \
|
||||||
@@ -273,14 +318,14 @@ magic: deep_magic
|
|||||||
|
|
||||||
# The IOCCC resident astronomer states
|
# The IOCCC resident astronomer states
|
||||||
#
|
#
|
||||||
charon: supernova
|
charon: magic
|
||||||
@echo $@ is a dwarf planet
|
@echo "$@ is a dwarf planet"
|
||||||
@echo dwarf is a type of planet
|
@echo "dwarf is a type of planet"
|
||||||
@echo $@ is a planet
|
@echo "therefore IAU, $@ is a planet"
|
||||||
|
|
||||||
pluto: supernova
|
pluto: charon
|
||||||
${MAKE} charon
|
${MAKE} charon
|
||||||
@echo $@ is a dwarf planet
|
@echo "$@ is a dwarf planet"
|
||||||
@echo dwarf is a type of planet
|
@echo "dwarf is a type of planet"
|
||||||
@echo $@ is a planet
|
@echo "therefore, $@ is a planet"
|
||||||
@echo get used to having lots of planets becasue supernovae can ${MAKE} a lot of them
|
@echo "having lots of planets is good feature because supernovae can help ${MAKE} a lot of them"
|
||||||
+94
-68
@@ -1,25 +1,45 @@
|
|||||||
# Best one-liner
|
# Best one-liner
|
||||||
|
|
||||||
Dave Burton
|
Dave Burton
|
||||||
<http://ioccc.snox.net>
|
<http://ioccc.snox.net>
|
||||||
|
|
||||||
|
# To build:
|
||||||
|
|
||||||
## Judges' comments:
|
```sh
|
||||||
### To use:
|
make
|
||||||
|
```
|
||||||
|
|
||||||
make
|
### To run:
|
||||||
./prog < any-file
|
|
||||||
|
```sh
|
||||||
|
./prog < any-file
|
||||||
|
```
|
||||||
|
|
||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
./prog < prog
|
```sh
|
||||||
./prog < prog.c
|
./prog < prog
|
||||||
|
./prog < prog.c
|
||||||
|
```
|
||||||
|
|
||||||
### Selected Judges Remarks:
|
### Alternate code:
|
||||||
|
|
||||||
|
An alternate version of this entry, `prog.alt.c`, is provided
|
||||||
|
This alternate code was supposed compile without warnings, however
|
||||||
|
with modern compilers this is no longer the case.
|
||||||
|
|
||||||
|
To compile this alternate version:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make alt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Judges' comments:
|
||||||
|
|
||||||
One line, one array, one loop and one statement but it prints many bytes. It won.
|
One line, one array, one loop and one statement but it prints many bytes. It won.
|
||||||
|
|
||||||
## Author's comments:
|
## Author's comments:
|
||||||
|
|
||||||
Feed this anything on stdin.
|
Feed this anything on stdin.
|
||||||
|
|
||||||
The included script may be used as a driver program for this entry.
|
The included script may be used as a driver program for this entry.
|
||||||
@@ -37,8 +57,7 @@ This code has been compiled and tested on:
|
|||||||
|
|
||||||
<div style="margin-bottom:60em;margin-top:4em"><strong>Spoiler below; scroll down.</strong></div>
|
<div style="margin-bottom:60em;margin-top:4em"><strong>Spoiler below; scroll down.</strong></div>
|
||||||
|
|
||||||
SPOILER
|
### SPOILER
|
||||||
-------
|
|
||||||
|
|
||||||
This started life as a personal challenge: write the shortest hex dump utility in C.
|
This started life as a personal challenge: write the shortest hex dump utility in C.
|
||||||
|
|
||||||
@@ -48,7 +67,9 @@ no extraneous newlines, the code must be portable,
|
|||||||
and without bypassing the solution using execve(2),
|
and without bypassing the solution using execve(2),
|
||||||
or functions built upon it (system(3), popen(3), etc). E.g:
|
or functions built upon it (system(3), popen(3), etc). E.g:
|
||||||
|
|
||||||
main(){system("hd");} // it's turtles all the way down!
|
```c
|
||||||
|
main(){system("hd");} // it's turtles all the way down!
|
||||||
|
```
|
||||||
|
|
||||||
is not acceptable.
|
is not acceptable.
|
||||||
And, "output correctly" is the output format of this entry. QED.
|
And, "output correctly" is the output format of this entry. QED.
|
||||||
@@ -58,15 +79,17 @@ This was too long for a one-liner, so it had to be formatted as something more i
|
|||||||
This solution is pleasing, but a true one-liner was the hoped-for goal.
|
This solution is pleasing, but a true one-liner was the hoped-for goal.
|
||||||
Here is the 157 character version in it's entirety:
|
Here is the 157 character version in it's entirety:
|
||||||
|
|
||||||
char O,o[ 20];L(O){
|
```c
|
||||||
putchar ( O+ 48+39 *(9<
|
char O,o[ 20];L(O){
|
||||||
O));} I(O) {L(~ 15);
|
putchar ( O+ 48+39 *(9<
|
||||||
O|| puts(o);} main (l){
|
O));} I(O) {L(~ 15);
|
||||||
for(;~(l=getchar()) ;I(O
|
O|| puts(o);} main (l){
|
||||||
&=15 ))o[ O++ ]=4<
|
for(;~(l=getchar()) ;I(O
|
||||||
(4^l >>5) ?l: 46,L
|
&=15 ))o[ O++ ]=4<
|
||||||
(l>> 4),L (l&15);O&&
|
(4^l >>5) ?l: 46,L
|
||||||
I(o[ O]=0 );}//157c
|
(l>> 4),L (l&15);O&&
|
||||||
|
I(o[ O]=0 );}//157c
|
||||||
|
```
|
||||||
|
|
||||||
While thinking about this in the shower (you are not the only one that does this!)
|
While thinking about this in the shower (you are not the only one that does this!)
|
||||||
came the idea which reduced the code to just 119 chars.
|
came the idea which reduced the code to just 119 chars.
|
||||||
@@ -75,65 +98,69 @@ The progression to the present size is interesting,
|
|||||||
and it is interesting that the same algorithm can be expressed so differently
|
and it is interesting that the same algorithm can be expressed so differently
|
||||||
by slight rearrangement of its parts.
|
by slight rearrangement of its parts.
|
||||||
|
|
||||||
// 119
|
```c
|
||||||
char O,o[20];main(l){for(;~(l=getchar());O||puts(o))o[O++]=isprint(l)?l:46,O&=15,printf("%02x ",l);O[o]=0;O&&puts(o);}
|
// 119
|
||||||
// 116
|
char O,o[20];main(l){for(;~(l=getchar());O||puts(o))o[O++]=isprint(l)?l:46,O&=15,printf("%02x ",l);O[o]=0;O&&puts(o);}
|
||||||
char O,o[20];main(l){for(;O++[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O&=15)||puts(o))printf("%02x ",l);O>1&&puts(o);}
|
// 116
|
||||||
// 115
|
char O,o[20];main(l){for(;O++[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O&=15)||puts(o))printf("%02x ",l);O>1&&puts(o);}
|
||||||
char O,o[20];main(l){for(;O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O=-~O&15)||puts(o))printf("%02x ",l);O&&puts(o);}
|
// 115
|
||||||
// 113
|
char O,o[20];main(l){for(;O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O=-~O&15)||puts(o))printf("%02x ",l);O&&puts(o);}
|
||||||
char O,o[20];main(l){for(;~l;(O=~l?printf("%02x ",l),-~O&15:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
|
// 113
|
||||||
// 112
|
char O,o[20];main(l){for(;~l;(O=~l?printf("%02x ",l),-~O&15:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
|
||||||
char O,o[20];main(l){for(;~l;(O=~l?-~O&printf("%02x ",l)*5:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
|
// 112
|
||||||
// 111
|
char O,o[20];main(l){for(;~l;(O=~l?-~O&printf("%02x ",l)*5:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
|
||||||
char O,o[20];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
// 111
|
||||||
// 110
|
char O,o[20];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
||||||
char O,o[0];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
// 110
|
||||||
// 109
|
char O,o[0];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
||||||
char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
// 109
|
||||||
|
char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
|
||||||
|
```
|
||||||
|
|
||||||
There are solutions without the ASCII sidebar that are significantly shorter.
|
There are solutions without the ASCII sidebar that are significantly shorter.
|
||||||
These do not compete in the same category, since their output is materially different.
|
These do not compete in the same category, since their output is materially different.
|
||||||
They are derived from the solutions above, but are still fascinating as concise utilities,
|
They are derived from the solutions above, but are still fascinating as concise utilities,
|
||||||
so here is their progression, for the curious:
|
so here is their progression, for the curious:
|
||||||
|
|
||||||
// 102
|
```c
|
||||||
I;O(O){putchar(O+48+39*(9<O));}main(l){for(;~(l=getchar());O(++I&15?~15:~37))O(l>>4),O(l&15);O(-38);}
|
// 102
|
||||||
// 80
|
I;O(O){putchar(O+48+39*(9<O));}main(l){for(;~(l=getchar());O(++I&15?~15:~37))O(l>>4),O(l&15);O(-38);}
|
||||||
O;main(l){while(~(l=getchar()))printf("%02x%c",l,++O&15?32:10);O&15&&puts("");}
|
// 80
|
||||||
// 78
|
O;main(l){while(~(l=getchar()))printf("%02x%c",l,++O&15?32:10);O&15&&puts("");}
|
||||||
O;main(l){for(;~l;(O=~(l=getchar())?printf("%02x ",l),-~O&15:!O)||puts(""));}
|
// 78
|
||||||
// 77
|
O;main(l){for(;~l;(O=~(l=getchar())?printf("%02x ",l),-~O&15:!O)||puts(""));}
|
||||||
O;main(l){for(;~l;(O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O)||puts(""));}
|
// 77
|
||||||
// 76
|
O;main(l){for(;~l;(O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O)||puts(""));}
|
||||||
O;main(l){for(;~l;O||puts(&O))O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O;}
|
// 76
|
||||||
|
O;main(l){for(;~l;O||puts(&O))O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O;}
|
||||||
|
```
|
||||||
|
|
||||||
It is possible to reduce the size of each of these by one by eliding the trailing newline.
|
It is possible to reduce the size of each of these by one by eliding the trailing newline.
|
||||||
This was not reported above since the newline kept getting appended by processing software,
|
This was not reported above since the newline kept getting appended by processing software,
|
||||||
and it is more interesting to remove characters by changing code than by filtering:
|
and it is more interesting to remove characters by changing code than by filtering:
|
||||||
|
|
||||||
$ tr -d '\012' < 109.c | wc -c
|
```sh
|
||||||
108
|
$ tr -d '\012' < 109.c | wc -c
|
||||||
$ tr -d '\012' < 76.c | wc -c
|
108
|
||||||
75
|
$ tr -d '\012' < 76.c | wc -c
|
||||||
$ tr -d '\012' < 109.c | cc -o 108 -xc -
|
75
|
||||||
$ verify 108
|
$ tr -d '\012' < 109.c | cc -o 108 -xc -
|
||||||
$
|
$ verify 108
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
An obfuscated hex dump has been done before:
|
An obfuscated hex dump has been done before:
|
||||||
[1986/bright/bright.c](http://ioccc.org/1986/bright/bright.c) is similar in function,
|
[1986/bright/bright.c](http://ioccc.org/1986/bright/bright.c) is similar in function,
|
||||||
but it uses more characters in just setting up its obfuscation than this entire solution!
|
but it uses more characters in just setting up its obfuscation than this entire solution!
|
||||||
|
|
||||||
BIGGER SPOILER
|
### BIGGER SPOILER
|
||||||
--------------
|
|
||||||
|
|
||||||
If you are unhappy with the way DEL (character 127) is handled,
|
If you are unhappy with the way DEL (character 127) is handled,
|
||||||
replace the cryptic expression `4<(4^l>>5)?l:46` with `32>l|l>126?46:l`.
|
replace the cryptic expression `4<(4^l>>5)?l:46` with `32>l|l>126?46:l`.
|
||||||
Both take the same number of characters, but the former is a bit more interesting.
|
Both take the same number of characters, but the former is a bit more interesting.
|
||||||
Bonus question: how does the first expression work?
|
Bonus question: how does the first expression work?
|
||||||
|
|
||||||
BIGGEST SPOILER (and some history)
|
### BIGGEST SPOILER (and some history)
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
Technically, `char o[0];` is illegal (SS 6.7.6.2) according to ISO (N1570).
|
Technically, `char o[0];` is illegal (SS 6.7.6.2) according to ISO (N1570).
|
||||||
And `char o[];` is a conditionally supported feature (SS 6.7.6.2, 6.10.8.3).
|
And `char o[];` is a conditionally supported feature (SS 6.7.6.2, 6.10.8.3).
|
||||||
@@ -186,8 +213,7 @@ and therefore 111 compiles but does not work correctly;
|
|||||||
> Most of the rest of the system, especially in the kernel,
|
> Most of the rest of the system, especially in the kernel,
|
||||||
> are models of clarity and efficient expression.
|
> are models of clarity and efficient expression.
|
||||||
|
|
||||||
TL;DR
|
### TL;DR
|
||||||
-----
|
|
||||||
|
|
||||||
So which version is the shortest, portable hex dump?
|
So which version is the shortest, portable hex dump?
|
||||||
|
|
||||||
@@ -196,29 +222,29 @@ So which version is the shortest, portable hex dump?
|
|||||||
* 113 works on Ancient UNIX and the portable C compiler.
|
* 113 works on Ancient UNIX and the portable C compiler.
|
||||||
* 119 works on all platforms, including the original Ritchie PDP-11 C compiler.
|
* 119 works on all platforms, including the original Ritchie PDP-11 C compiler.
|
||||||
|
|
||||||
Coda
|
### Coda
|
||||||
----
|
|
||||||
|
|
||||||
Clearly, the smallest possible program violates modern best practice.
|
Clearly, the smallest possible program violates modern best practice.
|
||||||
It is not even possible to compile cleanly, but it will compile correctly.
|
It is not even possible to compile cleanly, but it will compile correctly.
|
||||||
|
|
||||||
Included is `prog.nowarn.c`, a modern C implementation that is -- perhaps -- the smallest,
|
Included is `prog.alt.c`, a modern C implementation that is -- perhaps -- the smallest,
|
||||||
clean-compiling version using `clang` or `gcc` with `-Wall -pedantic`.
|
clean-compiling version using `clang` or `gcc` with `-Wall -pedantic`.
|
||||||
Note that while this is larger than all but the original attempt,
|
Note that while this is larger than all but the original attempt,
|
||||||
it will *not* work with the original Ritchie PDP-11 C compiler,
|
it will *not* work with the original Ritchie PDP-11 C compiler,
|
||||||
since the expression within the ternary remains too complex.
|
since the expression within the ternary remains too complex.
|
||||||
|
|
||||||
Try
|
Try:
|
||||||
|
|
||||||
cat prog.c prog.nowarn.c
|
```sh
|
||||||
|
cat prog.c prog.alt.c
|
||||||
|
```
|
||||||
|
|
||||||
to compare the differences (`diff` is not helpful on a one-liner).
|
to compare the differences (`diff` is not helpful on a one-liner).
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
## Copyright:
|
||||||
<!--
|
|
||||||
(c) Copyright 1984-2018, [Leo Broukhis, Simon Cooper, Landon Curt Noll][judges] - All rights reserved
|
(c) Copyright 1984-2018, [Leo Broukhis, Simon Cooper, Landon Curt Noll][judges] - All rights reserved
|
||||||
This work is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License][cc].
|
This work is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License][cc].
|
||||||
|
|
||||||
[judges]: http://www.ioccc.org/judges.html
|
[judges]: http://www.ioccc.org/judges.html
|
||||||
[cc]: http://creativecommons.org/licenses/by-sa/3.0/
|
[cc]: http://creativecommons.org/licenses/by-sa/3.0/
|
||||||
-->
|
|
||||||
File renamed without changes.
Regular → Executable
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
hd=${HD:=prog}
|
hd=${HD:=prog}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user