Задача
Получив список парольных фраз из трех слов, взломайте их все. Каждый раз, когда вы угадаете, вам дадут подсказку в стиле Mastermind , показывающую, сколько символов соответствует паролю и сколько находится в правильном положении. Цель состоит в том, чтобы минимизировать общее количество догадок во всех тестовых случаях.
Секретные фразы
Из списка слов в моей системе по умолчанию я случайно выбрал 10000 отдельных слов, чтобы составить словарь для этой задачи. Все слова состоят a-z
только из Этот словарь можно найти здесь ( сырой ).
Из этого словаря я сгенерировал 1000 парольных фраз, состоящих из трех случайных слов, разделенных пробелом каждое ( apple jacks fever
например). Отдельные слова могут быть повторно использованы в каждой парольной фразе ( hungry hungry hippos
). Вы можете найти список парольных фраз здесь ( необработанных ), по одному на строку.
Ваша программа может использовать / анализировать файл словаря по своему усмотрению. Вы не можете анализировать парольные фразы для оптимизации для этого конкретного списка. Ваш алгоритм все еще должен работать, учитывая другой список фраз
Гадать
Чтобы сделать предположение, вы отправляете строку в контролер. Должно возвращаться только :
- Количество символов в вашей строке также в парольной фразе ( не в правильной позиции)
- Количество символов в правильной позиции
Если ваша строка идеально подходит, она может вывести что-то, указывающее на это (мой использует -1
для первого значения).
Например, если парольная фраза the big cat
и вы угадаете tiger baby mauling
, программа проверки должна вернуться 7,1
. 7 символов ( ige<space>ba<space>
) находятся в обеих строках, но в разных позициях, а 1 ( t
) в одной и той же позиции в обеих. Обратите внимание, что пробелы считаются.
Я написал пример (читай: не оптимизирован) функции на Java, но не стесняйтесь писать свою собственную, если она дает только необходимую информацию.
int[] guess(String in){
int chars=0, positions=0;
String pw = currentPassword; // set elsewhere, contains current pass
for(int i=0;i<in.length()&&i<pw.length();i++){
if(in.charAt(i)==pw.charAt(i))
positions++;
}
if(positions == pw.length() && pw.length()==in.length())
return new int[]{-1,positions};
for(int i=0;i<in.length();i++){
String c = String.valueOf(in.charAt(i));
if(pw.contains(c)){
pw = pw.replaceFirst(c, "");
chars++;
}
}
chars -= positions;
return new int[]{chars,positions};
}
счет
Ваша оценка - это просто число предположений, которые вы отправляете проверяющему (считая окончательный, правильный) для всех тестовых фраз. Самый низкий балл побеждает.
Вы должны взломать все фразы в списке. Если ваша программа не работает ни на одном из них, она недействительна.
Ваша программа должна быть детерминированной. Если запустить дважды на одном и том же наборе парольных фраз, он должен вернуть тот же результат.
В случае ничьей в первую очередь я буду запускать связанные записи на моем компьютере четыре раза каждый, и выигрывает самое низкое среднее время для решения всех 1000 дел. Мой компьютер работает под управлением Ubuntu 14.04, с i7-3770K и 16 ГБ ОЗУ какого-то рода, в случае, если это имеет значение для вашей программы. По этой причине и для облегчения тестирования ваш ответ должен быть на языке, который имеет компилятор / переводчик, который можно бесплатно загрузить из Интернета (не включая бесплатные пробные версии) и не требует регистрации / регистрации.
Название адаптировано из XKCD
источник
9 0
, Это может занять некоторое время: PОтветы:
Scala 9146 (мин. 7, макс. 15, ср. 9,15) время: 2000 секунд
Как и во многих записях, я начинаю с определения общей длины, затем с пробелами, получая немного больше информации, сокращая количество оставшихся кандидатов и затем подбирая фразы.
Вдохновленный оригинальным комиксом xkcd, я попытался применить свое элементарное понимание теории информации. Есть триллиона возможных фраз или чуть менее 40 бит энтропии. Я поставил цель - до 10 догадок на тестовую фразу, что означает, что нам нужно выучить в среднем почти 5 битов на запрос (поскольку последний бесполезен). С каждым предположением мы получаем два числа и, грубо говоря, чем больше потенциальный диапазон этих чисел, тем больше мы ожидаем узнать.
Чтобы упростить логику, я использую каждый запрос как два отдельных вопроса, поэтому каждая строка предположения состоит из двух частей: левая сторона интересуется количеством правильных позиций (черные колышки в вдохновителе) и правая сторона интересуется количеством правильных символов ( всего колышков). Вот типичная игра:
Угадывать пробелы
Каждое космическое предположение может вернуть не более 2 черных колышков; Я попытался построить догадки, чтобы вернуть 0,1 и 2 колышка с вероятностями 1 / 4,1 / 2 и 1/4 соответственно. Я считаю, что это лучшее, что вы можете сделать для ожидаемых 1,5 бит информации. Я остановился на чередующейся строке для первого предположения, за которым следуют случайно сгенерированные, хотя оказывается, что обычно стоит только начать предполагать со второй или третьей попытки, так как мы знаем частоты длин слов.
Количество символов для обучения
Для догадок справа я выбираю случайные (всегда 2 из e / i / a / s) наборы символов, так что ожидаемое возвращаемое число составляет половину длины фразы. Более высокая дисперсия означает больше информации, и со страницы Википедии о биномиальном распределении я оцениваю около 3,5 битов на запрос (по крайней мере, для первых нескольких, прежде чем информация станет избыточной). Как только интервал известен, я использую случайные строки из наиболее распространенных букв слева, выбранные так, чтобы не конфликтовать с правой стороной.
Объединение оставшихся кандидатов
Эта игра представляет собой компромисс между скоростью вычислений и эффективностью запросов, и перечисление оставшихся кандидатов может занять очень много времени без структурированной информации, такой как конкретные символы. Я оптимизировал эту часть, главным образом собирая информацию, которая инвариантна к порядку слов, что позволяет мне предварительно рассчитать количество наборов символов для каждого отдельного слова и сравнить их с количеством, полученным из запросов. Я упаковываю эти числа в длинное целое число, используя компаратор машинного равенства и сумматор, чтобы проверить все числа моих персонажей в parralel. Это была огромная победа. Я могу собрать до 9 счетов в Лонге, но я обнаружил, что собирать дополнительную информацию не стоило, и остановился на 6-7.
После того, как остальные кандидаты известны, если набор достаточно мал, я выбираю один с самым низким ожидаемым журналом оставшихся кандидатов. Если набор достаточно велик, чтобы отнимать много времени, я выбираю небольшой набор образцов.
Всем спасибо. Это была забавная игра, которая побудила меня зарегистрироваться на сайте.
Обновление: очищен код для простоты и удобочитаемости, с небольшими изменениями в алгоритме, что привело к улучшению оценки.
Первоначальный счет: 9447 (минимум 7, максимум 13, средняя 9,45) время: 1876 секунд
Новый код 278 строк Scala, ниже
источник
C - всего: 37171, мин: 24, макс: 55, время: около 10 секунд
Я заимствовал идею Рэя, чтобы найти длину каждого слова, угадывая с пробелами, за исключением того, что я делаю бинарный поиск, а не линейный поиск, что спасает меня от многих догадок.
Определив длину слова, я думаю, что первое слово соответствует его длине, и я записал количество правильных позиций. Затем я выбираю первое слово из набора всех слов, которые разделяют такое же количество позиций с моим первым предположением, что и загадочное слово. В качестве третьего предположения я выбираю первое слово из набора всех слов, которые имеют одинаковое количество позиций с моим первым предположением в качестве загадочного слова и такое же количество позиций, что и второе предположение с загадочным словом и т. Д.
Используя этот метод, я могу угадать каждое слово, по одному, примерно за 5-10 догадок. Очевидно, что третье слово я должен сделать немного по-другому, потому что я не знаю его длину, но метод похож. Я использую файл, который содержит матрицу из числа позиций, общих для каждого слова, которые я предварительно вычислил. Большая часть времени выполнения происходит при загрузке предварительно вычисленных данных. Вы можете скачать все здесь .
Также забавно наблюдать, как это ограничивается словами:
источник
Python 3,4 - мин: 21, макс: 29, всего: 25146, время: 20 минут
мин: 30, макс: 235, всего: 41636, время: 4минОбновить:
Этот метод не использует случайность, поэтому оценка не изменится.
Сначала он использует такие предположения, как следующие, чтобы найти первое и второе пробелы в ответе.
Затем он подсчитывает вхождение каждой буквы, угадывая
aaaaa...
,bbbbb....
... После этого это будет стоить около 40 шагов. На самом деле нам не нужно пробовать все буквы, и мы можем попробовать их в произвольном порядке. В большинстве случаев достаточно около 20 букв. Здесь я выбираю 21.Теперь он знает длину первого слова и второго слова, чтобы отфильтровать список кандидатов на эти два слова. Обычно на каждого из них остается около 100 кандидатов.
Тогда это просто перечислить первое и второе слово. Как только первые два слова перечислены, мы можем вывести все допустимые третьи слова, так как мы знаем, что их количество символов.
Чтобы оптимизировать скорость, я использую в программе
concurrent.futures
многопроцессорность. Итак, вам нужен Python 3 для его запуска, и я протестировал его с Python 3.4 на моем Linux-компьютере. Также вам необходимо установитьnumpy
.источник
Ява 13 923 (мин: 11, макс: 17)
Обновление: улучшен счет (сломал <14 / взломать!), Новый код
Оригинальный пост
Я решил полностью сосредоточиться на количестве догадок, а не на производительности (учитывая правила). Это привело к очень медленной умной программе.
Вместо того, чтобы воровать у известных программ, я решил написать все с нуля, но оказалось, что некоторые / большинство идей совпадают.
Алгоритм
Вот как работает моя:
Пример догадок
Вот фактический пример:
Поскольку мой код никогда не фокусируется на отдельных словах, а только собирает информацию о полной фразе, он должен генерировать множество этих фраз, что делает его очень медленным.
Код
И, наконец, вот (уродливый) код, даже не пытайтесь его понять, извините:
источник
Java -
18 708 запросов; 2,4 секунды 11077 запросов; 125 минМин: 8, Макс: 13, Эффективных запросов: 10,095
Я потратил слишком много времени на это. :П
Код доступен на http://pastebin.com/7n9a50NMВерсия 1. доступна на http://pastebin.com/PSXU2bgaВерсия 2. доступна на http://pastebin.com/gRJjpbbu
Моя вторая ревизия. Я надеялся преодолеть барьер 11K, чтобы выиграть приз, но у меня не хватило времени, чтобы оптимизировать этого зверя.
Он работает по совершенно отдельному принципу от двух предыдущих версий (и его запуск занимает примерно 3500 раз). Общий принцип заключается в использовании пробелов и просеивания четных / нечетных символов, чтобы уменьшить список кандидатов до приемлемого размера (обычно от 2 до 8 миллионов), а затем выполнять повторные запросы с максимальной степенью дискриминации (т. Е. Чье распределение выходов имеет максимальную энтропию).
Не скорость, а память - главное ограничение. Моя виртуальная машина Java не позволит мне зарезервировать кучу больше 1200 МБ по какой-то непонятной причине (вероятно, Windows 7), и я настроил параметры, чтобы дать мне наилучшее возможное решение, которое не исчерпывает этот предел. Меня раздражает, что правильный запуск с правильными параметрами сломал бы 11K без существенного увеличения времени выполнения. Мне нужен новый компьютер. :П
Что меня так же раздражает, так это то, что 982 запроса в этой реализации - бесполезные запросы «проверки». У них нет никакой другой цели, кроме как удовлетворить правило, согласно которому оракул должен возвращать специальное значение «вы получили это» в какой-то момент, хотя в моей реализации правильный ответ был с уверенностью выведен до этого запроса в 98,2% случаев. Большинство других представлений под 11K полагаются на методы фильтрации, которые используют строки-кандидаты в качестве строк запроса и, следовательно, не подвергаются такому же наказанию.
По этой причине, хотя мое официальное количество запросов составляет 11 077 (если не считать лидеров, если их код соответствует требованиям, соответствует спецификациям и т. Д.), Я смело заявляю, что мой код выполняет 10 095 эффективных запросов, то есть только 10 095 запросов На самом деле необходимо определить все парольные фразы со 100% уверенностью. Я не уверен, что какая-либо другая реализация будет соответствовать этому, поэтому я буду считать это своей маленькой победой. ;)
источник
.
."perpetually exhausting pool"
Java - мин: 22, макс: 41, всего: 28353, время: 4 секунды
Программа угадывает пароль в 3 этапа:
Он также обрабатывает набор «плохих символов», которые возвращают нулевой результат в поиске, и набор «хороших символов», которые размещаются где-то еще в парольной фразе.
Ниже приведен пример последовательных отправлений значений для угадывания. Вы можете увидеть 3 шага:
Код:
источник
PYTHON 2.7 - 156821 догадки, 0,6 секунды
Я пошел на скорость, а не наименьшее количество догадок, хотя я полагаю, что мое количество догадок все еще меньше, чем, например, атака по словарю. Я не рассчитываю количество букв в пароле, но в неправильном месте, поскольку мой метод не использует его, но если вы считаете, что это дает мне несправедливое преимущество, я его реализую. Я просто начинаю с пустой строки догадки и добавляю к ней суффикс из одного символа, который увеличивается в моем списке символов, проверяя результат проверки, чтобы убедиться, что количество правильных символов равно длине догадки. Например, если бы пароль был «плохой», я бы предположил:
а, б
a
а, б, в, г
Я также пытался сортировать буквы по частоте английских букв, что сбрасывало около 35% количества догадок и времени. Я взломал все пароли за 0,82 секунды. Статистика печатается в конце.
РЕДАКТИРОВАТЬ: Удалил паразитные +1 и -1 из двух циклов while из предыдущих итераций тестирования, а также добавил дополнительную статистику для наименьших догадок и большинство догадок для отдельного пароля.
EDIT2: добавлена таблица поиска наиболее распространенных «следующих» букв для каждой буквы. Значительно увеличена скорость и уменьшено количество догадок
источник
C ++ -
1138310989 матчей!Обновить
Исправлены утечки памяти и удалена еще 1 попытка уменьшить размеры отдельных словарных словарей. Занимает около 50 минут на моем Mac Pro. Обновленный код на GitHub.
Я переключился на стратегию сопоставления фраз, переработал код и обновил его на github https://github.com/snjyjn/mastermind
Благодаря сопоставлению на основе фраз мы сократили количество попыток до 11383! Это дорого с точки зрения вычислений! Мне также не нравится структура кода! И это все еще далеко позади других :-(
Вот как я это делаю:
Параллельно добавляйте «специально созданные» тестовые строки, чтобы получить больше информации о фразе. Текущая стратегия заключается в следующем:
а. Используйте символы в порядке их частоты в словаре.
б. Мы уже знаем счет для самых частых
с. 1-я тестовая строка = следующие 5 символов. Это дает нам количество этих символов в фразе.
д. следующие 3 тестовые строки = следующие 5 символов каждая, охватывающие в общей сложности 20 символов в 4 попытках в дополнение к первому 1 символу. Это дает нам счет и для этих последних 5 символов. наборы со счетом 0 отлично подходят для уменьшения размера словаря!
е. Теперь для предыдущего теста, который имел наименьшее число, отличное от нуля, разделите строку на 2 и используйте 1 для тестирования. Итоговый счет говорит нам и о другом разделении.
е. Теперь повторите тесты с символами (начиная с 0),
После определения пробелов используйте ограничения (столько тестов, сколько можно выполнить в этих попытках), чтобы уменьшить размер словаря. Также создайте 3 под-словаря, по 1 на каждое слово.
Теперь сделайте несколько предположений для каждого слова и проверьте его.
Используйте эти результаты, чтобы уменьшить отдельные размеры словаря.
Украсьте это также тестовыми символами (после длины), чтобы получить больше ограничений на фразу! Я использовал 3 догадки в окончательной версии - 2 для слова 1 и 1 для слова 2
Это приводит словарь к управляемому размеру. Выполните перекрестный продукт, применяя все ограничения, как и прежде, чтобы создать словарь фраз.
Решите для словаря фраз через ряд догадок - на этот раз, используя информацию о положении и совпадении символов.
Этот подход подводит нас к 11383 попыткам:
Предыдущий пост
Я очистил код и загрузил его на https://github.com/snjyjn/mastermind. В процессе я улучшил его, и у меня еще есть 1 идея попробовать. Есть одно существенное отличие от того, что я сделал вчера:
Статистика теперь выглядит так:
Оригинальный пост
Извиняюсь за «ответ», но я только что создал аккаунт, и у меня недостаточно репутации, чтобы добавить комментарий.
У меня есть программа на C ++, которая занимает около 6,5 секунд и 24107 попыток сопоставления. Это около 1400 строк с ++. Меня не устраивает качество кода, и я его почистю, прежде чем выложу его в другой день или около того. Но в интересах сообщества и участия в обсуждении, вот что я делаю:
Прочитайте словарь, получите некоторую основную информацию о нем - минимальная / максимальная длина слова, частота символов и т. Д.
Сначала идентифицируйте пробелы - это имеет 2 половины, первая - это набор запросов, которые продолжают разделять пространство (аналогично одному C. Chafouin):
Это не совсем точно, так как я использую минимальную / максимальную длину слова, и я использую количество совпадений на каждом этапе, но вы поняли идею. На данный момент еще недостаточно информации, чтобы получить 2 пробела, но у меня достаточно, чтобы сократить ее до небольшого числа комбинаций. Из этих комбинаций я могу сделать пару конкретных запросов, которые сузят его до 1 комбинации.
Первое слово - получите вспомогательный словарь, в котором есть слова правильной длины. Subdictionary имеет свою собственную статистику. Сделайте несколько предположений с наиболее часто встречающимися персонажами, чтобы получить количество этих символов в слове. Снова уменьшите словарь, основываясь на этой информации. Создайте слово-угадайку, содержащее самые разные символы, и используйте его. Каждый ответ вызывает сокращение в словаре до тех пор, пока мы не получим точное соответствие, или если размер словаря равен 1.
Второе слово - похоже на первое слово
Третье слово - это больше всего отличается от других 2. У нас нет для этого информации о размере, но у нас есть все предыдущие запросы (которые мы сохранили). Эти запросы позволяют уменьшить словарь. Логика заключается в следующем:
Используйте сокращенный словарь, чтобы сделать предположение, используя самые разные символы, и продолжайте сокращать словарь до размера 1 (как в словах 1 и 2).
Статистика выглядит так:
источник
Go - всего: 29546
Подобно некоторым другим, с некоторыми оптимизациями.
AAAAAAAABBBBBBBBCCCCCCCC...ZZZZZZZZ
Это не особенно быстро.
источник
passphases
иallWords
не определены.Ява: 58 233
(справочная программа)
Простой бот для всех, чтобы победить. Он использует исходные 26 догадок для каждой фразы, чтобы установить количество символов. Затем удаляются все слова, содержащие буквы, не найденные во фразе.
Затем идет массивный цикл O (n 3 ) над оставшимися словами. Сначала проверяется каждая кандидатная фраза, чтобы узнать, является ли она анаграммой. Если это так, он угадывает это, игнорируя результаты, если это не идеальное совпадение. Я видел, что до сих пор использовалось от 28 до 5 догадок для каждой конкретной фразы.
Это медленно , и это полностью зависит от того, сколько слов можно исключить прямо из исходных 26 догадок. Большую часть времени он оставляет между 1000-4000 слов для зацикливания. Сейчас он работает где-то около 14 часов, со скоростью ~ 180 с / фраза. Я предполагаю, что это займет 50 часов, и обновит счет в то время. Вы, вероятно, должны сделать что-то умнее или более готовым, чем это.
(обновление) Это наконец закончено, с немного менее 60 000 предположений.
источник
Ява:
28 34026 185Мин 15, макс 35, время 2,5 с
Так как мой глупый бот наконец-то закончил работать, я хотел представить что-то немного быстрее. Он запускается всего за несколько секунд, но получает хороший результат (не совсем выигрыш> <).
Сначала он использует большую строку пэда, чтобы получить общую длину фразы. Затем бинарный поиск, чтобы найти пробелы, похожие на другие. При этом он также начинает проверять буквы по одной за раз (в сводном порядке), чтобы исключить слова, содержащие больше букв, чем всей фразы.
Как только он имеет длину слова, он использует шаг двоичного сокращения, чтобы сузить выбор для списков слов. Он выбирает самый большой список и букву примерно в половине слов. Он угадывает длину слова этой буквы, чтобы определить, какую половину выбросить. Он также использует результаты, чтобы избавиться от слов в других списках, в которых слишком много букв.
Если список состоит только из анаграмм, это не работает. В этот момент я просто перебираю их, пока не останется только два (или одно, если другие слова не известны).
Если у меня общее количество слов четыре (два известных и один с двумя вариантами), я пропускаю проверки сокращения и анаграммы и просто угадываю один из вариантов как полную фразу. Если это не сработает, то должно быть другое, но я экономлю примерно 50% времени.
Вот пример, показывающий взломанную первую фразу:
И конечно же код:
источник
C # - 10649 (минимум 8, максимум 14, среднее: 10,6) время: ~ 12 часов
Вот как это выглядит:
решающее устройство
Он использует перспективный решатель. Прежде чем сделать предположение, он оценивает количество различных значений, полученных от вдохновителя, с учетом возможных в настоящее время парольных фраз. Предположение, которое максимизирует количество различных результатов, является используемым.
Для фазы угадывания пространства рассматриваются только возможные комбинации «» и «.». Для фазы угадывания фразы он создает полный список возможных в настоящее время парольных фраз (именно поэтому он такой медленный).
Количество букв
Буквы подсчитываются с пробелом. Наборы букв были выбраны жадным поиском, добавляя одну букву за раз и выбирая случайные тестовые фразы, чтобы увидеть, насколько эффективен набор.
Код здесь: https://github.com/Tyler-Gelvin/MastermindContest
Интерфейс не был указан, поэтому все входные данные жестко закодированы, и модульные тесты являются единственным интерфейсом. «Основным» тестом является SolverFixture.SolveParallelAll.
источник
Main
функцию в вашем коде. У него есть один?SolverFixture.SolveSerialAll
- это то, что я использовал, чтобы получить результаты тестов, опубликованные выше, иSolver.Solve
это ядро программы. Это юнит-тестовый проект без единой официальной точки входа, поэтому безmain
функции.C # - Всего: 1000, Время выполнения: 305 секунд, Среднее: 24, Мин: 14, Макс: 32
Ничего себе, 15 лет, это очень хорошо, я не могу победить, но я сделал удар, так что вот мой подход. Я разбил это слово на слово, затем решил их последовательно. Определив длину первых двух слов, а затем сделав несколько стратегических догадок (каждый раз фильтруя по угаданному слову), я смог получить ответ с относительно небольшим количеством догадок. В течение периода, который я разработал, я смог оптимизировать большинство его частей для эффективного преформирования (в предположениях числа), но ошибка в этом заключается в первоначальном проектном решении логически решать одно слово за раз, поэтому я отбрасываю части догадки и / или не запускать догадки настолько эффективно, насколько это возможно, что, в свою очередь, означает, что я не выиграю в этом; (.
Все еще интересный дизайн (по крайней мере, я так думаю), что следует отметить с помощью включенного кода, в некоторых случаях я могу определить ответ, даже не выполняя предположение, которое возвращает -1, если это требуется, просто раскомментируйте строку кода, помеченную «ДОБАВЬТЕ ЗДЕСЬ ЗДЕСЬ (если требуется)» (и добавьте +1 ко всем моим оценкам :()
Алгоритм (Мое мышление в коде Судо)
Так что на самом деле есть две части, первые два слова и последнее слово. Это может не иметь смысла ни для кого, кроме меня, но я попытался добавить достаточно комментариев к коду, так что, возможно, это будет иметь больше смысла:
NextWord (одно из двух первых двух слов)
{
var lengthOfPossibleWord = Определить длину слова (в коде см .: эффективный способ найти длину)
Список возможностей = Все слова этой длины (lengthOfPossibleWord)
Угадай
возможности = возможности, где (для всех догадок) {Количество символов в той же позиции равно возможному слову
(если символы outOfPlace равны 0), тогда где все символы отличаются от возможного слова}
}
LastWord (после того, как первые два решены)
{
Возможности списка = все слова, отфильтрованные по количеству символов offPosition во втором слове (см. Код: helperWords)
Угадай
возможности = возможности где (для всех догадок) {
Количество символов в одной позиции равно возможному слову
Сумма символов входа и выхода == возможное слово (для всех догадок)
Длина равна длине возможного слова (сумма символов входа и выхода)
(если символы outOfPlace равны 0), тогда где все символы отличаются от возможного слова
}
}
Код
Обратите внимание, чтобы это работало, вам нужно включить ppcg_mastermind_dict.txt и ppcg_mastermind_passes.txt в работающий каталог (или в VS в том же каталоге и установить для параметра «Копировать в выходной каталог» значение true). Я действительно извиняюсь за качество кода, но над этим еще предстоит проделать большую работу, но он должен работать.
источник
Python - минимум: 87, максимум: 108, всего: 96063, время: 4 с
Это мой второй пост. Этот метод использует меньше времени, но оценка хуже. И он может быть запущен с помощью:
шаги:
. ....
,.. ...
...Это стоило около 90 предположений на каждый пароль.
источник
Perl (все еще работает ... на данный момент min / avg / max 8 / 9,2 / 11, оцените его в
1500300 часов общего времени выполнения)Обновление: изменил начальные догадки, чтобы ускорить его. Исправлена ошибка.
Вероятно, он не закончится раньше, чем этот конкурс, но я мог бы также опубликовать его. Он не определяет длины отдельных слов, поэтому он должен проверить весь словарь, что ... занимает некоторое время.
С помощью первых двух предположений он определяет общую длину, количество «е» и количество различных символов.
Затем он пробует все комбинации, которые соответствуют этой статистике, а также все предыдущие догадки.
Эта последняя (и последняя) версия добавила mp и в настоящее время работает на 24-ядерной системе.
источник
Java 10.026 (через 2,5 часа)
Вот мой оптимизированный код, теперь многопоточный для повышения скорости:
источник