Комментарии 42
Больше похоже на абракадабру из букв чем на анаграмму.
Ну это и есть анаграмма, как я понял.
Не совсем понятно какая практическая или теоретическая ценность данной статьи. Если хочется поделиться своим кодом с сообществом, уместно сделать библиотеку, выложить на гитхаб, в package list. Но уж не писать о решении каждого рядового кейса на хабре, он не резиновый :)
Не совсем понятно какая практическая или теоретическая ценность данной статьи. Если хочется поделиться своим кодом с сообществом, уместно сделать библиотеку, выложить на гитхаб, в package list. Но уж не писать о решении каждого рядового кейса на хабре, он не резиновый :)
Вы смеётесь?! Из-за двух микроскопических функций делать библиотеку и посылать пользователей в «сады Придонья».
Практическая ценность публикации — готовые функции для решения обозначенной в заголовке статьи задачи. Теоретическая ценность — ноль. Как и у всего программирования как прикладной дисциплины. :)
Практическая ценность публикации — готовые функции для решения обозначенной в заголовке статьи задачи. Теоретическая ценность — ноль. Как и у всего программирования как прикладной дисциплины. :)
Посмотрите пожалуйста википедию, там есть примеры.
Анаграмма это когда: покраснение превращается в пенсионерка или лепесток в телескоп
А то что выше это это просто перестановка букв.
А функция Левенштейна совсем для другого задумывалась.
Анаграмма это когда: покраснение превращается в пенсионерка или лепесток в телескоп
А то что выше это это просто перестановка букв.
А функция Левенштейна совсем для другого задумывалась.
Анаграмма это когда: покраснение превращается в пенсионерка или лепесток в телескоп
А то что выше это это просто перестановка букв.
Отчасти согласен. Ориентировался на более широкую трактовку семантики этого понятия. Так же как и ряд он-лайн сервисов анаграмм.
А функция Левенштейна совсем для другого задумывалась.
Да, спасибо, я в курсе. Но и для моей задачи вполне пригодилась.
Вот теперь сижу и думаю: может я чего нарушил, применив её непрофильно. :)
Ориентировался на более широкую трактовку семантики этого понятия.
Не надо жонглировать терминами. У слова «анаграмма» семантика вполне определенная, никаких «расширенных» семантик у него нет. В результате перестановки букв должно получиться слово или фраза, а не мешанина символов.
То, что делаете вы, называется пермутацией.
Вот теперь сижу и думаю: может я чего нарушил, применив её непрофильно. :)
Непрофильно вы применили термин «анаграмма».
Уважаемый, поспорьте лучше с составителями Большого психологического словаря.
psychology.academic.ru/6333/%D0%90%D0%9D%D0%90%D0%93%D0%A0%D0%90%D0%9C%D0%9C%D0%90
АНАГРАММА — (от греч. ana — пере + gramma — буква) — слово, словосочетание, бессмысленная комбинация букв, образованные перестановкой букв, составляющих др. слово, напр. хрестоматийное ляхопигисо. Задачи по разгадыванию А. используются в экспериментальных исследованиях мышления, мотивации, речевых способностей и в психодиагностических тестах.
psychology.academic.ru/6333/%D0%90%D0%9D%D0%90%D0%93%D0%A0%D0%90%D0%9C%D0%9C%D0%90
Уважаемый, поспорьте лучше с собственноручно размещенным вами эпиграфом:
Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный прием, состоящий в перестановке букв или звуков определенного слова (или словосочетания), что в результате дает другое слово или словосочетание
Посоревнуемся в упорстве?
АНАГРАММА — (от греч. ana — пере + gramma — буква) — слово, словосочетание, бессмысленная комбинация букв, образованные перестановкой букв, составляющих др. слово, напр. хрестоматийное ляхопигисо. Задачи по разгадыванию А. используются в экспериментальных исследованиях мышления, мотивации, речевых способностей и в психодиагностических тестах.
Упорство хорошо, когда вы отстаиваете некую новую концепцию, непонятую аудиторией. А вот когда вы пытаетесь упорством прикрыть собственные неточности и промахи — это уже плохо, ибо затягивает дискуссию и превращает ее в бессмысленное толковище.
Я вам пару очевидных вещей скажу, только вы не обижайтесь.
1. Если уж вы удосужились разместить в качестве эпиграфа некое определение, то и придерживайтесь его далее по тексту. А то в эпиграфе — анаграмма, а в тексте статьи — перемешанные буквы.
2. Если поковыряться, во многих науках термины используются в очень специфических значениях. В частности, в психологии. Но если вы используете термин не в его общепринятом значении, а в узкоспециализированном — то об этом надо заявлять громко и сразу.
Я вам пару очевидных вещей скажу, только вы не обижайтесь.
1. Если уж вы удосужились разместить в качестве эпиграфа некое определение, то и придерживайтесь его далее по тексту. А то в эпиграфе — анаграмма, а в тексте статьи — перемешанные буквы.
2. Если поковыряться, во многих науках термины используются в очень специфических значениях. В частности, в психологии. Но если вы используете термин не в его общепринятом значении, а в узкоспециализированном — то об этом надо заявлять громко и сразу.
Вот с этим согласен. Формулировку надо было брать другую.
Надо было брать правильный термин — пермутация. А еще желательно было бы добавить область применения вашего кода — психологическое тестирование.
Сейчас ваша статья вводит в заблуждение: читатель думает, что ваш код способен из одного слова или словосочетания сделать другое путем перестановки букв. Это, между прочим, весьма нетривиальная задача, и посмотреть ее решение было бы интересно многим. На деле же оказывается, что вы всего-навсего перемешиваете буквы с невразумительными переподвывертами.
Сейчас ваша статья вводит в заблуждение: читатель думает, что ваш код способен из одного слова или словосочетания сделать другое путем перестановки букв. Это, между прочим, весьма нетривиальная задача, и посмотреть ее решение было бы интересно многим. На деле же оказывается, что вы всего-навсего перемешиваете буквы с невразумительными переподвывертами.
srand((float)microtime() * 1000000);
А чем rand() не подошло то?
$int_anagramm = (int)$anagramm;
Что это? Полагаю, это такая интересная проверка не передали ли int. Но почему не is_numeric/is_integer?
$an = "";
$ot = "";
Вы через неделю забудете что означают эти $an и $ot. А сторонний разработчик вообще не поймет. Стоит давать более понятные названия для переменных. Да и вообще, в их наименовании в php camelCase в моде, но тут уж кому какие фломастеры нравятся…
Но вообще, в идеале, Вам бы PSR'ы почитать. Ну и хороший код — понятный код. В Вашем же случае все ужасно запутано.
(int) используется для приведения типа в int. Соответственно есть и другие операторы для других типов.
Именно так. Анаграмма для чисел — нонсенс.
Хороший код — рабочий код. Кому-то интересно назначение внутренних переменных?
Рабочий код может писать, простите, любой дурак. Я сейчас не намекаю на вас, просто это действительно так, учатся самые основы синтаксиса любого языка — максимум сутки. При должном количестве потраченных человеко-часов, он даже будет стабильно работать. Настоящее искусство — написать красивый, структурированный, понятный код, который читается, словно книга. Такой код легко расширять, легко изменять. Ваш код непонятен и запутан, его никто не будет использовать.
Рабочий код может писать, простите, любой дурак.
Очень сомнительное утверждение. Очень!
Я свой код никому не навязываю. Я им делюсь и утверждаю, что он рабочий и выполняет заявленную задачу (для этого и дал ссылку на свой оттестированный большой проект).
Искренне не понимаю, что в выложенном коде можно не понять. :)))
И таки да, код несовершенен, т.к. в нём оценивается качество перемешивания букв анаграммы слов, читаемых традиционно слева-направо. Имеет смысл добавить такую же оценку, если читать справа-налево, чтобы исключить, к примеру анаграмму «бирг» для слова «гриб».
Как скажете. Продолжите заниматься программированием — придете к моим словам.
И таки да, код несовершенен, т.к. в нём оценивается качество перемешивания букв анаграммы слов, читаемых традиционно слева-направо. Имеет смысл добавить такую же оценку, если читать справа-налево, чтобы исключить, к примеру анаграмму «бирг» для слова «гриб».
Что за бред я только что прочитал? Вы бы хоть поинтересовались, что и как именно оценивает алгоритм Левенштейна, чтобы в следующий раз не пороть чушь.
А чем rand() не подошло то?
Тем и не подошло, что не даёт возможности оценить качество перемешивания букв. :)
Т.е. вёрстка прямо в этих функциях вас не смутила? :)
Пилите статью.
Ну, да. Только у меня добавлена очень важная на практике проверка качества перемешивания букв посредством функции Левенштейна, дабы отсекать те случайные перемешивания, которые возвращают ту же последовательность букв, что и в исходном слове и даже те, в которых переставлены одна буква (или более — для длинных слов).
Т.е., таких «слабых» анаграмм не получится:
Слон -> лсон
Рубль -> рубьл
Т.е., таких «слабых» анаграмм не получится:
Слон -> лсон
Рубль -> рубьл
Ничего не буду говорить про качество кода, задам только несколько вопросов:
1. Что делать если результат функции ещё надо будет отдавать в api, например, для приложения?
2. Что делать верстальщику/фронтенд разработчику если надо будет внести какие-то изменения в html-верстку? Лезть в php-код?
3. У вас получится быстро написать unit-тест для вашего кода, ещё чтобы не надо было его изменять при каждом внесении изменений в функцию?
4. Что делать если надо будет использовать разные кодировки?
5. Насколько хорошо ваш код соответствует принципам SOLID?
6. И последний вопрос, как вы считаете, данная наработка нужна кому-то кроме вас, сможет ли человек легко воспользоваться ею в своём проекте?
1. Что делать если результат функции ещё надо будет отдавать в api, например, для приложения?
2. Что делать верстальщику/фронтенд разработчику если надо будет внести какие-то изменения в html-верстку? Лезть в php-код?
3. У вас получится быстро написать unit-тест для вашего кода, ещё чтобы не надо было его изменять при каждом внесении изменений в функцию?
4. Что делать если надо будет использовать разные кодировки?
5. Насколько хорошо ваш код соответствует принципам SOLID?
6. И последний вопрос, как вы считаете, данная наработка нужна кому-то кроме вас, сможет ли человек легко воспользоваться ею в своём проекте?
По пунктам.
1. Поправить формат выдачи функции GetWordAnagramm.
2. Нет. Ему нужно понимать DOM.
3. Этот код более 2 лет исправно функционирует в рабочей системе и прошёл тестирование на >10к примеров. Может я и не прав, но зачем что-то менять в том, что исправно работает?
4. Добавить соответствующий параметр к обеим функциям и передавать его в те библиотечные функции, которые того требуют.
5. Не знал, что SOLID-принципы применимы к «плоским» функциям.
6. Вполне возможно, что кому-нибудь пригодится. Встроить в проект, доработать никакого труда не составляет… Ну, а если никому не нужно, то и хрен с ним. :)
Спасибо за отзыв!
1. Поправить формат выдачи функции GetWordAnagramm.
2. Нет. Ему нужно понимать DOM.
3. Этот код более 2 лет исправно функционирует в рабочей системе и прошёл тестирование на >10к примеров. Может я и не прав, но зачем что-то менять в том, что исправно работает?
4. Добавить соответствующий параметр к обеим функциям и передавать его в те библиотечные функции, которые того требуют.
5. Не знал, что SOLID-принципы применимы к «плоским» функциям.
6. Вполне возможно, что кому-нибудь пригодится. Встроить в проект, доработать никакого труда не составляет… Ну, а если никому не нужно, то и хрен с ним. :)
Спасибо за отзыв!
1. К сожалению, не всё так просто и этого будет недостаточно, результат функции мы хотим использовать как на веб-странице с использованием html, так и в приложении где нет никакого html. Обе функции содержат работы с html.
2. Чем верстальщику это поможет, он хочет span заменить на div, например? Зачем фронтенд-разработчику писать код, который преобразовывает текущий если можно решить вопрос на этапе формирования этого кода?
3. Благо логика простая и здесь действительно сложно допустить ошибку, но если будете писать более сложную логику с такой же организацией кода, то у вас будут большие сложности с тестированием.
4. И потом не забывать везде использовать этот параметр, иначе можно получить сложно отлавливаемый баг.
5. Верно, данные принципы в первую очередь были сформированы в контексте ООП, но их идеи также могут быть применимы и к процедурному коду. Например, функция должна выполнять одну задачу.
6. Думаю, проще и лучше всё переписать.
Какую-то ценность в данной статье представляет, пожалуй, только информация про применение функции Левенштейна для решения такой задачи, но это не тянет на статью и приведенный код ещё больше портит впечатление о ней.
2. Чем верстальщику это поможет, он хочет span заменить на div, например? Зачем фронтенд-разработчику писать код, который преобразовывает текущий если можно решить вопрос на этапе формирования этого кода?
3. Благо логика простая и здесь действительно сложно допустить ошибку, но если будете писать более сложную логику с такой же организацией кода, то у вас будут большие сложности с тестированием.
4. И потом не забывать везде использовать этот параметр, иначе можно получить сложно отлавливаемый баг.
5. Верно, данные принципы в первую очередь были сформированы в контексте ООП, но их идеи также могут быть применимы и к процедурному коду. Например, функция должна выполнять одну задачу.
6. Думаю, проще и лучше всё переписать.
Какую-то ценность в данной статье представляет, пожалуй, только информация про применение функции Левенштейна для решения такой задачи, но это не тянет на статью и приведенный код ещё больше портит впечатление о ней.
Зря стараетесь, тут эффект Даннинга-Крюгера во всей красе. Пока человек сам не прочувствует, он не поймет Ваших доводов.
Зачем при выборке и оценке лучшего перемешивания символы склеиваются через пробел?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Преобразование слов и словосочетаний в анаграмму