Phân biệt danh từ nam tính và nữ tính trong tiếng Pháp trong vòng 100 ký tự


21

Bạn phải viết một chương trình rất nhỏ trong vòng 100 ký tự. Chương trình của bạn phải phân biệt giữa danh từ tiếng Pháp nam tính và nữ tính. Đầu ra nên là unnếu nó nam tính và unenếu nó là nữ tính. Thông thường, có một số quy tắc thống kê nhất định bạn có thể tuân theo (ví dụ: nếu kết thúc bằng chữ "e" thì nó có vẻ nữ tính hơn nam tính).

Đầu vào :

Một từ tiếng Pháp; nó có thể bao gồm bất kỳ chữ cái thường và dấu gạch ngang, bao gồm cả chữ thường có dấu.

Ví dụ đầu vào: ami

Đầu ra :

unnếu từ đó là nam tính và unenếu từ đó là nữ tính.

Ví dụ đầu ra: un

Bạn không cần phải nói đúng từng từ; mục tiêu của bạn là chính xác nhất có thể.

Chấm điểm : Câu trả lời của bạn phải trong vòng 100 ký tự. Báo cáo như printhoặc console.loghoặc alertlàm không được tính là một phần của tổng số byte của bạn. Bạn cũng có thể viết một hàm hoặc phương thức thực hiện nhiệm vụ này, trong trường hợp đó, một vài byte đầu tiên (ví dụ f=x=>) là một phần của khai báo hàm không được tính vào tổng của bạn. Tổng số điểm của bạn là số câu trả lời không chính xác. Ties bị phá vỡ bởi kích thước mã.

Danh từ để kiểm tra với:

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
Tôi đã thêm un squelette vào danh sách chỉ để làm cho mọi thứ khó khăn.
200_success

Câu trả lời:


23

CJam, 0 không chính xác, 32 29 byte

Mã này sử dụng một vài ký tự lẻ (một số ký tự không thể in được), nhưng tất cả chúng đều nằm trong phạm vi ASCII mở rộng. Vì vậy, một lần nữa, tôi đang đếm mỗi ký tự là một byte đơn.

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

Do các ký tự không thể in được, tôi chắc chắn Stack Exchange nuốt một số, vì vậy bạn có thể muốn sao chép mã từ bộ đếm ký tự (nó hiển thị các byte với mã hóa UTF-8, không tối ưu cho thử thách này; đồng thời, liên kết không ' T dường như hoạt động trong Firefox, nhưng thực hiện trong Chrome).

Kiểm tra nó ở đây.

Sau một vài cuộc thảo luận trong trò chuyện, chúng tôi đã hiểu rằng việc chơi golf regex sẽ không mang lại cho chúng tôi nhiều hơn nữa. Vì vậy, sau một gợi ý (đùa) trước đó của tôi, chúng tôi bắt đầu xem xét thao tác mã ký tự của các từ với một số chức năng nhất định, sao cho tất cả các từ trong một nhóm sẽ mang lại một số với một số thuộc tính dễ kiểm tra. Và chúng tôi đã may mắn hơn chúng tôi mong đợi! Đây là những gì mã làm cho các từ:

  • Hoàn toàn chuyển đổi các ký tự trong từ thành điểm mã của chúng.
  • Giải thích chúng là các chữ số trong cơ sở 2 (vâng, các chữ số sẽ lớn hơn 0 hoặc 1, nhưng CJam có thể xử lý điều đó).
  • Liên tục lấy modulo kết quả ... các số sau : [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Chuỗi số này tự nó được mã hóa dưới dạng các điểm mã của một chuỗi (đây là nơi xuất hiện các ký tự kỳ lạ và không thể in được).
  • Như thể bằng phép thuật, tất cả 25 danh từ nam tính mang lại 0hoặc 1, và tất cả 25 danh từ nữ tính mang lại 2hoặc 3với thủ tục này. Vì vậy, nếu chúng ta chia số này cho 2(chia số nguyên), chúng ta sẽ nhận được các số 0 cho các danh từ nam tính và các số cho các danh từ nữ tính.

Để làm tròn nó, chúng tôi đẩy "un"vào ngăn xếp, chúng tôi đẩy một cái e. Sau đó, chúng tôi đọc từ đầu vào từ STDIN và thực hiện tính toán ở trên, và cuối cùng nhân evới kết quả.

Tôi chưa bao giờ xếp modulo vào bất kỳ danh sách nào trước đây và tôi cảm thấy như mình sẽ không bao giờ ...

Rất cám ơn cho xnor và Sp3000 vì đã đưa ra những ý tưởng xung quanh và giúp tìm kiếm chuỗi chia.


Không chỉ ngắn hơn, mà nhanh hơn 2 phút. Kinh dị!
Dennis

@sudo;) ... một trong những lần hiếm hoi tôi có thể đánh bại bạn ... Tôi rất quan tâm đến lời giải thích của bạn :)
Martin Ender

11
Đợi đã, tôi bối rối. Nếu ma thuật tồn tại, tại sao bạn lãng phí nó vào một trang web thách thức lập trình ngớ ngẩn và không giải quyết hòa bình thế giới hay cái gì đó? (Không, nhưng nghiêm túc, woah . +1)
Doorknob

22

Ruby, 0 không chính xác, 63 56 53 52 51 50 byte

Tất cả các ký tự đều ở dạng ASCII mở rộng , cụ thể là ISO 8859-1 , vì vậy tôi đang đếm mỗi ký tự là một byte đơn.

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

Có vẻ như bộ thử nghiệm của bạn quá ngắn. Tôi đã tạo regex với golfer meta regex của Peter Norvig .

Bạn có thể gọi các chức năng trên như thế nào f["ami"]. Bạn có thể sử dụng khai thác thử nghiệm này để kiểm tra tất cả các trường hợp thử nghiệm:

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}

Kiểm tra nó trên Coding Ground.

Chỉnh sửa: Sử dụng tập lệnh thứ hai của Peter Norvig tôi đã tìm thấy một biểu thức chính khác, thực tế dài hơn một byte, nhưng tôi có thể rút ngắn hai byte bằng tay.

Chỉnh sửa: Sp3000 thiết lập golfer regex mà anh ấy đã viết cho thử thách regex gần đây của tôi về nó và tìm thấy một regex 36 35 34 byte để tôi sử dụng. Cảm ơn vì điều đó!


2
Làm sống lại những cơn ác mộng của meta regex golf ở đây vì tablelà một chuỗi con portablevà việc chuyển đổi được đặt thành khớp không hữu ích lắm vì bộ thứ hai có vẻ dễ khớp hơn ...
Sp3000 6/12/14

13

CJam, 0 lỗi ( 36 32 29 28 byte)

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

Đây là một hàm được đặt tên, vì vậy tôi chỉ đếm mã bên trong. Ngoài ra, olà một câu lệnh in, vì vậy nó không đóng góp vào số byte.

Hãy thử các trường hợp thử nghiệm trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Chỉ cần một hàm băm và tra cứu bảng.

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.