Fonemiczny Abugida

12

Postacie

Nazwijmy te znaki Unicode angielskimi spółgłosek IPA :

bdfhjklmnprstvwzðŋɡʃʒθ

Nazwijmy te znaki Unicode angielskimi samogłoskami IPA :

aeiouæɑɔəɛɜɪʊʌː

(Tak, ːto tylko długi znak samogłoski, ale traktuj go jako samogłoskę do celów tego wyzwania).

Wreszcie są to pierwotne i wtórne znaki stresu :

ˈˌ

Zauważ, że ɡ( U + 0261 ) nie jest małą literą g, a główny marker stresu ˈ( U + 02C8 ) nie jest apostrofem, a ː( U + 02D0 ) nie jest dwukropkiem.

Twoje zadanie

Przy danym słowie ułóż samogłoski na podążających za nimi spółgłosek i umieść znaczniki naprężenia pod spółgłosek, które poprzedzają. (Jak sugeruje tytuł pytania, taki system pisania, w którym sekwencje spółgłoskowo-samogłoskowe są spakowane razem jako jednostka, nazywa się abugida .) Biorąc pod uwagę dane wejściowe ˈbætəlʃɪp, uzyskaj wynik:

æə ɪ
btlʃp
ˈ

Słowo jest gwarancją ciąg spółgłosek, samogłosek i znaków stresu, jak zdefiniowano powyżej. Nigdy nie będzie kolejnych znaków naprężenia i zawsze będą one umieszczane na początku słowa i / lub przed spółgłoską.

Przypadki testowe

Mogą występować kolejne samogłoski. Na przykład kənˌɡrætjʊˈleɪʃənstaje się

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

Jeśli słowo zaczyna się od samogłoski, wydrukuj je na „linii bazowej” ze spółgłoskami: əˈpiːlstaje się

 ː
 i
əpl
 ˈ

Przypadek testowy z początkową, zaakcentowaną samogłoską: ˈælbəˌtrɔsstaje się

  ə ɔ 
ælbtrs
ˈ  ˌ  

Długie słowo: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsstaje się

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

Bzdurny przykład z początkowym dyftongiem, dużą ilością stosów samogłosek i bez znaczników stresu: eɪbaeioubaabaaastaje się

 u
 o
 i a
 eaa
ɪaaa
ebbb

Realizacja referencyjna

Twój program powinien generować takie same dane wyjściowe jak ten skrypt w języku 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()))

Wypróbuj na Ideone.

Zasady

  • Możesz napisać funkcję lub pełny program.

  • Jeśli twój program ma znak / ciąg znaków Unicode, możesz założyć, że dane wejściowe i wyjściowe wykorzystują je. Jeśli nie, lub czytasz / piszesz ze STDIN, użyj kodowania UTF-8.

  • Możesz utworzyć ciąg zawierający znaki nowego wiersza lub listę ciągów reprezentujących wiersze lub tablicę znaków Unicode.

  • Każdy wiersz wyniku może zawierać dowolną liczbę końcowych spacji. Jeśli utworzysz ciąg znaków, może on mieć pojedynczą nową linię.

  • Twój program powinien wygenerować poprawny wynik dla dowolnie długich słów z dowolnie długimi łańcuchami samogłosek, ale może założyć, że słowo wejściowe jest zawsze poprawne.

  • Jeśli nie ma znaczników naprężenia, dane wyjściowe mogą opcjonalnie zawierać ostatni pusty wiersz (nie zawierający niczego lub spacji).

  • Najkrótsza odpowiedź (w bajtach) wygrywa.

Lynn
źródło
Słabo ɜ, pominęłeś :-) A Brytyjczycy będą narzekać na ichɒ
Luisa Mendo
Ups! Dodałem ɜ, więc powinien to być teraz pełny zestaw samogłosek amerykańskich.
Lynn,
Występowania któregokolwiek z tych znaków należy liczyć tylko jako jeden bajt w dowolnym języku, niezależnie od podstawy kodu, w celu znalezienia równowagi między konkurującymi językami golfowymi lub stanowi część, Twoim zdaniem, wyzwania, aby ustalić, który język może faktycznie działać to co najmniej bajty, kropka?
Jonathan Allan,
Czy po spółgłosce istnieje maksymalna liczba samogłosek, którą nasz program powinien rozpoznać? Jeśli nie, dodaj przypadek testowy, taki jak biiiiiiiiiiiʒ(jak w „nie pszczołach”)
DanTheMan,
1
@JonathanAllan The Last; Unicode I / O jest częścią wyzwania. Dodam notatkę na ten temat.
Lynn,

Odpowiedzi:

2

NARS2000 APL, 138 bajtów

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
Oberon
źródło
Możesz usunąć wartość początkową, ⍞←ponieważ wynik jest domyślny. Ponadto liczba bajtów powinna być dokładnie dwa razy większa niż liczba znaków, zgodnie z tym . Powinno to wynosić 138 bajtów.
Adám
1

Python, 222 bajty

(202 znaków)

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

Zwraca tablicę znaków Unicode z tablicą dla każdego wiersza (zawierającą pojedyncze spacje dla każdego wymaganego miejsca)

Nie jestem pewien, gdzie można uzyskać przyzwoitą wydajność online (nie mam nawet narzędzi do jej prawidłowego przetestowania).
Mam załadowany wersję do ideone że używa tylko spółgłoski i samogłoski z angielskiego ,i .jako znaki stresu, gdzie mam fudged przypadków testowych zgodności.

Jonathan Allan
źródło
1

JavaScript (ES6), 181 bajtów

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
źródło