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
, *SEA
TUX
4 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).
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:
- Adam Rosenfield, Python, 20~
- John Fouhy, Python, ~3s
- Kent Fredric, Perl, ~1'ler
- Darius Bacon, Python, ~1'ler
- rvarcher, VB.NET (live link), ~1'ler
- Paolo Bergantino, PHP (live link), ~5s (~2 lokal olarak)
Ö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
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.
Nasıl MySQL kullanıcı hesaplarının bir...
Nasıl bir DOM düğüm üzerinde olay dinl...
bir öğe veri-öznitelik değeri için bir...
Bunları nasıl belirli sütun adları ile...
Nasıl dizin Python içinde olup olmadığ...