|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
Перебор вариантов29.05.2020, 11:26. Показов 6044. Ответов 72
Метки комбинаторика (Все метки)
Здравствуйте, нужна помощь новичку (мне).
Есть набор k букв, каждой букве может соответствовать несколько значений, например: А: 1,2,7 Б: 3,6 В: 4 Г: 5 Все значения разные. Вопрос: как организовать цикл, чтобы на каждой итерации выдавался набор значений по одному от каждой буквы? То есть в этом примере по 4 значения. Чтобы в итоге перебрались все варианты. Следует сказать, что букв может быть до 33, количество значений не ограничено.
0
|
|
| 29.05.2020, 11:26 | |
|
Ответы с готовыми решениями:
72
перебор вариантов... Перебор всех вариантов
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
| 30.05.2020, 21:48 | |
|
shabserg, Я уже столько раз перечитываю это всё, не до конца осознаю задание, но мне кажется что на самом деле всё может быть гораздо проще.
Позвольте я переспрошу у вас задание в виде шагов на простом примере, чтобы убедится в том, что я правильно понимаю о чём вообще речь? Например пользователь придумал пароль слово - кот. Затем пользователь придумывает и записывает некое правило для шифровки своего пароля, где для некоторых (или всех) букв из своего пароля - предлагает замену этих букв на некие другие буквы, например: к к к т т й ц в п и и это означает, что буква к может стать одной из й ц в а буква т может стать одной из п и предположим, что программа выбрала конкретные замены из предложенных вариантов и к заменило на ц т заменило на и в итоге оригинальный пароль кот превратился в цои. Затем программа выводит хеш слова цои и передаёт его пользователю, а оригинальный пароль слово кот, добавляет в обычный массив слов где-то у себя в базе. Пользователь без труда запоминает длиннющий хеш зашифрованного пароля и так же запоминает шифр для букв, то-есть й ц в п и проходит несколько лет... Появляется пользователь и хочет проверить - а какой пароль у него тогда был? Сам пароль забыл, но вот неких хеш и шифр й ц в п и был записан на бумажке, поэтому он вводит обе эти строки в нужные поля. А программа внутри себя переводит хеш обратно в слово цои и с помощью шифра й ц в п и начинает перебирать все сохранённые у себя слова-пароли, пытаясь найти то самое начальное слово кот?
1
|
|
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
||||
| 30.05.2020, 22:20 [ТС] | ||||
|
samana, ну почти так
. Дело в том, что все окно формы состоит из двух частей. В первой части пользователь вводит свой пароль, то есть "цои", нажимает кнопку "вычислить", и ему выдаётся хэш этого пароля, который нужно будет скопировать в часть 2. 1-я часть сделана и работает, нужно решить часть 2.Во второй части программы я (в качестве хакера) должен отгадать, какое слово из словаря он взял за основу пароля. Мне известен хэш пароля, правило замены (две строки что на что может меняться), а также есть словарь для перебора слов, загаданное слово точно в нем содержится. В итоге программа должна выдать в 2 текстбокса исходное слово (кот) и пароль (цои). Так что можно сказать, вы поняли все очень точно и объяснили лучше меня ![]()
к к к т т ш й ц в п и з.
0
|
||||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 30.05.2020, 22:36 [ТС] | |
|
Ещё может быть замена
а а а б р у и б р у То есть в итоге исходная буква а будет заменена на б, затем б на р, а р на у. То есть замены должны происходить последовательно, а не все сразу
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
||
| 30.05.2020, 23:02 | ||
|
к к к т т й ц в п и после которых и должно появится "цои" с хешем? --> Если да вводит на первом этапе, то получается на втором этапе нужно снова ввести эти к к к т т й ц в п и чтобы по ним уже пытаться расшифровать слово и найти подходящее "кот"?
1
|
||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 31.05.2020, 08:30 [ТС] | |
|
samana, я тоже так думал, когда делал эту прогу в первый раз. Оказалось, что нужно не так.
На первом этапе всего одно поле для ввода - поле для "цои" и одно поле для выдачи хэша. То есть этот пароль выдаётся преподавателем, который его как-то сам зашифровал. В итоге: 1-я часть: Ввести "цои" Вывести хэш этого пароля 2-я часть: Ввести хэш, вычисленный выше (просто мышкой скопировать в это поле) Ввести правило замен (две строки) Вывести "цои" Вывести исходное слово "кот" Преподавателем сообщается "цои", к к к т т й ц в п и И возможно исходное слово "кот" для проверки результата на правильность, но оно в проге нигде не вводится
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
| 31.05.2020, 09:12 | |
|
shabserg, да, теперь вроде всё задание стало понятно для меня, спасибо.
Смущает лишь тот момент, когда вы говорили, что пользователь не обязан ввести для каждой буквы замену, то-есть может некоторые пропустить, и что самое поразительное - может добавить буквы замены которых и нет в слове.. И что же тогда делать, если загадано слово "кот", а для замен предоставили вообще левые данные, в которых только лишние буквы, например аалл диеу И как по этим данным добраться до "кот"? Получается что нужно каждое слово из словаря проверять на равенство их хеша и хеша полученного на первом этапе?
1
|
|
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|||
| 31.05.2020, 10:10 [ТС] | |||
|
samana, ну это я вам привел теоретический момент, просто чтобы не вылетало никаких ошибок, если в списке замен появятся буквы, которых нет в слове.
Конечно, могут заменяться не все буквы.
Если же, например, дают совершенно левые замены, по которым нельзя прийти из любого слова словаря к данному паролю, то прога перебирает все варианты и в итоге говорит, что не нашла пароль. Добавлено через 28 минут
0
|
|||
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
||||||||||||||||
| 31.05.2020, 18:21 | ||||||||||||||||
|
shabserg, Что-то у меня не получилось сделать по всем вашим правилам. А именно - позволить пропускать буквы замен или добавлять лишние.. Даже не могу придумать как обрабатывать такие данные.
Но если для каждой буквы в пароле предоставить замены, то вроде всё находит правильно.
Кликните здесь для просмотра всего текста
Я всё оформил в отдельный статический класс PasswordFinder, у которого только один предоставленный публичный метод getOriginalPass, остальные методы этого класса нужны для внутренней его работы. Но наверно нет смысла разбираться в коде, потому что я сам смотрю на него и думаю "так.. и что я тут нагородил, как оно работает?". Весь код консольной программы ниже: Кликните здесь для просмотра всего текста
1
|
||||||||||||||||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
||||||||||||||||
| 31.05.2020, 20:12 [ТС] | ||||||||||||||||
|
samana, по-моему, здорово получилось, оно работает и это уже многого стоит. Но можете помочь тупому как быть, если у меня это должно быть в Form1 в Windows Forms?) Извините, что разместил эту тему не в том разделе, ведь здесь консольные приложения, а не формс, но на мою тему в том разделе никто не отвечал и я попробовал тут.
В форме две функциональные кнопки: первая выводит хэш пароля в части 1, а вторая отгадывает зашифрованное слово (button 1 и button 2). У меня функция, отвечающая за действия при нажатии на кнопку private void button2_Click(object sender, EventArgs e) находится в файле form1.cs, а static void Main() в другом (program.cs). И если я помещаю ваш код, который должен быть в main, в button2_Click (эта кнопка отвечает за поиск слова), то он не видит многие переменные за ее пределами. Что куда надо поставить правильно? Помогите поправить, пожалуйста Вот содержимое файла form1.cs сейчас
Вот как я раньше у себя делал, например
Знаю, что уже надоел вам со своими допросами, спасибо, что помогаете(
0
|
||||||||||||||||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 31.05.2020, 20:16 [ТС] | |
|
samana, вот так выглядит все окно формы, вверху файлы проекта
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
| 31.05.2020, 20:27 | |
|
shabserg, я так сходу не смогу подсказать, это нужно сесть за компьютер, чтобы ответить наиболее точно. Поэтому скорее всего смогу вернуться к вашему вопросу немного позднее.
1
|
|
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 31.05.2020, 20:55 [ТС] | |
|
samana, нет проблем, как вам удобно
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
|
| 01.06.2020, 00:35 | |
|
shabserg, Так как я точно не знаю все имена ваших элементов на форме, а вашего исходника у меня нет, то пришлось воссоздать форму заново у себя, чтобы потестить. Она почти такая же как на скриншоте, только цвета обычные, но дизайн вы можете уже изменить как угодно.
Внедрил текущий результат всех этих вычислений, но обнаружил ошибку, что если в слове (то, которое в словаре) есть повторяющиеся буквы (например "молоко"), то выдаёт ошибку при вычислениях. Вообще мне моя текущая реализация кода совсем не нравится, слишком тяжёлая для восприятия как глазами, так и мозгами. Думаю нужно идти каким-то другим вариантом. Но свой текущий исходник для винформс я вам оставлю, вдруг что-то пригодится из него WindowsFormsApp1.zip
1
|
|
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 01.06.2020, 12:09 [ТС] | |
|
samana, да, действительно, сейчас посмотрел, он не может такие слова расшифровывать, пишет выход за пределы массива(
Но преподавателем выдаются именно такие, например "абракадабра". И в слове не обязательно все буквы заменять, я еще раз уточнил. Мне посоветовали посмотреть аналог itertools.Product из питона в C#. Сказали, что так можно организовать вложенные циклы произвольной глубины (n циклов, так как количество замен изначально неизвестно), а это как раз и нужно. Это было бы проще, наверное. В замене аааааббббррркд уврнбрапенабнш сначала перебрать все варианты с "а" на "у", "б" на "р", "р" на "б", "к" на "н", "д" на "ш" затем в цикле к счетчику +1 и все варианты с "а" на "в", "б" на "р", "р" на "б", "к" на "н", "д" на "ш" и так далее. то есть каждый цикл отвечает за свою букву для замен (а, б, р, к, д) и на каждом шаге работы хэш полученный сверяется с исходным
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
||||||||
| 01.06.2020, 13:19 | ||||||||
|
Например метод, который корректно возвращает все замены, даже если буквы повторяются в слове. На выходе массив строк каждого варианта, из которого можно потом получить хеш.
Кликните здесь для просмотра всего текста
урннш уранш урбнш уаннш уаанш уабнш упннш упанш упбнш уеннш уеанш уебнш врннш вранш врбнш ваннш ваанш вабнш впннш впанш впбнш веннш веанш вебнш ррннш рранш ррбнш раннш раанш рабнш рпннш рпанш рпбнш реннш реанш ребнш нрннш нранш нрбнш наннш наанш набнш нпннш нпанш нпбнш неннш неанш небнш брннш бранш брбнш баннш баанш бабнш бпннш бпанш бпбнш беннш беанш бебнш Но это ничего не даст, так как
1
|
||||||||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 01.06.2020, 13:36 [ТС] | |
|
А какая разница программе на то, все буквы заменять или нет? Я думал, она должна брать букву из правила замен, проверять, есть ли она в слове (например, по "карте" этого слова, там же видно все содержащиеся в нем символы), если есть, то заменять её на всех позициях.
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
||
| 01.06.2020, 14:55 | ||
|
дд 12 то такая замена обязательно повлияет на все буквы д в слове? То-есть на выходе обязательно будет что-то из одного 1е1, 1е2, 2е1, 2е2? Или замена может касаться только первой д в слове и тогда на выходе может быть такая ситуация (где первая буква д заменена, а вторая осталась как есть) : 1ед, 2ед ? Добавлено через 42 минуты shabserg, Кажется я понял как всё это сделать невзирая на лишние или недостающие буквы замен. И по идее это совсем несложно. Попробую проверить на практике. Если идея работает, обязательно скину вас сюда.
1
|
||
|
2 / 2 / 0
Регистрация: 28.05.2020
Сообщений: 58
|
|
| 01.06.2020, 16:04 [ТС] | |
|
Ну тут, вроде, все понятно. Для этого я и пытался создать генератор наборов для замен, где выдавалось не больше одного значения для одной буквы. То есть если
дд но то в первом наборе выдалось бы только 0 и мы заменили все д в слове на н, а во втором 1 и мы бы все д заменили на о. Конечно, если заменяется буква "д" в слове, то на всех позициях она заменяется на одно и то же)
0
|
|
|
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
|
||||||
| 01.06.2020, 17:03 | ||||||
|
Попробуйте протестировать следующий вариант. По-идее всё работает и с лишними буквами и с пропусками.
Здесь интересен только метод Main в котором можно изменять лишь первые четыре переменные (они отмечены цифрами) и смотреть результат в консоли.
1
|
||||||
|
1533 / 540 / 127
Регистрация: 09.01.2018
Сообщений: 1,756
|
||||||||||||||||||||||||||||||||||||
| 01.06.2020, 20:23 | ||||||||||||||||||||||||||||||||||||
|
shabserg,
Я подумал и у меня получились вот такие соображения: Алгоритм шифрования Слово зашифровывается путем замены символов из одной строки на символы из другой строки. Обе строки имеются. Однако, символы в верхней строке повторяются. Это означает, что у каждого символа из верхней строки возможно несколько вариантов замены. Для того чтобы зашифровать слово с однозначным результатом шифрования, помимо исходных строк, необходимо знать какая именно из возможных замен использовалась для конкретного символа. Т.е. необходим ключ шифрования. Например слово КОТ имеет две буквы, совпадающие с набором букв из верхней строки. Пусть это будут буквы К и Т. И например, буква К имеет четыре возможных замены, а буква Т - шесть. Тогда возможный ключ должен выглядеть примерно так: 34 Это означает, что букву К заменить на ее 3-ю замену, букву Т на 4-ю, а букву О оставить как есть и не заменять. Этот самый ключ преподаватель нам не сообщил и именно его мы должны попытаться угадать. Ключа мы не знаем, однако теперь у нас есть метод шифрования. В метод передаются следующие параметры: 1. Шифруемое слово 2. Верхняя строка замен 3. Нижняя строка замен 4. Ключ Имея эти четыре аргумента, можно зашифровать слово из словаря, вычислить его хеш и сравнить с искомым. Значит задача сводится к тому, чтобы подобрать ключ. Что мы можем занять о ключе. Длина ключа равна количеству символов из верхней строки, совпадающих с символами шифруемого слова без повторов. Максимальное значение для каждой цифры ключа равно количеству возможных замен для символа, информацию о котором предоставляет цифра ключа минус 1. Минимальное значение цифры ключа - 0 Таким образом, сгруппировав все возможные замены для отдельного слова, мы можем узнать как длину ключа так и максимальные значения для каждой цифры. Теперь у нас есть и метод брут форса, генерирующий ключи для каждого слова. Нам понадобится перебрать все возможные значения ключа для каждого символа, зная его минимальные и максимальные значения. Тогда можно описать интерфейс класса, предоставляющего методы для взлома: Кликните здесь для просмотра всего текста
Как осуществляется взлом Имея набор ключей, нужно взять слово из словаря и поочередно зашифровать его каждым ключом, затем вычислить хеш зашифрованного слова и сравнить его с контрольным хешем. В случае совпадения взлом прекращается. Теперь когда весь алгоритм имеется, можно описать класс, который будет осуществлять взлом. Ему понадобится словарь и контрольное значение хеша, а также один метод, который будет делать то что описано в предыдущем абзаце. Интерфейс класса осуществляющего взлом: Кликните здесь для просмотра всего текста
Понадобятся также два вспомогательных метода, для вычисления хеша и его сравнения с контрольным: Кликните здесь для просмотра всего текста
Собственно, все ясно, можно приступать к реализации. Класс, предоставляющий методы для взлома: Кликните здесь для просмотра всего текста
Класс, осуществляющий взлом Кликните здесь для просмотра всего текста
Теперь можно потестировать: Кликните здесь для просмотра всего текста
Результаты: Кликните здесь для просмотра всего текста
Вообще тестировать такие вещи сложно. Поэтому упрошенный вариант прямо в Main. Все работает. В комментах постарался подробно описать что и зачем делается в реализации.
1
|
||||||||||||||||||||||||||||||||||||
| 01.06.2020, 20:23 | |
|
Перебор всех возможных вариантов
Диаграммы вариантов использования
Как сделать один из 3 вариантов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|