Abugida fonémica

12

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ɪʃənconvierte

      ɪ
ə  æ ʊeə
knɡrtjlʃn
  ˌ   ˈ

Si una palabra comienza con una vocal, imprímala en la "línea de base" con las consonantes: se əˈpiːlconvierte

 ː
 i
əpl
 ˈ

Un caso de prueba con una vocal inicial estresada: se ˈælbəˌtrɔsconvierte en

  ə ɔ 
ælbtrs
ˈ  ˌ  

Una palabra larga: se ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsconvierte

               æ    
ː              ː ʊ  
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ɪbaeioubaabaaaconvierte

 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()))

Pruébalo en Ideone.

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.

Lynn
fuente
Pobre ɜ, lo dejaste afuera :-) Y los británicos se quejarán de suɒ
Luis Mendo
¡Vaya, lo hice! Agregué ɜ, así que este debería ser un conjunto completo de vocales del general estadounidense ahora.
Lynn
Las ocurrencias de cualquiera de estos caracteres solo cuentan como un byte en cualquier idioma que se use, independientemente de su código base, para lograr el equilibrio entre los idiomas de golf competitivos o es parte del desafío, en su opinión, para encontrar qué idioma realmente puede funcionar en al menos bytes, punto?
Jonathan Allan
¿Hay un número máximo de vocales después de una consonante que nuestro programa debería reconocer? Si no, agregue un caso de prueba como biiiiiiiiiiiʒ(Como en "not the bees")
DanTheMan
1
@JonathanAllan El último; Unicode I / O es parte del desafío. Agregaré una nota sobre eso.
Lynn

Respuestas:

2

NARS2000 APL, 138 bytes

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
Oberon
fuente
Puede eliminar la inicial ⍞←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.
Adám
1

Python, 222 bytes

(202 caracteres)

import re
def f(s):y=[w[0]in'ˈˌ'and w or' '+w for w in re.split('([ˈˌ]?[bdfhjklmnprstvwzðŋɡʃʒθ]?[aeiouæɑɔəɛɜɪʊʌː]*)',s)[1::2]];return[[x[i-1:i]or' 'for x in y]for i in range(max(len(w)for w in y),0,-1)]

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.

Jonathan Allan
fuente
1

JavaScript (ES6), 181 bytes

f=
s=>(a=s.match(/[ˈˌ]?.[aeiouæɑɔəɛɜɪʊʌː]*/g).map(s=>/[ˈˌ]/.test(s)?s:` `+s)).map(s=>(l=s.length)>m&&(t=s,m=l),m=0)&&[...t].map(_=>a.map(s=>s[m]||` `,--m).join``).join`
`
;
<input oninput=o.textContent=f(this.value)><pre id=o>

Neil
fuente