Вот список некоторых распространенных лигатур в Юникоде (те, которые я мог создать с помощью своего ключа Compose в Debian):
Orig Ascii Lig
ae [ae] æ
AE [AE] Æ
oe [oe] œ
OE [OE] Œ
ij [ij] ij
IJ [IJ] IJ
ff [ff] ff
fi [fi] fi
fl [fl] fl
ffi [ffi] ffi
ffl [ffl] ffl
У вас есть два варианта в этой задаче: использовать фактические лигатуры UTF-8 или использовать вариант только для ASCII. Если вы используете настоящие варианты лигатур UTF-8, вы получаете бонус 20%. Если вы используете вариант только для ASCII, вы можете предположить, что квадратные скобки никогда не будут использоваться, кроме как для обозначения лигатуры.
Задача: дать строку в качестве входных данных, вывести ту же строку
со всеми оригинальными лигатурами, замененными их расширенными аналогами.
- сопоставлять с жадностью:
affib
становитсяaffib
(a[ffi]b
), а неaffib
(a[ff]ib
) илиaffib
(af[fi]b
).
- сопоставлять с жадностью:
со всеми "расширенными" последовательностями букв, замененными лигатурами.
- например,
æOEfoo
([ae]OEfoo
) становитсяaeŒfoo
(ae[OE]foo
).
- например,
Сделайте это полностью независимо: ffi
( [ff]i
) становится ffi
( ffi
), а не ffi
( [ffi]
).
Звучит достаточно просто? Подвох: каждый раз, когда две нелигатуры перекрываются ровно одним символом , обе лигатуры должны быть вставлены в строку. Вот несколько тестовых примеров для демонстрации:
Input Ascii-output Output
fij [fi][ij] fiij
fIJ f[IJ] fIJ * remember, capitalization matters!
fffi [ff][ffi] ffffi
fff [ff][ff] ffff
ffffi [ff][ff][ffi] ffffffi
ffffij [ff][ff][ffi][ij] ffffffiij
Будьте осторожны: применяется то же жадное сопоставление (обратите внимание, особенно на последние несколько тестовых случаев).
code-golf , поэтому выигрывает самый короткий код в байтах.