IMPORTANT: Please do not post solutions, hints, or other spoilers
until at least 60 hours after the date of this message.
Thanks.
IMPORTANTE: Por favor, no enviéis soluciones, pistas, o cualquier otra
cosa que pueda echar a perder la resolución del problema hasta
que hayan pasado por lo menos 60 horas desde el envío de este
mensaje. Gracias.
IMPORTANT: S'il vous plaît, attendez au minimum 60 heures après la
date de ce message avant de poster solutions, indices ou autres
révélations. Merci.
WICHTIG: Bitte schicken Sie keine Lösungen, Tipps oder Hinweise für
diese Aufgabe vor Ablauf von 60 Stunden nach dem Datum dieser
Mail. Danke.
BELANGRIJK: Stuur aub geen oplossingen, hints of andere tips in de
eerste 60 uur na het verzendingstijdstip van dit
bericht. Waarvoor dank.
VNIMANIE: Pozhalujsta ne shlite reshenija, nameki na reshenija, i
voobshe lyubye podskazki v techenie po krajnej mere 60 chasov
ot daty etogo soobshenija. Spasibo.
Qing3 Zhu4Yi4: Qing3 Ning2 Deng3Dao4 Jie1Dao4 Ben3 Xin4Xi2 Zhi1Hou4 60
Xiao3Shi2, Zai4 Fa1Biao3 Jie3Da2, Ti2Shi4, Huo4 Qi2Ta1 Hui4
Xie4Lou4 Da2An4 De5 Jian4Yi4. Xie4Xie4.
----------------------------------------------------------------
Write a function, 'expand_escapes', which expands escape sequences in
text. Escape sequences have the form
X<.....>
where 'X' is any letter or digit and '.....' is any string that
contains balanced <...> sequences. A backslash before a <, >, or \
removes its special meaning, so, for example,
Ahij> k l m>
is a valid single escape sequence. The arguments to 'expand_escapes'
are the string to be expanded, and a reference to a hash which maps
the escape codes to expansion functions; for example,
expand_escapes("Ahij> k l m>",
{ A => \&expand_a,
D => \&escape_sequence_d,
});
When 'expand_escapes' recognizes an escape sequence, say
W
it should first expand escape sequences in 'some text', if there are
any, removing backslashes where appropriate; then look in the hash to
find the associated function for 'W'; invoke the function, passing the
with the expanded version of 'some text' as the argument, and finally,
replace the entire sequence 'W<...>' with the return value of the
function. It should do this for every escape sequence in its string
argument. The example above should return the value of:
expand_a("a b c " . escape_sequence_d("edfg>hij") . " k l m");
Another example: given these arguments:
expand_escapes("Result: R<12\>34>, S, Rxyz>",
{ R => sub { scalar reverse $_[0] },
S => sub { join " ", split //, $_[0] },
}
);
'expand_escapes' should return the string
"Result: 43>21, G i v e m e p i e !, zyxt x < e tcba"
The function should be efficient, even for large argument strings.