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


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.