Talk:C: Difference between revisions
Add topic (Created page with "<nowiki> #include <stddef.h> #include <ctype.h> #include <stdlib.h> #include <stdio.h> #define K62 62 extern int main(int ac, const char *const *av) { char a[666]; for (; fgets(a, stdin); ) { size_t y, z= strlen(a); char *s= a+z; for (; z && (--z, iscntrl(*--s)) ;) { *s= 0; } y= z? (z-1)/K62+1: 1; z= z<=3? z: 3; } } </nowiki>") |
(latest pe.c) |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
===pe.c=== |
|||
<nowiki> |
<nowiki> |
||
#if 1 |
|||
#else |
|||
#error NEXT= ??? 16! = c.20x10^40 |
|||
#endif |
|||
/* TODO: PrecPup dev (gcc) */ |
|||
/* https://www.onlinegdb.com/online_c_compiler */ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#include <ctype.h> |
|||
#include <errno.h> |
|||
/** |
|||
#include <math.h> |
|||
**/ |
|||
#include <assert.h> |
|||
static void (die)(const int line); |
|||
#define die() die(__LINE__); |
|||
#define H_(X) (#X) |
|||
#define H(X) H_(X) |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
typedef unsigned long lnat; |
|||
/*\ \*/ |
|||
struct n_; typedef struct n_ n_; struct n_ { |
|||
lnat p, x; |
|||
n_ *n; |
|||
}; |
|||
/* |
|||
struct l_; typedef struct l_ l_; struct l_ { |
|||
n_ *h; |
|||
}; /**/ |
|||
typedef int rand_f(void); |
|||
/* static rand_f *rf= rand; /**/ |
|||
static void dump(n_ *p); |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
static n_ **split(n_ **lo_, n_ **hi_, n_ **it, lnat y) { |
|||
n_ *r, **lo= lo_, **hi= hi_; |
|||
lnat t= 0; |
|||
if (it); else it= lo_; |
|||
for (r= *it; r; r= r->n) { |
|||
if (r->x < y) { |
|||
*lo= r; lo= &r->n; |
|||
t+= r->p + 1; |
|||
} else { |
|||
*hi= r; hi= &r->n; |
|||
r->p+= t; |
|||
/* t= 0; /**/ |
|||
} |
|||
} |
|||
*hi= *lo= 0; |
|||
return hi_; |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
static void recurse_(lnat it, n_**hd) { |
|||
assert(*hd); |
|||
{ lnat x= (*hd)->x, p= (*hd)->p; |
|||
printf("it= %lu, r= (%lu, %lu, %lu)\t", it, x, p, x-p); |
|||
assert(x>=p); |
|||
} |
|||
dump(*hd); |
|||
fflush(0); |
|||
} |
|||
/*\ \*/ |
|||
static void recurse(lnat lo, lnat hi, n_ **hd) { |
|||
lnat mi; |
|||
/**/ |
|||
printf("\tlo= %lu hi= %lu\t", lo, hi); |
|||
dump(*hd); |
|||
fflush(0); /**/ |
|||
assert(lo<=hi); |
|||
if (lo!=hi); else { recurse_(lo, hd); return; } |
|||
mi= 2+hi-lo; mi= mi/2+lo; |
|||
{ n_ *li[1]; |
|||
/**/ split(hd, li, 0, mi); /**/ |
|||
recurse(lo, mi-1, hd); |
|||
printf("lo= %lu mi= %lu hi= %lu\n", lo, mi, hi); |
|||
recurse(mi, hi, li); |
|||
} |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
#define M 1 |
|||
#define M_ (1u<<M) |
|||
#define K (1u<<M_) |
|||
static n_ a__[1][K]; |
|||
static void dump(n_ *p) { |
|||
lnat v= 0; |
|||
lnat d; |
|||
{ static lnat u= 0ul-1; assert((u>>= 1)); } |
|||
if (p); else { puts("NIL"); return; } |
|||
do { |
|||
assert(p>=*a__); |
|||
assert(p<a__[1]); |
|||
d= p-*a__; |
|||
printf(d>>4? "^": "%X(x%lu..=%lu)->", (unsigned)d&15u, p->p, p->x); |
|||
if (d>>5); else { |
|||
d= 1ul<<d; |
|||
v^= d; |
|||
if (v&d); else { |
|||
puts("etc"); return; |
|||
} |
|||
} |
|||
p= p->n; /* TODO: count, check LE K */ |
|||
} while (p); |
|||
puts("#"); |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
static void tests_0(n_ **hd, n_ (*a)[K]) { |
|||
n_ *q= a[1], *p= 0; |
|||
int i; |
|||
assert(hd); assert(a); |
|||
for (i= K+0; --i >= 0; ) { (--q)->n= p; p= q; p->p= 0; p->x= i; } |
|||
*hd= p; |
|||
} |
|||
#define rand() 0 |
|||
static void tests_R_(n_ **hd, rand_f *rnd) { |
|||
n_ *le[1], **lt[1], *ri[1], **rt[1], ***pt, **pt_, *it, *it_; |
|||
assert(*hd); |
|||
it= (it_= *hd)->n; |
|||
if (it); else return; |
|||
dump(it_); |
|||
/* it_->n= 0; /**/ |
|||
*(*rt= ri)= *(*lt= le)= 0; |
|||
for (; it; it= it->n, **pt= 0) { |
|||
pt= rnd()&1u? rt: lt; |
|||
assert(!**pt); |
|||
**pt= it; /* append */ |
|||
*pt= &it->n; /* advance */ |
|||
} |
|||
**rt= **lt= 0; |
|||
/* if r is empty will prepend to r, and vice versa */ |
|||
pt_= *ri? *le && (rnd()&1u)? ri: le: ri; |
|||
it_->n= *pt_; |
|||
*pt_= it_; |
|||
tests_R_(le, rnd); |
|||
tests_R_(ri, rnd); |
|||
*hd= it= *(pt_= ri); /* TODO: rnd() */ |
|||
assert(it); |
|||
while ((it= *(pt_= &it->n)) != 0); |
|||
*pt_= *le; |
|||
} |
|||
static int rnd0(void) { return 0; } |
|||
static int rnd1(void) { return 1; } |
|||
static void tests_R0(n_ **hd, n_ (*a)[K]) { |
|||
tests_0(hd, a__); |
|||
tests_R_(hd, rnd0); |
|||
} |
|||
static void tests_R1(n_ **hd, n_ (*a)[K]) { |
|||
tests_0(hd, a__); |
|||
tests_R_(hd, rnd1); |
|||
} |
|||
static void tests_R(n_ **hd, n_ (*a)[K]) { |
|||
tests_0(hd, a__); |
|||
tests_R_(hd, rand); |
|||
} |
|||
static n_ *tests(void) { |
|||
n_ *hd[1]; |
|||
*hd= 0; |
|||
tests_0(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
*hd= 0; |
|||
tests_R0(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
*hd= 0; |
|||
tests_R1(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
*hd= 0; |
|||
tests_R(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
/**/ return *hd; /**/ |
|||
*hd= 0; |
|||
tests_R0(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
/* |
|||
*hd= 0; |
|||
tests_R1(hd, a__); |
|||
assert(*hd); |
|||
dump(*hd); |
|||
printf("[[ at %u]]\n", __LINE__); |
|||
/**/ |
|||
return *hd; |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
static int dtj(void) { |
|||
n_ *hd[1]; |
|||
/* (die)(0); /**/ |
|||
*hd= tests(); |
|||
dump(0); /**/ |
|||
dump(*hd); /**/ |
|||
recurse(0, K-1, hd); /**/ |
|||
return 0; |
|||
} |
|||
/*\ \*/ |
|||
static int dothejob(void) { |
|||
int rv; |
|||
rv= dtj(); |
|||
return !rv? EXIT_SUCCESS: EXIT_FAILURE; |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ |
|||
#undef NDEBUG |
|||
/** Using assert() to report runtime errors is, admittedly, very fckg lazy. -EMD |
|||
**/ |
|||
#include <assert.h> |
|||
static void (die)(int line) { |
|||
if (line); else { |
|||
fprintf(stderr, "\n\nThe C program '%s' has aborted.\n", __FILE__); fflush(0); |
|||
assert(!"I'm too stupid to work this out, sorry."); |
|||
} |
|||
fprintf(stderr, "\n\nYour crappy wee computer doesn't have enough memory to run" |
|||
" the C program '%s', which is why it gave up trying somewhere around line %d.\n", |
|||
__FILE__, line); fflush(0); |
|||
assert(!"I'm shit out of memory, sorry."); |
|||
} |
|||
/*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ |
|||
extern int main(int ac, const char *const *av) { |
|||
(void)ac; (void)av; |
|||
ac= dothejob(); /**/ |
|||
return ac; |
|||
} |
|||
#if 1 |
|||
#else |
|||
#error NEXT FILE |
|||
#include <stddef.h> |
#include <stddef.h> |
||
#include <ctype.h> |
#include <ctype.h> |
||
#include <string.h> |
|||
#include <stdlib.h> |
#include <stdlib.h> |
||
#include <stdio.h> |
#include <stdio.h> |
||
#include <assert.h> |
|||
#define strize_(X) #X |
|||
#define strize(X) strize_(X) |
|||
#define K62 62 |
#define K62 62 |
||
#define K3 4 |
|||
#define K3_ (K3-1) |
|||
extern int main(int ac, const char *const *av) { |
extern int main(int ac, const char *const *av) { |
||
static char b[K62][101][K3]; |
|||
char a[666]; |
char a[666]; |
||
int ln= 0, k_= 7; |
|||
size_t k; |
|||
if (ac>>1) k_= atoi(av[1]); |
|||
k= k_>=40? k_: k_+80u; |
|||
for (; fgets(a, sizeof a, stdin); ) { |
|||
size_t y, z= strlen(a); |
size_t y, z= strlen(a); |
||
char *s= a+z; |
char *s= a+z; |
||
for (; z && ( |
for (; z && (iscntrl(*(unsigned char *)--s)); --z, *s= 0); |
||
*s= 0; |
|||
} |
|||
y= z? (z-1)/ |
y= z? (z-1)/k + 1: 1; |
||
z= z |
z= z>=K3_? K3_ : z; /* !needed? */ |
||
for (++y; --y; ++ln, z= 0) { |
|||
int lo= ln%K62, hi= ln/62; |
|||
sprintf(b[lo][hi], "%-" strize(K3) ".*s", z, a); |
|||
} |
|||
} |
} |
||
ln= (ln-1)/K62 + 1; k= (ln-1)/2 + 1; fprintf(stderr, "\nln= %d k= %u\n", ln, k); |
|||
for (ln= 0-1; ++ln<K62; ) { b[ln][k][-1]= 0; puts(*b[ln]); } |
|||
puts(" @@@@@@@"); |
|||
for (ln= 0-1; ++ln<K62; ) puts(b[ln][k]); |
|||
return EXIT_SUCCESS; |
|||
} |
} |
||
#endif |
|||
</nowiki> |
</nowiki> |
Latest revision as of 20:37, 21 February 2023
pe.c[edit]
#if 1 #else #error NEXT= ??? 16! = c.20x10^40 #endif /* TODO: PrecPup dev (gcc) */ /* https://www.onlinegdb.com/online_c_compiler */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> /** #include <math.h> **/ #include <assert.h> static void (die)(const int line); #define die() die(__LINE__); #define H_(X) (#X) #define H(X) H_(X) /*\ \*/ /*\ \*/ /*\ \*/ typedef unsigned long lnat; /*\ \*/ struct n_; typedef struct n_ n_; struct n_ { lnat p, x; n_ *n; }; /* struct l_; typedef struct l_ l_; struct l_ { n_ *h; }; /**/ typedef int rand_f(void); /* static rand_f *rf= rand; /**/ static void dump(n_ *p); /*\ \*/ /*\ \*/ /*\ \*/ static n_ **split(n_ **lo_, n_ **hi_, n_ **it, lnat y) { n_ *r, **lo= lo_, **hi= hi_; lnat t= 0; if (it); else it= lo_; for (r= *it; r; r= r->n) { if (r->x < y) { *lo= r; lo= &r->n; t+= r->p + 1; } else { *hi= r; hi= &r->n; r->p+= t; /* t= 0; /**/ } } *hi= *lo= 0; return hi_; } /*\ \*/ /*\ \*/ /*\ \*/ static void recurse_(lnat it, n_**hd) { assert(*hd); { lnat x= (*hd)->x, p= (*hd)->p; printf("it= %lu, r= (%lu, %lu, %lu)\t", it, x, p, x-p); assert(x>=p); } dump(*hd); fflush(0); } /*\ \*/ static void recurse(lnat lo, lnat hi, n_ **hd) { lnat mi; /**/ printf("\tlo= %lu hi= %lu\t", lo, hi); dump(*hd); fflush(0); /**/ assert(lo<=hi); if (lo!=hi); else { recurse_(lo, hd); return; } mi= 2+hi-lo; mi= mi/2+lo; { n_ *li[1]; /**/ split(hd, li, 0, mi); /**/ recurse(lo, mi-1, hd); printf("lo= %lu mi= %lu hi= %lu\n", lo, mi, hi); recurse(mi, hi, li); } } /*\ \*/ /*\ \*/ /*\ \*/ #define M 1 #define M_ (1u<<M) #define K (1u<<M_) static n_ a__[1][K]; static void dump(n_ *p) { lnat v= 0; lnat d; { static lnat u= 0ul-1; assert((u>>= 1)); } if (p); else { puts("NIL"); return; } do { assert(p>=*a__); assert(p<a__[1]); d= p-*a__; printf(d>>4? "^": "%X(x%lu..=%lu)->", (unsigned)d&15u, p->p, p->x); if (d>>5); else { d= 1ul<<d; v^= d; if (v&d); else { puts("etc"); return; } } p= p->n; /* TODO: count, check LE K */ } while (p); puts("#"); } /*\ \*/ /*\ \*/ /*\ \*/ static void tests_0(n_ **hd, n_ (*a)[K]) { n_ *q= a[1], *p= 0; int i; assert(hd); assert(a); for (i= K+0; --i >= 0; ) { (--q)->n= p; p= q; p->p= 0; p->x= i; } *hd= p; } #define rand() 0 static void tests_R_(n_ **hd, rand_f *rnd) { n_ *le[1], **lt[1], *ri[1], **rt[1], ***pt, **pt_, *it, *it_; assert(*hd); it= (it_= *hd)->n; if (it); else return; dump(it_); /* it_->n= 0; /**/ *(*rt= ri)= *(*lt= le)= 0; for (; it; it= it->n, **pt= 0) { pt= rnd()&1u? rt: lt; assert(!**pt); **pt= it; /* append */ *pt= &it->n; /* advance */ } **rt= **lt= 0; /* if r is empty will prepend to r, and vice versa */ pt_= *ri? *le && (rnd()&1u)? ri: le: ri; it_->n= *pt_; *pt_= it_; tests_R_(le, rnd); tests_R_(ri, rnd); *hd= it= *(pt_= ri); /* TODO: rnd() */ assert(it); while ((it= *(pt_= &it->n)) != 0); *pt_= *le; } static int rnd0(void) { return 0; } static int rnd1(void) { return 1; } static void tests_R0(n_ **hd, n_ (*a)[K]) { tests_0(hd, a__); tests_R_(hd, rnd0); } static void tests_R1(n_ **hd, n_ (*a)[K]) { tests_0(hd, a__); tests_R_(hd, rnd1); } static void tests_R(n_ **hd, n_ (*a)[K]) { tests_0(hd, a__); tests_R_(hd, rand); } static n_ *tests(void) { n_ *hd[1]; *hd= 0; tests_0(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); *hd= 0; tests_R0(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); *hd= 0; tests_R1(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); *hd= 0; tests_R(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); /**/ return *hd; /**/ *hd= 0; tests_R0(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); /* *hd= 0; tests_R1(hd, a__); assert(*hd); dump(*hd); printf("[[ at %u]]\n", __LINE__); /**/ return *hd; } /*\ \*/ /*\ \*/ /*\ \*/ static int dtj(void) { n_ *hd[1]; /* (die)(0); /**/ *hd= tests(); dump(0); /**/ dump(*hd); /**/ recurse(0, K-1, hd); /**/ return 0; } /*\ \*/ static int dothejob(void) { int rv; rv= dtj(); return !rv? EXIT_SUCCESS: EXIT_FAILURE; } /*\ \*/ /*\ \*/ /*\ \*/ #undef NDEBUG /** Using assert() to report runtime errors is, admittedly, very fckg lazy. -EMD **/ #include <assert.h> static void (die)(int line) { if (line); else { fprintf(stderr, "\n\nThe C program '%s' has aborted.\n", __FILE__); fflush(0); assert(!"I'm too stupid to work this out, sorry."); } fprintf(stderr, "\n\nYour crappy wee computer doesn't have enough memory to run" " the C program '%s', which is why it gave up trying somewhere around line %d.\n", __FILE__, line); fflush(0); assert(!"I'm shit out of memory, sorry."); } /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ /*\ \*/ extern int main(int ac, const char *const *av) { (void)ac; (void)av; ac= dothejob(); /**/ return ac; } #if 1 #else #error NEXT FILE #include <stddef.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <assert.h> #define strize_(X) #X #define strize(X) strize_(X) #define K62 62 #define K3 4 #define K3_ (K3-1) extern int main(int ac, const char *const *av) { static char b[K62][101][K3]; char a[666]; int ln= 0, k_= 7; size_t k; if (ac>>1) k_= atoi(av[1]); k= k_>=40? k_: k_+80u; for (; fgets(a, sizeof a, stdin); ) { size_t y, z= strlen(a); char *s= a+z; for (; z && (iscntrl(*(unsigned char *)--s)); --z, *s= 0); y= z? (z-1)/k + 1: 1; z= z>=K3_? K3_ : z; /* !needed? */ for (++y; --y; ++ln, z= 0) { int lo= ln%K62, hi= ln/62; sprintf(b[lo][hi], "%-" strize(K3) ".*s", z, a); } } ln= (ln-1)/K62 + 1; k= (ln-1)/2 + 1; fprintf(stderr, "\nln= %d k= %u\n", ln, k); for (ln= 0-1; ++ln<K62; ) { b[ln][k][-1]= 0; puts(*b[ln]); } puts(" @@@@@@@"); for (ln= 0-1; ++ln<K62; ) puts(b[ln][k]); return EXIT_SUCCESS; } #endif