Fransızcada Eril ve Dişil İsimler ile 100 karakter arasında ayrım yapar.


21

100 karakter içinde çok küçük bir program yazacaksınız. Programınız eril ve dişil fransız isimler arasında ayrım yapmalıdır. Çıktı uneril ise ve unedişil ise olmalıdır. Genellikle, izleyebileceğiniz bazı istatistiksel kurallar vardır (örneğin, "e" ile bitmesi durumunda erilden kadınsı olması daha muhtemeldir).

Giriş :

Fransızca bir kelime; vurgulu küçük harfler de dahil olmak üzere herhangi bir küçük harf ve tire içerebilir.

Örnek giriş: ami

Çıktı :

unkelime eril uneise ve kadınsı ise.

Örnek çıktı: un

Her kelimeyi doğru almak zorunda değilsiniz; Amacınız mümkün olduğunca doğru olmak.

Puanlama : Cevabınız 100 karakter içinde olmalıdır . Gibi Tablolar printya console.logya alertdo not toplam bayt parçası olarak sayılır. Ayrıca, bu görevi yerine getiren bir işlev veya yöntem de yazabilirsiniz; bu durumda f=x=>işlev bildiriminin bir parçası olan ilk birkaç bayt (örn. ) Toplamınızı saymaz. Toplam puanınız yanlış cevap sayısıdır. Bağlar kod boyutuna göre bozulur.

Test edilecek isimler:

un ami
un café
un chapeau
un concert
un crayon
un garage
un garçon
un lit
un livre
un mari
un musée
un oncle
un ordinateur
un pantalon
un piano
un pique-nique
un portable
un père
un sandwich
un saxophone
un stade
un stylo
un théâtre
un téléphone
un voisin
une botte
une boum
une chaise
une chaussette
une chemise
une clarinette
une copine
une femme
une fille
une glace
une heure
une lampe
une maison
une montagne
une personne
une piscine
une pizza
une radio
une raquette
une salade
une souris
une sœur
une table
une télé
une voiture

6
Ben eklemiş un squelette sadece işleri zor hale getirmek için listeye.
200_success

Yanıtlar:


23

CJam, 0 hatalı, 32 29 bayt

Bu kod birkaç garip karakter kullanır (bazıları yazdırılamaz), ancak hepsi genişletilmiş ASCII aralığındadır. Bu yüzden yine, her karakteri tek bir bayt olarak sayıyorum.

"un"'el2b"zPB:  ":i+:%2/*

Yazdırılamayan karakterler nedeniyle, Stack Exchange'in bazılarını yutacağından eminim, bu yüzden kodu karakter sayacından kopyalamak isteyebilirsiniz (bu meydan okuma için yetersiz olan UTF-8 kodlu baytları gösterir; Firefox'ta çalışıyor gibi görünüyor, ancak Chrome'da çalışıyor).

Burada test et.

Sohbette biraz daha konuştuktan sonra, regex golfünün bizi daha da ileriye götürmeyeceğini düşündük. Bu yüzden, daha önceki (şaka) bir önerimden sonra, kelimelerin karakter kodlarını belirli fonksiyonlarla manipüle etmeye başladık, öyle ki bir gruptaki bütün kelimeler, kolay kontrol edilebilen bazı özelliklere sahip bir sayı verecekti. Ve beklediğimizden daha şanslı olduk! İşte kod kelimelere ne yapıyor:

  • Kelimedeki karakterleri örtük olarak kod noktalarına dönüştürür.
  • Bunları 2. tabandaki rakamlar olarak yorumlayın (evet, rakamlar 0 veya 1'den çok daha büyük olacaktır, ancak CJam bunu yapabilir).
  • Defalarca sonuç modulo ... Aşağıdaki sayılar atın: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Bu sayı dizisinin kendisi bir dizgenin kod noktaları olarak kodlanmıştır (bu tuhaf ve yazdırılamayan karakterlerin girdiği yer).
  • Büyü gibi, 25 eril isimler verim 0ya da 1ve 25 dişil isimler verim 2veya 3bu işleme. Yani eğer bunu 2(tamsayı bölme) ile bölersek , eril isimler ve dişil isimler için sıfır alırız.

Yuvarlamak "un"için yığının üzerine basarız, bir tane tutarız e. Daha sonra giriş sözcüğünü STDIN'den okur ve yukarıdaki hesaplamayı yaparız ve nihayetinde esonucu çarpın .

Modulo'yu daha önce hiçbir listeye katlamadım ve bir daha asla ...

Xnor ve Sp3000'e fikirleri attığı ve bölen zincirinin aranmasına yardımcı olduğu için çok teşekkürler.


Sadece kısa değil, 2 dakika daha hızlı. Korku!
Dennis,

@sudo;) ... seni yenebileceğim nadir zamanlardan biri ... Seninkiyle ilgili bir açıklama yapmak isterim :)
Martin Ender

11
Bekle, kafam karıştı. Eğer sihir varsa, neden onu aptalca bir programlama meydanında harcıyorsun ve dünya barışı falan çözemiyorsun? (Hayır, ama ciddi, vay 1.)
Doorknob

22

Ruby, 0 hatalı, 63 56 53 52 51 50 bayt

Tüm karakterler genişletilmiş ASCII , özellikle ISO 8859-1'dir , bu yüzden her karakteri tek bayt olarak sayıyorum.

f=->s{s[/la|tt|i.e|[égdzœu]..$|^b|^f|so|^ta/]?'une':'un'}

Test setiniz biraz kısa olmuş gibi görünüyor. Regex'i Peter Norvig'in meta regex golfçü ile yaptım .

Yukarıdaki gibi işlevini çağırabilirsiniz f["ami"]. Tüm test durumlarını kontrol etmek için bu test kablo demetini kullanabilirsiniz:

puts "ami café chapeau concert crayon garage garçon lit livre mari musée 
      oncle ordinateur pantalon piano pique-nique portable père sandwich 
      saxophone stade stylo théâtre téléphone voisin botte boum chaise 
      chaussette chemise clarinette copine femme fille glace heure lampe 
      maison montagne personne piscine pizza radio raquette salade souris 
      sœur table télé voiture".split.map{|s|f[s]+" "+s}

Kodlama Zeminde test edin.

Düzenleme: Peter Norvig'in ikinci senaryosunu kullanarak farklı bir regex buldum, bu aslında bir bayt daha uzundu, ancak iki bayt el ile kısaltabiliyordum .

Düzenleme: Sp3000 üzerine son regex meydan okuma için yazdığı regex golfçü ayarlayın ve kullanmak için bir 36 35 34 bayt regex bulundu. Bunun için teşekkürler!


2
Meta regex golf kabuslarının kabuslarını burada yeniden yaşatmak, çünkü tablealt portablekümenin bir alt yapısı olduğu ve eşleşecek olan anahtarlamanın çok kullanışlı olmadığı için ikinci takımın eşleşmesi daha kolay görünüyor ...
Sp3000

13

CJam, 0 hata ( 36 32 29 28 bayt)

{"un"oEb72^"+ÕåWïº"583b2b='e*o}:F;

Bu isimlendirilmiş bir fonksiyondur, bu yüzden sadece iç kodu sayarım. Ayrıca, obasılı bir ifadedir, bu nedenle bayt sayımına katkıda bulunmaz.

CJam tercümanındaki test durumlarını deneyin .

Nasıl çalışır

"un"o       " Print 'un'.                                                  ";
Eb          " Consider the input a base 14 number.                        ";
72^         " XOR the result with 72.                                     ";
"+ÕåWïº"    " Push that string.                                           ";
583b2b      " Convert from base 583 to base 2.                            ";
=           " Retrieve the corresponding element (0 or 1) from the array. ";
'e*o        " Print 'e' that many times.                                  ";

Sadece bir karma işlevi ve bir tablo araması.

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.