Update and fixes to 2001/schweikh
Format fix README.md. Add INABIAF section to bugs.md and README.md.
This commit is contained in:
1 parent
b8da99f411
commit
a1acee4de4
2 files changed
+50
-31
No files matched your search
+39
-31
@@ -1,12 +1,8 @@
|
||||
# Best one-liner
|
||||
|
||||
Jens Schweikhardt
|
||||
Marconi Communications
|
||||
Schlartaeckerweg 3
|
||||
D-71384 Weinstadt
|
||||
Germany
|
||||
|
||||
http://www.schweikhardt.net/
|
||||
Jens Schweikhardt
|
||||
Germany
|
||||
<http://www.schweikhardt.net/>
|
||||
|
||||
## To build:
|
||||
|
||||
@@ -20,6 +16,16 @@ make
|
||||
./schweikh string string2
|
||||
```
|
||||
|
||||
### INABIAF - it's not a bug it's a feature! :-)
|
||||
|
||||
This program will very likely crash or do something else if you do not give it
|
||||
two args.
|
||||
|
||||
Note also that the glob pattern must match the whole string. See the author's
|
||||
comments for details and a workaround.
|
||||
|
||||
There's also no way to escape meta characters.
|
||||
|
||||
## Try:
|
||||
|
||||
```sh
|
||||
@@ -35,17 +41,16 @@ Do you get the pattern here?
|
||||
## Author's remarks:
|
||||
|
||||
This one-liner program is a glob pattern matcher. It understands
|
||||
the glob characters `*' meaning `zero or more characters' and
|
||||
`?' meaning exactly one character, just like your unix shell.
|
||||
the glob characters `*` meaning 'zero or more characters' and
|
||||
`?` meaning exactly one character, just like your unix shell.
|
||||
|
||||
Run it with two args, the string and the glob pattern. The exit
|
||||
status is 0 (shell true) when the pattern matches, 1 otherwise.
|
||||
The glob pattern must match the whole string, so you may want to
|
||||
use * at the beginning and end of the pattern if you are looking
|
||||
for something in the middle.
|
||||
Run it with two args, the string and the glob pattern. The exit status is 0
|
||||
(shell true) when the pattern matches, 1 otherwise. The glob pattern must match
|
||||
the whole string, so you may want to use `*` at the beginning and end of the
|
||||
pattern if you are looking for something in the middle.
|
||||
|
||||
You can use it for your shell scripting needs similar to a silent grep
|
||||
(and without stdout redirected to /dev/null):
|
||||
(and without stdout redirected to `/dev/null`):
|
||||
|
||||
```sh
|
||||
if prog "${VARIABLE}" '<glob>'; then
|
||||
@@ -55,32 +60,35 @@ else
|
||||
fi
|
||||
```
|
||||
|
||||
Bugs: there is no way to escape the meta characters. Dammit Jim, I'm a
|
||||
### Bugs
|
||||
|
||||
There is no way to escape the meta characters. Dammit Jim, I'm a
|
||||
one-liner, not a regexp lib.
|
||||
|
||||
All obfuscation is obviously in the recursive m() function, an 86
|
||||
All obfuscation is obviously in the recursive `m()` function, an 86
|
||||
character glob pattern evaluator, returning nonzero for a match:
|
||||
* just a single complex return expression.
|
||||
* nested ternary operator ?: to save on if/else verbosity.
|
||||
* short circuiting && and || to save even more on if/else verbosity.
|
||||
* Subtraction instead of an equality operator in "*t - 42".
|
||||
* ASCII codes for '*' and '?'.
|
||||
* careful use of blanks even though this year's rules have extended
|
||||
|
||||
* Just a single complex return expression.
|
||||
* Nested ternary operator `?:` to save on if/else verbosity.
|
||||
* Short circuiting `&&` and `||` to save even more on if/else verbosity.
|
||||
* Subtraction instead of an equality operator in `*t - 42`.
|
||||
* ASCII codes for `*` and `?`.
|
||||
* Careful use of blanks even though this year's rules have extended
|
||||
that resource limit.
|
||||
* the source is a complete preprocessed C program. Because it communicates
|
||||
* The source is a complete preprocessed C program. Because it communicates
|
||||
with the world out there by means of argv and the exit status, there
|
||||
is no need for stdio bloat. An asm guru could surely squeeze this
|
||||
program in less than a screenful.
|
||||
* indent(1) is probably not too helpful.
|
||||
* `indent(1)` is probably not too helpful.
|
||||
|
||||
The recursion wonderfully and magically takes care of iteration and
|
||||
backtracking. I could tell you how it works but then I would have to
|
||||
kill^Wrequest an NDA from you :-) Run it under a debugger with several
|
||||
inputs, it will be quite helpful and instructive. Handling of '?' is
|
||||
straightforward; for '*' start out with '*foo' and 'foo*' against 'foo'.
|
||||
How does it deal with sequences of adjacent `*'? How could this be
|
||||
improved? If all else fails, recode the ?: operators with if/else and
|
||||
try again. For extra credit implement character classes like [a-z].
|
||||
<strike>kill</strike> request a NDA from you :-) Run it under a debugger with several
|
||||
inputs, it will be quite helpful and instructive. Handling of `?` is
|
||||
straightforward; for `*` start out with `*foo` and `foo*` against `foo`.
|
||||
How does it deal with sequences of adjacent `*`? How could this be
|
||||
improved? If all else fails, recode the `?:` operators with if/else and
|
||||
try again. For extra credit implement character classes like `[a-z]`.
|
||||
|
||||
## Copyright and CC BY-SA 4.0 License:
|
||||
|
||||
|
||||
@@ -1297,6 +1297,17 @@ points.
|
||||
Although it is independent of endianness both systems need the same character
|
||||
set. In other words both have to be ASCII or EBCDIC - not one of each.
|
||||
|
||||
## [2001/schweikh](2001/schweikh/schweikh.c) ([README.md](2001/schweikh/README.md))
|
||||
## STATUS: INABIAF - please **DO NOT** fix
|
||||
|
||||
This program will very likely crash or do something else if you do not give it
|
||||
two args.
|
||||
|
||||
Note also that the glob pattern must match the whole string. See the author's
|
||||
comments for details and a workaround.
|
||||
|
||||
There's also no way to escape meta characters.
|
||||
|
||||
# 2002
|
||||
|
||||
There was no IOCCC in 2002.
|
||||
|
||||
Reference in new issue
Block a user