SORU
14 NİSAN 2009, Salı


Nasıl bir mektup matris Olası sözleri [kelime oyunu Çözücü]listesini bulmak için

Son zamanlarda benim iPhone üzerinde bir oyun Scramble adlı oynuyorum. Bazılarınız bir oyun olarak bu oyunu biliyor olabilir. Oyun başladığında aslında, o gibi harflerin bir matris olsun:

F X I E
A M L O
E W B X
A S T U

Oyunun amacı zincirleme mektupları ile birlikte meydana mümkün olduğunca çok sayıda kelimeleri bulmak için. Sen-ebilmek başlamak ile herhangi bir harf ve her harf o çevreleyen Bu adil oyun, ve daha sonra bir kez taşımak için bir sonraki harf, her harf o surround harfi, adil oyundaha önce kullanılan herhangi bir harf dışında. Örneğin ızgaranın üstünde, kelimeler, , *, FAME, *SEATUX4 vb ile gelebilir. Kelime en az 3 karakter, ve bu oyunda 16 olurdu NxN karakterler, daha fazla olması gerekir ama bazı uygulamalarda değişiklik gösterebilir. Süre bu oyun eğlenceli ve bağımlılık, ben görünüşe göre çok iyi ve istediğim için biraz hile yaparak bir program bu bana mümkün olan en iyi kelime (Uzun kelime, daha fazla puan almak).

Sample Boggle

Ne yazık ki, algoritmaları veya onların verimlilik ile çok iyi ve çok ileri değilim. Benim ilk denemem such as this one sözlük (~2.3 MB) kullanır ve doğrusal bir arama sözlük girişleri ile kombinasyon eşleştirmek için çalışıyor. Bu bir alırçokuzun zaman olası kelimeleri bulmak için, ve sadece tur başına 2 dakika olsun bu yana, sadece yeterli değil.

Eğer herhangi bir Stackoverflowers daha etkin bir çözüm ile gelip görmek için ilgileniyorum. Çoğunlukla çözümleri Büyük 3 Ps kullanarak arıyorum: Python, PHP, ve Java veya C hız önemli olduğu için çok serin olduğunu, ancak Perl,.

MEVCUT ÇÖZÜMLER:

ÖDÜL:

Kendi programları ile katkıda bulunduk veren herkese teşekkür etme şeklim bu soru için bir ödül koyuyorum. Ne yazık ki sadece hızlı 7 gün boggle çözücü ve kazanan ödül olan ölçeceğim yani içinizden biri kabul edilen cevap verebilirim.

Ödül alırlar. Herkese katıldığı için teşekkür ederiz.

CEVAP
15 NİSAN 2009, ÇARŞAMBA


Benim cevabım da diğerleri gibi burada çalışıyor, ama biraz daha hızlı diğer çözümlere göre Python, Sözlük hızlı ayar kadar göründüğü için göndeririz. (John Fouhy çözüm karşı kontrol ettim.) Kurulumdan sonra, çözmek için zaman aşağı gürültü.

grid = "fxie amlo ewbx astu".split()
nrows, ncols = len(grid), len(grid[0])

# A dictionary word that could be a solution must use only the grid's
# letters and have length >= 3. (With a case-insensitive match.)
import re
alphabet = ''.join(set(''.join(grid)))
bogglable = re.compile('['   alphabet   ']{3,}$', re.I).match

words = set(word.rstrip('\n') for word in open('words') if bogglable(word))
prefixes = set(word[:i] for word in words
               for i in range(2, len(word) 1))

def solve():
    for y, row in enumerate(grid):
        for x, letter in enumerate(row):
            for result in extending(letter, ((x, y),)):
                yield result

def extending(prefix, path):
    if prefix in words:
        yield (prefix, path)
    for (nx, ny) in neighbors(path[-1]):
        if (nx, ny) not in path:
            prefix1 = prefix   grid[ny][nx]
            if prefix1 in prefixes:
                for result in extending(prefix1, path   ((nx, ny),)):
                    yield result

def neighbors((x, y)):
    for nx in range(max(0, x-1), min(x 2, ncols)):
        for ny in range(max(0, y-1), min(y 2, nrows)):
            yield (nx, ny)

Örnek kullanım:

# Print a maximal-length word and its path:
print max(solve(), key=lambda (word, path): len(word))

Düzenleme:Filtre kelime en az 3 harf uzunluğunda.

Edit 2:Kent Fredric Perl çözüm daha hızlı oldu; karakter kümesi yerine düzenli ifade eşleme kullanmak için çıkıyor neden merak ettim. Hakkında Python aynı yapıyor hızı iki katına çıkar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011
  • Skittles Page

    Skittles Pag

    28 Mart 2011