Hitung kesalahan ejaan dalam teks; meminimalkan jumlah kesalahan ejaan dalam kode Anda

28

Tulis program atau fungsi yang membutuhkan dua input:

  1. Pesan teks
  2. Kamus bahasa Inggris, seperti yang terlihat dalam file Github ini (berisi sekitar 60000 kata)

dan menampilkan jumlah kesalahan ejaan dalam pesan (lihat di bawah untuk definisi dan kasus uji).

Anda dapat menerima kamus sebagai parameter untuk fungsi Anda, sebagai file yang telah ditentukan sebelumnya yang ingin ditemukan oleh program Anda, sebagai data hard-coded dalam kode Anda, atau dengan cara apa pun yang masuk akal lainnya.


Kode Anda seharusnya terlihat seperti pesan teks, dengan jumlah kesalahan ejaan yang minimal. Jadi, Anda akan menghitung skor kode Anda dengan memasukkannya sendiri sebagai input.

Pemenangnya adalah kode yang memiliki skor terendah (skor minimal yang mungkin adalah 0). Jika ada beberapa jawaban dengan skor yang sama, pemenang ditentukan oleh ukuran kode (dalam karakter). Jika dua jawaban masih terikat, pemenangnya adalah yang sebelumnya.


Jika diperlukan, Anda dapat menganggap pesan input adalah ASCII (byte 32 ... 126) dengan baris baru yang disandikan secara konvensional (1 byte "10" atau 2 byte "13 10"), dan tidak kosong. Namun, jika kode Anda memiliki karakter non-ASCII, kode tersebut juga harus mendukung input non-ASCII (sehingga dapat menghitung skornya sendiri).

Karakter dibagi menjadi beberapa kelas berikut:

  • Huruf a ... z dan A ... Z
  • Spasi (didefinisikan di sini sebagai karakter spasi atau karakter baris baru)
  • Tanda baca . , ; : ! ?
    • Akhir kalimat . ! ?
  • Sampah (sisanya)

Sebuah kata didefinisikan sebagai urutan huruf, yang maksimal (yaitu tidak diawali atau diikuti oleh huruf).

Sebuah kalimat didefinisikan sebagai urutan maksimal karakter yang tidak mengakhiri kalimat.

Karakter adalah kesalahan ejaan jika melanggar salah satu aturan ejaan:

  1. Sebuah huruf harus berasal dari kata kamus (atau, dengan kata lain: setiap kata dengan panjang N yang tidak muncul dalam kamus dianggap sebagai kesalahan ejaan N)
  2. Karakter pertama dalam sebuah kalimat, mengabaikan karakter spasi putih awal, harus berupa huruf besar
  3. Semua huruf harus huruf kecil, kecuali yang ditentukan oleh aturan sebelumnya
  4. Karakter tanda baca hanya diperbolehkan setelah surat atau sampah
  5. Karakter baris baru hanya diperbolehkan setelah karakter akhir kalimat
  6. Karakter spasi putih tidak diizinkan di awal pesan dan setelah karakter spasi putih
  7. Seharusnya tidak ada sampah (atau, dengan kata lain: setiap karakter sampah dihitung adalah kesalahan ejaan)

Selain itu, kalimat terakhir harus berupa kosong atau hanya terdiri dari satu karakter baris baru (yaitu pesan harus diakhiri dengan karakter akhir kalimat dan baris baru opsional - sebut saja aturan 8).

Uji kasus (di bawah setiap karakter adalah aturan yang dilanggar; setelah itu =>adalah jawaban yang diperlukan):

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')
anatolyg
sumber
2
Saya mengharapkan banyak celah, tetapi Anda sepertinya menutupi semuanya. +1 dari saya.
Nathan Merrill
4
Saya pikir SPL adalah pemenangnya di sini.
Gurupad Mamadapur
2
. Geertude bahkan lebih baik. Perintah adalah kalimat yang berubah-ubah, hanya hitungan kata dan panjang rata-rata kata saja.
Rainer P.
Saya pikir "Applescript" ketika saya melihat ini. Tapi tidak punya Mac.
PurkkaKoodari
1
@PeterTaylor Saya tidak ingin aturan menjadi terlalu rumit. Kasing uji Anda baik-baik saja; Saya menambahkannya ke posting saya.
anatolyg

Jawaban:

6

Perl 6 , 134 kesalahan pengejaan

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

Dengan spasi putih ekstra untuk keterbacaan:

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

Catatan:

  • Harapkan kamus dalam file yang disebut 3.14159265358979di direktori kerja saat ini.
  • Satu-satunya bagian yang diilhami adalah garis
    append mistakes, .comb when none words slurp pi given lc word,
    sisanya cukup buruk. Tapi mungkin itu setidaknya bisa berfungsi sebagai dasar untuk solusi yang lebih baik ... :)
seseorang
sumber
4
Kode perl yang paling mudah dibaca
Kritixi Lithos