Fixes 2015/howe scripts, format/typo checks etc.

The try.sh script runs the commands that were in the try section. Having
this I discovered some errors in the avgtime.sh script which were fixed,
partly by having the cc.1 man page added (as not all systems have cc.1
in /usr/share/man/man1), in this case being gcc.1.gz (unzipped) from
Rocky Linux, and maybe other things besides. That script, avgtime.sh,
has also been updated to make sure at least two args are used and for
ShellCheck though some of the things ShellCheck wants to be done will
break the script so those warnings are disabled.

The README.md file has been format and typo fixed.

The war-and-peace.txt file has been added rather than forcing the script
(each time, in fact) to try and download it from Project Gutenberg.
This commit is contained in:
Cody Boone Ferguson committed 2023-12-06 12:43:03 -08:00
1 parent 3adfc9a06a
commit ff8d406544
6 files changed
+97186 -50

No files matched your search

+39 -45
View File
@@ -4,6 +4,9 @@
make
```
There is an alternate version provided. See [Alternate code](#alternate-code)
below.
## To use:
@@ -17,49 +20,34 @@ make
### Try:
```sh
./prog prog.alt.c prog.c
make test
./prog -d ABXYEFCD.tmp ACDBECFD.tmp
./prog ABXYEFCD.tmp ACDBECFD.tmp
rm -f curds.tmp whey.tmp
cp /usr/share/man/man1/cc.1 curds.tmp
cp /usr/share/man/man1/cc.1 whey.tmp
chmod 666 whey.tmp
make makeholes
./makeholes -n 1000 whey.tmp
./prog curds.tmp whey.tmp
./avgtime.sh 100 ./prog curds.tmp whey.tmp
# Assuming curl(1) installed, grab a really HUGE text file.
curl -L -o war-and-peace.txt http://www.gutenberg.org/ebooks/2600.txt.utf-8
cp war-and-peace.txt nuked.tmp
./makeholes -c'~' -n 1000 nuked.tmp
./prog war-and-peace.txt nuked.tmp
./avgtime.sh 100 ./prog war-and-peace.txt nuked.tmp
./try.sh
```
## Alternate code:
An alternate version of this entry, `prog.alt.c`, is provided.
This alternate code does not use a 64 bit FNV hash.
This alternate version does not use a 64-bit FNV hash. This was the original
entry but was changed to be the alt version.
### Alternate build:
To compile this alternate version:
```sh
make alt
```
### Alternate use:
Use `prog.alt` as you would `prog` above.
## Judges' remarks:
This is the best use of the FNV that we have seen in the IOCCC so far!
The output, when used without -d, is compatible with POSIX diff and
is suitable for use with patch.
The output, when used without `-d`, is compatible with POSIX `diff(1)` and
is suitable for use with `patch(1)`.
We welcome back Canada to the list of nations from where winning
entries have been submitted.
@@ -70,58 +58,64 @@ during a South Park P.T.A. Meeting?
"We must stop dirty (C) language from getting to our children's ears!"
[Blame Canada](https://www.youtube.com/watch?v=bOR38552MJA):
[Blame Canada](https://www.youtube.com/watch?v=bOR38552MJA)
Or should we teach our youth to understand the intricacies of this code?
Ying Tong Iddle I Po! We suggest you read the source for yourself, which
might be easier than the academic papers it was inspired by.
NOTE: Unlike the original entry source, prog.alt.c, prog.c uses a
NOTE: Unlike the original entry source, [prog.alt.c](prog.alt.c),
[prog.c](prog.c) uses a
64 bit FNV hash and fixes a function call warning.
## Author's remarks:
### Features
* "An O(NP) Sequence Comparison Algorithm" by Wu, Manber, Myers, Miller.
* Output compatible with patch(1).
* Output compatible with `patch(1)`.
* Strokes one of the judge's ego (I couldn't email chocolate or curry).
### Description
This is a functioning micro diff tool using an [O(NP) algorithm][Wu+89],
This is a functioning micro `diff(1)` tool using an [O(NP) algorithm][Wu+89],
compared to the older [O(ND) difference algorithm][Mye86] used by some versions
of diff. Its output is based on the default diff(1) output described by POSIX
and [The Open Group Base Specifications][SUSV7]. The output is suitable for use
with patch(1).
of `diff(1)`. Its output is based on the default `diff(1)` output described by POSIX
and [the Open Group Base Specifications][SUSV7]. The output is suitable for use
with `patch(1)`.
The `-d` option simply writes the edit distance between `file1` and `file2`.
The -d option simply writes the edit distance between file1 and file2.
### Observations
The FNV1a hash is a little slow compared to the trivial hash GNU Diff uses. I
downloaded a plain text copy of "War And Peace" from Project Gutenberg, used
``makeholes.c`` to make 1000 random changes, then profiled and timed the program
verses GNU Diff. The bottleneck appears to be in the file I/O and line hashing
with an average +0.05s slower. Using a huge file like "War And Peace" for
testing offsets the diff(1) optimised file I/O.
The FNV1a hash is a little slow compared to the trivial hash [GNU
diff](https://www.gnu.org/software/diffutils/) uses. I downloaded a plain text
copy of "War And Peace" from [Project Gutenberg](https://www.gutenberg.org),
used [makeholes.c](makeholes.c) to make 1000 random changes, then profiled and
timed the program verses GNU `diff(1)`. The bottleneck appears to be in the
file I/O and line hashing with an average +0.05s slower. Using a huge file like
"War And Peace" for testing offsets the `diff(1)` optimised file I/O.
There is no hash collision checking, partly because FNV1a appears to generate
very [few collisions][HshCmp] and an assumption that localised collisions within
a region of edits are highly unlikely.
### Support Files
* ``prog-test.sh``\
Basic test program verifies known test edit distances and patch support.
* [prog-test.sh](prog-test.sh)
Basic test program verifies known test edit distances and `patch(1)` support.
* ``avgtime.sh``
* [avgtime.sh](avgtime.sh)
* ``makeholes.c``\
Random edits (holes) made to a file in-place.
* [makeholes.c](makeholes.c)
Random edits (holes) made to a file in-place.
### References
+24 -5
View File
@@ -1,6 +1,13 @@
#!/usr/bin/env bash
if [[ "$#" -lt 2 ]]; then
echo "usage: $0 <count> <command>" 1>&2
exit 1
fi
COUNT=$1; shift
# ^--^ SC2124 (warning): Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.
# shellcheck disable=SC2124
CMD="$@"
N=0
@@ -8,15 +15,27 @@ SYS=0
USER=0
REAL=0
while [ $N -lt $COUNT ]; do
while [[ $N -lt $COUNT ]]; do
# ^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
# 'fixing' this will break the script so we disable it:
# shellcheck disable=SC2086
TIME=$( { /usr/bin/time -l $CMD >/dev/null; } 2>&1 | head -n 1 )
# ^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
# 'fixing' this will break the script so we disable it:
# shellcheck disable=SC2086
REAL="$REAL + $(echo $TIME | cut -d' ' -f1)"
# ^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
# 'fixing' this will break the script so we disable it:
# shellcheck disable=SC2086
USER="$USER + $(echo $TIME | cut -d' ' -f3)"
# ^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
# 'fixing' this will break the script so we disable it:
# shellcheck disable=SC2086
SYS="$SYS + $(echo $TIME | cut -d' ' -f5)"
(( N = $N + 1 ))
((N++))
done
printf 'avg-real\t%.3f\n' $(echo "scale=3; ( $REAL ) / $COUNT" | bc)
printf 'avg-user\t%.3f\n' $(echo "scale=3; ( $USER ) / $COUNT" | bc)
printf 'avg-sys\t%.3f\n' $(echo "scale=3; ( $SYS ) / $COUNT" | bc)
printf 'avg-real\t%.3f\n' "$(echo "scale=3; ( $REAL ) / $COUNT" | bc)"
printf 'avg-user\t%.3f\n' "$(echo "scale=3; ( $USER ) / $COUNT" | bc)"
printf 'avg-sys\t%.3f\n' "$(echo "scale=3; ( $SYS ) / $COUNT" | bc)"
+31041
View File
File diff suppressed because it is too large. Load diff
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
#
# try.sh - demonstrate IOCCC winner 2015/howe
#
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
# this way allows us to have the user specify a different compiler in an easy
# way.
if [[ -z "$CC" ]]; then
CC="cc"
fi
make CC="$CC" all >/dev/null || exit 1
# clear screen after compilation so that only the entry is shown
clear
./prog prog.alt.c prog.c
make test
./prog -d ABXYEFCD.tmp ACDBECFD.tmp
./prog ABXYEFCD.tmp ACDBECFD.tmp
rm -f curds.tmp whey.tmp
cp -f cc.1 curds.tmp
cp -f cc.1 whey.tmp
chmod 666 whey.tmp
make makeholes
./makeholes -n 1000 whey.tmp
./prog curds.tmp whey.tmp
./avgtime.sh 100 ./prog curds.tmp whey.tmp
cp -f war-and-peace.txt nuked.tmp
./makeholes -c'~' -n 1000 nuked.tmp
./prog war-and-peace.txt nuked.tmp
./avgtime.sh 100 ./prog war-and-peace.txt nuked.tmp
File diff suppressed because it is too large. Load diff
+9
View File
@@ -3803,6 +3803,15 @@ simply typing `make back_to` or `make mullender`.
(Linux doesn't seem to but macOS does).
## [2015/howe](2015/howe/prog.c) ([README.md](2015/howe/README.md))
[Cody](#cody) added the [try.sh](2015/howe/try.sh) script, downloaded the War
and Peace text file, fixed the [avgtime.sh](2015/howe/avgtime.sh) script (it
resulted in standard input errors in piping to `bc(1)`) and added the
[cc.1](2015/howe/cc.1) man page as not all systems have it (in fact it's
`gcc(1)` from Rocky Linux).
## [2015/mills1](2015/mills1/prog.c) ([README.md](2015/mills1/README.md))
[Cody](#cody) added the [try.sh](2015/mills1/try.sh) script which changes the