Alice , 17 bytes
/?.R?y.@
\i.!yDo/
Pruébalo en línea!
Explicación
/...@
\.../
Esta es solo la plantilla habitual para el código lineal en modo ordinal. Si desarrollamos esto, el programa real simplemente se convierte en:
i.!?D.?.Ryyo
La idea aquí es similar a la de mi respuesta de CJam . Dado que Alice no tiene una forma fácil de indexar en cadenas con enteros, es más fácil replicar este comportamiento con transliteración ( yen Alice). Sin embargo, la semántica de transliteración de Alice es mucho más general que la de CJam, lo que significa que Alice no solo ignora las asignaciones repetidas. Por ejemplo, si solo quisiéramos transcribir Mmm, marshmallowsa su reverso, esto representaría la siguiente lista de asignaciones:
M -> s
m -> w
m -> o
, -> l
-> l
m -> a
a -> m
r -> h
s -> s
h -> r
m -> a
a -> m
l ->
l -> ,
o -> m
w -> m
s -> M
Tenga en cuenta que lo que tenemos, por ejemplo, m -> w, m -> o, m -> ay m -> a. CJam simplemente descartaría todo excepto el primer mapeo, pero Alice en cambio pasaría por estos. Entonces, el primero mse asignaría a w, el segundo a o, el quinto nuevamente a wy así sucesivamente. En este caso, eso no es útil, porque en general si actuamos yen AAB(para algunas cadenas Ay B) como lo hicimos en CJam, siempre llegaremos a BAlice.
Entonces, ¿cómo calculamos una asignación que funciona y(es decir, cómo descartamos las asignaciones repetidas manualmente)? Por supuesto, al usar otra transliteración. :)
La fuente de la asignación que queremos tiene que ser el meollo de la entrada (es decir, la entrada deduplicada). Si aplicamos la asignación anterior a la protuberancia, entonces cada carácter solo aparece una vez, por lo que solo estamos haciendo uso de la primera de cada una de las asignaciones repetidas. Entonces, al transliterar la protuberancia con la entrada y su reversa, simplemente descartamos las asignaciones duplicadas. Entonces podemos usar la protuberancia y este nuevo resultado como un mapeo para la entrada original. Estoy seguro de que tiene sentido para alguien ...
Entonces el código:
i Read input. ["Mmm, marshmallows"]
.! Store a copy on the tape.
?D Push the nub of the input. ["Mmm, marshmallows" "Mm, arshlow"]
. Duplicate. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow"]
? Retrieve input. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows"]
.R Push its reverse. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows" "swollamhsram ,mmM"]
y Transliterate. ["Mmm, marshmallows" "Mm, arshlow" "swllmhsr mm"]]
y Transliterate. ["swwllwmhsrwm mms"]
o Output. []