Metinde yazım hatalarını say; kodunuzdaki yazım hatalarının sayısını en aza indirin


28

İki giriş alan bir program veya işlev yazın:

  1. Bir yazılı mesaj
  2. İngilizce dil sözlüğü, bu Github dosyasında göründüğü gibi (yaklaşık 60000 kelime içerir)

ve mesajdaki yazım hatalarının sayısını gösterir (tanım ve test durumları için aşağıya bakın).

Sözlüğü işlevinize bir parametre olarak, programınızın bulmasını beklediği önceden tanımlanmış bir dosya olarak, kodunuzda sabit kodlanmış veriler olarak veya başka bir mantıklı şekilde alabilirsiniz.


Kodunuz kısa bir yazım hatasıyla birlikte kısa mesaj gibi görünmelidir. Yani, hesaplar kodunuzun puanını giriş olarak kendisine besleyerek .

Kazanan en düşük puana sahip koddur (mümkün olan en düşük puan 0'dır). Aynı puanda birkaç cevap varsa, kazanan kod büyüklüğüne göre (karakter olarak) karar verilir. İki cevap hala bağlıysa, kazanan ilk cevaptır.


Gerekirse, giriş mesajının geleneksel şekilde kodlanmış (1 bayt "10" veya 2 bayt "13 10") ve boş olmayan ASCII (bayt 32 ... 126) olduğunu varsayabilirsiniz. Ancak, kodunuz ASCII olmayan karakterlere sahipse, ASCII olmayan girişi de desteklemelidir (böylece kendi puanını hesaplayabilir).

Karakterler aşağıdaki sınıflara bölünmüştür:

  • Harfler a ... z ve A ... Z
  • Boşluk (burada boşluk karakteri veya yeni satır karakteri olarak tanımlanır)
  • Noktalama . , ; : ! ?
    • Cümle bitmeyen . ! ?
  • Çöp (geri kalan her şey)

Bir kelime , maksimum olan bir harf dizisi olarak tanımlanır (yani bundan önce gelen veya hiçbir harf gelmeyen).

Bir cümle , cümle bitmeyen maksimum karakter dizisi olarak tanımlanır.

Karakter, yazım kurallarından herhangi birini ihlal ettiği takdirde yazım hatasıdır :

  1. Bir harf, bir sözlük kelimesine ait olmalıdır (veya başka bir deyişle: sözlükte görünmeyen her N uzunluğu kelimesi, Heceleme hataları olarak sayılır)
  2. Bir cümlenin ilk karakteri, başlangıçtaki boşluk karakterlerini yok sayarak, büyük harf olmalıdır
  3. Önceki kural tarafından belirtilenlerin dışındaki tüm harflerin küçük harf olması gerekir.
  4. Noktalama karakterlerine yalnızca bir harf veya çöpten sonra izin verilir
  5. Yeni satır karakterine yalnızca cümle biten bir karakterden sonra izin verilir
  6. Boşluk karakterlerine mesajın başında ve boşluk karakterlerinden sonra izin verilmez
  7. Hiçbir çöp olmamalıdır (veya başka bir deyişle: her çöp karakterinin saydığı bir yazım hatasıdır)

Ek olarak, son cümle ya boş olmalı ya da tam olarak bir yeni satır karakterinden oluşmalıdır (yani, mesaj cümle biten bir karakterle ve isteğe bağlı bir yeni satırla bitmelidir - hadi kural 8 diyelim).

Test durumları (her karakterin altında ihlal ettiği bir kuraldır; =>gerekli cevaptan sonra ):

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
Bir sürü boşluk bekliyordum ama hepsini gizlemiş gibiydin. Benden +1.
Nathan Merrill,

4
Bence burada SPL kazanan SPL .
Gurupad Mamadapur,

2
. Gerrude daha da iyi. Komutlar isteğe bağlı cümlelerdir, yalnızca sözcük sayımı ve ortalama sözcük uzunluğu önemlidir.
Rainer P.

Bunu gördüğümde "Applescript" diye düşündüm. Yine de bir Mac yok.
PurkkaKoodari

1
@PeterTaylor Kuralların fazla karmaşık olmasını istemiyorum. Test durumunuz iyi; Yazıma ekledim.
anatolyg

Yanıtlar:


6

Perl 6 , 134 yazım hataları

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

Okunabilirlik için ekstra boşluk ile:

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

Notlar:

  • Sözlüğü 3.14159265358979geçerli çalışma dizininde adı verilen bir dosyada bekler .
  • Sadece ilham alan kısım çizgi
    append mistakes, .comb when none words slurp pi given lc word,
    gerisi oldukça kötü. Ama belki de en azından daha iyi çözümler için temel olarak hizmet verebilir ... :)

4
Şimdiye kadar en okunabilir perl kodu
Kritixi Lithos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.