Как стать автором
Обновить

Комментарии 42

Больше похоже на абракадабру из букв чем на анаграмму.
Ну это и есть анаграмма, как я понял.
Не совсем понятно какая практическая или теоретическая ценность данной статьи. Если хочется поделиться своим кодом с сообществом, уместно сделать библиотеку, выложить на гитхаб, в package list. Но уж не писать о решении каждого рядового кейса на хабре, он не резиновый :)
Вы смеётесь?! Из-за двух микроскопических функций делать библиотеку и посылать пользователей в «сады Придонья».
Практическая ценность публикации — готовые функции для решения обозначенной в заголовке статьи задачи. Теоретическая ценность — ноль. Как и у всего программирования как прикладной дисциплины. :)
Посмотрите пожалуйста википедию, там есть примеры.
Анаграмма это когда: покраснение превращается в пенсионерка или лепесток в телескоп
А то что выше это это просто перестановка букв.
А функция Левенштейна совсем для другого задумывалась.
Анаграмма это когда: покраснение превращается в пенсионерка или лепесток в телескоп
А то что выше это это просто перестановка букв.

Отчасти согласен. Ориентировался на более широкую трактовку семантики этого понятия. Так же как и ряд он-лайн сервисов анаграмм.
А функция Левенштейна совсем для другого задумывалась.

Да, спасибо, я в курсе. Но и для моей задачи вполне пригодилась.
Вот теперь сижу и думаю: может я чего нарушил, применив её непрофильно. :)
Ориентировался на более широкую трактовку семантики этого понятия.

Не надо жонглировать терминами. У слова «анаграмма» семантика вполне определенная, никаких «расширенных» семантик у него нет. В результате перестановки букв должно получиться слово или фраза, а не мешанина символов.

То, что делаете вы, называется пермутацией.

Вот теперь сижу и думаю: может я чего нарушил, применив её непрофильно. :)

Непрофильно вы применили термин «анаграмма».
Уважаемый, поспорьте лучше с составителями Большого психологического словаря.
АНАГРАММА — (от греч. 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. Если поковыряться, во многих науках термины используются в очень специфических значениях. В частности, в психологии. Но если вы используете термин не в его общепринятом значении, а в узкоспециализированном — то об этом надо заявлять громко и сразу.
Вот с этим согласен. Формулировку надо было брать другую.
Надо было брать правильный термин — пермутация. А еще желательно было бы добавить область применения вашего кода — психологическое тестирование.

Сейчас ваша статья вводит в заблуждение: читатель думает, что ваш код способен из одного слова или словосочетания сделать другое путем перестановки букв. Это, между прочим, весьма нетривиальная задача, и посмотреть ее решение было бы интересно многим. На деле же оказывается, что вы всего-навсего перемешиваете буквы с невразумительными переподвывертами.
srand((float)microtime() * 1000000);

А чем rand() не подошло то?

$int_anagramm = (int)$anagramm;

Что это? Полагаю, это такая интересная проверка не передали ли int. Но почему не is_numeric/is_integer?
$an = "";
$ot = "";

Вы через неделю забудете что означают эти $an и $ot. А сторонний разработчик вообще не поймет. Стоит давать более понятные названия для переменных. Да и вообще, в их наименовании в php camelCase в моде, но тут уж кому какие фломастеры нравятся…
Но вообще, в идеале, Вам бы PSR'ы почитать. Ну и хороший код — понятный код. В Вашем же случае все ужасно запутано.
(int) используется для приведения типа в int. Соответственно есть и другие операторы для других типов.
Да, я это знаю. Но зачем приводить строку с текстом к int?
Чтобы убедиться в том, что функции передано слово, а не число.
Именно так. Анаграмма для чисел — нонсенс.
Анаграмма — да. Но у вас — не анаграмма, а перемешивание символов.
Рабочий код может писать, простите, любой дурак. Я сейчас не намекаю на вас, просто это действительно так, учатся самые основы синтаксиса любого языка — максимум сутки. При должном количестве потраченных человеко-часов, он даже будет стабильно работать. Настоящее искусство — написать красивый, структурированный, понятный код, который читается, словно книга. Такой код легко расширять, легко изменять. Ваш код непонятен и запутан, его никто не будет использовать.
Рабочий код может писать, простите, любой дурак.

Очень сомнительное утверждение. Очень!
Я свой код никому не навязываю. Я им делюсь и утверждаю, что он рабочий и выполняет заявленную задачу (для этого и дал ссылку на свой оттестированный большой проект).
Искренне не понимаю, что в выложенном коде можно не понять. :)))

И таки да, код несовершенен, т.к. в нём оценивается качество перемешивания букв анаграммы слов, читаемых традиционно слева-направо. Имеет смысл добавить такую же оценку, если читать справа-налево, чтобы исключить, к примеру анаграмму «бирг» для слова «гриб».
Как скажете. Продолжите заниматься программированием — придете к моим словам.
И вам больших свершений!
И таки да, код несовершенен, т.к. в нём оценивается качество перемешивания букв анаграммы слов, читаемых традиционно слева-направо. Имеет смысл добавить такую же оценку, если читать справа-налево, чтобы исключить, к примеру анаграмму «бирг» для слова «гриб».

Что за бред я только что прочитал? Вы бы хоть поинтересовались, что и как именно оценивает алгоритм Левенштейна, чтобы в следующий раз не пороть чушь.
А чем rand() не подошло то?

Тем и не подошло, что не даёт возможности оценить качество перемешивания букв. :)
Т.е. вёрстка прямо в этих функциях вас не смутила? :)
Меня? — Нет.
НЛО прилетело и опубликовало эту надпись здесь
Благодарю за чудесный говнокомментарий!
НЛО прилетело и опубликовало эту надпись здесь
Пилите статью.
Ну, да. Только у меня добавлена очень важная на практике проверка качества перемешивания букв посредством функции Левенштейна, дабы отсекать те случайные перемешивания, которые возвращают ту же последовательность букв, что и в исходном слове и даже те, в которых переставлены одна буква (или более — для длинных слов).
Т.е., таких «слабых» анаграмм не получится:
Слон -> лсон
Рубль -> рубьл
Настоящие анаграммы потому и сложно разгадывать, что они являются существующими словами. Это сбивает с толку и делает задачу сложной для человека.
А вот составить слово из мешанины букв может даже первоклассник (касса букв — помните?).
Ничего не буду говорить про качество кода, задам только несколько вопросов:

1. Что делать если результат функции ещё надо будет отдавать в api, например, для приложения?
2. Что делать верстальщику/фронтенд разработчику если надо будет внести какие-то изменения в html-верстку? Лезть в php-код?
3. У вас получится быстро написать unit-тест для вашего кода, ещё чтобы не надо было его изменять при каждом внесении изменений в функцию?
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 и более раз быстрее.
А вы проводили замеры стоит ли эта выгода накладных расходов на серию конкатенаций в цикле?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации