diff --git a/2019/poikola/.gitignore b/2019/poikola/.gitignore index 47fe1a305..f999c5335 100644 --- a/2019/poikola/.gitignore +++ b/2019/poikola/.gitignore @@ -9,4 +9,5 @@ poikola.log poikola.pdf poikola.synctex.gz prog +prog.alt prog.orig diff --git a/2019/poikola/Makefile b/2019/poikola/Makefile index e8a8cf392..9ea888437 100644 --- a/2019/poikola/Makefile +++ b/2019/poikola/Makefile @@ -47,7 +47,8 @@ CWARN= -Wall -Wextra -pedantic ${CSILENCE} # Compiler standard # -CSTD= -std=gnu17 +# The author did not test gnu17 but did gnu11 so we set to gnu11. +CSTD= -std=gnu11 # Compiler bit architecture # @@ -66,7 +67,10 @@ CINCLUDE= # Optimization # -OPT= -O3 +# We disable the optimiser because the author stated that for GCC optimiser +# level 0 gave correct output. With clang [0123s] works which suggests that +# [123s] might or might not work with GCC. +OPT= -O0 # Default flags for ANSI C compilation # @@ -116,8 +120,8 @@ CSRC= ${PROG}.o DATA= poikola.tex TARGET= ${PROG} # -ALT_OBJ= -ALT_TARGET= +ALT_OBJ= ${PROG}.alt.o +ALT_TARGET= ${PROG}.alt DOCS= poikola.tex ################# @@ -132,14 +136,27 @@ all: data ${TARGET} clean clobber install love haste waste maker easter_egg \ sandwich supernova deep_magic magic charon pluto +# We disable the optimiser because the author stated that for GCC optimiser +# level 0 gave correct output. With clang [0123s] works which suggests that +# [123s] might or might not work with GCC. The author also stated that they did +# not test gnu17 but for clang and GCC gnu11 does so we also set the standard to +# gnu11. ${PROG}: ${PROG}.c - ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} + ${CC} ${CFLAGS} -O0 -std=gnu11 $< -o $@ ${LDFLAGS} # alternative executable # alt: data ${ALT_TARGET} @${TRUE} +# We disable the optimiser because the author stated that for GCC optimiser +# level 0 gave correct output. With clang [0123s] works which suggests that +# [123s] might or might not work with GCC. The author also stated that they did +# not test gnu17 but for clang and GCC gnu11 does so we also set the standard to +# gnu11. +${PROG}.alt: ${PROG}.alt.c + ${CC} ${CFLAGS} -O0 -std=gnu11 $< -o $@ ${LDFLAGS} + # data files # data: ${DATA} diff --git a/2019/poikola/README.md b/2019/poikola/README.md index 58f1a96cb..3f3ee5535 100644 --- a/2019/poikola/README.md +++ b/2019/poikola/README.md @@ -4,6 +4,14 @@ make ``` +There is an alternate version of this program which changes the way the output +is displayed. See [Alternate code](#alternate-code) below. + +NOTE: we disable the optimiser because the author stated that for GCC optimiser +level 0 gave correct output. With clang [0123s] works which suggests that [123s] +might or might not work with GCC. Likewise, we do similar for the standard, +forcing `-std=gnu11`. + ### Bugs and (Mis)features: @@ -26,29 +34,52 @@ sleep 86400; make clobber prog sleep 86400; make clobber prog ./prog 512 ./prog + ``` +If you wish for some documentation: + +```sh +make docs +``` + +This will create the file `poikola.pdf` for your enjoyment. + ### Try: If you don't have a few days, try: ```sh -TZ=UTC24 make clobber prog -./prog 512 ./prog - -TZ=UTC48 make clobber prog -./prog 512 ./prog +./try.sh ``` -This program will not validate input so it might fail or get stuck if invoked -erroneously. +As the [bugs.md](/bugs.md#2019-poikola) says, this program will not validate +input so it might get stuck or fail if invoked erroneously. -This is supposed to happen. As is written in the -[The Jargon File](http://catb.org/jargon/html/F/feature.html): +## Alternate code: + +This version prints a newline after each number for parsing in other ways than +what can be done with the original entry. + + +### Alternate build: + +```sh +make alt ``` -That's not a bug, that's a feature. + + +### Alternate use: + +Use `prog.alt` as you would `prog` above. + + +### Alternate try: + +```sh +./try.alt.sh ``` @@ -57,9 +88,12 @@ That's not a bug, that's a feature. Do you have the time to see what this program does? Think again, come back and try again. -Note that 2 can be said to be the least odd prime because it is the greatest -even prime. Moreover 2 can be also said to be the greatest odd prime because it -is the least even prime. +Note that [2](https://t5k.org/curios/page.php/2.html) can be said to be the +least [odd](https://en.wikipedia.org/wiki/Parity_(mathematics)) +[prime](https://en.wikipedia.org/wiki/Prime_number) because it is the greatest +[even](https://en.wikipedia.org/wiki/Parity_(mathematics)) prime. Moreover `2` +can be also said to be the greatest odd prime because it is the least even +prime. The source code layout and some of the variable names honors the ski jumping accomplishments of [Matti @@ -68,6 +102,7 @@ Nykänen](https://en.wikipedia.org/wiki/Matti_Nyk%C3%A4nen). ## Author's remarks: + ### How to build: ```sh @@ -86,12 +121,14 @@ e.g.: clang -O1 -o prog prog.c ``` + ### Poster: You can generate an A3 sized poster by `make docs`. This command creates a pdf file `poikola.pdf`. This requires the [pdfTeX](https://en.wikipedia.org/wiki/PdfTeX) tool. + ### What this entry does: An old wise man mumbled to me: @@ -111,19 +148,20 @@ jumper](https://en.wikipedia.org/wiki/Matti_Nyk%C3%A4nen) and [amateur philosopher](http://telefinn.blogspot.com/2011/11/matti-nykanen-quotes.html), who passed away on fourth of February 2019. + ### Oh boys: So, I followed the rules given by [Gandalf the White](https://www.glyphweb.com/arda/g/gandalf.html) and the [Judges of -IOCCC](/judges.html). +the IOCCC](/judges.html). Output of `iocccsize`, using the [2019 version of iocccsize](https://www.ioccc.org/2019/iocccsize.c), is carefully selected. For the sake of clarity, I used single letter variables in the code. I also avoided unnecessary use of functions. Like a -[tripundra](https://en.wikipedia.org/wiki/Tripundra), this program has three levels. -In order to reveal all of them, you have to compile this program on three -consecutive days. +[tripundra](https://en.wikipedia.org/wiki/Tripundra), this program has three +levels. In order to reveal all of them, you have to compile this program on +three consecutive days. As this is a contest for obfuscated code, the program does not perform unnecessary checks, but either fails or gets stuck if invoked erroneously. The @@ -142,6 +180,7 @@ input in any way. These same parameters should be given in calculating a numbers](https://en.wikipedia.org/wiki/Prime_number). *Please note that maximum file size is one gigabyte*! + ### Obfuscation: *Matti Nykänen*: Every time I jump, and I get that feeling of _bon voyage_, @@ -150,11 +189,12 @@ the feeling that I've been here before. *Matti Nykänen*: When you are about to jump, you are all alone and have to make your own decisions. Up there, it's all _up yours_. -This code has some jumping too. I used some `goto`s instead of `longjmp()`. Some +This code has some jumping too. I used some `goto`s instead of `longjmp(3)`. Some Finnish [ski jumping](https://en.wikipedia.org/wiki/Ski_jumping) sites are used as labels, however, there is `lahti` instead of salpausselkä. + ### SHA-3-512 Compatibility chart ### Tested against [test vectors](https://www.di-mgt.com.au/sha_testvectors.html). @@ -167,11 +207,13 @@ and iso9899:2011 (argument of `-std=`). GCC-6: For optimization level 0, correct output using the C standards c11, c99, gnu11, gnu1x, gnu89, gnu90, gnu99, iso9899:1999 and iso9899:2011. + ### Missing a prime For obvious reason, the [oddest prime](https://mathworld.wolfram.com/OddPrime.html) is missing from output. + ### Observations `gcc` and `clang` are very fragile compilers. I spent numerous hours trying to @@ -179,6 +221,7 @@ achieve exactly the same output from different optimization levels and compilers. Small change in code can produce really unexpected results, i.e. the compiler can skip a few expressions or statements without obvious reason. + ### Major spoilers It is commonly believed that [Mike Keith's @@ -193,7 +236,7 @@ that `(23*m/9+(m<3?y--:y-2)+d+4+y/4-y/100+y/400)%7` is one character shorter. In my solution, `m<3?y--:y-2` is used directly, instead of assigning a value to `d`. -Q is pronounced in Finnish exactly like "kuu", a word for +`Q` is pronounced in Finnish exactly like `kuu`, a word for [month](https://en.wikipedia.org/wiki/Month) or the [Moon](https://en.wikipedia.org/wiki/Moon). So, `Q = k` is intended. @@ -207,22 +250,23 @@ code from my high school C-programming course. Originally, I wrote it over 20 years ago. My teacher said that it is (too) complicated to use bits stored in arrays, so I did it. + ### Other stuff [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson): I really like that you enjoyed my previous entry. I hope that you will like this entry too. Because I did not want to give too many clues to [the Judges](/judges.html), I tried to write this -entry in a different way than [Most Stellar](/2018/poikola/prog.c), but in this +entry in a different way than [Most Stellar](/2018/poikola/README.md), but in this code there is at least one recycled thing from it. By the way, the answers to -the questions I posed: `(1)` 255. `(2)` Try to compare binary representations of -those floats and binary representation of the string "`25th IOCCC!`". `(3)` I +the questions I posed: (1) 255. (2) Try to compare binary representations of +those `float`s and binary representation of the string "`25th IOCCC!`". (3) I don't know. I used standard [trigonometric functions](https://en.wikipedia.org/wiki/Trigonometric_functions) from [math.h](https://en.wikipedia.org/wiki/C_mathematical_functions#Overview_of_functions) for rotating the [Big Dipper](https://en.wikipedia.org/wiki/Big_Dipper) and later replaced those functions with my own implementations. But there was a bug in my code and the effect was more beautiful than intended. I did not even -debug this bug and now it works as a feature. `(4)` It is not possible. If you +debug this bug and now it works as a feature. (4) It is not possible. If you change a single bit, the [Fletcher's 16 checksum](https://en.wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16) does not match anymore and `goto` jumps to the end of the code. diff --git a/2019/poikola/prog.alt.c b/2019/poikola/prog.alt.c new file mode 100644 index 000000000..71a2d4561 --- /dev/null +++ b/2019/poikola/prog.alt.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#define W 48 +#define b '\b' +#define q R[2]== +#define R __DATE__ +#define n 1073741824ul +#define L (V) l[++S] << b * S +#define D (R[7]-W)*1000+(R[b]-W)*100+(R[9]-W)*10+R[10]-W +#define k q'p'?9:q'y'?5:q'n'?(R[1]=='u'?6:1):q'b'?2:q'r'?(*R=='M'?3:4):q'g'?8:q't'?10:q'v'?11:q'l'?7:12 +#define Z B |= (V) *l++ << u++ * b; +#define g for(a=0;a<5;a++) +#define o 25 +#define G a+ + +typedef unsigned long long V;V _=1ULL << 63; V d=1UL<<037; unsigned int x[ +n/16]; V m,F,u,T,a,r,H ,B,I; int main(int P, char *U[]){union{V K[o]; unsigned +char E[1]; }c ; const unsigned char *f, *l ; V X,i,e,z,A,Q,M=-~9, Y; struct stat +J; void *p; r++ ;V t,y= 0,v[5];const void*j[ ]= {&&laajavuori,&&ruka, &&puijo,&&lahti +,&&vuokatti,&&virpiniemi, &&ounasvaara};V N[o]={r, P,6,M,15,21, 28,36,45, 55,2,14, 27,41, +56,b,o,43, 62,18,39,61,20, 44};for(;U[r][a]; a++)T=T *M+U[!u][a]-W; T >>=P ; X=open(U[--P],F +); V w[o]= {_|d|32776,d|r, _|32896,_| d |32897,_|d|M, 32778,_+128,_ |32770,_ | 32771,_ |32905, +_ |139, d| 32907 , d|M,d| 32777,136,138,_|32777,_|d| 32897,d|1,32907,_|d|32768 ,_|32906,32898, +r,_}; i= fstat (X,&J); V O [o ]={M,7,11,17,18,3,5,16,b ,21,24,4,15,23,19,13, 12,P, 20,14,22,9,6,r} +; Y=H=J./*****/ st_size; p= mmap(/*TODO: FIX THIS */NULL ,H,r,r,X, u ); memset(&c,0, 200 ) ; z = b & +7; r = T/11 [O]; l=p ; for(I=2; I<= Y; x[I++>>4]|=( 1<<(I&4[N])) ); goto C; ruka: for(I=b*3; I--; +) { g v[ a ] =c .K[a]^c.K[G b-3]^ c.K[G M] ^ c.K[G 15]^ c.K[G M+M] ; g {t = v[(G 4) %5]^(v[(G 1)% +5]<<1|v[(G 1 ) %5] >> '?') ; for(A =0; A< o; A+= 5)c.K[ G A]^=t;}t=c .K[ 1] ; for ( a =0; a-24; a ++) +A =O[a],*v = c .K[A],c.K[A] =t<> (0100-N[a]),t=* v;for(A =!o; A^o; A += 5 ) {g v[a] = c.K[G +A]; g c .K[G A] ^= ~v[( G 1) %5]&v[(G P) %5];}c.K[!1] ^= w[I]; } goto *j[Q];C:for( I=P; I <=Y/P; +y=I*P) { while ( y <= Y ) x[y>>4]&=~(1 <<(y&O[12])), y +=I; do I++; while(~x[I>>4 ]&(1<<(I&15))); +}if(HP?a-P:a --)+(R[4]==32?0 +:((R[4]-W)*M))+ R[5]-45+a /4+a /0620-a/0x64)% 3]; ounasvaara: for ( I = 2 ; I<= Y; I ++) +if (x[I>>4]& (1 <<(15& I) ) ) printf( "%llu\n" , I);goto http; virpiniemi:for( I= !I; I-T +; ){ char s[30] ={W,W,'\0'} ;X=!!W;for(e=f[ I++]; e^0; e>>= 4)P = e & 15, s[X--]= P < +M ? W | P : P + 'W'; printf ( "%s" , s); } /* addr(ioccc) */ http://www.ioccc.org/ +return /******/ puts(""); /***/ vuokatti:for(;I ^'^';++I,printf("%llx\n" +,_),t =_+d,_=d, d = t) ; goto http;/*m= o/i; v[a]=a+n;return 0;*/} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/poikola/try.alt.sh b/2019/poikola/try.alt.sh new file mode 100755 index 000000000..a359be1a2 --- /dev/null +++ b/2019/poikola/try.alt.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# try.alt.sh - demonstrate IOCCC winner 2019/poikola alt code +# +# 'I will move to Copenhagen and apply for Swedish citizenship.' +# +# -- Matti Ensio Nykänen +# + +# 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 clobber CC="$CC" alt >/dev/null || exit 1 + +# clear screen after compilation so that only the entry is shown +clear + +echo "$ ./prog.alt 512 ./prog.alt" 1>&2 +read -r -n 1 -p "Press any key to continue (space = next page, q = quit): " +echo 1>&2 +./prog.alt 512 ./prog.alt | less -rEXF +echo 1>&2 + +echo "$ TZ=UTC24 make CC="$CC" clobber prog.alt" 1>&2 +TZ=UTC24 make CC="$CC" clobber prog.alt || exit 1 +read -r -n 1 -p "Press any key to run: ./prog.alt 512 ./prog.alt (space = next page, q = quit): " +echo 1>&2 +./prog.alt 512 ./prog.alt | less -rEXF +echo 1>&2 + +echo "$ TZ=UTC48 make CC="$CC" clobber prog.alt" 1>&2 +TZ=UTC48 make CC="$CC" clobber prog.alt || exit 1 +read -r -n 1 -p "Press any key to run: ./prog.alt 512 ./prog.alt (space = next page, q = quit): " +echo 1>&2 +./prog.alt 512 ./prog.alt | less -rEXF +echo 1>&2 diff --git a/2019/poikola/try.sh b/2019/poikola/try.sh new file mode 100755 index 000000000..27299f0cf --- /dev/null +++ b/2019/poikola/try.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# +# try.sh - demonstrate IOCCC winner 2019/poikola +# +# 'When you are about to jump, you are all alone and have to make your own +# decisions. Up there, it's all "up yours".' +# +# -- Matti Ensio Nykänen +# + +# 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 clobber CC="$CC" all >/dev/null || exit 1 + +# clear screen after compilation so that only the entry is shown +clear + +echo "$ ./prog 512 ./prog" 1>&2 +read -r -n 1 -p "Press any key to continue: " +echo 1>&2 +./prog 512 ./prog +echo 1>&2 + +echo "$ TZ=UTC24 make CC="$CC" clobber prog" 1>&2 +TZ=UTC24 make CC="$CC" clobber prog || exit 1 +read -r -n 1 -p "Press any key to run: ./prog 512 ./prog: " +echo 1>&2 +./prog 512 ./prog +echo 1>&2 + +echo "$ TZ=UTC48 make CC="$CC" clobber prog" 1>&2 +TZ=UTC48 make CC="$CC" clobber prog || exit 1 +read -r -n 1 -p "Press any key to run: ./prog 512 ./prog: " +echo 1>&2 +./prog 512 ./prog +echo 1>&2 diff --git a/bugs.md b/bugs.md index b6d7430d3..68ac44303 100644 --- a/bugs.md +++ b/bugs.md @@ -3513,6 +3513,7 @@ remarks in the sections [Syntax](/2019/lynn/README.md#syntax) and This program will not validate input so it might fail or get stuck if invoked erroneously. +Also, the maximum file size is 1GB. ## 2019 yang diff --git a/thanks-for-help.md b/thanks-for-help.md index cf183fd1c..28c7829b2 100644 --- a/thanks-for-help.md +++ b/thanks-for-help.md @@ -4243,6 +4243,24 @@ Cody also added the [example-1.txt](/2019/lynn/example-1.txt) and entry existing. +## [2019/poikola](/2019/poikola/prog.c) ([README.md[(/2019/poikola/README.md)) + +[Cody](#cody) added the missing `docs` rule to the Makefile that forms a PDF +file. The rule requires the tool +[pdflatex](https://tug.org/applications/pdftex/index.html). + +Cody also added the [alternate code](/2019/poikola/README.md#alternate-code). + +Cody also added the [try.sh](/2019/poikola/try.sh) and +[try.alt.sh](/2019/poikola/try.alt.sh) scripts. + +Cody also disabled the optimiser because the author stated that for clang the +levels [0123s] work okay but with GCC (6) they only said level 0 works, +suggesting that with some versions of GCC it might not be correct with levels != +0 and since 0 works with clang that's okay. Similarly, the same for C standards +tested: `gnu17` was not tested but `gnu11` was so the standard was set to +`gnu11`. + ## [2019/yang](/2019/yang/prog.c) ([README.md](/2019/yang/README.md]))