Merge pull request #251 from xexyl/1994-schnitzi
Fixes and updates in 1994/schnitzi
This commit is contained in:
2 files changed
+71
-45
No files matched your search
+44
-43
@@ -1,10 +1,10 @@
|
|||||||
# Best Layout:
|
# Best Layout:
|
||||||
|
|
||||||
Mark Schnitzius
|
Mark Schnitzius
|
||||||
ISX Corporation
|
ISX Corporation
|
||||||
1165 Northchase Pkwy, Suite 120
|
1165 Northchase Pkwy, Suite 120
|
||||||
Marietta, GA 30067
|
Marietta, GA 30067
|
||||||
USA
|
USA
|
||||||
|
|
||||||
## To build:
|
## To build:
|
||||||
|
|
||||||
@@ -21,8 +21,9 @@ results in compiler errors and not only that but the gets() is still there in
|
|||||||
the generated output. Even changing the buffer size can result in compilation
|
the generated output. Even changing the buffer size can result in compilation
|
||||||
errors if not done correctly. The generated output also does not have a changed
|
errors if not done correctly. The generated output also does not have a changed
|
||||||
buffer size. Changing it to use fgets() can happen later, maybe, but bigger
|
buffer size. Changing it to use fgets() can happen later, maybe, but bigger
|
||||||
files can now be parsed by the original code. An example is this Makefile. Thank
|
files can now be parsed by the original code. An example is this Makefile. Cody
|
||||||
you Cody!
|
gave some tips on how this entry works, in order to make the entry use fgets()
|
||||||
|
and compile successfully too, in the [bugs.md](/bugs.md) file. Thank you Cody!
|
||||||
|
|
||||||
|
|
||||||
## Try:
|
## Try:
|
||||||
@@ -45,50 +46,50 @@ find out why?
|
|||||||
|
|
||||||
## Author's comments:
|
## Author's comments:
|
||||||
|
|
||||||
SPOILER:
|
### SPOILER:
|
||||||
|
|
||||||
This is a program which takes any text file as input and 'flips'
|
This is a program which takes any text file as input and 'flips'
|
||||||
the input file along a diagonal running from the top left corner
|
the input file along a diagonal running from the top left corner
|
||||||
down to the bottom right. In other words, the first row in the
|
down to the bottom right. In other words, the first row in the
|
||||||
file ends up written down the first column of the result, the
|
file ends up written down the first column of the result, the
|
||||||
second row is written down the second column, etc. The program
|
second row is written down the second column, etc. The program
|
||||||
is run by redirecting a file into the executable on the command
|
is run by redirecting a file into the executable on the command
|
||||||
line; for instance, for the included 'info' file, the program
|
line; for instance, for the included 'info' file, the program
|
||||||
would be run as follows:
|
would be run as follows:
|
||||||
|
|
||||||
schnitzi < info
|
schnitzi < info
|
||||||
|
|
||||||
The program generates interesting results when its source file is
|
The program generates interesting results when its source file is
|
||||||
used as input:
|
used as input:
|
||||||
|
|
||||||
schnitzi < schnitzi.c
|
schnitzi < schnitzi.c
|
||||||
|
|
||||||
The result of this command is a program which does the exact same
|
The result of this command is a program which does the exact same
|
||||||
thing -- in other words, both the program and the "flipped"
|
thing -- in other words, both the program and the "flipped"
|
||||||
version of itself work identically (you'll need to redirect the
|
version of itself work identically (you'll need to redirect the
|
||||||
output of the above command into a separate file and compile it).
|
output of the above command into a separate file and compile it).
|
||||||
You might notice some differences in the flipped version, though.
|
You might notice some differences in the flipped version, though.
|
||||||
First off, a secret message becomes visible that was not visible
|
First off, a secret message becomes visible that was not visible
|
||||||
in the original program. Also, much of the code shows up in
|
in the original program. Also, much of the code shows up in
|
||||||
different places in the flipped program than it appeared in the
|
different places in the flipped program than it appeared in the
|
||||||
first program. My first version of this program was perfectly
|
first program. My first version of this program was perfectly
|
||||||
symmetrical along the diagonal, but later found out there were
|
symmetrical along the diagonal, but later found out there were
|
||||||
interesting ways to break the symmetry. The best way to see this
|
interesting ways to break the symmetry. The best way to see this
|
||||||
is to load both the original and flipped versions of the program
|
is to load both the original and flipped versions of the program
|
||||||
into an editor and switch back and forth between them rapidly.
|
into an editor and switch back and forth between them rapidly.
|
||||||
|
|
||||||
C tokens longer than a character (such as "main") proved difficult
|
C tokens longer than a character (such as "main") proved difficult
|
||||||
to use in both the original and flipped versions (after flipping,
|
to use in both the original and flipped versions (after flipping,
|
||||||
they show up as a string of single letters on successive lines).
|
they show up as a string of single letters on successive lines).
|
||||||
However, I found that it was possible to get around this through
|
However, I found that it was possible to get around this through
|
||||||
a few well-placed comments. An earlier version of this program
|
a few well-placed comments. An earlier version of this program
|
||||||
used nearly every single-character token in the "shared" area;
|
used nearly every single-character token in the "shared" area;
|
||||||
however, it proved to be too large for contest guidelines (although
|
however, it proved to be too large for contest guidelines (although
|
||||||
the code itself is only about 300 characters, the extra whitespace
|
the code itself is only about 300 characters, the extra whitespace
|
||||||
needed to pad it put it over the limit -- it nearly filled a 79 by
|
needed to pad it put it over the limit -- it nearly filled a 79 by
|
||||||
79 area, adding up to over 4000 total characters). I will provide
|
79 area, adding up to over 4000 total characters). I will provide
|
||||||
this other version to anyone interested -- contact me by email
|
this other version to anyone interested -- contact me by email
|
||||||
at schnitzi@east.isx.com.
|
at schnitzi@east.isx.com.
|
||||||
|
|
||||||
## Copyright and CC BY-SA 4.0 License:
|
## Copyright and CC BY-SA 4.0 License:
|
||||||
|
|
||||||
|
|||||||
@@ -481,11 +481,16 @@ generate compiler errors. Cody explains the magic below which might be used to
|
|||||||
change this entry to fgets() (and he'll be working on it in the coming days most
|
change this entry to fgets() (and he'll be working on it in the coming days most
|
||||||
likely).
|
likely).
|
||||||
|
|
||||||
### The magic of the entry
|
### The magic of [1994/schnitzi](1994/schnitzi/schnitzi.c) and how it flips text
|
||||||
|
|
||||||
|
Cody provided some tips in how the entry works so that it can hopefully be made
|
||||||
|
to use fgets() and also hopefully have the buffer size updated in the generated
|
||||||
|
code. He notes that this might be a real problem with formatting the code but
|
||||||
|
nevertheless he offers the below tips:
|
||||||
|
|
||||||
Take a look at the interesting comment as well as the `int r=0,x,y=0` at the top
|
Take a look at the interesting comment as well as the `int r=0,x,y=0` at the top
|
||||||
of the file. If you look at each column go down that column you can see how it
|
of the file. If you look at each column go down that column you can see how it
|
||||||
spells out the code. For instance the first column looks like:
|
spells out the code! For instance the first column looks like:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -525,6 +530,26 @@ provide the correct input in comments or possibly by rearranging some of the
|
|||||||
code (this was required to make the generated code compile at all when changing
|
code (this was required to make the generated code compile at all when changing
|
||||||
the buffer size).
|
the buffer size).
|
||||||
|
|
||||||
|
### Important points:
|
||||||
|
|
||||||
|
Getting this entry to use `fgets()` is easy but the problem is you're supposed
|
||||||
|
to be able to feed the source to the program and the output of that will be
|
||||||
|
compilable. It however will create compiler errors. So it's not just changing
|
||||||
|
the code to get it to use fgets()! I (Cody) already did this before I noticed
|
||||||
|
the other part which is why I rolled that part back. I did increase the buffer
|
||||||
|
size but that only works on the original source.
|
||||||
|
|
||||||
|
To say just how sensitive this entry is: even a space, lack of space or a
|
||||||
|
character, wrong character, lack of character or character in the wrong place
|
||||||
|
can cause a compilation error! Make sure that the output of:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./schnitzi < schnitzi.c
|
||||||
|
```
|
||||||
|
|
||||||
|
can be compiled and the output of that new program when fed itself can also be
|
||||||
|
compiled!
|
||||||
|
|
||||||
|
|
||||||
# 1995
|
# 1995
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user