音素アブギダ


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文字の配列を作成できます。

  • 出力の各行には、任意の量の末尾スペースを含めることができます。文字列を生成する場合、単一の末尾改行が含まれる場合があります。

  • プログラムは、任意の長さの母音連鎖を持つ任意の長さの単語に対して正しい出力を生成する必要がありますが、入力語は常に有効であると想定する場合があります。

  • ストレスマーカーがない場合、出力にはオプションで最終的な空の行が含まれることがあります(空または空白を含む)。

  • 最短回答(バイト単位)が優先されます。


悪いɜ、あなたはそれを除外しました:-)そして、英国人は彼らについて不平を言うでしょうɒ
ルイス・メンドー

おっと、やった!を追加ɜしたので、これは完全な一般的なアメリカの母音セットになります。
リン

これらの文字の出現は、競合するゴルフ言語間でバランスを取るために、またはあなたの意見では、実際にどの言語が実際に実行できるかを見つけるための課題の一部であるために、コードベースに関係なく使用される言語で1バイトとしてカウントされます少なくともバイト単位で、期間?
ジョナサンアラン

プログラムが認識すべき子音の後に母音の最大数はありますか?biiiiiiiiiiiʒ「ミツバチではない」のようなテストケースを追加しない場合
-DanTheMan

1
@JonathanAllan後者。Unicode I / Oは課題の一部です。それについてのメモを追加します。
リン

回答:


2

NARS2000 APL、138バイト

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

⍞←出力が暗示されるように、イニシャルを削除できます。また、このように、バイトカウントは文字カウントのちょうど2倍にする必要があります。したがって、これは138バイトでなければなりません。
アダム

1

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

各行の配列を含むUnicode文字の配列を返します(必要な各スペースの単一スペースを含む)

どこで適切な出力をオンラインで取得できるかはまだわかりません(また、ここで適切にテストするためのツールもありません)。
私はへのバージョンをロードしたideoneだけで、英語の子音と母音を使用していること,.、私が準拠するようにテストケースをfudgedているストレスマークとして。


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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.