Nhà giả kim (1547 byte)
_->In_NN+2b+al+g
al+g+0NN->ak
al+g+NN->ah
ah+b->ah+m+d+z+a
ah+0b->C+Z+Q
Z+j+z->Z+j+d
Z+j+0z->M+s
M+g+b->M+g+r
M+g+h->M+g+d
M+g+0b+0h+q->J+U
J+o+h->J+o+m
J+o+a->J+o+d
J+o+0h+0a->2C+an+Q
an+j+h->an+j+d
an+j+0h->aC+s
aC+g->e+am+P
am+l+b->am+l+d
am+l+0b->al+s
ak+b->ak+m+d
ak+0b->C+aj+Q
aj+j+h->aj+j+b
aj+j+0h->I+n
I+f+e->I+f+a
I+f+b->I+f+m+d+z
I+f+0e+0b->C+ai+Q
ai+j+h->ai+j+b
ai+j+0h->aB+n
aB+f->H
H+z->H+d
H+a+e->H
H+0z+0e->G+i
G+i+0b->ag
G+i+b->az+b+n
az+f+0b->Out_a
az+f+b->G+b+n
G+f->G+t
ag+e->ag
ag+0e->af+t
af+i+e->af+i+a
af+i+0e->Out_a
Q->F+s
F+g+b->F+g+y
F+g+A->F+g
F+g+0b+0A->av+o
av+o+0m->w
av+o+m->m+ae+A
ae+m->ae+b
ae+0m->u+n
u+f+b->u+f+m
u+f+e->u+f+E
u+f+A->u+f+k+c
u+f+0b+0e+0A->ad
ad+c->ad+A
ad+0c->ac
ac+y->ac+d+c
ac+0y->ab
ab+c->ab+y
ab+0c->V+l
V+l+0k->x
V+l+k->aa+t
aa+i+0e->W
aa+i+e->Y
Y+E->Y+D+c
Y+0E->X
X+c->X+E
X+0c->aa+i
W+D->W+e
W+0D->V+P
x+E->x
x+d->x
x+b->x+k
x+0E+0d+0b->aw
aw+h->aw+d
aw+0h->aE+s
aE+g->p
p+b->p+2r
p+k->p+d
p+B->p
p+q->p
p+0b+0k+0B+0q->r+q+av+U
w+h->w+d
w+y->w+r
w+C->w+B+q
w+0h+0y+0C->aD+U
aD+o->j
U->au+s
au+g+b->au+g+d
au+g+0b->v
v+d->d+aA+t
aA+i+k->R
aA+i+0k->at
at+B->at+k+c
at+0B->L
L+c->L+B
L+r->L+b
L+0c+0r->as+n
as+f+b->as+f+r
as+f+0b->R
R+0e->K
R+e+q->ar+D+c
ar+e+q->ar+c
ar+0q->aq
aq+c->aq+q
aq+0c->R
K+D->K+e
K+h->K+b
K+0D+0h->ap+P
ap+l+b->ap+l+h
ap+l+0b->v
v+0d+k->v
v+0d+r->v
v+0d+0k+0r->o
s+0d->g
s+d->d+ao+t
ao+i->ao+P
ao+l->s
P->O+c
O+b->2c+O
O+0b->N
N+c->b+N
N+0c+e->O
N+0c+0e->l
n+b->n+c
n+0b->T
T+c->ay
T+0c->e+n
ay+c->b+T
ay+0c->f
t+d->t+c
t+0d->S
S+c->ax
S+0c->e+t
ax+c->d+S
ax+0c->i
Bản demo trực tuyến .
Lưu ý: điều này khá chậm. Nếu thử nghiệm với trình thông dịch hỗ trợ áp dụng quy tắc nhiều lần cùng một lúc (ví dụ: phiên bản của tôi - mặc dù đảm bảo rằng bạn có phiên bản mới nhất sửa lỗi trong trình phân tích cú pháp) thì bạn có thể tăng tốc đáng kể bằng cách thêm hai quy tắc:
T+2c->b+T
S+2c->d+S
tuyến tính nào thông qua các quy tắc hiện có
T+c->ay
ay+c->b+T
S+c->ax
ax+c->d+S
Bóc tách một phần
Ở cấp độ cao, điều này sử dụng cách tiếp cận tương tự như câu trả lời của tôi.
Mô hình tính toán của Nhà giả kim thực chất là máy đăng ký Minsky . Tuy nhiên, Nhà giả kim rất tiết lộ sự tương đương của mã và dữ liệu và bằng cách cho phép nhiều mã thông báo ở phía bên trái của quy tắc sản xuất một cách hiệu quả, trạng thái không bị giới hạn bởi một nguyên tử: chúng ta có thể sử dụng một bộ nguyên tử và điều này cho phép (không đệ quy) chương trình con. Điều này rất hữu ích cho golf. Điều duy nhất nó thực sự thiếu là macro và khả năng sửa lỗi.
0xMột( 2 A + 1 ) 2xP
e
b
n
b
e
b
t
d
e
d
a, b = b, 0
mở rộng tối thiểu 17 byte:
S+a->S+b
S+0a->T
nơi S
là trạng thái hiện tại và T
là trạng thái tiếp theo. Một "bản sao" không phá hủy thậm chí còn đắt hơn, bởi vì nó phải được thực hiện như một "di chuyển" từ a
đến b
và một phụ trợ tmp
, tiếp theo là "di chuyển" từ tmp
trở lại a
.
Obfuscation
Tôi đã đặt bí danh cho nhiều biến số khác nhau và loại bỏ khoảng 60 trạng thái trong quá trình chơi golf và nhiều trong số chúng không có tên đặc biệt nào, nhưng để đánh golf hoàn toàn, tôi đã viết một bộ giảm thiểu để các tên hiện không thể giải mã được. Chúc may mắn đảo ngược kỹ thuật đó! Đây là công cụ thu nhỏ (trong CJam), đưa ra một vài giả định về mã nhưng có thể được điều chỉnh để giảm thiểu các chương trình Nhà giả kim khác:
e# Obfuscate / minimise Alchemist program
e# Tokenise
qN%[SNS]e_*S%
e# Get token frequencies for substitution purposes, special-casing the I/O ones
_["+" "0" "2" "->" "_" N "In_n" "n" "Out_tmp2" "tmp2"]-
$e`$W%1f=
e# Empirically we want a two-char input for n and a one-char one for tmp2
["In_n" "Out_tmp2" "n" "tmp2"]\+
["In_NN" "Out_a" "NN"] "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"1/:A+ A2m*:e_"NN"a-+
1$,<
er
_s,p