Đếm lỗi chính tả trong văn bản; giảm thiểu số lỗi chính tả trong mã của bạn


28

Viết chương trình hoặc hàm có hai đầu vào:

  1. Một tin nhắn văn bản
  2. Từ điển của ngôn ngữ tiếng Anh, như nó xuất hiện trong tệp Github này (chứa khoảng 60000 từ)

và đưa ra số lỗi chính tả trong thông báo (xem bên dưới để biết định nghĩa và trường hợp kiểm tra).

Bạn có thể nhận từ điển dưới dạng tham số cho chức năng của mình, dưới dạng tệp được xác định trước mà chương trình của bạn mong muốn tìm thấy, dưới dạng dữ liệu được mã hóa cứng trong mã của bạn hoặc theo bất kỳ cách thức hợp lý nào khác.


Mã của bạn sẽ trông giống như một tin nhắn văn bản, với một số lỗi chính tả tối thiểu. Vì vậy, bạn sẽ tính điểm của mã bằng cách đưa nó vào chính nó làm đầu vào.

Người chiến thắng là mã có điểm thấp nhất (điểm tối thiểu có thể là 0). Nếu có một vài câu trả lời có cùng số điểm, người chiến thắng được quyết định theo kích thước mã (tính theo ký tự). Nếu hai câu trả lời vẫn bị ràng buộc, người chiến thắng là câu trả lời trước đó.


Nếu được yêu cầu, bạn có thể giả sử thông báo đầu vào là ASCII (byte 32 ... 126) với các dòng mới được mã hóa theo cách thông thường (1 byte "10" hoặc 2 byte "13 10") và không trống. Tuy nhiên, nếu mã của bạn có các ký tự không phải ASCII, thì nó cũng nên hỗ trợ đầu vào không phải ASCII (để nó có thể tính điểm của chính nó).

Các ký tự được chia thành các lớp sau:

  • Chữ a ... z và A ... Z
  • Khoảng trắng (được định nghĩa ở đây là ký tự khoảng trắng hoặc ký tự dòng mới)
  • Chấm câu . , ; : ! ?
    • Kết thúc câu . ! ?
  • Rác (tất cả phần còn lại)

Một từ được định nghĩa là một chuỗi các chữ cái, là tối đa (nghĩa là không đi trước cũng không theo sau bởi một chữ cái).

Một câu được định nghĩa là một chuỗi các ký tự tối đa không kết thúc câu.

Một ký tự là một lỗi chính tả nếu nó vi phạm bất kỳ quy tắc chính tả nào:

  1. Một chữ cái phải thuộc về một từ trong từ điển (hay nói cách khác: mỗi từ có độ dài N không xuất hiện trong từ điển được tính là lỗi chính tả N)
  2. Ký tự đầu tiên trong câu, bỏ qua mọi ký tự khoảng trắng ban đầu, phải là một chữ cái viết hoa
  3. Tất cả các chữ cái phải là chữ thường, ngoại trừ những chữ cái được quy định bởi quy tắc trước đó
  4. Một ký tự dấu chấm câu chỉ được phép sau một chữ cái hoặc rác
  5. Một ký tự dòng mới chỉ được phép sau một ký tự kết thúc câu
  6. Các ký tự khoảng trắng không được phép ở phần đầu của tin nhắn và sau các ký tự khoảng trắng
  7. Không nên có rác (hay nói cách khác: mỗi ký tự rác là một lỗi chính tả)

Ngoài ra, câu cuối cùng phải trống hoặc bao gồm chính xác một ký tự dòng mới (tức là tin nhắn sẽ kết thúc bằng một ký tự kết thúc câu và một dòng mới tùy chọn - hãy gọi nó là quy tắc 8).

Các trường hợp thử nghiệm (bên dưới mỗi ký tự là một quy tắc mà nó vi phạm; sau đó =>là câu trả lời bắt buộc):

Here is my 1st test case!!
           711           4                => 4

main(){puts("Hello World!");}
2   777    883     3     77 78            => 12

  This message starts with two spaces
66                                   8    => 3

What ? No apostrophe's??
     4              71 4                  => 4

  Extra   whitespace   is   BAD!
66      661111111111 66   66333           => 21

Several
lines?
Must be used only to separate sentences.
                                          => 1 (first linebreak is en error: rule 5)

"Come here," he said.
73         7                              => 3 (sentence starts with '"', not 'C')

2
Tôi đã mong đợi một loạt các sơ hở, nhưng dường như bạn đã bao gồm tất cả. +1 từ tôi.
Nathan Merrill

4
Tôi nghĩ SPL là người chiến thắng ở đây.
Gurupad Mamadapur

2
.Gertrude thậm chí còn tốt hơn. Các lệnh là các câu tùy ý, chỉ đếm từ và vấn đề độ dài từ trung bình.
Rainer P.

Tôi đã nghĩ "Applescript" khi tôi thấy điều này. Mặc dù vậy, đừng có máy Mac.
PurkkaKoodari

1
@PeterTaylor Tôi không muốn các quy tắc trở nên quá phức tạp. Trường hợp thử nghiệm của bạn là tốt; Tôi đã thêm nó vào bài viết của tôi.
anatolyg

Câu trả lời:


6

Lỗi chính tả 6 , 134

my token punctuation {<[.,;:!?]>}
my \text = slurp; my \mistakes=[]; for split /\.|\!|\?/, text { for .trim.match: :g, /<:letter>+/ -> \word { (append mistakes, .comb when none words slurp pi given lc word) or (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./) }}
append mistakes, comb / <after \s | <punctuation>> <punctuation> | <!before <punctuation> | <:letter> | \s> . | <!after \.|\!|\?> \n | [<before ^> | <after \s>] \s /, text; say mistakes.Numeric

Với khoảng trắng thêm cho khả năng đọc:

my token punctuation {<[.,;:!?]>}
my \text = slurp;
my \mistakes=[];
for split /\.|\!|\?/, text {
    for .trim.match: :g, /<:letter>+/ -> \word {
        (append mistakes, .comb when none words slurp pi given lc word)
        or
        (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./)
    }
}
append mistakes, comb /
  <after \s | <punctuation>> <punctuation>
  | <!before <punctuation> | <:letter> | \s> .
  | <!after \.|\!|\?> \n
  | [<before ^> | <after \s>] \s
/, text;
say mistakes.Numeric

Ghi chú:

  • Yêu cầu từ điển trong một tệp được gọi 3.14159265358979trong thư mục làm việc hiện tại.
  • Phần duy nhất lấy cảm hứng là dòng
    append mistakes, .comb when none words slurp pi given lc word,
    phần còn lại là khá xấu. Nhưng có lẽ nó ít nhất có thể đóng vai trò là cơ sở cho các giải pháp tốt hơn ... :)

4
Mã perl dễ đọc nhất từ ​​trước đến nay
Kritixi Lithos
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.