Надо быстро алгоритм набросать как палиндромические панграммы из данного словаря выуживать, но что-то не больно "набрасывается". Может кто работал с этим и подскажет?
Пример панграмм (читаются одинаково задом наперед):
"mom", "racecar", "34543", or the phrase "never odd or even".
Able was I ere I saw Elba A man, a plan, a canal, Panama
Словарь (170000 слов):
...
abakas
abalone
abalones
abamp
abampere
abamperes
abamps
abandon
abandoned
....
Все что пришло в голову - загрузить все в таблицу:
#!/usr/bin/perl
open(FILEHANDLE,"WORD_LST");
@fileContents = <FILEHANDLE>;
close(FILEHANDLE);
for $_ ( @fileContents)
{
#chomp($_);
if (/(\w+)(\s)/) {
print "INSERT INTO word_lst (word,drow,length)values ('$1',REVERSE('$1'),".length($1).");\n";
}
}
(chomp почему-то не отсекает \n в $_)
Результат выполнения перл скрипта:
...
INSERT INTO word_lst (word,drow,length)values ('abaca',REVERSE('abaca'),5);
INSERT INTO word_lst (word,drow,length)values ('abacas',REVERSE('abacas'),6);
INSERT INTO word_lst (word,drow,length)values ('abaci',REVERSE('abaci'),5);
...
создал уникальные индексы на колонки word and drow.
и сделал join (Oracle)
select /* first_rows*/ wl1.word,wl2.word panagram
from word_lst wl1, word_lst wl2
where wl1.word||wl2.word=wl2.drow||wl1.drow
and substr(wl1.word,1,least(wl1.length,wl2.length))=substr(wl2.drow,1,least(wl1.length,wl2.length))
and substr(wl2.word,1,least(wl1.length,wl2.length))=substr(wl1.drow,1,least(wl1.length,wl2.length))
and rownum<10
/
Результат:
....
egad adage
seg adages
sex addaxes
redd adder
meed adeem
tidal adit
...
Заметьте: только 2 слова, а уже 170.000*170.000 потенциальных сравнений, а мне надо еще что-бы все буквы алфавита в панаграмме были, т.е. я буду self-join еще пяток раз.
Вопрос: есть ли оптимальное решение?
Palindromic Pangram
-
- Уже с Приветом
- Posts: 1018
- Joined: 24 Jan 2002 10:01
- Location: Слава Украине!