Alchemist (1547 bytes)
_->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
Demo online .
Catatan: ini sangat lambat. Jika menguji dengan juru bahasa yang mendukung penerapan aturan beberapa kali sekaligus (mis. Yang saya pakai - walaupun pastikan Anda memiliki versi terbaru yang memperbaiki bug di parser) maka Anda bisa mendapatkan percepatan signifikan dengan menambahkan dua aturan:
T+2c->b+T
S+2c->d+S
yang sebaris rute melalui aturan yang ada
T+c->ay
ay+c->b+T
S+c->ax
ax+c->d+S
Diseksi sebagian
Pada level tinggi, ini menggunakan pendekatan yang sama dengan jawaban CJam saya.
Model perhitungan Alchemist pada dasarnya adalah mesin register Minsky . Namun, Alchemist dengan sangat baik mengekspos kesetaraan kode dan data, dan dengan memungkinkan banyak token di sisi kiri aturan produksi secara efektif negara tidak dibatasi untuk diwakili oleh satu atom: kita dapat menggunakan tupel atom, dan ini memungkinkan (non-rekursif) subrutin. Ini sangat berguna untuk golf. Satu-satunya hal yang benar-benar kurang adalah macro dan debuggability.
Untuk array saya menggunakan fungsi pairing yang dapat diimplementasikan dengan sangat golf di RM. Array kosong diwakili oleh0, dan hasil dari prepending x ke array SEBUAH adalah ( 2 A + 1 ) 2x. Ada satu subrutin yang harus dipasangkan: subrutin ini disebut P
dan menambahkan nilai e
ke b
. Ada dua subrutin untuk tidak n
adil : tidak cocok b
untuk e
dan b
; dan tidak t
berpasangan d
dengan e
dan d
. Ini memungkinkan saya untuk menyimpan sedikit pengocokan data antar variabel, yang penting: operasi "pemindahan" tunggal
a, b = b, 0
memperluas setidaknya 17 byte:
S+a->S+b
S+0a->T
di mana S
keadaan saat ini dan T
adalah keadaan selanjutnya. "Salinan" non-destruktif bahkan lebih mahal, karena harus dilakukan sebagai "perpindahan" dari dan a
ke b
pembantu tmp
, diikuti dengan "perpindahan" dari tmp
belakang ke a
.
Kebingungan
Saya alias berbagai variabel satu sama lain dan menghilangkan sekitar 60 negara dalam proses golf program, dan banyak dari mereka tidak memiliki nama yang sangat berarti, tetapi untuk sepenuhnya golf saya menulis sebuah minimiser sehingga nama-nama sekarang benar-benar tidak dapat diuraikan. Semoga berhasil, balikkan tekniknya! Berikut adalah minimiser (dalam CJam), yang membuat beberapa asumsi tentang kode tetapi dapat diadaptasi untuk meminimalkan program Alchemist lainnya:
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