Kết hợp bính âm


13

Tạo một hàm lấy một chuỗi âm tiết bính âm làm đối số và trả về true của tổ hợp tồn tại, ngược lại là sai.

Sử dụng "v" cho "ü".

Dưới đây là danh sách đầy đủ các kết hợp. http://www.pinyin.info/rules/initials_fests.html

Ví dụ

f("bu") == true
f("zheng") == true
f("nv") == true
f("ri") == true
f("cei") == false
f("ia") == false
f("kian") == false
f("qa") == false

Xin vui lòng, không làm những việc như cạo trang web hoặc đọc tệp phương thức nhập để giảm số lượng ký tự. (Nếu bạn làm như vậy, độ dài của dữ liệu sẽ được tính vào số lượng ký tự) Một trong những mục đích của mã golf này là để xem cách các quy tắc có thể được đơn giản hóa. Mã ngắn nhất sẽ thắng.


Một cái gì đó như thế narnào? : P
JiminP

1
Cũng như một ghi chú, bất chấp những gì các ví dụ nói, tôi không tin nvilà có một sự kết hợp hợp lệ.
rintaun

Nếu trang được liên kết đã nói »  er đã bị bỏ qua khỏi bảng này« thì có nên đưa nó vào không? (Rốt cuộc, đó là một con số, nếu tôi nhớ chính xác ;-))
Joey

Câu trả lời:


4

JavaScript 1.6, 503 496 477 ký tự

function g(s){return/^([bfmpw]?o|[yjqx]ua?n|[ln]ve?|ei?|y[aio]ng|w?[ae]ng?|w?ai?|wei|y?ao|y?ou|y[ai]n?|yu?e|[^aeiou]+u)$/.test(s)|(((k=6*("ccsszzdflmnprtbghkjqx".indexOf(s[0])+(f=s[1]=='h')))|(r="a.e.ai.ei.ao.ou.an.ang.en.eng.ong.ua.uo.uai.ui.uan.uang.un.i.ia.ie.iao.iu.ian.iang.in.ing.iong.u.ue".split('.').indexOf(s.slice(f+1))))<0?0:k>84?r>17^k<108:parseInt("009m2f00b8jb009m2f00b7r3009m2n00b8jj1dwcfz0000rtfjba4f1xgbnjfj01rz1uyfb1009nn61b37cv1uyfa5".slice(k,k+6),36)>>r&1)}

Được định dạng một chút dễ đọc hơn (chặn mọi lỗi trong việc ngắt mã thành một vài dòng):

function _g(s)
{
  f = s[1] == 'h'
  k = "ccsszzdfghjklmnpqrtxb".indexOf(s[0]) * 6
  k += 6 * f
  return /^(weng|[bfmp]?o|[yjqx]ua?n|[ln]ve?|[ae]i?|y[aeiu]|y[aio]ng|[ae]ng?|wang?|wai?|we[in]|w[ou]|y?ao|y?ou?|y[ai]n|yue)$/.test(s) | 
         !!(k >= 0 && (1 << "a.e.ai.ei.ao.ou.an.ang.en.eng.ong.u.ua.uo.uai.ui.uan.uang.un.i.ia.ie.iao.iu.ian.iang.in.ing.iong.u.ue".split('.').indexOf(s.slice(f + 1)) & parseInt("00j85300mh2v00j85300mgan00j85b00mh332rsovz0002cp00b8jj00b8jjqmlts000b8jjv2mkfz3uwo3jv203jz3pwvelqmlts000jbaq2m6ewvqmlts03pwvdp".slice(k, k + 6), 36)))
}

Các trường hợp ban đầu bằng không cộng với một vài lần được kiểm tra với biểu thức chính quy. Sau đó, bảng được mã hóa dưới dạng một chuỗi gồm 6 chữ số, 36 chữ số cơ bản, một số cho mỗi âm thanh ban đầu. Việc tra cứu sau đó sử dụng một cặp indexOfcuộc gọi và sự thay đổi để chọn đúng bit.

Đã kiểm tra đối với tất cả các ô trong bảng kết hợp (các ô được điền đã kiểm tra đúng, các ô trống được kiểm tra là sai).

Chỉnh sửa: Đã thay thế một số trong 36 ký tự của tra cứu cơ sở-36 bằng các phép so sánh kể từ g, kiêu, hiêu, jễu, q, và z, có các khối dày / đúng.

Chỉnh sửa: Sắp xếp lại kiểm tra bit để tránh !!regex không cần thiết và nén chặt hơn regex.


Tại sao bạn cần một !!? Tôi không chắc tôi hiểu tại sao bạn lại cần một cú đúp không ...
Peter Olson

Với nó, lợi nhuận là 0 hoặc 1; không có nó "true" được trả về là khác không nhưng không nhất thiết là 1. Kịch bản kiểm tra của tôi đang xác thực với giá trị if (g(s) == (validList.indexOf(s) >= 0)trả về false 16 == true; Tôi tranh luận nó từ một "những gì hiện 'true' thực sự có nghĩa là" quan điểm và rời khỏi điều đó. Trong cả hai trường hợp, tôi có một sự thay đổi kế hoạch cho sau này ngày hôm nay rằng sẽ loại bỏ các !!bằng cách thay thế 1<<r&*parseIntvới (nhiều hơn hoặc ít hơn) (parseInt>>r)&1sao cho trở lại là 1 tôi cạo hai ký tự.
DocMax

1

PHP, 548 ký tự

Cấp, nó có thể không tối ưu, nhưng tôi đã viết một biểu thức chính quy để khớp với các kết hợp bính âm hợp lệ. Giảm ký tự bằng cách thay thế các chuỗi con lặp lại bằng các biến.

<?php $a='?|e(i|ng?)';$b='|o(u|ng)|u';$c='|a?n)?|i(a[on]';$d='(a(ng?|o|i)';$e='|ng?)';$f='(i|ng)?';echo(preg_match("/^([bpm](a(i|o$e$a|u|o|i(e|a[on]$e?)|[pm]ou|m(e|iu)|f(a(ng?)?|ou$a|u)|d$d$a?$b(o|i$c?|e|u)?)|[dtnl]$d?|e$f$b(o$c|e)?)|[jqxy](i(a(o$e?|e|u|o?ng|n)|u(e|a?n))|([zcs]h?|r)i|[nl](ve?|i(n|ang?|u))|[dl]ia|[dt](ing|ui)|[dn]en|diu|([gkh]|[zcs]h?)(e(ng?)|a(o|ng?|i)?|ou|u(o|i|a?n)?)|r(e(ng?)?|a(o$e$b(a?n?|o|i)?)|[gkh](ei|ong|u(a$f))|[zcs]hua$f|([zcs]|[zc]h)ong|(z|[zs]h)ei|a(i|o$e?|ou$a?|w(u|a(i$e?|o|e(i$e))$/",$argv[1]))?"true":"false";

Sử dụng

> php pinyin.php bu
> true
> php pinyin.php cei
> false

1

F #, 681 ký tự

type l=Y|J|Q|X|W|F|B|P|M|N|L|T|D|Z|K|H|Zh|G|Sh|Ch|C|S|R|Iong|Vn|Van|Ia|Iu|In|Iang|Ve|V|Ian|Iao|Ie|Ing|I|Ei|A|Ai|An|Ang|Eng|U|Ao|E|Ou|Uo|Uan|Un|Ui|En|Ong|Ua|Uang|Uai|Ueng|O
let v x=x.GetHashCode()
let n x=J.GetType().GetNestedType("Tags").GetFields().GetValue(v x).ToString().Substring(6).ToLower();
let(^)a b=List.collect(fun x->List.map(fun z-> n x+ n z)b)a
let(-)a b=[v a..v b]
let(&)a b=a@b
let(!)a=[v a]
[<EntryPoint>]
let main a=
 printf"%b"(List.exists(fun x->x=a.[0])(Y-X^Iong-I& !W^Ei-Ui@Ua-O& !F^Ei-A@An-U@ !Ou&(F-N@D-Sh)^ !En&F-M^ !O&B-M^ !In&N-L^Iu-Un& !D^Ia-Iu&B-D^Ian-Ao& !M^E-Ou&Ch-S^A-Ong&T-Sh^Ei-Ui&N-G^ !Ong&K-Ch^Ua-Uai& !R^An-Ua&(Sh-R@ !Z@ !Zh)^ !I&["lia";"pou";"mui"]))
 0

Không hoàn toàn có được các âm tiết mà không có phụ âm đầu tiên chính xác (Y, W, v.v.).


1

APL (Dyalog mở rộng) , 475 byte

s←⊢⊆⍨' '≠⊢
a b c2097144 131064 1957895
f←{(⊂⍵)∊(12v),(s'yi ya ye yao you yan yang yin ying yong yu yue yuan yun wu wa wo wai wei wan wang wen weng nv lv nve lve'),(,⊤(a-8)1966080 393208 1966064 2096720 1966072 1048568a a 2056184a 131048a 7288b 7280 106488b 7280b 0 1958911 73735c c 352263c 24583 1859591c,57)/,('bpmfdtnlgkhzcs',s'zh ch sh r j q x')∘.,v'aoe',s'ai ei ao ou an ang en eng ong u ua uo uai ui uan uang un ueng i ia ie iao iu ian iang in ing iong u ue uan un'}

Hãy thử trực tuyến!

Chơi gôn trong tiến trình.

Ung dung

s←{⍵⊆⍨' '≠⍵}
cons'b p m f d t n l g k h z c s zh ch sh r j q x'
vwls'a o e ai ei ao ou an ang en eng ong u ua uo uai ui uan uang un ueng i ia ie iao iu ian iang in ing iong u ue uan un'
tabcon∘.,vwl
bin←,⊤2097136 1966080 393208 1966064 2096720 1966072 1048568 2097144 2097144 2056184 2097144 131048 2097144 7288 131064 7280 106488 131064 7280 131064 0 1958911 73735 1957895 1957895 352263 1957895 24583 1859591 1957895 7 7 7 7 7
all'aoe',(12vwl),(s'yi ya ye yao you yan yang yin ying yong yu yue yuan yun wu wa wo wai wei wan wang wen weng nv lv nve lve'),bin/,tab
f←{(⊂⍵)∊all}

Hãy thử trực tuyến!

Hàm trợ giúp sgiải nén chuỗi được phân tách bằng dấu cách:

{⍵⊆⍨' '≠⍵}    monadic function taking a string
    ' '≠⍵       0s at spaces, 1s elsewhere
 ⍵⊆⍨            Partition (split at 0s)

Trước tiên tôi lưu trữ các chuỗi ban đầu và cuối cùng có thể có trong âm tiết, sau đó tạo một bảng tabchứa phần nối của mỗi chuỗi từ danh sách đầu tiên với mỗi chuỗi từ danh sách thứ hai.

Tiếp theo, tôi lưu trữ dữ liệu nhị phân dưới dạng danh sách các số nguyên. Một số số nguyên được lặp lại và do đó có thể được lưu trữ trong các biến, điều này cũng cho phép bỏ qua một số khoảng trắng.

Mỗi số nguyên được giải mã thành nhị phân và đại diện cho một hàng của bảng. Mỗi bit trong số biểu thị cho dù một âm tiết nhất định trong hàng đó có phải là một âm tiết hợp lệ hay không, với MSB đại diện cho cột đầu tiên. Tất cả các âm tiết không hợp lệ được loại bỏ khỏi bảng.

Chúng tôi làm phẳng bảng thành một danh sách, thêm vào các biểu mẫu không có phụ âm đầu tiên như một trường hợp đặc biệt và cuối cùng kiểm tra xem đầu vào của chúng tôi có trong danh sách không.

Tiềm năng chơi gôn có thể hơn nữa:

  • Viết mã hóa base64 hoặc base255
  • Sắp xếp lại các cột và hàng để làm cho các số nhỏ hơn.

Kịch bản hữu ích Python và trình tạo trường hợp thử nghiệm: Hãy thử trực tuyến!

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.