Pinyin Kombinasyonları


13

Bağımsız değişken olarak heceli bir pinyin dizesi alan ve kombinasyonun true değerini döndüren bir işlev oluşturun, aksi takdirde false olur.

"Ü" için "v" kullanın.

İşte kombinasyonların tam listesi. http://www.pinyin.info/rules/initials_finals.html

Örnekler

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

Lütfen karakter sayısını azaltmak için web sayfalarını kazıma veya giriş yöntemi dosyalarını okuma gibi şeyler yapmayın. (Bunu yaparsanız, verilerin uzunluğu karakter sayısına göre sayılır.) Bu kod golfünün amaçlarından biri, kuralların nasıl basitleştirilebileceğini görmektir. En kısa kod kazanır.


Nasıl bir şey nar? : P
JiminP

1
Bir not olarak, örneklerin söylediklerine rağmen nvi, şimdiye kadar geçerli bir kombinasyon olduğuna inanmıyorum .
rintaun

Bağlantı verilen sayfa zaten »  er bu tablodan çıkarılmışsa« dahil edilmemeli mi? (Sonuçta, doğru hatırlıyorsam bir sayıydı ;-))
Joey

Yanıtlar:


4

JavaScript 1.6, 503 496 477 karakter

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

Biraz daha okunaklı bir şekilde ortaya çıktı (kodu birkaç satıra bölmekle ilgili hataları engellemek):

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

Sıfır başlangıç ​​vakaları ve birkaç defalık düzenli bir ifadeyle test edilir. Bundan sonra, tablo, başlangıç ​​sesi başına bir tane olmak üzere 6 basamaklı, temel 36 rakamlı (birleştirilmiş) bir dizi olarak kodlanır. Arama daha sonra indexOfdoğru biti seçmek için bir çift çağrı ve bir kaydırma kullanır.

Kombinasyon tablosundaki tüm hücrelere karşı test edildi (doldurulmuş hücreler doğru test edildi, boş hücreler yanlış test edildi).

Düzenleme: g-, k–, h–, j–, q– ve z– yoğun blokları true / false olduğundan, temel 36 aramasının 36 karakterini karşılaştırmalarla değiştirdi.

Düzenleme: Gereksiz önlemek için bit testini yeniden !!düzenledi ve normal ifadeyi daha fazla sıkıştırdı.


Neden ihtiyacınız var !!? Neden bir çifte ihtiyacın olmayacağını anladığımdan emin değilim ...
Peter Olson

Bununla beraber, dönüş 0 veya 1'dir; o "gerçek" olmadan olmayan sıfır olarak döndü ancak mutlaka 1. Benim sınama komut ile doğruluyor değil if (g(s) == (validList.indexOf(s) >= 0)hangi false döndürür 16 == true; Ben bunu '' gerçek 'gerçekten ne anlama geliyor' 'perspektifinden tartıştım ve bir şey bıraktım. Her iki durumda da, bugün için daha sonra (daha fazla veya daha az) ile !!değiştirerek planlanan bir değişiklik yaptım . dönüş 1 ve iki karakter tıraş. 1<<r&*parseInt(parseInt>>r)&1
DocMax

1

PHP, 548 karakter

Kabul ediyorum, muhtemelen uygun değil, ancak geçerli pinyin kombinasyonlarıyla eşleşmesi için bir regex yazdım. Yinelenen alt dizeleri değişkenlerle değiştirerek karakterleri azaltır.

kod

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

kullanım

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

1

F #, 681 karakter

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

İlk ünsüz doğru olmadan heceleri tam olarak almaz (Y, W vb.).


1

APL (Genişletilmiş Dyalog) , 475 bayt

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

Çevrimiçi deneyin!

Golf devam ediyor.

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}

Çevrimiçi deneyin!

Yardımcı işlevi s, boşlukla sınırlandırılmış bir dizeyi açar:

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

Önce olası ilk ve son dizeleri hecede saklarım, sonra tabilk listeden her dizenin ikinci listeden her dizeyle birleştirilmesini içeren bir tablo oluştururum.

Sonra, ikili verileri tamsayıların bir listesi olarak saklarım. Tamsayıların bazıları tekrarlanır ve bu nedenle bazı boşlukların seçilmesine izin veren değişkenlerde saklanabilir.

Her tamsayı ikili olarak çözülür ve tablonun bir satırını temsil eder. Sayıdaki her bit, bu satırdaki belirli bir hecenin geçerli bir hece olup olmadığını gösterir, MSB ilk sütunu temsil eder. Tüm geçersiz heceler tablodan kaldırılır.

Tabloyu bir liste halinde düzleştirir, özel bir durum olarak başlangıç ​​ünsüz olmadan formları ekler ve son olarak girdimizin listede olup olmadığını kontrol ederiz.

Olası daha fazla golf potansiyeli:

  • Base64 veya base255 kodlama yazma
  • Sayıları küçültmek için sütunları ve satırları yeniden sıralayın.

Python yararlı komut dosyası ve test senaryosu oluşturucu: Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.