2010-08-13 13 views
8

Zrobiłem trochę wyszukiwania Google, ale nie mogłem znaleźć tego, czego szukałem.Sprawdzanie poprawności słów względem angielskiego słownika w Railsach?

Zajmuję się tworzeniem gry typu scrabble w szynach i zastanawiałem się, czy istnieje prosty sposób sprawdzenia, co gracz wkłada do gry w rzeczywistości. Piszą to słowo.

Czy weryfikacja w stosunku do bazy słowników języka angielskiego załadowana w aplikacji najlepiej rozwiązuje ten problem? Jeśli tak, czy są jakieś biblioteki oferujące taką funkcjonalność? Jeśli nie, co byś zasugerował?

Dzięki za pomoc!

Odpowiedz

2

Poradnik nieobowiązkowy dla języka tutaj, polega na tym, że jeśli dbasz tylko o istnienie słowa (które w takim przypadku robisz) i planujesz załadować całą bazę danych do aplikacji (która twoje zapytanie sugeruje, że rozważasz), wtedy DAWG umożliwi ci sprawdzenie istnienia w złożoności czasu O (n), gdzie n jest wielkością słowa (rozmiar słownika nie daje żadnego efektu - ogólnie wyszukiwanie jest zasadniczo O (1)) , będąc relatywnie minimalną strukturą pod względem pamięci (w rzeczy samej, niektóre wstawienia faktycznie zmniejszą rozmiar struktury, DAWG dla "góry, stukania, stukania, wierzchołków" ma mniej węzłów niż jeden dla "wierzchołków, dotknij").

+0

W przypadku ruby ​​prawdopodobnie chciałbyś użyć 'Set': tablica zajęłaby czas proporcjonalnie proporcjonalny do wielkości słownika, a jeśli używałbyś skrótu, używałbyś kluczy, ale nie wartości. –

+0

Jeśli słownik nie jest bardzo mały, nawet słaby i interpretowany DAWG pokona zestaw bazujący na haszyszu. DAWG jest zasadniczo O (1) pod względem wielkości słownika, wpływa na to tylko rozmiar słowa (na tworzenie hashów ma również wpływ wielkość słowa), ale z wszystkimi innymi czynnikami dotyczącymi algorytmów DAWG wychodzi lepiej. DAWG jest całkiem normalną strukturą dla dużych zestawów strun (słów, sekwencji DNA itp.). –

11

trzeba dwie rzeczy:

  1. słowo lista
  2. jakiś kod

Lista słowo jest skomplikowana część. W większości systemów uniksowych dostępna jest lista słów pod numerem /usr/share/dict/words lub /usr/dict/words - patrz: http://en.wikipedia.org/wiki/Words_(Unix), aby uzyskać więcej informacji. Ten na moim Macu zawiera 234.936 słów. Ale nie wszystkie są poprawnymi słowami Scrabble. Musisz więc jakoś nabyć słownik Scrabble, upewnij się, że masz odpowiednią licencję na jego użycie i przetwórz go tak, aby był plikiem tekstowym.

(Aktualizacja:. Lista słowo LetterPress jest teraz open source i available on GitHub)

Kod nie jest problemem w prostym przypadku. Oto skrypt I bita właśnie teraz:

words = {} 
File.open("/usr/share/dict/words") do |file| 
    file.each do |line| 
    words[line.strip] = true 
    end 
end 
p words["magic"] 
p words["saldkaj"] 

Będzie to wyjście

true 
nil 

Zostawiam to jako ćwiczenie dla czytelnika, aby go w odpowiednie słowa sprzeciwu. (Technicznie nie jest to Słownik, ponieważ nie ma definicji). Lub użyć DAWG zamiast skrótu, nawet jeśli hasz prawdopodobnie odpowiada Twoim potrzebom.

+0

Cóż, jest to gra typu wariant scrabble, więc każdy renomowany słownik (webster i in.) Będzie prawdopodobnie w porządku. Czy po prostu owinąłbym kod w funkcję sprawdzania poprawności i podstawiłbym "usr/share/dict/words" (lub źródło, skąd otrzymuję słowa) za pomocą słownika API? – dartfrog

+0

Słownik dla [LetterPress] (http://www.atebits.com/letterpress/) jest teraz open source i [dostępny na GitHubie] (https://github.com/atebits/Words). – AlexChaffee

Powiązane problemy