Aqui está uma lista de algumas ligaduras comuns no Unicode (as que eu poderia criar com minha chave Compose no 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
Você tem duas opções neste desafio: use as ligaduras UTF-8 reais ou use a variante apenas ASCII. Se você usar as variantes reais de ligadura UTF-8, você ganha um bônus de 20%. Se você usar a variante apenas ASCII, poderá assumir que colchetes nunca estarão envolvidos, exceto para indicar uma ligadura.
O desafio: dada uma string como entrada, produza a mesma string
com todas as ligaduras originais substituídas por suas contrapartes expandidas.
- corresponda avidamente:
affib
torna - seaffib
(a[ffi]b
), nãoaffib
(a[ff]ib
) ouaffib
(af[fi]b
).
- corresponda avidamente:
com todas as seqüências de letras "expandidas" substituídas por ligaduras.
- por exemplo,
æOEfoo
([ae]OEfoo
) torna-seaeŒfoo
(ae[OE]foo
).
- por exemplo,
Faça isso de forma totalmente independente: ffi
( [ff]i
) torna-se ffi
( ffi
), não ffi
( [ffi]
).
Parece bastante simples? Há um problema: toda vez que duas não-ligaduras se sobrepõem por exatamente um caractere , as duas ligaduras devem ser inseridas na string. Aqui estão alguns casos de teste para demonstrar:
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
Cuidado: a mesma correspondência gananciosa se aplica (observe especialmente os últimos casos de teste).
code-golf , o código mais curto em bytes vence.
Respostas:
JavaScript (ES6), 213 bytes - bônus de 20% = 170,4
Explicação
Teste
Mostrar snippet de código
fonte
r="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae",x=r.split`|`
ser reescrito comox="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae".split`|`
para -4 bytes?match
chamada requer a sequência separada por|
caracteres.