Âm vị học Abugida


12

Nhân vật

Chúng ta hãy gọi các ký tự Unicode này là phụ âm IPA tiếng Anh :

bdfhjklmnprstvwzðŋɡʃʒθ

Và hãy gọi các ký tự Unicode này nguyên âm IPA tiếng Anh :

aeiouæɑɔəɛɜɪʊʌː

(Vâng, ːchỉ là dấu nguyên âm dài, nhưng coi nó như một nguyên âm cho mục đích của thử thách này.)

Cuối cùng, đây là những dấu hiệu căng thẳng chính và phụ :

ˈˌ

Lưu ý rằng ɡ( U + 0261 ) không phải là chữ thường g và dấu căng thẳng chính ˈ( U + 02C8 ) không phải là dấu nháy đơn và ː( U + 02D0 ) không phải là dấu hai chấm.

Nhiệm vụ của bạn

Đưa ra một từ, xếp các nguyên âm lên trên các phụ âm mà chúng theo sau và đặt các dấu căng thẳng bên dưới các phụ âm mà chúng đứng trước. (Như gợi ý tiêu đề câu hỏi, một hệ thống chữ viết, trong đó các chuỗi nguyên âm phụ âm được đóng gói cùng nhau như một đơn vị, được gọi là abugida .) Với đầu vào ˈbætəlʃɪp, tạo đầu ra:

æə ɪ
btlʃp
ˈ

Một từ được đảm bảo là một chuỗi các phụ âm, nguyên âm và dấu trọng âm, như được định nghĩa ở trên. Sẽ không bao giờ có các dấu căng thẳng liên tiếp, và chúng sẽ luôn được đặt ở đầu từ và / hoặc trước một phụ âm.

Các trường hợp thử nghiệm

Có thể có nguyên âm liên tiếp. Ví dụ, kənˌɡrætjʊˈleɪʃəntrở thành

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

Nếu một từ bắt đầu bằng nguyên âm, hãy in nó trên đường cơ sở của Google với các phụ âm: əˈpiːltrở thành

 ː
 i
əpl
 ˈ

Một trường hợp thử nghiệm với một nguyên âm ban đầu, nhấn mạnh: ˈælbəˌtrɔstrở thành

  ə ɔ 
ælbtrs
ˈ  ˌ  

Một từ dài: ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəstrở thành

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

Một ví dụ vô nghĩa với một diphthong ban đầu, rất nhiều nguyên âm xếp chồng và không có dấu căng thẳng: eɪbaeioubaabaaatrở thành

 u
 o
 i a
 eaa
ɪaaa
ebbb

Thực hiện tham khảo

Chương trình của bạn sẽ tạo ra cùng một đầu ra như tập lệnh Python này:

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

Hãy thử nó trên Ideone.

Quy tắc

  • Bạn có thể viết một chức năng hoặc một chương trình đầy đủ.

  • Nếu chương trình của bạn có loại ký tự / chuỗi Unicode, bạn có thể giả sử đầu vào và đầu ra sử dụng chúng. Nếu không, hoặc bạn đọc / ghi từ STDIN, hãy sử dụng mã hóa UTF-8.

  • Bạn có thể tạo một chuỗi chứa dòng mới hoặc danh sách các chuỗi biểu thị các hàng hoặc một mảng các ký tự Unicode.

  • Mỗi hàng đầu ra có thể chứa bất kỳ số lượng dấu cách. Nếu bạn sản xuất một chuỗi, nó có thể có một dòng mới duy nhất.

  • Chương trình của bạn sẽ tạo ra đầu ra chính xác cho các từ dài tùy ý với các chuỗi nguyên âm dài tùy ý, nhưng có thể cho rằng từ đầu vào luôn hợp lệ.

  • Nếu không có dấu căng thẳng, đầu ra của bạn có thể tùy ý bao gồm một hàng trống cuối cùng (không chứa gì hoặc khoảng trắng).

  • Câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.


ɜThật tội nghiệp , bạn đã bỏ nó ra :-) Và người Anh sẽ phàn nàn về họɒ
Luis Mendo

Rất tiếc, tôi đã làm! Tôi đã thêm ɜ, vì vậy đây sẽ là một bộ nguyên âm chung của Mỹ.
Lynn

Sự xuất hiện của bất kỳ ký tự nào trong số này chỉ được tính là một byte trong bất kỳ ngôn ngữ nào được sử dụng bất kể cơ sở mã của chúng để đạt được sự cân bằng giữa các ngôn ngữ chơi golf cạnh tranh hoặc là một phần của thách thức, theo ý kiến ​​của bạn, để tìm ngôn ngữ nào thực sự có thể thực hiện nó trong ít nhất byte, thời gian?
Jonathan Allan

Có số nguyên âm tối đa sau một phụ âm mà chương trình của chúng tôi sẽ nhận ra không? Nếu không thêm trường hợp kiểm tra như biiiiiiiiiiiʒ(Như trong "không phải là ong")
DanTheMan

1
@Jonathan ALLan Cái sau; Unicode I / O là một phần của thách thức. Tôi sẽ thêm một lưu ý về điều đó.
Lynn

Câu trả lời:


2

NARS2000 APL, 138 byte

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

Bạn có thể loại bỏ ban đầu ⍞←như ngụ ý đầu ra. Ngoài ra, số byte phải chính xác gấp đôi số ký tự, theo điều này . Vì vậy, đây phải là 138 byte.
Adám

1

Python, 222 byte

(202 ký tự)

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

Trả về một mảng các ký tự unicode với một mảng cho mỗi hàng (chứa các khoảng trắng cho mỗi không gian cần thiết)

Không chắc chắn nơi nào người ta có thể có được đầu ra tốt trực tuyến (và tôi thậm chí không có công cụ để kiểm tra nó đúng cách ở đây).
Tôi đã tải một phiên bản cho ideone chỉ sử dụng phụ âm và nguyên âm tiếng Anh với ,.như các dấu căng thẳng, nơi tôi đã đưa ra các trường hợp thử nghiệm để tuân thủ.


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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.