Фонемічна Абугіда


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.

  • Ви можете створити рядок, що містить нові рядки, або список рядків, що представляють рядки, або масив символів Unicode.

  • Кожен рядок виводу може містити будь-яку кількість пробілів. Якщо ви створюєте рядок, у неї може бути один зворотний новий рядок.

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

  • Якщо немає маркерів напруги, ваш вихід може необов'язково включати остаточний порожній рядок (нічого не містить або пробіли).

  • Найкоротша відповідь (у байтах) виграє.


Погано ɜ, ви його покинули :-) І британці поскарзяться на своєɒ
— Луїс Мендо

На жаль, я! Я додав ɜ, тож це має бути повний загальний загальний американський гласний.
— Лінн

Чи вживання будь-якого з цих символів вважається лише одним байтом на будь-якій мові, незалежно від їх кодової бази, щоб досягти балансу між конкуруючими мовами для гри в гольф, або є частиною завдання, на вашу думку, знайти, яка мова насправді може виконувати це принаймні байти, період?
— Джонатан Аллан

Чи існує максимальна кількість голосних після приголосного, яку наша програма повинна розпізнавати? Якщо не додати тестовий випадок типу biiiiiiiiiiiʒ(Як у "не бджіл")
— DanTheMan

1
@JonathanAllan Останній; Unicode I / O є частиною завдання. Додам до цього записку.
— Лінн

Відповіді:


2

NARS2000 APL, 138 байт

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

Ви можете видалити початковий, ⍞←оскільки вихід має на увазі. Крім того, кількість байтів має бути рівно вдвічі більше символів, відповідно до цього . Отже, це має бути 138 байт.
— Адам

1

Пітон, 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)]

Повертає масив символів унікоду з масивом для кожного рядка (містить окремі пробіли для кожного необхідного простору)

Не впевнений, де можна отримати гідний вихід в Інтернеті (і я навіть не маю інструментів, щоб перевірити його належним чином тут).
Я завантажив версію для 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.