diff --git a/bin/gen-years.sh b/bin/gen-years.sh
index 3fbba6840..7840b2521 100755
--- a/bin/gen-years.sh
+++ b/bin/gen-years.sh
@@ -106,7 +106,7 @@ export LC_ALL="C"
# set variables referenced in the usage message
#
-export VERSION="2.1.1 2025-06-06"
+export VERSION="2.2.0 2025-07-10"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
@@ -279,6 +279,70 @@ function output_award
}
+# output_abstract
+#
+# Write the abstract name to standard output (stdout)
+#
+# usage:
+# output_abstract YYYY/dir/.entry.json
+#
+# returns:
+# 0 ==> no errors detected, but output may be empty
+# > 0 ==> function error number
+#
+function output_abstract
+{
+ local ENTRY_JSON_PATH; # the .entry.json path
+ local PATTERN; # XPath for JSON pattern
+ local ABSTRACT; # extracted abstract from .entry.json
+
+ # parse args
+ #
+ if [[ $# -ne 1 ]]; then
+ echo "$0: ERROR: in output_abstract: expected 1 arg, found $#" 1>&2
+ return 1
+ fi
+ ENTRY_JSON_PATH="$1"
+ if [[ ! -e $ENTRY_JSON_PATH ]]; then
+ echo "$0: ERROR: in output_abstract: .entry.json does not exist: $ENTRY_JSON_PATH" 1>&2
+ return 2
+ fi
+ if [[ ! -f $ENTRY_JSON_PATH ]]; then
+ echo "$0: ERROR: in output_abstract: .entry.json is not a file: $ENTRY_JSON_PATH" 1>&2
+ return 3
+ fi
+ if [[ ! -r $ENTRY_JSON_PATH ]]; then
+ echo "$0: ERROR: in output_abstract: .entry.json is not a readable file: $ENTRY_JSON_PATH" 1>&2
+ return 4
+ fi
+
+ # obtain the abstract string
+ #
+ PATTERN='$..abstract'
+ if [[ $V_FLAG -ge 5 ]]; then
+ echo "$0: debug[5]: about to run: $JVAL_WRAPPER -b -q -- $ENTRY_JSON_PATH '$PATTERN' | $JSTRDECODE -d -q -N -" 1>&2
+ fi
+ export ABSTRACT
+ ABSTRACT=$("$JVAL_WRAPPER" -b -q "$ENTRY_JSON_PATH" "$PATTERN" | "$JSTRDECODE" -d -q -N -)
+ status_codes=("${PIPESTATUS[@]}")
+ if [[ ${status_codes[*]} =~ [1-9] || -z $ABSTRACT ]]; then
+ echo "$0: ERROR: in output_abstract: $JVAL_WRAPPER -b -q -- $ENTRY_JSON_PATH '$PATTERN' | $JSTRDECODE -d -q -N - failed," \
+ "error codes: ${status_codes[*]}" 1>&2
+ return 5
+ fi
+ if [[ ${#ABSTRACT} -ge 65 ]]; then
+ echo "$0: ERROR: in output_abstract: abstract length ${#ABSTRACT} >= 65 in $ENTRY_JSON_PATH" 1>&2
+ return 6
+ fi
+ if [[ $ABSTRACT =~ [\;$,] ]]; then
+ echo "$0: ERROR: in output_abstract: abstract contains ; or & or , in $ENTRY_JSON_PATH" 1>&2
+ return 7
+ fi
+ echo "${ABSTRACT//[;&,]/}"
+ return 0
+}
+
+
# output_ordinal
#
# Write the numerical ordinal form of a non-negative integer to standard output (stdout)
@@ -1011,6 +1075,17 @@ for YYYY in $("$TAC_TOOL" "$TOP_FILE"); do
continue
fi
+ # determine the abstract for this entry
+ #
+ ABSTRACT=$(output_abstract "$ENTRY_JSON")
+ status="$?"
+ if [[ $status -ne 0 || -z $ABSTRACT ]]; then
+ echo "$0: ERROR: cannot find abstract in .entry.json: $ENTRY_JSON" 1>&2
+ EXIT_CODE="7" # exit 7
+ echo "$0: Warning: EXIT_CODE set to: $EXIT_CODE" 1>&2
+ continue
+ fi
+
# Verify $YYYY_DIR/README.md
#
if [[ ! -e $YYYY_DIR/README.md ]]; then
@@ -1026,7 +1101,7 @@ for YYYY in $("$TAC_TOOL" "$TOP_FILE"); do
# output markdown for this entry
#
- echo "*
"
+ echo "* $YYYY_DIR - $AWARD -
$ABSTRACT "
done | if [[ -z $NOOP ]]; then
cat >> "$TMP_YEARS_MD"
else
diff --git a/sitemap.xml b/sitemap.xml
index b7cc08289..850a6fb9e 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -15282,7 +15282,7 @@
https://www.ioccc.org/bin/gen-years.sh
- 2025-06-07T02:36:45+00:00
+ 2025-07-10T08:42:52+00:00
https://www.ioccc.org/bin/html.sed
@@ -15602,7 +15602,7 @@
https://www.ioccc.org/status.html
- 2025-07-08T23:40:18+00:00
+ 2025-07-10T08:46:27+00:00
https://www.ioccc.org/status.json
@@ -15630,6 +15630,6 @@
https://www.ioccc.org/years.html
- 2025-06-07T02:38:29+00:00
+ 2025-07-10T08:45:52+00:00
diff --git a/years.html b/years.html
index 8bdc89399..6e7f39ee5 100644
--- a/years.html
+++ b/years.html
@@ -480,49 +480,49 @@
-
2020/tsoj - Most misleading indentation
+
2020/tsoj - Most misleading indentation -
Asteroids
-
2020/yang - Best abuse of CPP
+
2020/yang - Best abuse of CPP -
PIN-protected program generator
Jump to: top
@@ -533,46 +533,46 @@
-
2019/dogon - Best use of space and time
+
2019/dogon - Best use of space and time -
X11 Golly game of Life
-
2019/duble - Best collaborative graphics
+
2019/duble - Best collaborative graphics -
Collaborative graphics editor
-
2019/giles - Most in need of wide space
+
2019/giles - Most in need of wide space -
WAV reverberator
-
2019/karns - Most in need of whitespace
+
2019/karns - Most in need of whitespace -
Breadth-first search on text
-
2019/lynn - Most functional compiler
+
2019/lynn - Most functional compiler -
Haskell compiler
-
2019/mills - Most in need to be tweeted
+
2019/mills - Most in need to be tweeted -
Machine Learning on text
-
2019/yang - Most in need of transparency
+
2019/yang - Most in need of transparency -
Text scrambler
Jump to: top
@@ -583,49 +583,49 @@
-
2018/algmyr - Most cacophonic
+
2018/algmyr - Most cacophonic -
Converts text to sound using font as spectrogram
-
2018/ciura - Most likely to be awarded
+
2018/ciura - Most likely to be awarded -
Strunk and White checker
-
2018/hou - Most likely to top the charts
+
2018/hou - Most likely to top the charts -
Converter of JSON to SVG pie chart
-
2018/vokes - Most connected
+
2018/vokes - Most connected -
Computing strongly connected graph components
Jump to: top
@@ -636,46 +636,46 @@
-
2015/endoh1 - Most diffused reaction
+
2015/endoh1 - Most diffused reaction -
reaction-diffusion system HTTP server
-
2015/hou - Most well rounded hash
+
2015/hou - Most well rounded hash -
MD5 without integers
-
2015/muth - Most complete use of CPP
+
2015/muth - Most complete use of CPP -
preprocessor Turing engine
-
2015/yang - Most pointed reaction
+
2015/yang - Most pointed reaction -
text encoder with sea star pattern that varies with C flavor
Jump to: top
@@ -686,37 +686,37 @@
-
2014/deak - Most underscored argument
+
2014/deak - Most underscored argument -
CPP and C99 abuse
-
2014/sinon - Best choice of optimization
+
2014/sinon - Best choice of optimization -
optimizer-controlled shooter game
-
2014/vik - Best handling of beeps
+
2014/vik - Best handling of beeps -
Morse audio transcoder
Jump to: top
@@ -727,49 +727,49 @@
-
2013/cable1 - Most partisan one liner
+
2013/cable1 - Most partisan one liner -
1-liner party of a US President
-
2013/endoh3 - Most tweetable one liner
+
2013/endoh3 - Most tweetable one liner -
play music with ABC notation
-
2013/hou - Best use of one infinite loop
+
2013/hou - Best use of one infinite loop -
ray tracer
-
2013/mills - Most timely rendered
+
2013/mills - Most timely rendered -
HTTP server ray tracing a timestamp
-
2013/morgan1 - Smallest large system simulator
+
2013/morgan1 - Smallest large system simulator -
X11 based Solar system simulator
Jump to: top
@@ -780,46 +780,46 @@
-
2012/dlowe - Best way to lose a life
+
2012/dlowe - Best way to lose a life -
Conway’s game of death
-
2012/endoh1 - Most complex ASCII fluid - Honorable mention
+
2012/endoh1 - Most complex ASCII fluid - Honorable mention -
ASCII fluid dynamics
-
2012/hamano - Silver Award - Most elementary use of C
+
2012/hamano - Silver Award - Most elementary use of C -
PDF with little dancing men
-
2012/hou - Most useful obfuscation
+
2012/hou - Most useful obfuscation -
Syntax highlighter
-
2012/kang - Best short program
+
2012/kang - Best short program -
Decodes spelled out numbers
-
2012/vik - Bronze Award - Best use of cocoa
+
2012/vik - Bronze Award - Best use of cocoa -
Steganography
-
2012/zeitak - Gold Award - Balanced use of obfuscation
+
2012/zeitak - Gold Award - Balanced use of obfuscation -
Brace matcher
Jump to: top
@@ -830,46 +830,46 @@
-
2011/akari - Best of Show - Most Shrinkable
+
2011/akari - Best of Show - Most Shrinkable -
Downsampler with 3 embeded programs
-
2011/hou - Best self documenting program
+
2011/hou - Best self documenting program -
Scientific calculator
Jump to: top
@@ -880,46 +880,46 @@
-
2006/monge - Best compiled graphics
+
2006/monge - Best compiled graphics -
Graphical fractal generator
Jump to: top
@@ -930,49 +930,49 @@
-
2005/aidan - Most ingenious puzzle solution
+
2005/aidan - Most ingenious puzzle solution -
Sudoku solver
-
2005/anon - Best 3D puzzle
+
2005/anon - Best 3D puzzle -
Multi-dimensional sliding tile puzzle generator
-
2005/timwi - Most discourteous interpreter
+
2005/timwi - Most discourteous interpreter -
A BF lanaguage interpreter
-
2005/vik - Most circuitous walk
+
2005/vik - Most circuitous walk -
Wolfenstein style graphics engine
Jump to: top
@@ -983,49 +983,49 @@
-
2004/arachnid - Best use of vision
+
2004/arachnid - Best use of vision -
Curses maze navigator with only line-of-sight visibility
-
2004/hoyle - Most functional output
+
2004/hoyle - Most functional output -
Curses based polynomial graphing with auto-scale
-
2004/jdalbec - Best abuse of the periodic table
+
2004/jdalbec - Best abuse of the periodic table -
Conway’s look’n’say sequence split into elements
-
2004/sds - Best abuse of indentation
+
2004/sds - Best abuse of indentation -
Space/tab/linefeed steganography
-
2004/vik2 - Best abuse of CPP
+
2004/vik2 - Best abuse of CPP -
Calculates prime numbers using only CPP
Jump to: top
@@ -1036,49 +1036,49 @@
-
2001/cheong - Best short program
+
2001/cheong - Best short program -
Computes arbitrary-precision square root
-
2001/kev - Best curses game
+
2001/kev - Best curses game -
A Pong game across network
-
2001/rosten - Best abuse of the user
+
2001/rosten - Best abuse of the user -
Makes X mouse pointer have inertia or anti-inertia
-
2001/westley - Best position-independent code
+
2001/westley - Best position-independent code -
Sorts/scrambles that outputs as text/punch-cards
Jump to: top
@@ -1089,46 +1089,46 @@
-
2000/bellard - Most specific output
+
2000/bellard - Most specific output -
Prints M6972593 (2^6972593-1) by Modular Fast Fourier Transform
-
2000/dhyang - Best layout
+
2000/dhyang - Best layout -
Saitou Hajime image that prints a prog that prints a prog …
-
2000/dlowe - Worst abuse of the rules
+
2000/dlowe - Worst abuse of the rules -
A dc-style calculator that uses embedded Perl
-
2000/rince - Astronomically obfuscated
+
2000/rince - Astronomically obfuscated -
Plots the positions of the four Galilean moons of Jupiter
-
2000/tomx - Most complete program
+
2000/tomx - Most complete program -
C source and shell program and Makefile
Jump to: top
@@ -1139,46 +1139,46 @@
-
1998/bas1 - Best encapsulation
+
1998/bas1 - Best encapsulation -
Outputs a gzipped 3D beam maze in Postscript
-
1998/bas2 - Best small program
+
1998/bas2 - Best small program -
determines the size of stdin under IOCCC sizing rules
-
1998/chaos - Best object orientation
+
1998/chaos - Best object orientation -
Rotates and zooms an object using ASCII graphics
-
1998/df - Best data hiding
+
1998/df - Best data hiding -
A word guessing game
-
1998/dlowe - Best utility
+
1998/dlowe - Best utility -
Pootifies stdin (useful to view Microsoft html files)
-
1998/fanf - Most obfuscated translator
+
1998/fanf - Most obfuscated translator -
Translates Lambda expressions into combinator expressions
-
1998/schnitzi - Best flow control
+
1998/schnitzi - Best flow control -
Prints a C program that sorts arguments using strange functions
-
1998/schweikh2 - Most erratic behavior
+
1998/schweikh2 - Most erratic behavior -
Prints random 0’s and 1’s causes some gcc’s as passes to choke
Jump to: top
@@ -1189,37 +1189,37 @@
-
1996/dalbec - Best numerical obfuscation
+
1996/dalbec - Best numerical obfuscation -
Generator of strong probable-primes to a given base
-
1996/huffman - Best obfuscated character set utility
+
1996/huffman - Best obfuscated character set utility -
Braille to ASCII and vice versa
-
1996/rcm - Best RFC obfuscation
+
1996/rcm - Best RFC obfuscation -
Gunzip equivalent
-
1996/schweikh1 - Worst abuse of the C preprocessor
+
1996/schweikh1 - Worst abuse of the C preprocessor -
Calculates Easter dates from 1582 to 2199 AD
-
1996/westley - Best one liner
+
1996/westley - Best one liner -
Shows the time on clock with a configurable face and style
Jump to: top
@@ -1230,40 +1230,40 @@
-
1995/cdua - Best output
+
1995/cdua - Best output -
Generate a maze on the scren and then solve it
-
1995/esde - Interesting algorithm
+
1995/esde - Interesting algorithm -
Searches for words in a file which have the same Soundex code
-
1995/garry - Best utility
+
1995/garry - Best utility -
Environment-expansion and binary output via escaped env vars
-
1995/leo - Best use of obfuscation
+
1995/leo - Best use of obfuscation -
Output interesting patterns and cycles in PostScript
-
1995/makarios - Best short program
+
1995/makarios - Best short program -
Emits the base 8 representation of prime palindromic in base 8
-
1995/vanschnitz - Worst abuse of the C preprocessor and most likely to amaze
+
1995/vanschnitz - Worst abuse of the C preprocessor and most likely to amaze -
Towers of Hanoi via the C pre-processor
Jump to: top
@@ -1274,37 +1274,37 @@
-
1994/imc - Most obfuscated algorithm
+
1994/imc - Most obfuscated algorithm -
print a random n by n magic square
-
1994/ldb - Best one liner
+
1994/ldb - Best one liner -
print a random line from stdin
-
1994/shapiro - Most well rounded obfuscation
+
1994/shapiro - Most well rounded obfuscation -
print time of day on a tty
-
1994/smr - Worst abuse of the rules
+
1994/smr - Worst abuse of the rules -
world’s smallest self reproducing program
-
1994/tvr - Best X11 program
+
1994/tvr - Best X11 program -
interactive fractals for the X Window System
-
1994/westley - Worst abuse of the C preprocessor
+
1994/westley - Worst abuse of the C preprocessor -
Adventure/Dungeon like game played via the C pre-processor
Jump to: top
@@ -1315,37 +1315,37 @@
-
1993/ant - Best utility
+
1993/ant - Best utility -
egrep utility with Posix-like documentation
-
1993/cmills - Bill Gates Award
+
1993/cmills - Bill Gates Award -
X11 program that shatters and bounces windows
-
1993/dgibson - Best abuse of the C preprocessor
+
1993/dgibson - Best abuse of the C preprocessor -
plays the game of life using cpp
-
1993/ejb - Best obfuscated algorithm
+
1993/ejb - Best obfuscated algorithm -
tower of Hanoi and patience pizzle
-
1993/leo - Best game
+
1993/leo - Best game -
game of mastermind (cows and bulls)
-
1993/lmfjyh - Most versatile source
+
1993/lmfjyh - Most versatile source -
source is the filename that prints value of FILE
-
1993/rince - Most well rounded
+
1993/rince - Most well rounded -
game state machine language that comes with a number of games
-
1993/schnitzi - Obfuscated Intelligence Award
+
1993/schnitzi - Obfuscated Intelligence Award -
answers questions about English text in a file
-
1993/vanb - Most irregular expression
+
1993/vanb - Most irregular expression -
calculator that prints in octal
Jump to: top
@@ -1356,43 +1356,43 @@
-
1992/adrian - Most educational
+
1992/adrian - Most educational -
grep-like utility using a state machine transition language
-
1992/albert - Most useful program
+
1992/albert - Most useful program -
factors multi-precision numbers with factors < MAX_LONG
-
1992/buzzard.1 - Most obfuscated algorithm
+
1992/buzzard.1 - Most obfuscated algorithm -
print factorial or gcd or prime test w/Babbage-like engine
-
1992/lush - Worst abuse of the C preprocessor
+
1992/lush - Worst abuse of the C preprocessor -
prints Hello World using error messages
-
1992/nathan - Worst abuse of the rules
+
1992/nathan - Worst abuse of the rules -
obfuscation by (trivial) encryption (source not exported)
-
1992/westley - Best small program
+
1992/westley - Best small program -
print ASCII world map and mark a location by lat/long
Jump to: top
@@ -1403,31 +1403,31 @@
-
1991/dds - Most well rounded
+
1991/dds - Most well rounded -
basic compiler that is heavily compressed
-
1991/rince - Best game
+
1991/rince - Best game -
game with sprites and boulders and dimonds and keys
-
1991/westley - Grand Prize
+
1991/westley - Grand Prize -
plays tic-tac-toe where output for next move that prints board
Jump to: top
@@ -1438,37 +1438,37 @@
-
1990/dds - Best language tool
+
1990/dds - Best language tool -
basic interpreter that is heavily compressed
-
1990/dg - Best abuse of the C preprocessor
+
1990/dg - Best abuse of the C preprocessor -
rot13 done with strange cpp macros
-
1990/jaw - Best entropy-reducer
+
1990/jaw - Best entropy-reducer -
compress and atob standins
-
1990/pjr - Most unusual data structure
+
1990/pjr - Most unusual data structure -
the quick brown fox using CPP defines and structs of functions
-
1990/scjones - ANSI Committee’s worst abuse of C
+
1990/scjones - ANSI Committee’s worst abuse of C -
trigraph-abusing self-reproducing program
-
1990/stig - Strangest abuse of the rules
+
1990/stig - Strangest abuse of the rules -
nested-comment tester (all on command line)
-
1990/tbr - Best utility
+
1990/tbr - Best utility -
simple compressed shell with silly layout
Jump to: top
@@ -1479,34 +1479,34 @@
-
1989/fubar - Best self-modifying program
+
1989/fubar - Best self-modifying program -
self-reconstructing recompiling factorial program
-
1989/jar.1 - Strangest abuse of the rules
+
1989/jar.1 - Strangest abuse of the rules -
Hello world as a C string
-
1989/ovdluhe - Most humorous output
+
1989/ovdluhe - Most humorous output -
monkey-typer following template with APE identifiers
-
1989/paul - Most complex algorithm
+
1989/paul - Most complex algorithm -
print fibonacci base 2 by simulating turing machine
-
1989/robison - Best minimal use of C
+
1989/robison - Best minimal use of C -
apl-expression interpreter (binary) written in C–
-
1989/roemer - Best layout
+
1989/roemer - Best layout -
prints e with pi shaped layout with _31415 identifiers
-
1989/vanb - Best one liner
+
1989/vanb - Best one liner -
one-liner prints all subsets of arguments
-
1989/westley - Most algorithms in one program
+
1989/westley - Most algorithms in one program -
reversible and rot13able program that reverses and/or rot13s
Jump to: top
@@ -1517,31 +1517,31 @@
-
1988/applin - Best of Show
+
1988/applin - Best of Show -
massive #define that includes itself and prints primes
-
1988/dale - Best abuse of system calls
+
1988/dale - Best abuse of system calls -
prints command line using lots of system calls
-
1988/isaak - Best visuals
+
1988/isaak - Best visuals -
table driven table of the elements cpp with self-inclusion
-
1988/phillipps - Least likely to compile successfully
+
1988/phillipps - Least likely to compile successfully -
12 Days of Christmas recursive main() calls w/tables
-
1988/reddy - Most useful obfuscated C program
+
1988/reddy - Most useful obfuscated C program -
prints name of ‘char ((foo[16])()’ compressed
-
1988/robison - Best abuse of C constructs
+
1988/robison - Best abuse of C constructs -
print e in any base using only – >= and while()
Jump to: top
@@ -1552,25 +1552,25 @@
-
1987/biggar - Best abuse of the rules
+
1987/biggar - Best abuse of the rules -
program defined on the command line
-
1987/hines - Worst style
+
1987/hines - Worst style -
counts goto’s with all ids goto anagrams with all goto flow
-
1987/korn - Best one liner
+
1987/korn - Best one liner -
one-liner that prints a message on a Un*x system
-
1987/wall - Most useful obfuscation
+
1987/wall - Most useful obfuscation -
roman numeral -> decimal and vice versa conversion
Jump to: top
@@ -1581,31 +1581,31 @@
-
1986/applin - Most adaptable program
+
1986/applin - Most adaptable program -
hello world works under cc and /bin/sh and f77
-
1986/august - Best complex task done in a complex way
+
1986/august - Best complex task done in a complex way -
struct-heavy e-computation with memory allocation with sbrk
-
1986/bright - Most useful obfuscation
+
1986/bright - Most useful obfuscation -
hex dump with cpp compressed that uses lots of << for constants
-
1986/hague - Worst abuse of the C preprocessor
+
1986/hague - Worst abuse of the C preprocessor -
morse code filter written with ’DIT DAH _DIT DIT_DAH’
-
1986/holloway - Best simple task performed in a complex way
+
1986/holloway - Best simple task performed in a complex way -
prints hello world! via a recursive main
-
1986/pawka - Most illegible code
+
1986/pawka - Most illegible code -
prints ‘obfuscated?’ big using xyyyx idents
-
1986/wall - Grand Prize - Most well rounded in confusion
+
1986/wall - Grand Prize - Most well rounded in confusion -
Dvorak keyboard emulator
Jump to: top
@@ -1616,19 +1616,19 @@
-
1985/august - Most obscure program
+
1985/august - Most obscure program -
cpp obfuscated and compressed recursive primes in binary
-
1985/lycklama - Strangest appearing program
+
1985/lycklama - Strangest appearing program -
heavily cpped with o_oo identifiers that scrolls text right
-
1985/shapiro - Grand Prize - Most well rounded in confusion
+
1985/shapiro - Grand Prize - Most well rounded in confusion -
two #defines one 7-liner that results in a maze
-
1985/sicherman - Worst abuse of the C preprocessor
+
1985/sicherman - Worst abuse of the C preprocessor -
rot13 w/strange #defines that create comment headers etc.
Jump to: top
@@ -1639,16 +1639,16 @@
-
1984/decot - Second Place
+
1984/decot - Second Place -
prints garbage and weird cpp defines - keywords for others
Jump to: top