Фонематический Абугида

12

Персонажи

Давайте назовем эти символы Unicode английскими согласными IPA :

bdfhjklmnprstvwzðŋɡʃʒθ

И давайте назовем эти символы Unicode английскими гласными IPA :

aeiouæɑɔəɛɜɪʊʌː

(Да, ːэто просто длинная гласная метка, но для целей этого вызова обращайтесь с ней как с гласной.)

Наконец, это первичные и вторичные стресс-метки :

ˈˌ

Обратите внимание, что ɡ( U + 0261 ) не является строчной буквой g, а маркер первичного напряжения ˈ( U + 02C8 ) не является апострофом, а ː( U + 02D0 ) не является двоеточием.

Твое задание

Получив слово, сложите гласные поверх согласных, за которыми они следуют, и поместите маркеры напряжения под согласными, которые им предшествуют. (Как подсказывает заголовок вопроса, такая система записи, где последовательности согласных и гласных упакованы вместе как единое целое, называется abugida .) Учитывая входные данные ˈbætəlʃɪp, выведите выходные данные:

æə ɪ
btlʃp
ˈ

Слово гарантированно будет строка согласные, гласные, и стресс марок, как определено выше. Никогда не будет последовательных ударных знаков, и они всегда будут помещаться в начале слова и / или перед согласной.

Контрольные примеры

Там могут быть последовательные гласные. Например, kənˌɡrætjʊˈleɪʃənстановится

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

Если слово начинается с гласного, напечатайте его на «базовой линии» с согласными: əˈpiːlстановится

 ː
 i
əpl
 ˈ

Тестовый пример с начальным ударным гласным: ˈælbəˌtrɔsстановится

  ə ɔ 
ælbtrs
ˈ  ˌ  

Длинное слово: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsстановится

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

Бессмысленный пример с начальным дифтонгом, большим набором гласных и без маркеров стресса: eɪbaeioubaabaaaстановится

 u
 o
 i a
 eaa
ɪaaa
ebbb

Ссылочная реализация

Ваша программа должна выдать тот же вывод, что и скрипт 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()))

Попробуйте это на Ideone.

правила

  • Вы можете написать функцию или полную программу.

  • Если ваша программа имеет символьно-строковый тип Unicode, вы можете предположить, что входы и выходы используют их. Если нет, или вы читаете / пишете из STDIN, используйте кодировку UTF-8.

  • Вы можете создать строку, содержащую символы новой строки, или список строк, представляющих строки, или массив символов Юникода.

  • Каждая строка вывода может содержать любое количество конечных пробелов. Если вы создаете строку, она может содержать один завершающий символ новой строки.

  • Ваша программа должна выдавать правильный вывод для произвольно длинных слов с произвольно длинными цепочками гласных, но может предполагать, что входное слово всегда допустимо.

  • Если маркеров напряжения нет, ваш вывод может дополнительно включать в себя окончательную пустую строку (не содержащую ничего или пробелы).

  • Самый короткий ответ (в байтах) выигрывает.

Линн
источник
Бедный ɜ, ты это не учел :-) И британцы будут жаловаться на ихɒ
Луис Мендо
Ой, я сделал! Я добавил ɜ, так что теперь это должен быть полный набор американских гласных.
Линн
Являются ли вхождения любого из этих символов только одним байтом в любом используемом языке, независимо от их кодовой базы, для обеспечения баланса между конкурирующими языками игры в гольф, или, по вашему мнению, является частью проблемы, чтобы выяснить, какой язык действительно может работать это в минимум байтов, точка?
Джонатан Аллан
Есть ли максимальное число гласных после согласного, которое должна распознавать наша программа? Если не добавить тестовый пример, как biiiiiiiiiiiʒ(Как в «не пчелы»)
DanTheMan
1
@JonathanAllan Последний; Unicode I / O является частью проблемы. Я добавлю заметку об этом.
Линн

Ответы:

2

NARS2000 APL, 138 байтов

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
Oberon
источник
Вы можете удалить начальный, ⍞←поскольку подразумевается вывод. Кроме того, количество байтов должно быть ровно вдвое больше, чем количество символов, согласно этому . Так что это должно быть 138 байтов.
Адам
1

Python, 222 байта

(202 символа)

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

Возвращает массив символов Unicode с массивом для каждой строки (содержащий одиночные пробелы для каждого необходимого пробела)

Не уверен, где можно получить приличный результат в Интернете (и у меня даже нет инструментов для его проверки).
Я загрузил версию для ideone, которая просто использует английские согласные и гласные с,. ударными знаками и в качестве ударных, где я выдумал контрольные примеры для соответствия.

Джонатан Аллан
источник
1

JavaScript (ES6), 181 байт

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>

Нил
источник