Alchimiste (1547 octets)
_->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
Démo en ligne .
Remarque: c'est assez lent. Si vous testez avec un interpréteur qui prend en charge l'application d'une règle plusieurs fois à la fois (par exemple la mienne - bien que assurez-vous que vous disposez de la dernière version qui corrige un bogue dans l'analyseur), vous pouvez obtenir une accélération significative en ajoutant deux règles:
T+2c->b+T
S+2c->d+S
qui alignent un itinéraire à travers les règles existantes
T+c->ay
ay+c->b+T
S+c->ax
ax+c->d+S
Dissection partielle
À un niveau élevé, cela utilise la même approche que ma réponse CJam.
Le modèle de calcul d'Alchemist est essentiellement la machine à registres Minsky . Cependant, Alchemist expose très bien l'équivalence du code et des données, et en autorisant de nombreux jetons sur le côté gauche d'une règle de production, l'état n'est pas contraint d'être représenté par un atome: nous pouvons utiliser un tuple d'atomes, et cela autorise les sous-programmes (non récursifs). Ceci est très utile pour le golf. Les seules choses qui manquent vraiment sont les macros et le débogage.
Pour les tableaux, j'utilise une fonction de couplage qui peut être implémentée de manière assez golfique dans les RM. Le tableau vide est représenté par0et le résultat du pré-paiement X mettre en réseau UNE est ( 2 A + 1 ) 2X. Il existe un sous-programme à associer: le sous-programme est appelé P
et il ajoute la valeur de e
à b
. Il existe deux sous-routines à n
dissocier : les dissociations b
de e
et b
; et t
dissocie d
vers e
et d
. Cela m'a permis d'économiser pas mal de données mélangées entre les variables, ce qui est important: une seule opération de "déplacement"
a, b = b, 0
s'étend à au moins 17 octets:
S+a->S+b
S+0a->T
où S
est l'état actuel et T
l'état suivant. Une "copie" non destructive est encore plus coûteuse, car elle doit être effectuée comme un "déplacement" de a
vers b
et un auxiliaire tmp
, suivi d'un "déplacement" de tmp
retour vers a
.
Obfuscation
Je me suis aliasé diverses variables et j'ai éliminé environ 60 états dans le processus de golf du programme, et beaucoup d'entre eux n'avaient pas de noms particulièrement significatifs de toute façon, mais pour le jouer pleinement, j'ai écrit un minimiseur afin que les noms soient maintenant complètement indéchiffrables. Bonne chance en ingénierie inverse! Voici le minimiseur (dans CJam), qui fait quelques hypothèses sur le code mais pourrait être adapté pour minimiser d'autres programmes Alchemist:
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