Pull to refresh
48
0
Владимир @volmir

Веб-программист

Send message
Для решения задания можно было использовать готовые фрэймворки, что сводило само решение задания к 10 минутам.

Извините за вопрос.
Но можно поинтересоваться, какой фреймворк/пакет файлов/веб-приложение позволяет реализовать полностью или частично описанные в задаче требования?
Спасибо за бета-тест и отзыв :)
Сделал ряд доработок по интерфейсу:
1) Фокус автоматически ставится в поле ввода (после загрузки страницы).
2) Добавил на гл. страницу форму с случайными словами, в которые можно поиграть, перейдя одним кликом по кнопке.
3) Описание отгаданного слова в игре теперь выводится в модальном окне (без перезагрузки страницы).
4) Почищена база слов (от глаголов, прилагательных, наречий, союзов и т.п.)
5) Добавлен функционал «Получить подсказку».
6) Разные мелкие правки текстов, описаний, подсказок, заголовков и т.п.

Переделал систему по предложенной вами схеме (ищем слово в индексе из 65000 слов словаря). Теперь все летает!
Запрос из 20-ти символов выполняется с следующими результатами:
Память: 12.02 megabytes
Время: 0.500537 сек.

Сам запрос:
SELECT v.vocabulary_id, v.vocab 
FROM vocabulary v 
LEFT JOIN vector vkt ON v.vocabulary_id = vkt.id 
WHERE `vkt`.`ye` = 0 AND `vkt`.`y` = 0 AND `vkt`.`kh` = 0 AND `vkt`.`ts` = 0 AND `vkt`.`ch` = 0 AND `vkt`.`sh` = 0 AND `vkt`.`shch` = 0 AND `vkt`.`mgk` = 0 AND `vkt`.`yi` = 0 AND `vkt`.`tvd` = 0 AND `vkt`.`ee` = 0 AND `vkt`.`yu` = 0 AND `vkt`.`ya` = 0

Т.е. все буквы, которых нет в слове включаем в запрос через отрицание, а в результате получаем множества, которые состоят из нужных нам букв.

Структура таблицы vector:

CREATE TABLE `vector` (
  `id` int(11) NOT NULL,
  `a` tinyint(1) NOT NULL DEFAULT '0',
  `b` tinyint(1) NOT NULL DEFAULT '0',
  `v` tinyint(1) NOT NULL DEFAULT '0',
  `g` tinyint(1) NOT NULL DEFAULT '0',
  `d` tinyint(1) NOT NULL DEFAULT '0',
  `e` tinyint(1) NOT NULL DEFAULT '0',
  `ye` tinyint(1) NOT NULL DEFAULT '0',
  `zh` tinyint(1) NOT NULL DEFAULT '0',
  `z` tinyint(1) NOT NULL DEFAULT '0',
  `i` tinyint(1) NOT NULL DEFAULT '0',
  `y` tinyint(1) NOT NULL DEFAULT '0',
  `k` tinyint(1) NOT NULL DEFAULT '0',
  `l` tinyint(1) NOT NULL DEFAULT '0',
  `m` tinyint(1) NOT NULL DEFAULT '0',
  `n` tinyint(1) NOT NULL DEFAULT '0',
  `o` tinyint(1) NOT NULL DEFAULT '0',
  `p` tinyint(1) NOT NULL DEFAULT '0',
  `r` tinyint(1) NOT NULL DEFAULT '0',
  `s` tinyint(1) NOT NULL DEFAULT '0',
  `t` tinyint(1) NOT NULL DEFAULT '0',
  `u` tinyint(1) NOT NULL DEFAULT '0',
  `f` tinyint(1) NOT NULL DEFAULT '0',
  `kh` tinyint(1) NOT NULL DEFAULT '0',
  `ts` tinyint(1) NOT NULL DEFAULT '0',
  `ch` tinyint(1) NOT NULL DEFAULT '0',
  `sh` tinyint(1) NOT NULL DEFAULT '0',
  `shch` tinyint(1) NOT NULL DEFAULT '0',
  `mgk` tinyint(1) NOT NULL DEFAULT '0',
  `yi` tinyint(1) NOT NULL DEFAULT '0',
  `tvd` tinyint(1) NOT NULL DEFAULT '0',
  `ee` tinyint(1) NOT NULL DEFAULT '0',
  `yu` tinyint(1) NOT NULL DEFAULT '0',
  `ya` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
На React JS написан отдельный сайт: js.combination.cf
Но там функционал обрезанный (по сравнению с полной версией api.combination.cf/web), есть ряд особенностей связанных с хостингом (локально работает — на хостинге «нет»).
Разрабатывать удобный, современный и функциональный UI — мне этому ещё учиться и учиться. Пока в приоритете бекэнд (60-70% усилий), на фронтенд — оставшиеся 30-40%.
Спасибо, сейчас читаю код. В принципе, все понятно (алгоритм), осталось разобраться в деталях :)
Я рад, что игра вам понравилась.
В Сети есть словари русского языка в текстовом формате:
www.speakrus.ru/dict
Спасибо за идеи.
Над пользовательским интерфейсом ещё работать и работать.

Ещё одна интересная фишка (увидел её в аналогичных сервисах): «получить подсказку».
Т.е. при нажатии на кнопку выводится в модальном окне толкование одного или нескольких неразгаданных слов.
Да, конечно. Когда наберется достаточная статистика и пропарсятся все доступные словари (например, сейчас в базе не хватает современных слов, вошедших в язык за последнее десятилетие) — можно будет «ручками» или автоматически пройтись по словам, откорректировать их.
Это именно то, что я искал.
О таком направлении я не думал вообще.
Спасибо вам огромное за идею и участие!
Буду пробовать реализовать подобный алгоритм.
Сейчас алгоритм работает следующим образом:
1) Генерируются блоки комбинаций (размер блока: 50000-100000 слов) (66% времени на итерацию).
2) Этот блок проверяется на наличие в словаре (34% времени на итерацию).
Далее цикл повторяется…

Т.е. оптимизировать надо и первый шаг и второй.
Сама сложная задача (как это я вижу сейчас) — сгенерировать эти самые 4.1804 E+18 комбинаций (за разумное время и минимально возможными ресурсами процессора).
А как их проверить — можно будет потом уже придумать (алгоритм составить или закешировать).
А если на Си (или ином языке программирования, каком?) написать перебор комбинаций, быстрее будет работать? Насколько быстрее, нежели на PHP? Не сталкивался с такими задачами раньше, хочется посоветоваться.
Все равно, потребуется сравнить 65000 слов и 4.1804 E+18 вариантов.
Базу из 65000 слов можно полностью закешировать.
Задача разлагается на две подзадачи:
1) Сгенерировать 4.1804 E+18 комбинаций.
2) Проверить сгенерированные комбинации в словаре из 65000 слов.
Пример запроса из 20-ти букв (на сайтах в сети, которые предоставляют похожие сервисы):

1) поискслов.рф/anagram/search?query=абвгдежзиклмнорпстуф
Найдено: 155 страниц слов (размещения с повторениями).
Время ответа сервера: менее одной секунды на страницу.

2) wordhelp.ru/comb/абвгдежзиклмнорпстуф
Найдено: 9736 слов.
Время ответа сервера: 4 секунды.

Вопрос: Как можно обработать 4,180,411,311,071,440,000 комбинаций за 1-4 секунды? И по всем этим словосочетаниям сделать поиск по словарю?
Конечно, вопросы сложные и нетривиальные, простых ответов не будет. Но, возможно, хотя бы получится узнать направления того куда «смотреть», что «копать»…
Спасибо за видео. Хороший обзор, как можно обойтись одним рубанком (образно говоря), чтобы сделать лук.
Карбоновый композит можно использовать в качестве рабочего материала для плеч. Прочность на разрыв и растяжение ещё лучше, чем у стеклоламината. Некоторые производители даже включают карбон в массовые модели луков. Но есть ряд моментов, почему он мало распространен:
1) Стоимость (намного выше стеклоламината).
2) Карбон на сжатие работает хуже, т.е. применяется только на внешней части плеча лука.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity