Caracteres
Llamemos a estos caracteres Unicode inglés consonantes IPA :
bdfhjklmnprstvwzðŋɡʃʒθ
Y llamemos a estos caracteres Unicode vocales inglesas IPA :
aeiouæɑɔəɛɜɪʊʌː
(Sí, ː
es solo la marca de la vocal larga, pero trátela como una vocal a los efectos de este desafío).
Finalmente, estas son marcas de estrés primarias y secundarias :
ˈˌ
Tenga en cuenta que
ɡ
( U + 0261 ) no es una g minúscula, y el marcador de tensión primarioˈ
( U + 02C8 ) no es un apóstrofe, yː
( U + 02D0 ) no es un colon.
Tu tarea
Dada una palabra, apila las vocales sobre las consonantes que siguen y coloca los marcadores de énfasis debajo de las consonantes que preceden. (Como sugiere el título de la pregunta, dicho sistema de escritura, donde las secuencias de vocales consonantes se agrupan como una unidad, se llama abugida .) Dada la entrada ˈbætəlʃɪp
, produce la salida:
æə ɪ
btlʃp
ˈ
Se garantiza que una palabra es una cadena de consonantes, vocales y marcas de énfasis, como se definió anteriormente. Nunca habrá marcas de estrés consecutivas, y siempre se colocarán al comienzo de la palabra y / o antes de una consonante.
Casos de prueba
Puede haber vocales consecutivas. Por ejemplo, se kənˌɡrætjʊˈleɪʃən
convierte
ɪ
ə æ ʊeə
knɡrtjlʃn
ˌ ˈ
Si una palabra comienza con una vocal, imprímala en la "línea de base" con las consonantes: se əˈpiːl
convierte
ː
i
əpl
ˈ
Un caso de prueba con una vocal inicial estresada: se ˈælbəˌtrɔs
convierte en
ə ɔ
ælbtrs
ˈ ˌ
Una palabra larga: se ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəs
convierte
æ
ː ː ʊ
uə aə æ əɪ ɪɛ iəoə
sprklfrdʒlstkkspldʃs
ˌ ˌ ˌ ˌ ˌ ˈ
Un ejemplo sin sentido con un diptongo inicial, un montón de apilamiento de vocales y sin marcadores de estrés: se eɪbaeioubaabaaa
convierte
u
o
i a
eaa
ɪaaa
ebbb
Implementación de referencia
Su programa debería producir el mismo resultado que este script de Python:
consonants = 'bdfhjklmnprstvwzðŋɡʃʒθ'
vowels = 'aeiouæɑɔəɛɜɪʊʌː'
stress_marks = 'ˈˌ'
def abugidafy(word):
tiles = dict()
x = y = 0
is_first = True
for c in word:
if c in stress_marks:
tiles[x + 1, 1] = c
elif c in consonants or is_first:
y = 0
x += 1
tiles[x, y] = c
is_first = False
elif c in vowels:
y -= 1
tiles[x, y] = c
is_first = False
else:
raise ValueError('Not an IPA character: ' + c)
xs = [x for (x, y) in tiles.keys()]
ys = [y for (x, y) in tiles.keys()]
xmin, xmax = min(xs), max(xs)
ymin, ymax = min(ys), max(ys)
lines = []
for y in range(ymin, ymax + 1):
line = [tiles.get((x, y), ' ') for x in range(xmin, xmax + 1)]
lines.append(''.join(line))
return '\n'.join(lines)
print(abugidafy(input()))
Reglas
Puede escribir una función o un programa completo.
Si su programa tiene un tipo de carácter / cadena Unicode, puede asumir que las entradas y salidas los usan. Si no es así, o si lee / escribe desde STDIN, use la codificación UTF-8.
Puede producir una cadena que contenga nuevas líneas, o una lista de cadenas que representan filas, o una matriz de caracteres Unicode.
Cada fila de salida puede contener cualquier cantidad de espacios finales. Si produce una cadena, puede tener una nueva línea final.
Su programa debe producir la salida correcta para palabras arbitrariamente largas con cadenas de vocales arbitrariamente largas, pero puede suponer que la palabra de entrada siempre es válida.
Si no hay marcadores de estrés, su salida puede incluir opcionalmente una fila vacía final (que no contiene nada ni espacios).
La respuesta más corta (en bytes) gana.
fuente
ɜ
, lo dejaste afuera :-) Y los británicos se quejarán de suɒ
ɜ
, así que este debería ser un conjunto completo de vocales del general estadounidense ahora.biiiiiiiiiiiʒ
(Como en "not the bees")Respuestas:
NARS2000 APL, 138 bytes
fuente
⍞←
como la salida está implícita. Además, el recuento de bytes debe ser exactamente el doble del recuento de caracteres, según esto . Entonces esto debería ser 138 bytes.Python, 222 bytes
(202 caracteres)
Devuelve una matriz de caracteres unicode con una matriz para cada fila (que contiene espacios individuales para cada espacio requerido)
Todavía no estoy seguro de dónde se puede obtener una salida decente en línea (y ni siquiera tengo las herramientas para probarlo aquí correctamente).
He cargado una versión para ideone que solo usa consonantes y vocales en inglés con
,
y.
como marcas de estrés, donde he falsificado los casos de prueba para que se ajusten.fuente
JavaScript (ES6), 181 bytes
fuente