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ʃɪp
erzeugen 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ɪʃən
wird
ɪ
ə æ ʊeə
knɡrtjlʃn
ˌ ˈ
Wenn ein Wort mit einem Vokal beginnt, drucken Sie es auf der "Grundlinie" mit den Konsonanten: əˈpiːl
wird
ː
i
əpl
ˈ
Ein Testfall mit einem ersten, betonten Vokal: ˈælbəˌtrɔs
wird
ə ɔ
ælbtrs
ˈ ˌ
Ein langes Wort: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəs
wird
æ
ː ː ʊ
uə aə æ əɪ ɪɛ iəoə
sprklfrdʒlstkkspldʃs
ˌ ˌ ˌ ˌ ˌ ˈ
Ein unsinniges Beispiel mit einem anfänglichen Diphthong, viel Vokalstapel und keinen Stressmarkern: eɪbaeioubaabaaa
wird
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()))
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.
ɜ
, also sollte dies jetzt ein vollständiger allgemeiner amerikanischer Vokal sein.
biiiiiiiiiiiʒ
(Wie in "nicht die Bienen")
ɜ
, du hast es ausgelassen :-) Und die Briten werden sich über ihreɒ