音位错误


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字符数组。

  • 输出的每一行可以包含任意数量的尾随空格。如果产生一个字符串,则可能只有一个尾随换行符。

  • 您的程序应为带有任意长元音链的任意长单词产生正确的输出,但可以假定输入单词始终有效。

  • 如果没有压力标记,则您的输出可以选择包含最后一个空行(不包含任何内容或空格)。

  • 最短的答案(以字节为单位)获胜。


差劲ɜ,您把它排除在外了:-)英国人将抱怨他们ɒ
路易斯·门多

糟糕,我做到了!我补充说ɜ,所以这应该是完整的通用美国元音集。
林恩

这些字符中的任何一个的出现是否仅计为一个字节,无论使用哪种语言,无论其代码库如何,以便在竞争的高尔夫语言之间取得平衡,或者是您认为要找出哪种语言可能真正发挥作用的挑战的一部分最少字节,一个周期?
乔纳森·艾伦

在程序应识别的辅音之后,是否有最大数量的元音?如果没有添加类似的测试用例biiiiiiiiiiiʒ(如“不是蜜蜂”)
DanTheMan

1
@JonathanAllan后者;Unicode I / O是挑战的一部分。我将为此添加注释。
林恩

Answers:


2

NARS2000 APL,138字节

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

您可以删除⍞←暗示的首字母缩写。此外,按照this,字节数应恰好是字符数的两倍。因此,这应该是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加载了一个版本,该版本仅使用带有,.作为重音符号的英语辅音和元音,在其中我捏造了测试用例以使其符合要求。


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.