แยกความแตกต่างระหว่างคำนามผู้ชายและคำนามผู้หญิงในภาษาฝรั่งเศสไม่เกิน 100 ตัวอักษร


21

คุณต้องเขียนโปรแกรมขนาดเล็กมากภายใน 100 ตัวอักษร โปรแกรมของคุณต้องแยกความแตกต่างระหว่างคำนามภาษาฝรั่งเศสแบบผู้ชายและแบบผู้หญิง ผลลัพธ์ควรเป็นunถ้าเป็นแบบผู้ชายและuneเป็นแบบผู้หญิง บ่อยครั้งที่มีกฎทางสถิติบางอย่างที่คุณสามารถติดตามได้ (เช่นถ้ามันลงท้ายด้วย "e" มันจะเป็นผู้หญิงมากกว่าผู้ชาย)

อินพุต :

คำภาษาฝรั่งเศส มันอาจประกอบด้วยตัวอักษรตัวเล็กและขีดกลางใด ๆ

อินพุตตัวอย่าง: ami

ผลผลิต :

unถ้าคำนั้นเป็นผู้ชายและuneถ้าคำนั้นเป็นผู้หญิง

ตัวอย่างผลลัพธ์: un

คุณไม่ต้องพูดถูกทุกคำ เป้าหมายของคุณคือแม่นยำที่สุดเท่าที่จะทำได้

เกณฑ์การให้คะแนน : คำตอบของคุณจะต้องไม่เกิน 100 ตัวอักษร งบดังกล่าวเป็นprintหรือconsole.logหรือalertไม่ไม่นับเป็นส่วนหนึ่งของไบต์รวมของคุณ นอกจากนี้คุณยังสามารถเขียนฟังก์ชันหรือวิธีการที่ทำงานนี้ซึ่งในไม่กี่ไบต์แรก (เช่นf=x=>) ซึ่งเป็นส่วนหนึ่งของการประกาศฟังก์ชั่นจะไม่นับรวมเป็นของคุณ คะแนนรวมของคุณคือจำนวนคำตอบที่ไม่ถูกต้อง ความสัมพันธ์จะขาดตามขนาดรหัส

คำนามที่จะทดสอบด้วย:

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
ฉันจะเพิ่มun squeletteลงในรายการเพื่อทำให้สิ่งต่าง ๆ ยากขึ้น
200_success

คำตอบ:


23

CJam, 0 ไม่ถูกต้อง, 32 29 ไบต์

รหัสนี้ใช้อักขระแปลก ๆ ไม่กี่ตัว (บางตัวไม่สามารถพิมพ์ได้) แต่ทั้งหมดนั้นอยู่ในช่วง ASCII ที่ขยายเพิ่ม ดังนั้นอีกครั้งฉันนับตัวละครแต่ละตัวเป็นไบต์เดียว

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

เนื่องจากอักขระที่ไม่สามารถพิมพ์ได้ฉันแน่ใจว่า Stack Exchange กลืนบางตัวดังนั้นคุณอาจต้องการคัดลอกรหัสจากตัวนับอักขระ (แสดงจำนวนไบต์ด้วยการเข้ารหัส UTF-8 ซึ่งเป็นสิ่งที่ท้าทายสำหรับความท้าทายนี้นอกจากนี้ลิงก์ก็ไม่ได้ ' ดูเหมือนจะไม่ทำงานใน Firefox แต่ทำงานใน Chrome)

ทดสอบที่นี่

หลังจากการสนทนาเพิ่มเติมในการแชทเราพบว่าการเล่นกอล์ฟ regex จะไม่นำเราไปไกลกว่านี้อีกแล้ว ดังนั้นตามข้อเสนอแนะก่อนหน้านี้ (ล้อเล่น) ของฉันเราเริ่มมองหาการจัดการรหัสอักขระของคำที่มีฟังก์ชั่นบางอย่างเช่นว่าทุกคำจากกลุ่มหนึ่งจะให้ตัวเลขกับคุณสมบัติบางอย่างที่ง่ายต่อการตรวจสอบ และเราโชคดีกว่าที่เราคาดไว้! นี่คือสิ่งที่รหัสทำกับคำว่า:

  • แปลงอักขระในคำเป็นจุดโค้ดโดยปริยาย
  • ตีความว่าเป็นตัวเลขในฐาน 2 (ใช่ตัวเลขจะใหญ่กว่า 0 หรือ 1 แต่ CJam สามารถจัดการได้)
  • รับผลโมดูโลซ้ำ ๆ ... ตัวเลขต่อไปนี้: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. ลำดับของตัวเลขนี้ถูกเข้ารหัสเป็นจุดรหัสของสตริง (นี่คือจุดที่อักขระแปลกและไม่สามารถพิมพ์ออกมาได้)
  • ราวกับมีเวทมนตร์ทั้งหมด 25 ชายนามผลผลิต0หรือ1และทั้งหมด 25 คำนามผู้หญิงผลผลิต2หรือ3มีขั้นตอนนี้ ดังนั้นถ้าเราหารสิ่งนี้ด้วย2(การหารจำนวนเต็ม) เราจะได้ศูนย์สำหรับคำนามผู้ชายและคำนามผู้หญิง

ในการปัดเศษออกเราจะกด"un"ลงบนสแต็eก จากนั้นเราอ่านคำที่ป้อนจาก STDIN และทำการคำนวณข้างต้นและในที่สุดก็คูณeด้วยผลลัพธ์

ฉันไม่เคยพับ modulo ลงในรายการก่อนหน้านี้และฉันรู้สึกว่าฉันจะไม่ทำอีกครั้ง ...

ขอบคุณมากสำหรับ xnor และ Sp3000 สำหรับการขว้างความคิดไปรอบ ๆ และช่วยในการค้นหาเชนตัวหาร


ไม่เพียงสั้นกว่า แต่เร็วกว่า 2 นาที สยองขวัญ!
เดนนิส

@sudo;) ... หนึ่งในช่วงเวลาที่หายากที่ฉันสามารถเอาชนะคุณได้ ... ฉันจะสนใจคำอธิบายของคุณเป็นอย่างมาก :)
Martin Ender

11
เดี๋ยวก่อนฉันสับสน หากมีความมหัศจรรย์อยู่ทำไมคุณถึงสูญเสียมันไปบนเว็บไซต์ท้าทายการเขียนโปรแกรมที่งี่เง่าและไม่แก้ปัญหาสันติภาพโลกหรืออะไรบางอย่าง? (ไม่ใช่ แต่จริงจังwoah . +1)
Doorknob

22

Ruby, 0 ไม่ถูกต้อง, 63 56 53 52 51 50 ไบต์

ตัวละครทุกตัวอยู่ในรูปแบบ ASCII แบบขยายโดยเฉพาะISO 8859-1ดังนั้นฉันจึงนับตัวอักษรแต่ละตัวเป็นไบต์เดียว

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

ดูเหมือนว่าชุดทดสอบของคุณจะสั้นเกินไป ฉันสร้าง regex กับนักกอล์ฟ meta regex ของ Peter Norvig แล้วแล้ว

f["ami"]คุณสามารถเรียกฟังก์ชั่นดังกล่าวข้างต้นเช่น คุณสามารถใช้ชุดทดสอบนี้เพื่อตรวจสอบกรณีทดสอบทั้งหมด:

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}

ทดสอบบน Coding Ground

แก้ไข:การใช้สคริปต์ที่สองของ Peter Norvigฉันพบ regex ที่แตกต่างกันซึ่งจริงๆแล้วมีความยาวหนึ่งไบต์ แต่ที่ฉันสามารถย่อให้เหลือสองไบต์ด้วยมือ

แก้ไข: Sp3000ตั้งนักกอล์ฟ regex ที่เขาเขียนสำหรับความท้าทาย regex ล่าสุดของฉันบนมันและพบregex 36 35 34 byte ให้ฉันใช้ ขอบคุณสำหรับสิ่งนั้น!


2
ผ่อนคลายฝันร้ายของ meta regex golf ที่นี่เพราะtableซับสตริงของportableและการสลับที่กำหนดให้ตรงไม่มีประโยชน์มากเพราะชุดที่สองดูเหมือนง่ายกว่าที่จะจับคู่ ...
Sp3000

13

CJam, 0 ข้อผิดพลาด ( 36 32 29 28 ไบต์)

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

นี่คือฟังก์ชั่นที่มีชื่อดังนั้นฉันแค่นับรหัสภายใน นอกจากนี้ยังoเป็นคำสั่งพิมพ์ดังนั้นจึงไม่ได้มีส่วนร่วมในการนับไบต์

ลองกรณีทดสอบในล่าม CJam

มันทำงานอย่างไร

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

เพียงแค่ฟังก์ชั่นแฮชและค้นหาตาราง

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