# 通用（弯曲）代码高尔夫求解器

14

010011010111000100001111 ...（OEIS中的序列A038219）。

``````MD5: 5dc589a06e5ca0cd9280a364a456d7a4
``````

``````4D 71 0F 65 27 46 0B 7C
``````

8
Pedantic quibble：永远不会出现pi- 输出中只会包含每个有限的字符串。

@KeithRandall：我希望能保证不会包含“永不放弃”和类似作品的序列。

2

2012年

7

## C，–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];}}
``````

``````#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编写的代码。）

（+1）我发现使用Ubuntu12.04 / gcc，您的两个程序都可以编译并产生正确的输出...使用Win7 / mingw / gcc，这两个程序都可以编译，但会产生分段错误...使用Win7 / lcc，非高尔夫版本可以工作，但高尔夫版本会产生分段错误。
2012年

1

6

### 红宝石，109 104 101 94个字符

``````s=?0
loop{s=(s[/(.*).*\1/][/.#{\$1}/]<?1??1:?0)+s
s.size&7<1&&\$><<[s.reverse.to_i(2)].pack(?C)}``````

2012年

@res这确实有效。谢谢。

4

## Perl，95个字符

``````\$|=\$_="010";
y///c%8||print pack"B*",/(.{8})\$/while/(.+)\$(?(?{m|.*\$^N(.)|})(?{\$_.=1-\$^N})|(?!))/
``````

`\$|=`严格意义上讲，前三个字符（）并不是必需的...但是，如果没有那个，您通常必须等待脚本完成生成完整的4096字节，然后才能看到任何输出。这将需要几个小时。也许几个世纪了；我不确定。我是否提到过该程序的性能随时间而变差？因此，因此，我感到不得不将它们包括在内。

1