首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >音素阿布吉达

音素阿布吉达
EN

Code Golf用户
提问于 2016-09-10 13:41:53
回答 3查看 330关注 0票数 12

字符

让我们把这些Unicode字符称为英文IPA辅音:

代码语言:javascript
运行
复制
bdfhjklmnprstvwzðŋɡʃʒθ

让我们把这些Unicode字符称为英文IPA元音:

代码语言:javascript
运行
复制
aeiouæɑɔəɛɜɪʊʌː

(是的,ː只是长元音标记,但为了这一挑战,请把它当作元音。)

最后,这些是主应力和次级应力的标记:

代码语言:javascript
运行
复制
ˈˌ

注意,ɡ (U+0261)不是小写g,主应力标记ˈ (U+02C8)不是撇号,ː (U+02D0)不是冒号。

您的任务

给出一个词,将元音叠加在它们所跟随的辅音的顶部,并将重音标记放在它们前面的辅音下面。(正如问题标题所暗示的那样,这种书写系统(辅音元音序列作为一个单元被包装在一起)称为阿布吉达。给定输入ˈbætəlʃɪp,生成输出:

代码语言:javascript
运行
复制
æə ɪ
btlʃp
ˈ

如上文所定义的,一个单词肯定是一串辅音、元音和重音标记。永远不会有连续的重音标记,它们总是放在单词的开头和/或辅音前面。

测试用例

可能有连续元音。例如,kənˌɡrætjʊˈleɪʃən变成

代码语言:javascript
运行
复制
      ɪ
ə  æ ʊeə
knɡrtjlʃn
  ˌ   ˈ

如果一个单词以元音开头,在“基线”上用辅音打印它:əˈpiːl变成

代码语言:javascript
运行
复制
 ː
 i
əpl
 ˈ

带有初始重音元音的测试用例:ˈælbəˌtrɔs变为

代码语言:javascript
运行
复制
  ə ɔ 
ælbtrs
ˈ  ˌ  

一个冗长的词:ˌsuːpərˌkaləˌfrædʒəˌlɪstɪˌkɛkspiːæləˈdoʊʃəs变成

代码语言:javascript
运行
复制
               æ    
ː              ː ʊ  
uə aə æ əɪ ɪɛ  iəoə 
sprklfrdʒlstkkspldʃs
ˌ  ˌ ˌ   ˌ  ˌ    ˈ  

一个无意义的例子,有一个初始的diphthong,大量的元音堆叠,没有重音标记:eɪbaeioubaabaaa变成

代码语言:javascript
运行
复制
 u
 o
 i a
 eaa
ɪaaa
ebbb

参考实现

您的程序应该产生与这个Python脚本相同的输出:

代码语言:javascript
运行
复制
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字符数组。
  • 每一行输出可能包含任何数量的尾随空格。如果生成一个字符串,它可能有一个尾换行符。
  • 您的程序应该为具有任意长的元音链的任意长的单词生成正确的输出,但可能假定输入单词总是有效的。
  • 如果没有压力标记,您的输出可能有选择地包括最后的空行(不包含任何或空格)。
  • 最短的答案(以字节为单位)获胜。
EN

回答 3

Code Golf用户

回答已采纳

发布于 2016-09-10 19:51:48

NARS2000 APL,138个字节

代码语言:javascript
运行
复制
⍉⌽⊃E,⍨¨↓∘' '¨∨/¨∊∘M¨E←(1+(W∊M←'ˌˈ')++\W∊'bdfhjklmnprstvwzðŋɡʃʒθ')⊂W←⍞
票数 2
EN

Code Golf用户

发布于 2016-09-10 20:02:56

JavaScript (ES6),181个字节

代码语言:javascript
运行
复制
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`
`
;
代码语言:javascript
运行
复制
<input oninput=o.textContent=f(this.value)><pre id=o>
票数 1
EN

Code Golf用户

发布于 2022-11-28 16:00:20

,609字节

代码语言:javascript
运行
复制
import."strings"
type P struct{x,y int}
func M(s[]int)(m,n int){for _,e:=range s{if e<=m{m=e};if e>=n{n=e}};return}
func f(s string)(L string){T,x,y,F,R:=make(map[P]rune),0,0,1>0,ContainsRune
for _,r:=range s{if R("ˈˌ",r){T[P{x+1,1}]=r}else if R("bdfhjklmnprstvwzðŋɡʃʒθ",r)||F{y=0;x++;T[P{x,y}],F=r,1<0}else if R("aeiouæɑɔəɛɜɪʊʌː",r){y--;T[P{x,y}],F=r,1<0}}
var u,v[]int
for k:=range T{u,v=append(u,k.x),append(v,k.y)}
for y,Y:=M(v);y<Y+1;y++{o:=[]string{}
for x,X:=M(u);x<X+1;x++{if r,ok:=T[P{x,y}];ok{o=append(o,string(r))}else{o=append(o," ")}}
L+=TrimPrefix(Join(o,"")," ")+"\n"}
return}

在网上试试!

引用实现的直接端口。

Ungolfed解释

代码语言:javascript
运行
复制
// map of x-y coords to a character
type tile map[P]rune

func (t tile) Xs() (o []int) {
	for k := range t {
		o = append(o, k.x)
	}
	return
}
func (t tile) Ys() (o []int) {
	for k := range t {
		o = append(o, k.y)
	}
	return
}

// coordinate pair
type P struct{ x, y int }

func min[T int](s []T) T {
	var m T
	for _, e := range s {
		if e <= m {
			m = e
		}
	}
	return m
}
func max[T int](s []T) T {
	var m T
	for _, e := range s {
		if e >= m {
			m = e
		}
	}
	return m
}

func f(s string) string {
	C, V, S := "bdfhjklmnprstvwzðŋɡʃʒθ", "aeiouæɑɔəɛɜɪʊʌː", "ˈˌ" // constant strs
	tiles := make(tile)                                          // the actual map
	x, y := 0, 0                                                 // (x0,y0) is the leftmost center
	isFirst := true                                              // is this character the first of a line?
	for _, r := range s {                                        // for each char...
		if strings.ContainsRune(S, r) {                          // if it's stress...
			tiles[P{x + 1, 1}] = r                               // put it underneath the next syllable
		} else if strings.ContainsRune(C, r) || isFirst {        // if it's a consonant or the first letter...
			y = 0
			x++
			tiles[P{x, y}] = r                                   // place on the baseline
			isFirst = false
		} else if strings.ContainsRune(V, r) {                   // if's a vowel...
			y--
			tiles[P{x, y}] = r                                   // place 1 above the baseline at the current x
			isFirst = false
		}
	}

	// get the ranges for outputting into a string
	xs, ys := tiles.Xs(), tiles.Ys()
	xmin, xmax := min(xs), max(xs)
	ymin, ymax := min(ys), max(ys)

	lines := []string{}
	for y := ymin; y < ymax+1; y++ {             // for each vowel at height y...
		line := func() (o []string) {
			for x := xmin; x < xmax+1; x++ {     // for each syllable on that vowel height...
				if r, ok := tiles[P{x, y}]; ok { // get the char
					o = append(o, string(r))
				} else {
					o = append(o, " ")           // use a space if there is no vowel there
				}
			}
			return
		}()
		lines = append(lines, strings.TrimPrefix(strings.Join(line, ""), " ")) // add to the output
	}
	return strings.Join(lines, "\n") // return the string
}

在网上试试!

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/92877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档