ชุดพินอิน


13

สร้างฟังก์ชั่นที่รับพยางค์ของพินอินเป็นอาร์กิวเมนต์และส่งคืนค่าจริงของการรวมกันที่มีอยู่เป็นเท็จมิฉะนั้น

ใช้ "v" สำหรับ "ü"

นี่คือรายการทั้งหมดของชุดค่าผสม http://www.pinyin.info/rules/initials_finals.html

ตัวอย่าง

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

โปรดอย่าทำสิ่งต่าง ๆ เช่นการขูดหน้าเว็บหรืออ่านวิธีการป้อนข้อมูลเพื่อลดจำนวนตัวอักษร (ถ้าคุณทำเช่นนั้นความยาวของข้อมูลจะถูกนับเป็นจำนวนตัวอักษร) จุดประสงค์ประการหนึ่งของกอล์ฟรหัสนี้คือเพื่อดูว่ากฎจะง่ายขึ้นได้อย่างไร รหัสที่สั้นที่สุดชนะ


แล้วมีอะไรประมาณnarนี้ : P
JiminP

1
อย่างที่ทราบแม้ว่าตัวอย่างจะพูดว่าฉันไม่เชื่อว่าnviเป็นชุดค่าผสมที่ถูกต้อง
rintaun

หากไม่ได้ระบุหน้าที่เชื่อมโยงแล้ว»  erจากตารางนี้«มันควรจะรวมอยู่ด้วยหรือไม่? (หลังจากทั้งหมดมันเป็นตัวเลขถ้าฉันจำได้อย่างถูกต้อง ;-))
Joey

คำตอบ:


4

JavaScript 1.6, 503 496 477 ตัวอักษร

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

รูปแบบที่อ่านง่ายขึ้นเล็กน้อย (ยกเว้นข้อผิดพลาดใด ๆ ในการแบ่งรหัสเป็นสองสามบรรทัด):

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

กรณีเริ่มต้นที่เป็นศูนย์บวกหนึ่งครั้งจะถูกทดสอบด้วยนิพจน์ทั่วไป หลังจากนั้นตารางจะถูกเข้ารหัสเป็นชุด (ตัดแบ่ง) ของตัวเลข 6 หลัก, ฐาน -36 หนึ่งตัวต่อเสียงเริ่มต้น การค้นหาจากนั้นใช้คู่ของการindexOfโทรและการเปลี่ยนเพื่อเลือกบิตที่เหมาะสม

ทดสอบกับทุกเซลล์ในตารางของชุดค่าผสม (เซลล์ที่เติมเต็มแล้วทดสอบสำหรับเซลล์ว่างเปล่าจริงที่ทดสอบว่าเป็นเท็จ)

แก้ไข:แทนที่บางส่วนของ 36 ตัวอักษรของการค้นหาฐาน -36 ด้วยการเปรียบเทียบตั้งแต่ g–, k–, h–, j–, q– และ z– มีบล็อกหนาแน่นของจริง / เท็จ

แก้ไข:จัดเรียงการทดสอบบิตใหม่เพื่อหลีกเลี่ยงความไม่จำเป็น!!และทำการบีบอัด regex ให้มากขึ้น


ทำไมคุณต้องการ!!? ฉันไม่แน่ใจว่าฉันเข้าใจว่าทำไมคุณถึงต้องการเตียงคู่ไม่ใช่ ...
Peter Olson

ด้วยมันผลตอบแทนคือ 0 หรือ 1; หากไม่มี "ความจริง" จะถูกส่งกลับเป็นไม่ใช่ศูนย์ แต่ไม่จำเป็นต้อง 1 สคริปต์ทดสอบของฉันกำลังตรวจสอบความถูกต้องif (g(s) == (validList.indexOf(s) >= 0)ว่าส่งคืนเท็จ16 == trueหรือไม่ ฉันถกเถียงกันว่ามันมาจาก "สิ่งที่ไม่ 'จริง' หมายความว่าจริงๆ" มุมมองและทิ้งสิ่งใน. ในทั้งสองกรณีก็จะมีการเปลี่ยนแปลงตามแผนสำหรับต่อมาในวันนี้ว่าจะทำไปด้วย!!โดยการแทนที่1<<r&*parseIntด้วย (มากหรือน้อย) (parseInt>>r)&1เพื่อให้ return คือ 1 และฉันโกนสองตัวอักษร
DocMax

1

PHP, 548 ตัวอักษร

จริงอยู่มันอาจไม่เหมาะสม แต่ฉันเขียน regex เพื่อจับคู่ชุดพินอินที่ถูกต้อง อักขระที่ลดลงโดยแทนที่สตริงย่อยซ้ำด้วยตัวแปร

รหัส

<?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";

การใช้

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

1

F #, 681 ตัวอักษร

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

ไม่ได้รับพยางค์ที่ค่อนข้างถูกต้องโดยใช้พยัญชนะต้น (Y, W ฯลฯ )


1

APL (Dyalog Extended) , 475 ไบต์

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'}

ลองออนไลน์!

กำลังเล่นกอล์ฟอยู่

Ungolfed

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}

ลองออนไลน์!

ฟังก์ชั่นตัวช่วยsคลายสตริงที่คั่นด้วยช่องว่าง:

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

ฉันแรกจะเก็บสตริงเริ่มต้นและสุดท้ายที่เป็นไปได้ในพยางค์จากนั้นสร้างตารางtabที่มีการต่อกันของแต่ละสตริงจากรายการแรกพร้อมกับแต่ละสตริงจากรายการที่สอง

ต่อไปฉันเก็บข้อมูลไบนารี่เป็นรายการจำนวนเต็ม จำนวนเต็มบางส่วนถูกทำซ้ำและสามารถเก็บไว้ในตัวแปรซึ่งอนุญาตให้มีการเว้นช่องว่าง

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

เราแผ่ตารางลงในรายการเพิ่มในแบบฟอร์มโดยไม่มีตัวอักษรเริ่มต้นเป็นกรณีพิเศษและสุดท้ายตรวจสอบว่าอินพุตของเราอยู่ในรายการหรือไม่

ศักยภาพการเล่นกอล์ฟที่เป็นไปได้เพิ่มเติม:

  • เขียนการเข้ารหัส base64 หรือ base255
  • เรียงลำดับคอลัมน์และแถวใหม่เพื่อทำให้ตัวเลขมีขนาดเล็กลง

Python สคริปต์ที่เป็นประโยชน์และเครื่องมือสร้างกรณีทดสอบ: ลองออนไลน์!

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