Составить из букв комбинации

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

sedikpoll
Сообщения: 100

Составить из букв комбинации

Сообщение sedikpoll »

Есть следующие буквы "о а м д", их нужно различно перемешивать, т.е. составить комбинации существующих слов.

дома -то что нам нужно
омад
дамо
мода -то что нам нужно

Каким способом можно перемешивать имеющеюся буквы?
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Составить из букв комбинации

Сообщение SLEDopit »

sedikpoll писал(а):
27.09.2010 17:24
Каким способом можно перемешивать имеющеюся буквы?
первое, что пришло на ум:

Код: Выделить всё

 $ echo {a,b,c}{a,b,c}{a,b,c} | tr ' ' '\n' | grep a | grep b | grep c
abc
acb
bac
bca
cab
cba
а вот извлечь из этого нужные варианты, это, наверное, только со словарем если.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
grAndrew2
Сообщения: 18

Re: Составить из букв комбинации

Сообщение grAndrew2 »

Я когда-то решал подобную задачу - взял словарь из старого ispell (подойдет даже скомпиленный), там где-то 300к слов без словоформ, кажется, и каждое слово прогонял на предмет grep'пуемости по "^\$WORD$"
т.е. предложенный выше скрипт надо загнать в переменную WORDS=$( ... ) и for word in WORDS do grep... далее разберетесь

Спасибо сказали:
Аватара пользователя
Skyb
Сообщения: 967
ОС: RFremix 18

Re: Составить из букв комбинации

Сообщение Skyb »

а регекс в баше нет?
C:\windows> ifconfig
"ifconfig" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Составить из букв комбинации

Сообщение drBatty »

Skyb писал(а):
28.09.2010 07:31
а регекс в баше нет?

есть. ~=
grAndrew2 писал(а):
27.09.2010 23:27
т.е. предложенный выше скрипт надо загнать в переменную WORDS=$( ... ) и for word in WORDS do grep... далее разберетесь


возможно, шаблон /ab|bc/ будет быстрее, чем 2 шаблона /ab/ и /ba/
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Skyb
Сообщения: 967
ОС: RFremix 18

Re: Составить из букв комбинации

Сообщение Skyb »

Ну а почему бы и не воспользоваться им :)
C:\windows> ifconfig
"ifconfig" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Составить из букв комбинации

Сообщение drBatty »

Skyb писал(а):
28.09.2010 08:45
Ну а почему бы и не воспользоваться им smile.gif

потому, что я ерунду сморозил: нам нужно найти ЧТО ИЗ НИХ подходит, а с таким шаблоном я найду много совпадений. Это не совсем то:
sedikpoll писал(а):
27.09.2010 17:24
дома -то что нам нужно
омад
дамо
мода -то что нам нужно

тут ответ будет ДА. И что? ну в принципе можно вырезать это sed -rn 's/.*(ab|ba).*/\1/p' , а потом uniq, но это будет наверняка дольше.
по моим опытам:

Код: Выделить всё

doc@bx:~/test$ time -p sed -rn '/оббе/{ p;q  }' ru_RU_UTF8.dic
оббегавший/A
real 0.45
user 0.27
sys 0.01
doc@bx:~/test$ time -p grep -q '/оббе/' ru_RU_UTF8.dic
real 0.89
user 0.52
sys 0.03
doc@bx:~/test$ time -p grep  '/оббе/' ru_RU_UTF8.dic
real 0.77
user 0.51
sys 0.03
doc@bx:~/test$ time -p grep -q '/оббе/' ru_RU_UTF8.dic
real 0.81
user 0.54
sys 0.02
doc@bx:~/test$ time -p sed -rn '/оббе/{ p;q  }' ru_RU_UTF8.dic
оббегавший/A
real 0.45
user 0.27
sys 0.01
doc@bx:~/test$ time -p sed -rn '/оббе/{ p;  }' ru_RU_UTF8.dic
оббегавший/A
оббегаемый/A
оббегание/J
оббегать/LMPR
оббегающий/A
real 0.93
user 0.56
sys 0.02

быстрее всего

sed -rn '/оббе/q1'
результат $? равен 1, если нашлось "оббе". оббе впервые встречается в середине словаря.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Составить из букв комбинации

Сообщение watashiwa_daredeska »

Если нужно по словарю искать слова, которые состоят из заданных букв, то я бы вообще пошел по другому пути.
1). Обработать словарь в вид: ключ = отсортированные буквы слова => значение. Например: адмо->мода, адмо->дома, аабббо->баобаб.
2). Заданные буквы также отсортировать и уже искать в словаре по получившемуся ключу.

Один поиск по отсортированному словарю — на порядки быстрее n! линейных поисков :) Может быть, не совсем для чистой командной строки решение, но в самом простом случае sqlite3 можно дёргать и из шелл-скрипта.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Составить из букв комбинации

Сообщение drBatty »

watashiwa_darede... писал(а):
28.09.2010 11:04
Если нужно по словарю искать слова, которые состоят из заданных букв, то я бы вообще пошел по другому пути.

я не знаю... вроде скорость в тестах и так достаточна (я-же не знаю исходных данных). Но я-бы бы пошёл по третьему пути: конечно я отсортировал-бы словарь, но потом его порезал скажем на 1000 кусков (33буквы * 33 == 1089), и выбрал-бы кусок словаря по первым двум буквам, скорость увеличится в ~1000 раз (отрезать 2 буквы и выбрать словарь - это быстро, и O(1)) простенькое хеширование и сработает неплохо.

На практике я помнится считал CRC32 от слова, а словарь порезал на 256 частей, а то у меня куски по вышеописанному методу очень разные получились - не эффективно, с CRC32 оказалось быстрее. Конечно подошла-бы любая хеш функция, вот только у меня был bash, cksum, и sed :(

А вообще использовать EXT3/4 как БД оказалось очень эффективно и удобно: ключ==имя файла, данные внутри. Зачем мне деревья из БД, если они уже в ФС имеются? И неплохие, кстати.

Кстати, хотел MySQL, но очень медленно из bash'а запросы делать, а собирать запросы в пачки очень сложно было...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Составить из букв комбинации

Сообщение SLEDopit »

drBatty писал(а):
28.09.2010 14:34
А вообще использовать EXT3/4 как БД оказалось очень эффективно и удобно: ключ==имя файла, данные внутри.
Не согласен. Как минимум на ext такая база ограничена количеством инодов.

Код: Выделить всё

 $ df -i /home
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sdb7             196800    3096  193704    2% /home
200 тысяч, как то не густо (:
Да и выборка, особенно в случае вложенных запросов, будет крайне неэффективной.
drBatty писал(а):
28.09.2010 14:34
но очень медленно из bash'а запросы делать,
в смысле медленно?
echo "SELECT something FROM table;" | mysql -uuser -ppassword database
чего тут медленного то? несекурно, да. но не медленно.
drBatty писал(а):
28.09.2010 14:34
собирать запросы в пачки очень сложно было...
да ладно, легким движением sed любой текстовый файл превращается в sql файл (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Составить из букв комбинации

Сообщение drBatty »

SLEDopit писал(а):
30.09.2010 00:27
Не согласен. Как минимум на ext такая база ограничена количеством инодов.

ну и что? любая БД ограничена.
SLEDopit писал(а):
30.09.2010 00:27
200 тысяч, как то не густо (:

мне хватило с избытком - уже на 70 000 узлах диск был заполнен.
SLEDopit писал(а):
30.09.2010 00:27
Да и выборка, особенно в случае вложенных запросов, будет крайне неэффективной.

??? у меня есть MySQL, я не идиот. А для простых запросов эффективность в разы выше MySQL.
SLEDopit писал(а):
30.09.2010 00:27
echo "SELECT something FROM table;" | mysql -uuser -ppassword database
чего тут медленного то? несекурно, да. но не медленно.

попробуйте.
SLEDopit писал(а):
30.09.2010 00:27
да ладно, легким движением sed любой текстовый файл превращается в sql файл (:

а я, можно подумать, QBASIC'ом собирал ;)
bash вообще медленный, и у меня bash был в самом конце:
s/.*/mysql < tmp.sql/e
получается быстрее, чем
s/..../echo "SELECT..." | mysql/e
(на самом деле, труба | это тоже файл, а тут две трубы - sed тоже через пайп передаёт, s//команда/w PIPE /bin/sh)

PS: верю. в других случаях будет по другому, в моём было именно так. а тут похожий случай.

PPS: а я не кричал, что БД - маздай :-) просто одно из специализированных решений. Мне самому весело было смотреть на каталог размером в сотни метров (именно каталог, а не файлы в нём).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Составить из букв комбинации

Сообщение SLEDopit »

drBatty писал(а):
30.09.2010 02:43
попробуйте.
ну, я просто этим постоянно пользуюсь (:
drBatty писал(а):
30.09.2010 02:43
PPS: а я не кричал, что БД - маздай :-)
Мда, что-то я в полудреме все немного не так понял. Мои извинения.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали: