Генератор паролей

  • 28
  • Недоступна
Реализуй логику метода getPassword, который должен возвращать ByteArrayOutputStream, в котором будут байты пароля. Требования к паролю: 1) 8 символов. 2) только цифры и латинские буквы разного регистра. 3) обязательно должны присутствовать цифры, и буквы разного регистра. Все сгенерированные пароли
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (162)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Михаил
Уровень 32, Смоленск, Россия
undefined, 21:41
Дмитрий
Уровень 34
22 июля, 15:00
public class Solution {
    public static void main(String[] args) {
        ByteArrayOutputStream password = getPassword();
        System.out.println(password.toString());
    }
//65-90 заглавные 97-122 строчные 48-57 цифры   91-96 58-64
    public static ByteArrayOutputStream getPassword() {
        Random random = new Random();
        List<Integer> list = new LinkedList<>();
        ByteArrayOutputStream v = new ByteArrayOutputStream();

        boolean big = true;
        boolean smal = true;
        boolean integ = true;

        while (big || smal || integ) {
            list.clear();
            while (list.size() < 8) {
                IntStream s = random.ints(1, 48, 123);
                int number = s.sum();
                if ((number < 58 || number > 64) && (number < 91 || number > 96)) list.add(number);
            }

            for(Integer i : list){
                if(i >= 65 && i <=90){
                    big = false;
                }
                if(i >= 97 && i <=122){
                    smal = false;
                }
                if(i >= 48 && i <=57){
                    integ = false;
                }
            }
        }


        for(int i = 0; i < 8; i++){
         v.write(list.get(i));
        }

        return v;
    }
}
Хелп ми, леди анд джентельмены, пишет, что в пароле нет цифр валидатор, хотя если бы их не было, то цикл не закончился бы. А так абсолютный рандом на выходе, со всеми требованиями из условия.
Maks Panteleev
Уровень 38, Москва, Россия
29 июня, 08:12
ASCII коды
48-57 - цифры
65-90 - большие буквы
97 - 122 - маленькие буквы
Maks Panteleev
Уровень 38, Москва, Россия
29 июня, 08:11
Уф, целый час возился, задача супер кайф) сначала полез в регулярки, но они там нафиг не нужны) Что сделал я: 1) написал три диапазона для рандомных чисел по ASCII кодировке. Цифры, заглавные и обычные буквы. 2) создал стрингбилдер, в него сразу добавил по 1 рандомной цифре из каждого диапазона. Делается это легко (ПРИМЕР С ЦИФРАМИ):
sb.append((char) (int) (random.nextDouble() * 10 + 48));
3) дальше в цикле от на 5 итераций беру рандомное число - 0,1,2 на каждую итерацию и в зависимости от значения в свитч блоке добавляется цифра если ноль, заглавная если 1 и тд 4) тут я сделал наверное не самую нужную, но прикольную вещь. Я перегоняю стрингбилдер в лист чарактеров, потом вызываю метод
Collections.shuffle(list);
А потом снова возвращаю лист в стрингбилдер) Это делать не обязательно, но в целом штука прикольная) 5) пишу стрингбилдер в ByteArrayOutputStream и возвращаю) все прошло) П.с. никак не мог понять как же мне сделать чтоб было всегда по 1 цифре букве и тд минимум, а потом решил не морочиться и тупо добавил по одной а остальные рандом)
Aleksandr Alekseenko Network engineer
25 июня, 04:16
Опишу свою реализацию. Из условия мы имеем 3 блока символов и 8 разрядов, куда их можем поместить. Мы должны создать равные шансы для геренации случайного символа из каждого блока. 1. Генерируем случайное число. 2. Проверяем если оно меньше 0.3, то генерируем символ из 1-го блока. (шансы 30%) 2а. Если оно в диапазоне [0.3, 0.6), то генерируем символ из 2-го блока (шансы 30%) 2б. Если все остальное, то генерируем символ из 3-го блока (шансы 40% - можно сделать шансы более справедливыми генерацией числа в диапазоне от 0 до 1000) 3. Записываем символ в ByteArrayOutputStream И так повторяем в цикле 8 раз. Если полученный ByteArrayOutputStream содержит хотя бы один символ из 1-го блока && , хотя бы, один символ из 2-го блока && ,хотя бы, один символ из 3-го блока, то возвращаем ByteArrayOutputStream, иначе рекурсивно вызываем этот же метод. Полезная ссылка
Светлана
Уровень 33
17 июня, 08:50
Исправьте валидато! он не принимает мое правильное решение и противоречит сам себе! 😤 😀😀😀😀😀
Сергей
Уровень 27, Воронеж, Россия
9 июня, 17:00
Блин ну что за эпикфейл🤦‍♂️ Решил задачку. Проверял на все условия. Создал массив с паролями. Просмотрел. Все ок. Отправил на проверку. Выдал две ошибки, что необходимо использовать хотя бы по одной заглавной и строчной букве латинского алфавита. И это при том что у меня логика для всех наборов символов одинаковая! Проверил еще раз. Немного поменял условие проверки, так сказать от обратного. Отправил опять на проверку. В этот раз выдало ошибку про то, что надо использовать хотя бы одну цифру и заглавную букву. У меня глаза на лоб вылезли, ибо в этом нет логики. В общем решил я просто потыкать на кнопочку проверки, ничего не меняя в коде. И вот так 12 попыток он мне выдавал ошибки в разных вариациях, но ошибки всегда про цифры и буквы, остальные условия всегда проходили. На 13 попытке валя сжалился надо мной и все таки засчитал мне задачу. Чем дальше решаю сложные задачки, тем больше мне кажется, что я не учусь чему либо, а просто ищу пути как обмануть валидатор. В этот раз нужно было просто 13 раз нажать кнопку проверки.
Lena
Уровень 24, Киев, Украина
6 июня, 17:32
В "правильном решении" selected никогда не становится true
Dmitry Panchenko
Уровень 24, Москва, Россия
5 июня, 12:07
в цилкле, пока длинна не 8, генерим 3 раза подряд нужные наборы символов и добавляем в выход. и проверка перед третий генерацией на длинну 8.
Игорь Ходыко Enterprise Java Developer
28 мая, 12:40
Кстати, я тут хотел схитрить сделать первые 2 разных(цифра и заглавная буква), остальные 6 строчные. а потом Shuffle их. Так не прокатывает. Нужно первые 3 (цифра, заглавная, строчная) остальные рандом и Shuffle. Так прокатило.