Phonemic Abugida


12

ตัวละคร

มาเรียกตัวอักษรยูนิโค้ดเหล่านี้ว่าตัวอักษร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

  • เอาต์พุตแต่ละแถวอาจมีช่องว่างต่อท้ายจำนวนเท่าใดก็ได้ หากคุณสร้างสตริงมันอาจมีการขึ้นบรรทัดใหม่ต่อท้ายเดียว

  • โปรแกรมของคุณควรสร้างผลลัพธ์ที่ถูกต้องสำหรับคำที่ยาวโดยพลการที่มีสระเสียงยาวโดยพลการ แต่อาจคิดว่าคำที่ป้อนนั้นถูกต้องเสมอ

  • หากไม่มีเครื่องหมายระบุความกดดันเอาท์พุทของคุณอาจรวมแถวว่างสุดท้ายไว้ (ไม่มีสิ่งใดหรือเว้นวรรค)

  • คำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ


แย่ɜคุณออก :-) และอังกฤษจะบ่นเกี่ยวกับพวกเขาɒ
Luis Mendo

โอ๊ะฉันทำแล้ว! ฉันเพิ่มɜดังนั้นนี่ควรเป็นสระสังทั่วไปของอเมริกาในขณะนี้
Lynn

เกิดขึ้นของตัวละครใด ๆ เหล่านี้ที่จะนับเป็นหนึ่งไบต์ในภาษาใดก็ตามที่ใช้โดยไม่คำนึงถึงฐานรหัสของพวกเขาเพื่อความสมดุลระหว่างภาษาการแข่งขันกอล์ฟหรือเป็นส่วนหนึ่งของความท้าทายในความคิดของคุณเพื่อค้นหาภาษาที่อาจดำเนินการ อย่างน้อยไบต์ระยะเวลา?
Jonathan Allan

มีสระจำนวนมากที่สุดหลังจากที่พยัญชนะที่โปรแกรมของเราควรจำได้หรือไม่? หากไม่ได้เพิ่มกรณีทดสอบเช่นbiiiiiiiiiiiʒ(ใน "ไม่ใช่ผึ้ง")
DanTheMan

1
@JanathanAllan หลัง; Unicode I / O เป็นส่วนหนึ่งของความท้าทาย ฉันจะเพิ่มบันทึกเกี่ยวกับเรื่องนั้น
Lynn

คำตอบ:


2

NARS2000 APL, 138 ไบต์

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

คุณสามารถลบการเริ่มต้น⍞←เมื่อเอาท์พุทโดยนัย นอกจากนี้ยังนับไบต์ควรจะตรงสองนับจำนวนตัวอักษรตามนี้ นี่ควรเป็น 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 กรณีทดสอบเพื่อให้สอดคล้อง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.