Talk:C: Difference between revisions

Add topic
From Rabid Reaction Force
Content added Content deleted
(m)
(latest pe.c)
 
(One intermediate revision by one other user 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>
Line 51: Line 368:
return EXIT_SUCCESS;
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