Fonemik Abugida


12

Karakterler

Bu Unicode karakterlerine İngilizce IPA ünsüzleri diyelim :

bdfhjklmnprstvwzðŋɡʃʒθ

Ve şu Unicode karakterlerine İngilizce IPA ünlüleri diyelim :

aeiouæɑɔəɛɜɪʊʌː

(Evet, ːsadece uzun sesli harftir, ancak bu zorluğun amacı için bir sesli harf olarak ele alın.)

Son olarak, bunlar birincil ve ikincil stres işaretleri :

ˈˌ

Not ɡ( U +, 0261 ), bir küçük g değildir ve birinci gerilim belirteç ˈ( u + 02C8 ) bir kesme işareti değildir ve ː( u + 02D0 ), bir kolon değildir.

Senin görevin

Bir kelime söyledikçe, ünlüleri takip ettikleri ünsüzlerin üstüne koyun ve stres işaretlerini önünde bulundukları ünsüzlerin altına yerleştirin. (Soru başlığı ipucu olarak, ünsüz sesli harf dizilerinin bir birim olarak bir araya getirildiği böyle bir yazma sistemine abugida denir .) Girdi göz önüne alındığında ˈbætəlʃɪp, çıktıyı üretin:

æə ɪ
btlʃp
ˈ

Bir kelimenin , yukarıda tanımlandığı gibi bir ünsüz, sesli harf ve stres işareti olduğu garanti edilir. Asla ardışık stres işaretleri olmayacak ve her zaman kelimenin başına ve / veya bir ünsüzden önce yerleştirilecektir.

Test senaryoları

Ardıl ünlüler olabilir. Örneğin, kənˌɡrætjʊˈleɪʃənolur

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

Bir kelime sesli harfle başlıyorsa, ünsüzlerle "taban çizgisine" yazdırın: əˈpiːlolur

 ː
 i
əpl
 ˈ

İlk, stresli sesli harfleri olan bir test vakası: ˈælbəˌtrɔsolur

  ə ɔ 
ælbtrs
ˈ  ˌ  

Uzun bir kelime: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsolur

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

İlk diphthong, çok sayıda sesli harf istifleme ve stres işareti olmayan saçma bir örnek: eɪbaeioubaabaaaolur

 u
 o
 i a
 eaa
ɪaaa
ebbb

Referans uygulaması

Programınız bu Python betiğiyle aynı çıktıyı üretmelidir:

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 üzerinde deneyin.

kurallar

  • Bir işlev veya tam bir program yazabilirsiniz.

  • Programınızın Unicode karakter / dize türü varsa, girişlerin ve çıkışların bunları kullandığını varsayabilirsiniz. Değilse veya STDIN'den okuma / yazma işlemi yaparsanız, UTF-8 kodlamasını kullanın.

  • Yeni satırlar içeren bir dize veya satırları temsil eden bir dize listesi veya bir Unicode karakter dizisi üretebilirsiniz.

  • Her çıktı sırası herhangi bir miktarda arka boşluk içerebilir. Bir dize oluşturursanız, tek bir sondaki yeni satır olabilir.

  • Programınız keyfi olarak uzun sesli harf zincirlerine sahip rastgele uzun kelimeler için doğru çıktıyı üretmelidir, ancak giriş kelimesinin her zaman geçerli olduğunu varsayabilir.

  • Stres işareti yoksa, çıktınız isteğe bağlı olarak son boş satır içerebilir (hiçbir şey veya boşluk içermez).

  • En kısa cevap (bayt cinsinden) kazanır.


Zavallı ɜ, dışarıda bıraktın :-) Ve İngilizler şikayet edecekɒ
Luis Mendo

Hata! Ekledim ɜ, bu yüzden şimdi tam bir Amerikan geneli sesli harf olmalı.
Lynn

Bu karakterlerden herhangi birinin oluşumları, rakip golf dilleri arasında dengeyi sağlamak için kod tabanlarına bakılmaksızın hangi dilde kullanılırsa kullanılsın yalnızca hangi bayt olarak sayılıyor veya size göre, hangi dilin gerçekten performans gösterebileceğini bulmak için en azından bayt, süre?
Jonathan Allan

Programımızın tanıması gereken bir ünsüzden sonra maksimum sayıda sesli harf var mı? Değilse biiiiiiiiiiiʒ("arılar değil" gibi) bir test örneği eklemek
DanTheMan

1
@JonathanAllan İkincisi; Unicode G / Ç zorluğun bir parçasıdır. Bununla ilgili bir not ekleyeceğim.
Lynn

Yanıtlar:


2

NARS2000 APL, 138 bayt

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

⍞←Çıktıyı ima ettiği için ilk harfi kaldırabilirsiniz . Ayrıca, bayt sayısı tam başına iki kat karakter sayısı olmalıdır bu . Bu 138 bayt olmalıdır.
07

1

Python, 222 bayt

(202 karakter)

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

Her satır için bir dizi içeren (gerekli her boşluk için tek boşluklar içeren) bir unicode karakter dizisi döndürür

Biri henüz çevrimiçi iyi bir çıktı alabilirsiniz emin değilim (ve ben bile burada düzgün test etmek için araçlar yok). İdeone'e sadece İngilizce ünsüzleri ve sesli harfleri stres işaretleri olan ve stres işaretleri olarak kullanan
bir sürüm yükledim , burada test senaryolarına uymak için hazırladım .,.


1

JavaScript (ES6), 181 bayt

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.