Abugida fonêmica


12

Personagens

Vamos chamar essas consoantes IPA em inglês de caracteres Unicode :

bdfhjklmnprstvwzðŋɡʃʒθ

E vamos chamar esses caracteres Unicode de vogais IPA em inglês :

aeiouæɑɔəɛɜɪʊʌː

(Sim, ːé apenas a marca da vogal longa, mas trate-a como uma vogal para o objetivo deste desafio.)

Finalmente, essas são estrias primárias e secundárias :

ˈˌ

Observe que ɡ( U + 0261 ) não é um g minúsculo, e o marcador de estresse primário ˈ( U + 02C8 ) não é um apóstrofo, e ː( U + 02D0 ) não é um cólon.

Sua tarefa

Dada uma palavra, empilhe as vogais em cima das consoantes que seguem e coloque os marcadores de tensão sob as consoantes que precedem. (Como o título da pergunta sugere, esse sistema de escrita, em que sequências consoantes-vogais são agrupadas como uma unidade, é chamado de abugida .) Dada a entrada ˈbætəlʃɪp, produza a saída:

æə ɪ
btlʃp
ˈ

Uma palavra é garantida como uma sequência de consoantes, vogais e marcas de estresse, conforme definido acima. Nunca haverá estresses consecutivos, e eles sempre serão colocados no início da palavra e / ou antes de uma consoante.

Casos de teste

Pode haver vogais consecutivas. Por exemplo, kənˌɡrætjʊˈleɪʃəntorna-se

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

Se uma palavra começar com uma vogal, imprima-a na “linha de base” com as consoantes: əˈpiːltorna - se

 ː
 i
əpl
 ˈ

Um caso de teste com uma vogal estressada inicial: ˈælbəˌtrɔstorna - se

  ə ɔ 
ælbtrs
ˈ  ˌ  

Uma palavra longa: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəstorna - se

               æ    
ː              ː ʊ  
uə aə æ əɪ ɪɛ  iəoə 
sprklfrdʒlstkkspldʃs
ˌ  ˌ ˌ   ˌ  ˌ    ˈ  

Um exemplo sem sentido com um ditongo inicial, muito empilhamento de vogais e sem marcadores de estresse: eɪbaeioubaabaaatorna - se

 u
 o
 i a
 eaa
ɪaaa
ebbb

Implementação de referência

Seu programa deve produzir a mesma saída que este script 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()))

Experimente em Ideone.

Regras

  • Você pode escrever uma função ou um programa completo.

  • Se o seu programa possui um tipo de caractere / string Unicode, você pode assumir que entradas e saídas as utilizam. Caso contrário, ou você lê / escreve em STDIN, use a codificação UTF-8.

  • Você pode produzir uma sequência contendo novas linhas, uma lista de sequências representando linhas ou uma matriz de caracteres Unicode.

  • Cada linha de saída pode conter qualquer quantidade de espaços à direita. Se você produzir uma sequência, ela poderá ter uma única nova linha à direita.

  • Seu programa deve produzir a saída correta para palavras arbitrariamente longas com cadeias de vogais arbitrariamente longas, mas pode assumir que a palavra de entrada é sempre válida.

  • Se não houver marcadores de tensão, sua saída poderá incluir opcionalmente uma linha vazia final (sem nada ou espaços).

  • A resposta mais curta (em bytes) vence.


Pobre ɜ, você o deixou de fora :-) E os britânicos vão reclamar dos seusɒ
— Luis Mendo

Opa, eu fiz! Eu adicionei ɜ, então essa deve ser uma vogal geral da General American definida agora.
— Lynn

As ocorrências de qualquer um desses caracteres contam apenas como um byte, independentemente do idioma usado, independentemente de sua base de códigos, a fim de encontrar o equilíbrio entre os idiomas de golfe concorrentes ou faz parte do desafio, na sua opinião, de descobrir qual idioma pode realmente funcionar em menos bytes, ponto final?
— Jonathan Allan

Existe um número máximo de vogais após uma consoante que nosso programa deve reconhecer? Caso contrário, adicione um caso de teste como biiiiiiiiiiiʒ(como em "not the bees")
— DanTheMan

1
@JonathanAllan O último; A E / S Unicode faz parte do desafio. Vou adicionar uma nota sobre isso.
— Lynn

Respostas:


2

NARS2000 APL, 138 bytes

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞

Você pode remover a inicial ⍞←conforme a saída está implícita. Além disso, a contagem de bytes deve ser exatamente o dobro da contagem de caracteres, conforme isso . Portanto, isso deve ser 138 bytes.
— Adám 12/09/16

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

Retorna uma matriz de caracteres unicode com uma matriz para cada linha (contendo espaços únicos para cada espaço necessário)

Ainda não sei onde é possível obter uma produção decente on-line (e eu nem tenho as ferramentas para testá-la corretamente aqui também).
Carreguei uma versão para ideone que apenas usa consoantes e vogais em inglês com ,e .como marcas de estresse, onde falsifiquei os casos de teste para estar em conformidade.


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>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.