Từ hay gần từ?


8

Viết chương trình hoặc hàm đã cho một chuỗi (hoặc tương đương với ngôn ngữ của bạn), xác định xem chuỗi đó có phải là từ hay không và đưa ra giá trị trung thực hoặc sai.

(Đây không phải là một bản sao của Đây có phải là một từ không? Các từ không chính xác được tạo theo một cách rất khác mà tôi tin rằng đây là một thách thức hoàn toàn khác)

Tất cả các từ sẽ là chữ thường, từ 5 đến 10 ký tự và không có dấu nháy đơn.

Các từ đúng là một tập hợp con được chọn ngẫu nhiên trong danh sách các từ tiếng Anh SCOWL (cỡ 50).

Các từ không chính xác được tạo ra thông qua hai phương pháp: hoán đổi và thay thế.

Các từ "hoán đổi" được tạo ra bằng cách trộn ngẫu nhiên Fisher-Yates trên các chữ cái của các từ được chọn ngẫu nhiên (thực). Thay vì hoán đổi các chữ cái mỗi lần, một chữ cái có thể hoặc không thể hoán đổi (xác suất thay đổi, vì vậy một số từ sẽ thực tế hơn các từ khác). Nếu từ mới khớp với một từ hiện có, kết quả sẽ bị loại bỏ và nó tạo ra một từ khác.

Các từ "thay thế" được tạo bằng một phương pháp tương tự, nhưng thay vì hoán đổi chữ cái này bằng một chữ cái khác, mỗi chữ cái có cơ hội được thay thế bằng một chữ cái ngẫu nhiên khác.

Mỗi phương pháp được sử dụng để tạo ra 50% từ giả mạo.

Chấm điểm

Hàm của bạn phải nhỏ hơn 150 byte . Việc tính điểm được xác định như sau:

percentage of answers correct + ((150 - length of program) / 10) 

Quy tắc

Vì việc này liên quan đến một số lượng lớn các trường hợp kiểm tra (mỗi danh sách từ là 1000 từ), một chương trình kiểm tra tự động là tốt. Trình kiểm tra tự động không được tính vào thời lượng của chương trình; tuy nhiên, nó nên được đăng để những người khác có thể kiểm tra nó.

  • Không sơ hở.
  • Không có chính tả / từ điển liên quan tích hợp.

Tài nguyên

Danh sách các từ: http://pastebin.com/Leb6rUvt

Danh sách không từ (cập nhật) : http://pastebin.com/rEyWdV7S

Các tài nguyên khác (danh sách từ SCOWL và mã được sử dụng để tạo các từ ngẫu nhiên): https://www.dropbox.com/sh/46k13ekm0zvm19z/AAAFL25Z8ogLvXWTDmRwVdiGa?dl=0


2
Tôi biết rằng có sẵn một danh sách từ sẽ đánh bại điểm thách thức, nhưng làm thế nào một chương trình được cho là biết rằng grits (404 trong danh sách không từ) không phải là một từ, coi nó thực sự là một từ?
Geobits

2
Đừng hiểu lầm tôi; Tôi không thích grits chút nào. Tại sao bất cứ ai sẽ ăn chúng là ngoài tôi. Nhưng ngay cả tôi sẽ không đi xa như vậy để từ chối từ bản thân: P
Geobits

Cảnh báo công bằng: Tôi chưa đi xa hơn trong danh sách, vì vậy có thể có những người khác.
Geobits

Vài lời nhiều phi lời nói, một số hơi mờ: quais, paves, colic, supermax. (Lưu ý bên lề: Tôi rất vui mừng khi biết đó supermaxlà một từ thực tế)
Sp3000 17/2/2016

Điều kỳ lạ là thậm chí chạy danh sách thông qua danh sách lớn nhất của SCOWL đã không bắt được bất kỳ ai trong số đó, mặc dù chúng chắc chắn là từ. Tôi đã tạo ra 1000 từ khác (chúng nằm trong liên kết tài nguyên khác) và nếu một từ không thực sự là một từ, nó sẽ được thay thế bằng từ trong danh sách thay thế có cùng số dòng. Trong khi đó, tôi đã cập nhật điều pastebin để sử dụng các từ thay thế cho từ không phải từ.
Daniel M.

Câu trả lời:


8

PHP, 64,9 (50%, 1 byte)

Chà, tôi không thực sự chắc chắn nếu đây là một câu trả lời chấp nhận được, nhưng đây là:

1

Chạy như thế này:

echo '1' | php -- word

Rõ ràng, đối với một danh sách lớn các từ đúng và không chính xác, điều này dẫn đến 50% dương tính giả và 0% âm tính giả, do đó, 50% đúng. Vì chương trình là 1 byte, bạn sẽ nhận được phần thưởng có độ dài tối đa có thể (mặc dù câu trả lời có độ dài bằng không).


Điều thú vị là, điều này khá cạnh tranh do cân bằng điểm số. +1
Addison Crump

6

CJam, 78,6 (78,5%, 149 byte)

l2b0"(1»\]ÁûKëá*ßð%äp`Ï_5ÚY÷:Ä$î ëQXV)­JKÆ¿-(ivHì?{'à\ßÐiCæz°P0ãª/îÏèÄ)WCÅH±Ø^2Ô¥?
î'jJ#OAõ~×cA$[8,ô#~¬#7>"255b2b+=

Khớp 696 từ thật và không khớp với 874 từ không, cho 1570/2000 = 0.785. Đã thử nghiệm trình thông dịch trực tuyến trong Chrome - Tôi không chắc liệu permalink có hoạt động trong Firefox hay không. Trong trường hợp không, chuỗi có chứa không thể in được, có thể được lấy bằng

[24 40 5 49 25 187 92 93 193 251 158 131 75 235 131 225 42 129 223 240 14 37 228 112 96 207 95 53 218 89 247 58 3 196 3 36 1 238 143 32 235 139 81 15 88 86 41 20 173 74 75 198 191 45 40 105 118 72 236 63 123 39 224 15 15 92 223 208 16 147 105 140 67 16 230 122 176 80 26 48 133 227 148 144 170 47 238 207 232 136 24 196 41 87 132 67 197 72 177 216 94 24 50 212 165 63 10 238 39 106 74 35 79 65 245 126 215 136 6 99 65 36 91 56 44 143 155 150 244 35 126 172 35 55 62]:c

Chương trình chỉ băm đầu vào và thực hiện tra cứu dựa trên 1077 thùng có thể. Tôi đã thử chơi golf regex này, nhưng những từ không quá gần với những từ thực sự có ích.

Hãy thử trực tuyến! | Bộ kiểm tra (dán danh sách từ đầy đủ để đếm số lượng trận đấu)


1
"Tôi đã thử chơi golf regex này, nhưng những từ không quá gần với từ thật" - rất nhiều mục tiêu
Daniel M.

3

Mathicala, 69,35 (69,35%, 150 byte)

StringContainsQ[" "|##&@@"seaeiislaanreuaooesrtnlneimdiuuosnlrlggtwtwnsdjexexavsvnuvtxsgokcmairlzlzeyatgpnlfiyhtcdxrvmuqtqtmsfohnk"~StringPartition~2]

Giải trình

Hàm sẽ kiểm tra xem từ có chứa các cặp chữ cái nhất định hiếm khi xảy ra trong các từ thực hay không. Nếu vậy, hàm sẽ trả về True, chỉ ra rằng từ đó có thể không phải là một từ thực sự. Ví dụ: cặp "ii"xảy ra 21 lần trong danh sách không từ, trong khi không xảy ra trong danh sách từ.

Tỷ lệ chính xác

Words:      85.4%  
Not words:  53.3%

0

CSharp, 69,85 (57,45%, 26 byte)

"hoeiaunrt".Contains(s[1])

Tôi kiểm tra xem chữ cái thứ hai của từ có trong danh sách các chữ cái thứ hai phổ biến nhất trong tiếng Anh ( từ trang web này ).

Kiểm tra tự động:

static void Main(string[] args)
{
string[] good = System.IO.File.ReadAllLines( @"PATH_GOOD.txt");
string[] bad = System.IO.File.ReadAllLines(@"PATH_BAD.txt");

int counter_good = 0;
int counter_bad = 0;

foreach (string s in good)
{
    if ("hoeiaunrt".Contains(s[1])) counter_good++;
}

foreach (string s in bad)
{
    if (!("hoeiaunrt".Contains(s[1]))) counter_bad++;
}

Console.WriteLine(counter_good);
Console.WriteLine(counter_bad);

Console.ReadLine();
}

Kết quả:

828
321

Phép tính:

(828+321)/20 + 124/10 = 57.45 + 12.4 = 69.85

0

ES6, 76 (67,4%, 64 byte)

Một câu trả lời nghiêm túc hơn lần này. Đây là một thuật toán khá đơn giản. Nó trả về một giá trị trung thực khi ký tự thứ hai của một từ là một trong số đó aeinoru. Nó không mang lại tỷ lệ thành công tốt hơn đáng kể so với chỉ 1, nhưng nó vẫn rất ngắn.

w=>/^[^qxy][aehil-prux]/.test(w)>/[^aeiouy]{3}|[fiopq]$/.test(w)

Kiểm tra tại đây.

  • +2.7 bằng cách thêm biểu thức chính quy để tìm các từ có 3 phụ âm liên tiếp trở lên và quy định chúng là "không từ"
  • +0.1 bằng cách thay thế &!bằng>
  • +1,95 bằng cách loại trừ các ký tự đầu tiên không phổ biến nhất qxy , thêm các ký tự thứ hai hợp lệ (phổ biến) hơn để bù cho các phủ định sai, loại bỏ dấu phẩy thừa trong regex
  • +0,05 bằng cách loại trừ các từ kết thúc bằng các ký tự kết thúc không chắc fiopq
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.