Abugida fonemik

12

Karakter

Sebut saja karakter Unicode ini konsonan IPA Bahasa Inggris :

bdfhjklmnprstvwzðŋɡʃʒθ

Dan mari kita sebut karakter Unicode vokal IPA Bahasa Inggris ini :

aeiouæɑɔəɛɜɪʊʌː

(Ya, ːitu hanya tanda vokal panjang, tetapi perlakukan itu sebagai vokal untuk tujuan tantangan ini.)

Akhirnya, ini adalah tanda stres primer dan sekunder :

ˈˌ

Perhatikan bahwa ɡ( U + 0261 ) bukan huruf kecil g, dan penanda stres primer ˈ( U + 02C8 ) bukan merupakan tanda kutip, dan ː( U + 02D0 ) bukan titik dua.

Tugas Anda

Diberi kata, susun huruf vokal di atas konsonan yang mereka ikuti, dan tempatkan penanda tegangan di bawah konsonan yang didahului. (Seperti yang ditunjukkan oleh judul pertanyaan, sistem penulisan seperti itu, di mana sekuens konsonan-vokal dikemas bersama sebagai satu unit, disebut abugida .) Berdasarkan input ˈbætəlʃɪp, hasilkan output:

æə ɪ
btlʃp
ˈ

Sebuah kata dijamin menjadi serangkaian konsonan, vokal, dan tanda tekanan, sebagaimana didefinisikan di atas. Tidak akan pernah ada tanda stres berturut-turut, dan mereka akan selalu ditempatkan pada awal kata dan / atau sebelum konsonan.

Uji kasus

Mungkin ada vokal berturut-turut. Misalnya, kənˌɡrætjʊˈleɪʃənmenjadi

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

Jika sebuah kata dimulai dengan vokal, cetaklah pada "garis dasar" dengan konsonan: əˈpiːlmenjadi

 ː
 i
əpl
 ˈ

Sebuah test case dengan huruf vokal awal yang ditekankan: ˈælbəˌtrɔsmenjadi

  ə ɔ 
ælbtrs
ˈ  ˌ  

Kata yang panjang: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəsmenjadi

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

Contoh omong kosong dengan diftong awal, banyak susunan vokal, dan tanpa penanda stres: eɪbaeioubaabaaamenjadi

 u
 o
 i a
 eaa
ɪaaa
ebbb

Implementasi referensi

Program Anda harus menghasilkan output yang sama dengan skrip Python ini:

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

Cobalah di Ideone.

Aturan

  • Anda dapat menulis fungsi atau program lengkap.

  • Jika program Anda memiliki karakter Unicode / tipe string, Anda dapat mengasumsikan input dan output menggunakannya. Jika tidak, atau Anda membaca / menulis dari STDIN, gunakan pengodean UTF-8.

  • Anda dapat menghasilkan string yang berisi baris baru, atau daftar string yang mewakili baris, atau array karakter Unicode.

  • Setiap baris output dapat berisi jumlah spasi tambahan. Jika Anda menghasilkan string, itu mungkin memiliki satu baris tambahan.

  • Program Anda harus menghasilkan output yang benar untuk kata-kata panjang sewenang-wenang dengan rantai vokal panjang sewenang-wenang, tetapi dapat mengasumsikan bahwa kata input selalu valid.

  • Jika tidak ada penanda tegangan, output Anda dapat secara opsional menyertakan baris kosong terakhir (tidak mengandung apa-apa, atau spasi).

  • Jawaban terpendek (dalam byte) menang.

Lynn
sumber
Kasihan ɜ, Anda meninggalkannya :-) Dan Inggris akan mengeluh tentang merekaɒ
Luis Mendo
Ups, saya lakukan! Saya menambahkan ɜ, jadi ini harus menjadi set lengkap vokal Jenderal Amerika sekarang.
Lynn
Apakah kemunculan salah satu karakter ini hanya dihitung sebagai satu byte di mana bahasa apa pun yang digunakan terlepas dari basis kode mereka untuk mencapai keseimbangan antara bahasa golf yang bersaing atau merupakan bagian dari tantangan, menurut Anda, untuk menemukan bahasa mana yang benar-benar dapat melakukan setidaknya dalam byte, titik?
Jonathan Allan
Apakah ada jumlah maksimum vokal setelah konsonan yang harus dikenali oleh program kami? Jika tidak menambahkan test case seperti biiiiiiiiiiiʒ(Seperti pada "not the bees")
DanTheMan
1
@JonathanAllan Yang terakhir; Unicode I / O adalah bagian dari tantangan. Saya akan menambahkan catatan tentang itu.
Lynn

Jawaban:

2

NARS2000 APL, 138 byte

⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
Oberon
sumber
Anda dapat menghapus inisial ⍞←saat output tersirat. Juga, jumlah byte harus tepat dua kali jumlah karakter, sesuai ini . Jadi ini harus 138 byte.
Adám
1

Python, 222 byte

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

Mengembalikan array karakter unicode dengan array untuk setiap baris (berisi spasi tunggal untuk setiap ruang yang diperlukan)

Tidak yakin di mana orang bisa mendapatkan output yang layak secara online (dan saya bahkan belum punya alat untuk mengujinya dengan baik di sini).
Saya telah memuat versi ke ideone yang hanya menggunakan konsonan dan vokal bahasa Inggris dengan ,dan .sebagai tanda stres, di mana saya telah memalsukan kasus uji agar sesuai.

Jonathan Allan
sumber
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
sumber