Address the fixed / unfixed 1996/westley situation
When I first fixed this it was because the scripts segfaulted and at
least one showed an environmental variable both of which caused some
usability issues. But I started to wonder if maybe the fixed code should
be the alt version. To do this I made a change to the scripts so one can
tell the script which version to use. I was having a problem in figuring
out how to explain it (owing to the fact I've been awake once again
since stupid o'clock and without good sleep) but before I answered that
I decided to test out the new feature to the script and the output made
me decide to at least for now (discussion can be had) keep the fix the
westley.c and the unfixed original code the alt code. This particularly
shows up in the third script where the output is hard to tell what is
part of the program and what is not. The unfixed version looks like:
$ WESTLEY=./westley.alt ./clock3
TERM=xterm-256color
./clock3: line 12: 15498 Segmentation fault: 11 ${WESTLEY} "123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijkl" "/\$%&'()*+,-./\$%&'()*+,-." " ||" "
..3..6..9..12 Hours
----.----10---.----20---.----30---.----40---.----50---.---- Minutes
"
which has a " by itself on the last line that should not be there. Then
there's the other problematic output. It should just look like:
..3..6..9..12 Hours
----.----10---.----20---.----30---.----40---.----50---.---- Minutes
This commit is contained in:
1 parent
fa87b511bf
commit
c9ce688238
4 files changed
+57
-41
No files matched your search
+51
-38
@@ -1,53 +1,55 @@
|
|||||||
# Best One Liner
|
# Best One Liner
|
||||||
|
|
||||||
Brian Westley (Merlyn LeRoy on Usenet)
|
Brian Westley (Merlyn LeRoy on Usenet)
|
||||||
1906 James Ave.
|
1906 James Ave.
|
||||||
St. Paul, MN 55105
|
St. Paul, MN 55105
|
||||||
USA
|
USA
|
||||||
|
<http://www.westley.org>
|
||||||
http://www.westley.org
|
|
||||||
|
|
||||||
## To build:
|
## To build:
|
||||||
|
|
||||||
make all
|
```sh
|
||||||
|
make all
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in
|
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in
|
||||||
this entry as well as it displaying environmental variables. Although the
|
this entry as well as it displaying environmental variables. Although the
|
||||||
scripts showed correct output these also segfaulted but with the fix they no
|
scripts showed correct output, it somewhat lessened the usability because they
|
||||||
longer do. Now if argc < 5 (argv[4] is referenced) it will not do anything and
|
segfaulted. With the fix they no longer do. If argc < 5 (argv[4] is referenced)
|
||||||
it will not segfault either (this was caused by the body of the for() loop which
|
it will not do anything and it will not segfault either - this was caused by the
|
||||||
is now empty (it doesn't appear to be needed at all). Note that this does make
|
body of the for() loop which is now empty (it doesn't appear to be needed at
|
||||||
some of the author's explanations / portability notes no longer valid but we
|
all). Note that you should check the [westley.alt.c](westley.alt.c) file when
|
||||||
have kept them there for the interested. Thank you Cody for your assistance!
|
reading the author's comments. To see how to use the original see below. Thank
|
||||||
|
you Cody for your assistance!
|
||||||
|
|
||||||
|
|
||||||
## To run:
|
## To run:
|
||||||
|
|
||||||
sh ./clock1
|
```sh
|
||||||
|
sh ./clock1
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Try:
|
## Try:
|
||||||
|
|
||||||
|
|
||||||
sh ./clock2
|
```sh
|
||||||
|
sh ./clock2
|
||||||
Also try:
|
```
|
||||||
|
|
||||||
|
|
||||||
sh ./clock2
|
|
||||||
|
|
||||||
|
|
||||||
And for a good time, try:
|
And for a good time, try:
|
||||||
|
|
||||||
|
```sh
|
||||||
sh ./clock3
|
sh ./clock3
|
||||||
|
```
|
||||||
|
|
||||||
### Alternate code:
|
### Alternate code:
|
||||||
|
|
||||||
An alternate version of this entry, `westley.alt.c`, is provided.
|
An alternate version of this entry, [westley.alt.c](westley.alt.c), is provided.
|
||||||
The original is in [westley.alt.c](westley.alt.c) does not contain
|
This version is the original code [westley.alt.c](westley.alt.c) and does not
|
||||||
the above mentioned fixes.
|
contain the above mentioned fixes.
|
||||||
|
|
||||||
To compile this alternate version:
|
To compile this alternate version:
|
||||||
|
|
||||||
@@ -55,6 +57,15 @@ To compile this alternate version:
|
|||||||
make alt
|
make alt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To use it with the scripts try:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
WESTLEY=./westley.alt ./clock1
|
||||||
|
WESTLEY=./westley.alt ./clock2
|
||||||
|
WESTLEY=./westley.alt ./clock3
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Judges' remarks:
|
## Judges' remarks:
|
||||||
|
|
||||||
Time and time again, Brian Westley seems to come up with a winner!
|
Time and time again, Brian Westley seems to come up with a winner!
|
||||||
@@ -74,37 +85,39 @@ clock that runs backwards, and a linear-style clock.
|
|||||||
|
|
||||||
The program makes the following (possibly non-portable) assumptions:
|
The program makes the following (possibly non-portable) assumptions:
|
||||||
|
|
||||||
1. Command line strings can be written to
|
1. Command line strings can be written to.
|
||||||
|
|
||||||
2. `argv[0]` can be written to as if it were a `long *`
|
2. `argv[0]` can be written to as if it were a `long *`.
|
||||||
|
|
||||||
3. The first three elements of the struct * returned by localtime() are seconds,
|
3. The first three elements of the struct * returned by localtime() are seconds,
|
||||||
minutes, hours, and all are ints
|
minutes, hours, and all are ints.
|
||||||
|
|
||||||
4. My sample scripts assume ASCII, though this is not inherent in the code, just
|
4. My sample scripts assume ASCII, though this is not inherent in the code, just
|
||||||
my sample scripts
|
my sample scripts.
|
||||||
|
|
||||||
These assumptions are pretty reasonable. 2) can be eliminated
|
These assumptions are pretty reasonable. 2) can be eliminated but makes the code
|
||||||
by makes the code larger.
|
larger.
|
||||||
|
|
||||||
The code is simple; the arguments passed are:
|
The code is simple; the arguments passed are:
|
||||||
|
|
||||||
prog minute_map hour_map hand_symbol clock_image
|
```sh
|
||||||
|
./westley minute_map hour_map hand_symbol clock_image
|
||||||
|
```
|
||||||
|
|
||||||
The program merely takes the minute (0-59) and the hour (0-23)
|
The program merely takes the minute (0-59) and the hour (0-23)
|
||||||
values, looks up the offsets in `minute_map` and `hour_map`
|
values, looks up the offsets in `minute_map` and `hour_map`
|
||||||
and writes the `hand_symbol` for each into the `clock_image`
|
and writes the `hand_symbol` for each into the `clock_image`
|
||||||
string. This string is then printed.
|
string. This string is then printed.
|
||||||
|
|
||||||
The for() loop starts by calling time() with argv[0], so
|
The for() loop starts by calling `time()` with `argv[0]`, so
|
||||||
the time value (a long) is written into the program name.
|
the time value (a long) is written into the program name.
|
||||||
The for() control value is argc, which starts at 5, but
|
The for() control value is `argc`, which starts at `5`, but
|
||||||
the /=2 statement is executed before the test, so the for()
|
the `/=2` statement is executed before the test, so the for()
|
||||||
loop is executed twice, with h=2, then h=1 (for hour & minute).
|
loop is executed twice, with `h=2`, then `h=1` (for hour & minute).
|
||||||
|
|
||||||
The statement of the for() loop takes the hour or minute
|
The statement of the for() loop takes the hour or minute
|
||||||
field of the struct returned by localtime() by casting it
|
field of the struct returned by `localtime()` by casting it
|
||||||
to an int* and dereferencing element [h]. It is slightly
|
to an `int *` and dereferencing element `[h]`. It is slightly
|
||||||
smaller to use the trick `h[(int*)localtime(*m)]` instead of
|
smaller to use the trick `h[(int*)localtime(*m)]` instead of
|
||||||
`((int*)localtime(*m))[h]`.
|
`((int*)localtime(*m))[h]`.
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
./westley \
|
${WESTLEY:=./westley}
|
||||||
|
${WESTLEY} \
|
||||||
"%%%&&&'''666EEESSSaaannn{{{zzzyyyxxxwwwhhhYYYKKK===000###\$\$\$" \
|
"%%%&&&'''666EEESSSaaannn{{{zzzyyyxxxwwwhhhYYYKKK===000###\$\$\$" \
|
||||||
"34CQ_lkj[M?234CQ_lkj[M?2" \
|
"34CQ_lkj[M?234CQ_lkj[M?2" \
|
||||||
" .*" \
|
" .*" \
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
./westley \
|
${WESTLEY:=./westley}
|
||||||
|
${WESTLEY} \
|
||||||
"%%%\$\$\$###000===KKKYYYhhhwwwxxxyyyzzz{{{nnnaaaSSSEEE666'''&&&" \
|
"%%%\$\$\$###000===KKKYYYhhhwwwxxxyyyzzz{{{nnnaaaSSSEEE666'''&&&" \
|
||||||
"32?M[jkl_QC432?M[jkl_QC4" \
|
"32?M[jkl_QC432?M[jkl_QC4" \
|
||||||
" xX" \
|
" xX" \
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
./westley \
|
${WESTLEY:=./westley}
|
||||||
|
${WESTLEY} \
|
||||||
"123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijkl" \
|
"123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijkl" \
|
||||||
"/\$%&'()*+,-./\$%&'()*+,-." \
|
"/\$%&'()*+,-./\$%&'()*+,-." \
|
||||||
" ||" \
|
" ||" \
|
||||||
|
|||||||
Reference in new issue
Block a user