C,–110个字符
该程序的该版本使用线性运行时算法来生成序列。从程序中的402个字符中减去512,得出的总数为负110。
#define C v=calloc(7,8),v->p=p
#define G(F,K)u->F[d[K]]
#define S(F,T)G(f,T)=F,G(t,T)=T,G(n,T)=
struct{int p,f[2],t[2];void*n[2];}r,*u,*v,*w;char*d,c;p,b,h,i,j,k;
main(s){for(;d=++p-s?d:realloc(d,s*=2);){d[i=p]=b;c+=c+b;p%8||putchar(c);
for(u=&r;b=u->p,u->p=p,w=G(n,k=i);S(i,k)v=G(n,k),u=v)for(h=G(f,k),j=G(t,k);j>h;--i,--j)
if(d[i]-d[j]){S(i,k)C;u=v;S(h,j)w;S(0,i)C;b=w->p;goto x;}S(0,i)C;x:b=1-d[b+1];}}
根据问题,程序在无限循环中运行,这需要大量内存分配,并且realloc()
用于保持序列连续可以导致堆碎片。您可以通过calloc(7,8)
在第一行中替换来提高程序的内存使用率calloc(1,sizeof*v)
。这将在32位计算机上特别有用,其中56可能太大了两倍。
该代码有点不可读,而且不是一种有趣的方式。为此我深表歉意。坦白说,即使是非高尔夫版本也不是很清楚:
#include <stdio.h>
#include <stdlib.h>
typedef struct branch branch;
typedef struct node node;
struct branch {
int from, to;
node *next;
};
struct node {
int pos;
branch br[2];
};
static node root = { 0 };
static unsigned char *data = NULL;
static int endpos = 0;
static int size = 1;
static node *mknode(void)
{
node *n;
n = calloc(1, sizeof *n);
n->pos = endpos;
return n;
}
static branch *getbranch(node *n, int p)
{
return &n->br[data[p]];
}
static void setbranch(node *n, int from, int to, node *next)
{
n->br[data[to]].next = next;
n->br[data[to]].from = from;
n->br[data[to]].to = to;
}
int main(void)
{
node *u, *v, *w;
int follower, from, i, i0, j;
int out, b;
out = b = 0;
for (;;) {
++endpos;
if (endpos == size) {
size *= 2;
data = realloc(data, size);
}
data[endpos] = b;
out = (out << 1) | b;
if (endpos % 8 == 0) {
putchar(out);
out = 0;
}
i = endpos;
u = &root;
for (;;) {
follower = u->pos + 1;
u->pos = endpos;
w = getbranch(u, i)->next;
if (!w)
break;
i0 = i;
from = getbranch(u, i0)->from;
for (j = getbranch(u, i0)->to ; j > from ; --j) {
if (data[i] != data[j]) {
/* divide branch */
v = mknode();
setbranch(u, i, i0, v);
u = v;
setbranch(u, from, j, w);
setbranch(u, 0, i, mknode());
follower = w->pos + 1;
goto bitfound;
}
--i;
}
v = getbranch(u, i0)->next;
setbranch(u, i, i0, v);
u = v;
}
/* extend branch */
setbranch(u, 0, i, mknode());
bitfound:
b = 1 - data[follower];
}
}
(上面的非代码化代码基于问题描述中以及Soltys主页上由Grzegorz Herman和Michael Soltys编写的代码。)
感谢@schnaader和@res报告了初始版本中的错误。