Форум Фотогалерея Деловой мир Мелитополя
Мелитополь
Мелитопольский форум
 
 RSS  FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Алгоритм решения игры "Что за слово"
На страницу 1, 2, 3  След.
 
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пт Сен 29, 2006 00:53 am    Заголовок сообщения: Алгоритм решения игры "Что за слово" Ответить с цитатой

интересно выслушать варианты решения игры http://melitopol.com.ua/forum/viewtopic.php?t=1322.
алгоритм не должен использовать какие-либо сторонние программы.
думаю тема довольно интересная хотя в принципе решение довольно просто но хочется выслушать варианты.

Код:
[root@dev words]# time ./start.sh рнгкмтиеа
Searching:
.................................................................
Найдено:
маркетинг

real    0m1.253s
user    0m0.896s
sys     0m0.096s

Язык реализации - PHP
словарь - 163294 слов
процессор - Semptron 2.2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 10:11 am    Заголовок сообщения: Ответить с цитатой

То что программку написал не поленился эт конешно хорошо, но зачем было брать как пример, последнее использ. слово? эх ты, ну ок, не учёл знач. Придумывай теперь слово, но ток по правилам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пт Сен 29, 2006 10:27 am    Заголовок сообщения: Ответить с цитатой

простите я просто запарился Smile поднял из истории последний вызов, а там как раз последнее слово вылезло Smile
Если б ты не сказал то наврятли кто-нить и заметил кстати Smile так как такое сочетание букв сложно запомнить а заметить соответствие тем более Laughing
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Максмел

Горожанин


Пол: Пол: Он
Зарегистрирован: 31.01.2006
Сообщения: 113

Репутация: 17.2
голосов: 1

СообщениеДобавлено: Пт Сен 29, 2006 12:18 pm    Заголовок сообщения: Ответить с цитатой

Алгоритм? Ну, если есть словарь в одном файле, то просто:
Ищешь слова, длина которых совпадает с длиной слова-загадки, затем проверяешь количество входящих букв ("уйх": а-0, б-0, ..., у-1, й-1...),
если количество всех букв совпадает, то слово подходит.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пт Сен 29, 2006 12:23 pm    Заголовок сообщения: Ответить с цитатой

Максмел писал(а):
Алгоритм? Ну, если есть словарь в одном файле, то просто:
Ищешь слова, длина которых совпадает с длиной слова-загадки, затем проверяешь количество входящих букв ("уйх": а-0, б-0, ..., у-1, й-1...),
если количество всех букв совпадает, то слово подходит.

ну прикинь слово в 5 букв у тебя к примеру выпадет 10000 слов из пяти букв. И что ты потом в каждом будешь искать соответствие букв ? Как по моему будет долго. особенно если учитывать что буква может попадаться несколько раз.
В данном примере тебе прийдется выполнить
100000 - тыс операций на обработку словаря
+ 50 тыс на поиск букв с словах.
как по моему громоздко
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
Максмел

Горожанин


Пол: Пол: Он
Зарегистрирован: 31.01.2006
Сообщения: 113

Репутация: 17.2
голосов: 1

СообщениеДобавлено: Пт Сен 29, 2006 12:59 pm    Заголовок сообщения: Ответить с цитатой

ЕСЛИ длина текущего слова = длине искомого ТО
{
подсчитываем количество разных букв в слове // "ротт": р=1, о=1, т=2
ЕСЛИ количество соответствующих букв совпадает ТО слово найдено
}
ИНАЧЕ берем следующее слово

По-моему ничего тут сложного. Разве что искомое слово будет в самом конце. Тогда действительно будут перебираться все слова, длина которых равна длине искомого.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 13:04 pm    Заголовок сообщения: Ответить с цитатой

Я кон. уже не помню в Алгебре формулу (не знал, да еще и забыл), но прикол должен быть такой:
Слово из 5 букв "12345", теперь ты должен взять каждую букв. и отд. ей от слова ... бутер, сам не знаю что нач. говорить, продолжим, надо как я понемаю составить макс. кол-во вариации с этими буквами, по форм., пример :
12354
12534 - ну думаю вы меня поняли, потом запомнить, каждый вариант и подставлять/сравнивать каждый вар. с словарём, если слово не образовалось, тоесть вышло что то типо "тпоел", то оно покажется, крит. эрор, а если выйдет реал. слово "тепло", то словарь отреагир. что грамматика прав. ошибки нет. тоесть "Ю вин". Клос. програм.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 13:07 pm    Заголовок сообщения: Ответить с цитатой

Максмел писал(а):
ЕСЛИ длина текущего слова = длине искомого ТО
{
подсчитываем количество разных букв в слове // "ротт": р=1, о=1, т=2
ЕСЛИ количество соответствующих букв совпадает ТО слово найдено
}
ИНАЧЕ берем следующее слово

По-моему ничего тут сложного. Разве что искомое слово будет в самом конце. Тогда действительно будут перебираться все слова, длина которых равна длине искомого.


Хм, ты в эргономике не силён, думай как упростить. По твоему нужно разбивать тогда каждое слово со словаря и сравнивать отдельно по буквам. Прочти мой вар. , там проще, в конце вар. слова снова дел. одним целым и сравниваеш уже как целое слово, а не это...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Максмел

Горожанин


Пол: Пол: Он
Зарегистрирован: 31.01.2006
Сообщения: 113

Репутация: 17.2
голосов: 1

СообщениеДобавлено: Пт Сен 29, 2006 13:13 pm    Заголовок сообщения: Ответить с цитатой

ReZak писал(а):
Я кон. уже не помню в Алгебре формулу (не знал, да еще и забыл), но прикол должен быть такой:
Слово из 5 букв "12345", теперь ты должен взять каждую букв. и отд. ей от слова ... бутер, сам не знаю что нач. говорить, продолжим, надо как я понемаю составить макс. кол-во вариации с этими буквами, по форм., пример :
12354
12534 - ну думаю вы меня поняли, потом запомнить, каждый вариант и подставлять/сравнивать каждый вар. с словарём, если слово не образовалось, тоесть вышло что то типо "тпоел", то оно покажется, крит. эрор, а если выйдет реал. слово "тепло", то словарь отреагир. что грамматика прав. ошибки нет. тоесть "Ю вин". Клос. програм.


Да, но при наличии словаря, такой метод можно отбросить. Ты знаешь, сколько вариантов перестановок в слове, где 20 неповторяющихся букв? По ходу 20! (!-факториал) К примеру, слово, где 10 разных букв - это уже 3 628 800 вариантов перестановок. А 12 УЖЕ 479 001 600...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
Максмел

Горожанин


Пол: Пол: Он
Зарегистрирован: 31.01.2006
Сообщения: 113

Репутация: 17.2
голосов: 1

СообщениеДобавлено: Пт Сен 29, 2006 13:20 pm    Заголовок сообщения: Ответить с цитатой

И учитывай еще то, с каждым "словом" из миллионов/миллиардов твоих перестановок тебе придется сделать поиск по всему словарю. У меня поиск пройдет только один раз, хоть и тщательно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение  
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 13:30 pm    Заголовок сообщения: Ответить с цитатой

Напомни мне формулу для начала, поверь лучше такой вариант, чем тупой перебор каждого слова, ведь компьютеру сначало нужно узнать, состоит ли слово с библиотеки именно с такими параметрами как твоё слово, тоесть по люб. ты перероеш всю библиотеку, на дан. кол-во символов, вот теперь и подумай, что проще будет ).
Мне кажестя, что лучше комп. сначала образовать кучю вариантов, а потом сравн. с библиотекой. Тоесть компьютеру быстрее обр. эт вариант, чем потом начать разбив. кажд, слово из словаря, это уже не так просто.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пт Сен 29, 2006 13:32 pm    Заголовок сообщения: Ответить с цитатой

Максмел писал(а):
И учитывай еще то, с каждым "словом" из миллионов/миллиардов твоих перестановок тебе придется сделать поиск по всему словарю. У меня поиск пройдет только один раз, хоть и тщательно.

У тебя поиск делается в 2 раза а у меня в 1. И вообще кто тебе сказал что у меня перебор ? Laughing
Раскрою свой алгоритм.
1. создаем словарь с ХЕШЕМ . хеш состит из букв поставленных в алфивитном порядке и знака # содержащий основное слово
Цитата:
абиийклосссттю#абсолютистский
азйнопррчы#прозрачный
аблнооссттью#абсолютность
ийстчы#чистый
абйлностыю#абсолютный
абилосцюя#абсолюция
аббенорст#абсорбент
аббейннорсты#абсорбентный
аббеоррс#абсорбер

2.На основе абракадабры которую ввели делаю ХЕШ ()
3. ищу хеш.
4. в найденных строках выделяю слово.
ВСЕ !!!

код создания словаря с хешем:
Код:
include('hash.php');
$file_ar=file('words.txt');
foreach($file_ar as $str){
if(preg_match_all('/([^\#\s]+)#.+/',$str,$matches,PREG_SET_ORDER)){
    foreach($matches as $match){
        $tmp_word=trim($match[1]);
        echo mk_hash($tmp_word).'#'.$tmp_word."\n";
    }
}
}


код поиска
Код:

<?
include('hash.php');
$word=trim(file_get_contents('word.txt'));
if(empty($word)){
    die("ERROR: Вы не указали слово\nИспользование: ./start.sh СЛОВО\n");
}
$hash=mk_hash($word);
$file_ar=&file('words_db.txt');
$n=0;
$i=0;
echo "Searching hash [$hash]:\n";
$buf=null;
foreach($file_ar as $str){
$i++;
if(!($i%2500)){echo '.';}
    $find=strstr($str, $hash);
    if($find){
        $tmp=explode('#',$str);
        if(strlen(trim($tmp[1]))==strlen($word)){
        $buf[]=$tmp[1];
        $n++;
        }
    }
}
if($buf){
    $buf=array_unique($buf);
    echo "\nНайдено:\n";
    foreach($buf as $word){
        echo $word;
    }
}
else{echo "\nНичего не найдено\n";}
?>



функция создание хеша
Код:

function mk_hash($word){
  $word=str_replace('ё','е',$word);
  $tmp=explode("\n",chunk_split($word,1,"\n"));
  array_pop($tmp);
  sort($tmp);
  $tmp=implode($tmp);
  return($tmp);
}

Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 13:35 pm    Заголовок сообщения: Ответить с цитатой

Я не когда не говорил, что я программист Rolling Eyes, Томас, что то у тебя вообще 3 вар., что скажеш нам ламерам про наши ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Thomas
В настоящее время запрещен

Бывалый


Пол: Пол: Он
Зарегистрирован: 29.03.2006
Сообщения: 3169
Откуда: /dev/null
Репутация: 138.5
голосов: 31

СообщениеДобавлено: Пт Сен 29, 2006 13:40 pm    Заголовок сообщения: Ответить с цитатой

Код:
Томас, что то у тебя вообще 3 вар.,

не совсем понял что имлось в виду.
Дело в том что все серьезные алгоритмы поиска постороены на том что создается так называемый хеш или индекс. Который упрощает значительно поиск.

Как по мне метод перебора и сравнения со словарем безсмысленный так как вам нужно найти слова которые состоят из набора букв, а как они должны стоят не важно в принципе.


Последний раз редактировалось: Thomas (Пт Сен 29, 2006 13:41 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ] Посетить сайт автора
ReZak

Писатель


Пол: Пол: Оно
Зарегистрирован: 15.06.2006
Сообщения: 469

Репутация: 27.4

СообщениеДобавлено: Пт Сен 29, 2006 13:41 pm    Заголовок сообщения: Ответить с цитатой

О ток понял мысль ) Толковая ) упор. по алфав. мне понравилось, намного проще. Кажется я где то уже встречал такой подход.
Эт ты на паскале такое пишеш ? ну да на паскале, я таких функций как у тебя исп. не знаю ). Я только мыслить умею и то не всегда удачно. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение [ скрыт ]
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Мелитополь -> Программирование Часовой пояс: GMT + 2
На страницу 1, 2, 3  След.
Страница 1 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Р: 507275

База отдыха «Белый парус» пгт Кирилловка Азовское море.
AUKRO-RIP.IN.UA Аукро закрылся -рейтинг сохранился!

Рейтинг Мелитопольских сайтов на Melitopol.org Internet Map Hosting by VivaNET