User:Quequero/IOCCC ASCII Plotter
From UIC
Pensai a questo piccolo plotter per l'IOCCCInternational Obfuscated C Code Contest contest 2005, è un plotter di funzioni matematiche in notazione Infinix, cioe' quella che usiamo normalmente quando scriviamo i conti su un foglio, ecco il codice:
* que_plot.c by <b>Quequero</b>
* quequero (at) bitchx [dot] it
* http://quequero.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#define P 3.14
#define E 2.71
#define I u y
#define u else
#define y if
#define r return
#define o float
#define m char
#define W for
extern errno; m*e;int f,x,i,j,t,l,q,p;o v();h(m*s,m*d,int k){ for(i=0;i<k; i++)
y(s[i]!=d[i])r 0; r 1; } o ol(){ o a=0; y(*e=='x'){*e++;r(o)x;} I(*e=='e'){*e++
; r(o)E;}I(*e=='p'){*e++; r(o)P; } while(*e>='0'&&*e<='9'){ a=a*10+(*e-48);*e++
;}r a; } o o1(){ o k; y(*e=='-') { e++; r-o1(); } I(*e=='('){ e++; k=v(); } I((
*e>='0'&&*e<='9')||*e=='x'){ r(o)ol(); } I(h(e,"acos(",5)){e+=5; k=(o)acos(v())
; } I(h(e,"asin(",5)){ e+=5; k=(o)asin(v()); } I(h(e, "atan(", 5)){ e+=5; k=(o)
atan(v()); }I(h(e,"abs(",4)){ e+=4; k=(o)abs((int)v()); } I(h(e,"cos(",4)){ e+=
4; k=(o)cos((double)v()); } I(h(e, "log(", 4)){ e+=4; k=(o)log10(v()); } I(h(e,
"ln(",3)){ e+=3;k=(o)log(v()); } I(h(e, "sin(",4)) { e+=4; k=(o)sin (( double)v
()); } I(h(e,"sqrt(",5)){e+=5; k=(o)sqrt(v()); }I(h(e, "tan(", 4)){ e+=4; k=(o)
tan(v()); } I(*e=='p'){k=(o)P; }I(*e=='e'){k=(o)E; }u{r 0; }y(errno== 33||errno
==34){f=1; errno=0; r 0; } y(k>0.0&&k<0.5)k=0; I(k>0.5&&k<1.0)k=1; I(k<0.0 &&k>
-0.5)k=0; I(k<-0.5&&k>-1.0)k=-1; e++; r k; }o a1(){o b,d, c; b=o1(); while(*e&&
(*e=='*'||*e=='/'||*e=='^'||*e=='%')){ c=(o)*e++; d=o1(); y((m)c=='*')b*=d; I((
m)c=='^')b=(o)pow(b,d); I((m)c=='/'){ y(!d)f=1; u b/=d; } I((m)c=='%'){y(!d)r 0
; b= (o)((int)b%(int)d); }} r b; }o v(){ o k,f,c; k= a1(); while(*e&&(*e=='+'||
*e=='-')){ c=(o)*e++; f=a1(); k+=(o)(c=='+')?f:-f; } r k; } main(int a,m**b){ m
**c,*n; unsigned m*h; f='1'-49; y(a<sizeof(m) <<2)r 0; q=atoi(b[a-(1<<1) ]); p=
atoi(b [a-(1<<0)]); c=malloc(sizeof(m*)*p); n=malloc(sizeof(m)*q*p); y(l=0,!c||
!n)r 1; W(i=0; i<p; i++)c[i]=n+i*q; t=&c[p-i+1]-&c[p-i]; W(i=0; i<p; i++)W(j=0;
j<q; j++)c[i][j]=32; W(i=0,j=0; i<q; i+=&c[p>>t][i+t]-&c[p>>t][i])c[p>>t][i]=45
; W(i=0; i<p; i+=&c[p>>t][i+t]-&c[p>>t][i])c[i][q>>t]=(2<<6) -(2<<t); W(i=j;; i
++){ y(b[t][i])l++; u break; } c[p>>t][q>>t]=~t+(c[p-t][q>>t]<<1); c[p>>t][q-t]
=c[p>>t][8]+17; c[(m)b[a]][q>>t]=94; h=malloc(l+t);W(j=0,i=0; i<l;i++){ h[j]=(m
)* b+i!=32?b[1][i]:(int)b[a]; j+=b [1][i]!=32?f+1:(unsigned int)b[1][i]>>(int
)&c; } h[j]=((unsigned m)&n)&((unsigned m) b[a]); l=j; l-=2; W(x=-q>>1; x<q>>1;
x++) { e=&h[1<<1]; t=(int)v(); y(f){ f=0; } u{ y(t<(p>>1)&&t>-(p>>1))c[(p-t)-(p
>>1)][x+(q>>1)]='.'; } } W(i=0; i<p; i++){ W(j=0; j<q; j++){ printf("%c",c[i][j
]); } printf("\n"); } free(h); free(c); free(n); r 0; }
Se fate copia e incolla state attenti, dopo ogni #define e dopo ogni #include ci deve essere un "a capo". Quindi assicuratevi che il codice incollato nel vostro file sia uguale a quello che vedete qui. Il codice fu scritto un po' di corsa, comunque nel main() ci sono dei trick di offuscamento carini, il resto è davvero poco offuscato. :). Il codice è davvero ANSI C e potete compilarlo così:
O potete importarlo in un progetto di VC++/Dev-C++ e compilarlo normalmente. La sintassi per l'utilizzo è questa:
Qualche esempio carino:
$ ./que_plot "y=sin(x)*ln(x)" 50 10
$ ./que_plot "y=8/(1+(x^2)/100)" 50 20
$ ./que_plot "y=cos(x)-sin(x)" 50 10
$ ./que_plot "y=(e^x-e^-x)/(e^(x/2)+e^(-x/2))" 20 30
E queste sono le funzioni supportate:
- -> substraction (2 - 1 = 1)
* -> multiplication (5 * 2 = 10)
/ -> division (9 / 2 = 4.5)
^ -> power (2 ^ 3 = 8, astonished eh? lol j/k ;p)
% -> modulus (10 % 4 = 2)
sin -> sine
cos -> cosine
tan -> tangent
asin -> arc-sine
acos -> arc-cosine
atan -> arc-tangent
sqrt -> square root
abs -> absolute value
log -> logarithm (base 10)
ln -> natural logarithm (base e)
p -> pi-greek (3.14159265358...)
e -> base of natural logarithm (2.71828182845...)
x -> this is the unknown variable of a function
Dal momento che per stare negli spazi fui costretto a rimuovere le funzioni iperboliche, ve le riporto qui sotto in modo da poterle usare nella loro forma nativa:
cosh = (e^x+e^(-x))/2
tanh = (e^x-e^(-x))/(e^x+e^(-x))
Idem per le radici quadrate:
i valori su schermo vengono arrotondati, quindi 1.6 diventa 2, non è colpa mia, sono i caratteri ASCII che vivono nel mondo del discreto ;p. E comunque ok... Si tratta sempre di un parser infinix di 500 byte! :). Buon diverimento!
^
|
|
. .| . .
. .. .. . . . . .. . . . . .
----.--.--.--.-----------ö.--.--.--.------------.>
. . .. . . . . | .. .. . . . .
. . . | . .
|
|
y=8/(1+(x^2)/100)
^
|
.
...|...
.. | ..
.. | ..
... | ...
.. | ..
..... | .....
........ | .......
-------------------------ö----------------------->
|
|
y=sin(x)*ln(x)
^
|
| .
| . .. .
| . .
-------------------------ö.-.--.--.---.--.--.--.->
| ..
| ... ..
| ..
|