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.

Lynn
fonte
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←⍞
Oberon
fonte
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.

Jonathan Allan
fonte
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
fonte