Phonemisches Abugida

12

Zeichen

Nennen wir diese Unicode-Zeichen englische IPA-Konsonanten :

bdfhjklmnprstvwzðŋɡʃʒθ

Und nennen wir diese Unicode-Zeichen englische IPA-Vokale :

aeiouæɑɔəɛɜɪʊʌː

(Ja, es ːist nur das lange Vokalzeichen, aber behandeln Sie es als einen Vokal für den Zweck dieser Herausforderung.)

Schließlich sind dies primäre und sekundäre Spannungsspuren :

ˈˌ

Beachten Sie, dass ɡ( U + 0261 ) kein Kleinbuchstabe g ist und der primäre Spannungsmarker ˈ( U + 02C8 ) kein Apostroph und ː( U + 02D0 ) kein Doppelpunkt ist.

Deine Aufgabe

Stapeln Sie mit einem Wort die Vokale auf die Konsonanten, denen sie folgen, und platzieren Sie die Spannungsmarkierungen unter den Konsonanten, denen sie vorangehen. (Wie der Fragentitel andeutet, wird ein solches Schriftsystem, bei dem Konsonant-Vokal-Sequenzen als Einheit gepackt sind, als Abugida bezeichnet .) Bei gegebener Eingabe ˈbætəlʃɪperzeugen Sie die Ausgabe:

æə ɪ
btlʃp
ˈ

Ein Wort besteht garantiert aus einer Reihe von Konsonanten, Vokalen und Betonungszeichen, wie oben definiert. Es wird niemals aufeinanderfolgende Betonungszeichen geben, und sie werden immer am Anfang des Wortes und / oder vor einem Konsonanten platziert.

Testfälle

Es kann aufeinanderfolgende Vokale geben. Zum Beispiel kənˌɡrætjʊˈleɪʃənwird

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

Wenn ein Wort mit einem Vokal beginnt, drucken Sie es auf der "Grundlinie" mit den Konsonanten: əˈpiːlwird

 ː
 i
əpl
 ˈ

Ein Testfall mit einem ersten, betonten Vokal: ˈælbəˌtrɔswird

  ə ɔ 
ælbtrs
ˈ  ˌ  

Ein langes Wort: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəswird

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

Ein unsinniges Beispiel mit einem anfänglichen Diphthong, viel Vokalstapel und keinen Stressmarkern: eɪbaeioubaabaaawird

 u
 o
 i a
 eaa
ɪaaa
ebbb

Referenzimplementierung

Ihr Programm sollte dieselbe Ausgabe wie dieses Python-Skript erzeugen:

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

Probieren Sie es auf Ideone.

Regeln

  • Sie können eine Funktion oder ein vollständiges Programm schreiben.

  • Wenn Ihr Programm einen Unicode-Zeichen- / String-Typ hat, können Sie davon ausgehen, dass Ein- und Ausgaben diese verwenden. Wenn dies nicht der Fall ist oder Sie von STDIN aus lesen / schreiben, verwenden Sie die UTF-8-Codierung.

  • Sie können eine Zeichenfolge mit Zeilenumbrüchen oder eine Liste von Zeichenfolgen, die Zeilen darstellen, oder ein Array von Unicode-Zeichen erstellen.

  • Jede Ausgabezeile kann beliebig viele nachgestellte Leerzeichen enthalten. Wenn Sie eine Zeichenfolge erstellen, wird möglicherweise nur eine Zeile am Zeilenende nachgestellt.

  • Ihr Programm sollte die richtige Ausgabe für beliebig lange Wörter mit beliebig langen Vokalketten erzeugen, kann jedoch davon ausgehen, dass das Eingabewort immer gültig ist.

  • Wenn keine Belastungsmarkierungen vorhanden sind, kann Ihre Ausgabe optional eine letzte leere Zeile enthalten (die nichts oder Leerzeichen enthält).

  • Die kürzeste Antwort (in Bytes) gewinnt.

Lynn
quelle
Arm ɜ, du hast es ausgelassen :-) Und die Briten werden sich über ihreɒ
Luis Mendo
Hoppla, das habe ich getan! Ich fügte hinzu ɜ, also sollte dies jetzt ein vollständiger allgemeiner amerikanischer Vokal sein.
Lynn
Werden Vorkommen eines dieser Zeichen unabhängig von ihrer Codebasis nur als ein Byte in der jeweils verwendeten Sprache gezählt, um ein Gleichgewicht zwischen konkurrierenden Golfsprachen herzustellen, oder ist es Ihrer Meinung nach Teil der Herausforderung, herauszufinden, welche Sprache tatsächlich funktioniert es in mindestens Bytes, Punkt?
Jonathan Allan
Gibt es eine maximale Anzahl von Vokalen nach einem Konsonanten, die unser Programm erkennen sollte? Wenn nicht, fügen Sie einen Testfall wie biiiiiiiiiiiʒ(Wie in "nicht die Bienen")
DanTheMan
1
@ JonathanAllan Letzteres; Unicode I / O ist Teil der Herausforderung. Ich werde eine Anmerkung dazu hinzufügen.
Lynn

Antworten:

2

NARS2000 APL, 138 Bytes

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
Oberon
quelle
Sie können die Initiale entfernen, ⍞←wenn die Ausgabe impliziert ist. Auch sollte Byteanzahl genau das Doppelte der Anzahl der Zeichen, wie pro diese . Das sollten also 138 Bytes sein.
Adám
1

Python, 222 Bytes

(202 Zeichen)

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

Gibt ein Array von Unicode-Zeichen mit einem Array für jede Zeile zurück (mit einzelnen Leerzeichen für jedes erforderliche Leerzeichen).

Ich bin mir nicht sicher, wo man noch eine anständige Ausgabe online bekommen kann (und ich habe nicht einmal die Werkzeuge, um sie hier richtig zu testen).
Ich habe eine Version zu ideone geladen , die nur englische Konsonanten und Vokale mit ,und .als Stressmarkierungen verwendet, wobei ich die Testfälle durcheinandergebracht habe, um sie anzupassen.

Jonathan Allan
quelle
1

JavaScript (ES6), 181 Byte

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
quelle