LINUX.ORG.RU

Пятнично, перестановки в скрипте

 ,


0

3

Играл вчера с младенцем в кубики (шесть с штук с буквами), после составления глубокомысленных фраз чумбыл и [censored] задумался, что можно более осмысленного из них сложить.

Из исходных данных имею cubs=(яаузив юыпэйк шмсебт афцчьр гмхжео ъндплщ) Решил погрепать по словарю, написал тупой перебор башевскими do и if для вызова grep [${cubs[$i1]}][${cubs[$i2]}]...

Задачу решил, буду блистать интеллектом перед детьми, но осадок остался - как это надо было делать без вложенных циклов в рамках юниксвэй?

from itertools import permutations, product
[''.join(y) for x in permutations(['ABC', 'DEF', 'GHI']) for y in product(*x)]
mix_mix ★★★★★ ()

Я не знаю, что вы держите за «юниксвэй» и чем плохи вложенные циклы, за один проход по словарю это, очевидно делается как-то так:

$ join-array() { local array="${1}[*]" IFS="$2" str="$3"; printf -v "$str" '%s' "${!array}"; }
$ join-array cubs '|' cubs_re
$ grep "$cubs_re" dic

Или как-то так:

$ join-array cubs $'\n' cubs_nl
$ grep -F "$cubs_nl" dic

что, пожалуй, лучше.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 3)
Ответ на: комментарий от mix_mix

Я понимаю, что для решения подобных задач написаны тонны либ, и это решение элегантно выглядит, но хотелось бы труЪ классики. Типа на седе замутить.

tereshchenko ()
Ответ на: комментарий от Zmicier

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

tereshchenko ()
Ответ на: комментарий от tereshchenko

Я тебе привёл как раз самый труЪ-вэй, осталось прям из питона по словарю чекать. На седе это будет монструозное поделие строк на 200, и от циклов никуда не денешься уж точно. Ты же не забыл, надеюсь, что кубики ещё местами менять можно?

mix_mix ★★★★★ ()
Ответ на: комментарий от tereshchenko

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

То, что я написал вообще ничего про кубики не знает. Я показал лишь очевидный и чуть менее очевидный способ обойтись одним проходом по словарю (тогда как вы, я так понял, читали словарь много раз).

Вы затрудняетесь написать и рекомбинацию тоже?

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Я написал тупо и некрасиво. Жду, что возможно КО скажет - регекспов ты не знаешь, решается однострочником. Вот узнал, что питон это умеет из коробки. Идея, что сначала делать все рекомбинации, а потом дергать словарь - полезна, но по сути ничего не меняет.

tereshchenko ()

Я вот так сделал:

echo echo_{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'}{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'}{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'}{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'}{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'}{'{я,а,у,з,и,в}','{ю,ы,п,э,й,к}','{ш,м,с,е,б,т}','{а,ф,ц,ч,ь,р}','{г,м,х,ж,е,о}','{ъ,н,д,п,л,щ}'} | tr \ _ '\n ' | grep -v '\({.*}\).*\1'  | bash | tr \  \\n > combos.txt

grep -Fof dict.txt combos.txt | sort -u > result.txt

Сам словарь нашел в интернете и сконвертировал в UTF-8, удалив ^M (это важно).

Конечно, первую команду можно сократить, но там одна строчка повторяется шесть раз, поэтому её проще сформировать копированием, чем программно.

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

А эта идея мне нравится :), спасибо. Хотя мой вариант значительно быстрее работает.

tereshchenko ()
Последнее исправление: tereshchenko (всего исправлений: 1)
Ответ на: комментарий от HerrWeigel

Я просто ввёл в поиск «словарь русского языка txt»,
вот этот словарь брал для опыта, чистил примерно так:

cat lop2v2.txt | iconv -f cp1251 | tr -d '\015' | grep -E '[а-я]{5,}' > dict.txt

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от Xenius

Спасибо. Мне когда-то нужно было для целей, похожих на цели тс, но не нашел в txt того, что надо и забил.

HerrWeigel ★★★★ ()
Ответ на: комментарий от Xenius

У меня по твоему словорю получилось 1060 слов (не включая проверочное). ;)

Правда словарь ещё пришлось обработать наприльнком:

iconv -f cp1251 lop2v2.txt | egrep '^.{3,6}$' | egrep -v '[ -]' | sed 's/[[:upper:]]*/\L&/' | sort -u > dict6.ru

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.