Сервер домена требует, чтобы все сотрудники имели надежный случайный пароль, соответствующий следующим правилам:
- Ровно 15 символов.
- Только вводимые с клавиатуры символы (как показано в коде типа ниже). Обучение продажам использовать коды ALT + NUMPAD не допускается.
- Как минимум 1 строчная буква:
abcdefghijklmnopqrstuvwxyz
- Как минимум 1 заглавная буква:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Минимум 1 цифра:
0123456789
- Как минимум 1 символ:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
Для этого ИТ-отдел поручил и будет распространять генератор случайных паролей среди всех сотрудников. Все сотрудники должны будут использовать генератор случайных паролей. Требования к генератору случайных паролей, в дополнение к ограничениям пароля выше:
- Он должен быть в состоянии генерировать все перестановки всех допустимых символов.
- Он должен отображать сгенерированный пароль на экране.
- Код должен быть как можно меньше (в байтах).
Пожалуйста, отправьте предложенное решение в течение следующей недели.
correcthorsebatterystaple
Ответы:
Математика (18)
Позвольте мне немного обмануть
PS не безопасность :)
источник
Рубин,
7469 байтПросто случайный выбор из диапазона ASCII 33 - 126, пока все классы символов присутствуют:
Рубин, 39 байт
Используя умное открытие лося:
Изменить, чтобы удовлетворить толпу:
Обратите внимание, что правила изменились после того, как я впервые опубликовал это. В то время обе предыдущие записи применялись к правилам. Я также хотел бы отметить, что правила все еще не очень хорошо определены:
«Перестановка». Там нет перестановок допустимых символов, которые соответствуют остальным правилам, потому что любая перестановка набора допустимых символов равна длине самого набора допустимых символов (в то время как пароль должен иметь длину 15 символов). И нет никаких повторений в перестановке. Однако моя первая запись все еще более «случайна», чем многие из других хорошо проголосовавших ответов здесь.
Тем не менее, здесь у вас есть это. Позволяет повторения символов и подчеркивания:
Рубин, 77 байт
Я также использовал
puts
вместоp
этого, потому чтоp
печатает строку, заключенную в «кавычки», и некоторые символы экранируются обратной косой чертой.Рубин, 70 байт
Как указывает Ventero,
~
может быть пропущен перед регулярными выражениями иprint
может быть замененputs$_
. Но с ужасным выводом это может привести к тому, что вы также можете распечатать все отклоненные пароли, сжав их в одну строку:объяснение
Как просили.
$_
это полумагическая переменная, которая содержит последнюю строку, прочитанную из ввода - так что вам не всегда нужно ее хранить, как это . Здесь, однако, мы используем его из-за другого свойства, а именно, что~
оператор применяет регулярное выражение непосредственно к нему, трюк, который я впервые узнал с помощью chron . Я заменил использованиеall
, но это должно быть довольно легко понять, если вы получите остальное ( см. Документы ).источник
.all?{|r|~r}
? Что делает$_=
?\W
в Ruby , включают подчеркивание_
? В большинстве диалектов регулярных выражений я знаю, что это не так. И если ваш код не может сгенерировать пароли, в которых_
единственным не алфавитно-цифровым символом является один, то это нарушит одно требование. Второй подход, очевидно, нарушает это требование, но я думаю, что он не был правильно сформулирован в то время.\W
не содержит подчеркивания в Perl-совместимом RegEx ( источник ).sample
не повторяет элементы, поэтому пароли с повторяющимися элементами не могут быть сгенерированы вашим кодом. Можете ли вы исправить эти две проблемы, чтобы ваш ответ соответствовал вопросу? Видя, что ваше решение является ведущим, за исключением Wolfram Alpha, было бы неплохо увидеть, сможете ли вы соответствовать и при этом сохранять лидерство. Я думаю, это не должно быть слишком сложно.Java 8 -
354329319275267 символовПросто для удовольствия, используя лямбды с Java 8 - каждый возможный вывод имеет одинаковую вероятность быть найденным.
Он использует тот факт, что разрешенные символы имеют последовательные коды ASCII, от 33 до 126.
Образец вывода:
Сжатая программа:
class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}
источник
while(a+A+d+p<4)
вместе сa|=1
вместоa++
? Или используйте битовые маски, то есть такие вещи, какa|=1
сквозныеa|=8
, сa<15
условием цикла. Это сохраняет еще 13 символов, если я посчитал правильно.new String(int[],int,int)
сохраняет еще 40 с лишним символов!Python 2.X + 3.X (229 символов): генерировать и заменять
идея
r
случайной цифройs
наs != r
, по заглавной буквеКод
Python 2.X + 3.X (194 символа): создать и проверить
\u
и\l
не существует в регулярных выражениях Python.random.sample
это без замены, чтобы получить все возможные разрешенные пароли, нам нужна выборка с заменой.Использование недостатка в описании проблемы
В настоящее время описание проблемы не требует, чтобы каждый символ / цифра появлялся с одинаковой вероятностью. С помощью следующего решения вы не можете делать какие-либо предположения об одном символе и / или позиции. Но вы можете сделать это с несколькими.
Python 2.X + 3.X (62 символа)
Спасибо Даниеро за идею использовать образец.
источник
\l
и так далее для регулярных выражений Python? Не вижу этого в ссылке . Мой Python 3.3.3 даже не примет"\u"
. Ониstr(…)
не объединяют буквы в 3.3.3 или 2.7.6. Одно из предложений для optmization:all(s("\\"+i,p)for i in "dluW")
.random.sample
выбирает элементы без замены, поэтому не все пароли возможны.\u
и\l
только для vim.Bash на * NIX (109)
Для правильной работы
$a
не должен быть установлен действительный, но неслучайный пароль заранее. Если вы хотите включитьa=
и разрыв строки вперед, это еще три символа, но это позволяет вам запускать эту вещь несколько раз. Вы также можете заменить все новые строки на;
чтобы у вас была однострочная которую вы можете выполнять так часто, как пожелаете.Кроме того, вы должны были установить
LC_ALL=C
или не устанавливать какие-либо переменные среды, зависящие от локали (LANG
иLC_CTYPE
зависящие от в частности), поскольку диапазоны символов зависят от порядка сопоставления, равного порядку ascii./dev/urandom
является источником случайных байтов.!-~
это диапазон всех допустимых символов, как указано в вопросе.tr -dc
удаляет все символы, не перечисленные в следующем аргументе.head
занимает 15 из оставшихся символов.grep
проверяет, встречается ли каждый из требуемых видов хотя бы один раз. Его ввод состоит из четырех копий кандидата, поэтому порядок символов не имеет значения, поэтому все возможные пароли имеют шанс быть выбранными.-q
К ГРЭП выход подавляет.По неизвестным причинам,
/dev/random
а не/dev/urandom
принимает возраст. Кажется, энтропия довольно быстро исчерпала себя. Если выcd
в/dev
, вы можете избежать еще несколько байт, но чувствует себя немного как обман.Python 2 (138)
Чтобы сделать код читабельным, я добавил новую строку и отступ после цикла, который не является необходимым и который я не учел.
По сути, это та же идея, что и в версии bash. Случайный источник здесь
random.sample
, который не будет повторять элементы. Чтобы противостоять этому факту, мы используем 15 копий списка допустимых букв. Таким образом, любая комбинация все еще может иметь место, хотя повторяющиеся буквы встречаются реже. Но я решил считать это особенностью, а не ошибкой, поскольку вопрос не требовал равной вероятности для всех перестановок, только для возможности.Питон 3 (145)
Один перевод строки и один отступ снова не учитываются. Помимо некоторых накладных расходов на синтаксис, специфичных для Python-3, это то же решение, что и для Python 2.
JavaScript (161)
Я добавил новые строки для удобства чтения, но не посчитал их.
R (114)
Разрыв строки и отступ внутри цикла добавлены, но не учитываются. Если вам это нравится, вы можете снова переместить это в одну
;
строку.источник
grepl
в своем коде R. Если бы я только думал повторить тестовый пароль четыре раза, чтобы вы могли выполнить все проверки за один раз. И вы знаете, если бы я только подумал оsample
иintToUtf8
. Тем не менее, вам нужно добавитьreplace=TRUE
(или, точнее, просто добавить,T
) к вашему образцу метода, чтобы убедиться, что вы получаете все возможные пароли.replace=T
ошибку, спасибо за указание на это. ПоискintToUtf8
по угадыванию вероятных имен с завершением табуляции занял у меня довольно много времени; Я знал, что такая функция должна существовать, но более распространенные имена, такие какchr
и так далее, не использовались.*4
? Я думал, что ваше регулярное выражение будет соответствовать любой строке, то есть сначала одна заглавная буква, потом что-нибудь, потом одна строчная буква, чем что-либо ... что я ошибся?re.search
не делаюre.match
, поэтому регулярное выражение может совпадать где угодно в пароле кандидата. Это объясняет, почему это закончится в конечном счете?re.search
вместоre.match
. Что объясняет его. Но я все еще думаю, что вам не нужно*4
. Спасибо за объяснение (+1)C # (
сжатые 123 - 139,103 - 127 символов):Использование совершенно адекватного метода каркаса в
System.Web.dll
:Уплотненный:
Пример:
В качестве альтернативы, возьмите значение второго параметра (
int numberOfNonAlphanumericCharacters
) из командной строки:источник
GeneratePassword
не поддерживает полный набор символов, указанный в вопросе. Также я не нашел никаких гарантий относительно минимального количества вхождений каждой категории персонажей.class P
иstring[] a
.Р (
301322 персонажа)Исправление забыл проверить на цифры.
(пробелы добавлены только для ясности).
Создает все возможные 15-символьные перестановки из 94 символов. Затем случайным образом выбирает один, пока не будет соответствовать критериям.
Волшебство в
q:q
операции, которая генерирует новый тип данных фактора, который является взаимодействием всех факторов в первомq
списке со всеми факторами во втором списке , с каждой возможной комбинацией этих двух списков, включенных в список " уровни "этого фактора. Взаимодействуйте 15 копий списка разрешенных персонажей, и вы получите (94 ^ 15) возможных уровней.Пожалуйста, не пытайтесь сделать это дома. Код занимает пару секунд, чтобы выяснить все трехсимвольные перестановки, я действительно не могу себе представить, сколько времени потребуется, чтобы выяснить все 15-символьные перестановки, если ваш компьютер не просто не хватает памяти в То время. Когда я запустил готовый скрипт (трехсимвольный пароль), чтобы проверить его, первым выдаваемым им паролем был «oO =», который, я думаю, подводит итог реакции, которую вы должны иметь на этот код.
источник
Mathematica 170
Примеры
"<]} Pg3 / e? 3 + Z ~ Oz"
"X / 8jWe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"
источник
Python 2,7 (182)
источник
join
вроде бы там должно быть: Ожидается ли, что пользователи поймут синтаксис списка Python из вывода['q', 'u', ...]
:?aA$bc1111111111
) невозможными.Гольфскрипт (60)
Так как обл. Гольфскрипт отсутствует, и как нуб мне все равно нужна практика :)
Он просто строит массив из 4 обязательных + 11 случайных символов и сортирует их в случайном порядке.
источник
{r}$
. Это довольно грязный способ перемешать список - мне это нравится! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225Используя правило, где:
function(x){return x*x}
может быть переписан какfunction(x)x*x
. Кажется, работает только для функций, возвращающих значение.Следующая итерация, уменьшенная
x.sort(function().5-R())
доx.sort(y=>.5-R())
Следующая итерация уменьшена с помощью жирной стрелки, что, к сожалению, работает только для Firefox 22 и выше.
источник
JavaScript (сжато 269 символов)
Для ясности, это код до того, как я его сжал в JS-Fiddle :
Здесь он сжат до 269 символов ( JS-Fiddle of it ):
источник
shuffle()
«пользовательской функцией». Является ли это частью JavaScript или кода, вам придется написать его самостоятельно?Clojure (63):
Но необходимо улучшить, чтобы убедиться, что он содержит не менее 1 символа каждой категории (верхний, нижний, цифра, символ).
источник
В sql-сервере
Смотрите это в действии - 1
увидеть это в действии - 2
источник
~0Aa
, ни пароль,b
за которым следуетa
.САС (191)
*TQP,(f=h10*)S=
Комментарии / отступ:
источник
PowerShell: 119
Позолоченный код
Без гольфа и прокомментировал
источник
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
вы можете сделать одно совпадение с ним, которое будет соответствовать только тогда, когда есть один верхний, нижний, цифровой, символ.1aZ%
и другое(p3R
? У меня были некоторые трудности с поиском способов сделать это онлайн.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
Хорошие совпадения:C>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
Неудачные совпадения:3evthX3_X^nBrR`
.nA ~ uYzrR4YV-r.u-IjZE48ntQ;HxV
Python 2,7 (149)
Записано более читаемым (а не исполняемым) способом;
Довольно прямолинейно и на удивление не намного дольше, чем версия «создать, повторить при сбое матча».
источник
0Aa~~~~~~~~~~~~
? (Обратите внимание, что'~' == chr(126)
.)PSQL (189)
Похоже, PSQL немного многословен ... :)
SQLfiddle demo .
источник
PHP,
235225Этот скрипт перемешивает символы, а затем проверяется через RegEx, чтобы убедиться, что пароль надежный (или он регенерирован).
источник
while(true) ... if (condition) break
вы можете использоватьwhile (!condition)
Javascript (209)
Пол-ungolfed;
источник
Perl, 92
Не так лаконично, как ответ на Ruby, но я уверен, что мастер Perl мог бы сделать это еще короче ... Я не слишком доволен всеми
m//
функциями в конце, но, похоже, работает и должен удовлетворять условиям, чтобы в конечном итоге генерировать все перестановки.Пример использования:
Отредактированный , чтобы исправить проверки и изменения
[[:punct:]]
к[\W_]
после MvGs комментариев.источник
aaaaaaaaaaaaaa
за чего цикл завершится. Вы должны проверить критерии с неслучайными паролями, чтобы убедиться, что они делают то, что вам нужно.[[:punct:]]
? Думаю, я бы предпочел, which is shorter and of which I'm even more sure that it is correct, at least combined with your
диапазон '[\ W_] 33..127`.\W
не включал_
, но вы абсолютно правы, в этом нет необходимости: gist.github.com/anonymous/8301237 . Спасибо!Java 7 (
270234 символов)Посылка та же самая, что используется @assylias с java 8 (генерируйте случайные пароли до тех пор, пока не получите действительный пароль). Однако вместо использования лямбда-символов пароль генерируется путем итерации массива char и проверяется путем сопоставления с регулярным выражением.
Минимизированный код:
источник
Powershell
Версия с одним вкладышем (143 байта)
Мини-версия (146 байт)
Читаемая версия (860 байт)
источник
abcd1234ABCD{|}~
никогда не появится, потому что$symbol
хотя бы один из символов находится между ASCII 33 и 47.$SR
до$Q
?(g(65..90))
вниз к65..90|g'. And change the
foreach` заявлению наforeach-object
петли с использованием%
псевдонима. Пример:foreach($N in (1..11)){
...}
должно быть выполнимо , как1..11|%{
...}
. Я почти уверен, что возможны другие варианты оптимизации, но на самом деле я имею в виду совершенно иную реализацию, которую планирую попробовать позже.Фактор, 196 символов
Тот же алгоритм, что и в MvG и Moose's. Это не самый короткий, но должен соответствовать всем (текущим) критериям в вопросе:
источник
~{}|1234abcdABCD
потерпит неудачу в регулярном выражении."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 символа
Как я ненавижу
srand()
? Позвольте мне сосчитать пути.источник
Хаскелл, 192
Напечатанная строка имеет кавычки и экранирует символы обратной косой черты и кавычки; если это неприемлемо,
print
можно заменить ещеputStrLn
на 3 байта. Вот более читаемая версия:Это довольно просто, он просто создает бесконечный / ленивый список случайных символов ASCII в диапазоне
'!'
до'~'
, затем отбрасывает первый элемент, пока первые 15 символов не получат хотя бы один символ из каждой строки обязательных символов.источник
Excel VBA, 209 байт
Произвольно генерирует 15 символов ASCII, поэтому возможны все возможные комбинации. Затем использует шаблон регулярного выражения, чтобы проверить, содержит ли он хотя бы один из каждого критерия.
Если это так, то отображается пароль, если не отображается «Повторить».
Спасибо Барту Кайерсу за шаблон регулярного выражения: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-string-contains-at-least-one-lower-case-char- верхний
источник
AutoHotkey 352
Использование - Просто запустите скрипт
источник
Python (121 символ)
Использует тот факт, что вы можете умножать списки в Python [1,2,3] * 2, дает [1,2,3,1,2,3]. Импорт случайный. Числа в списке, умноженные на три, являются границами между диапазонами в таблице ascii для необходимых символов, например, [65, 90] отображаются в верхний регистр букв.
источник
import random
в код.PHP 5.5 (230 байт)
Или на одной строке (211 байт)
источник