Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 7

Задача про пин-коды для домофона

12.08.2019, 22:15. Показов 9025. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить задачу.

Человек вводит пин-код с домофона, длиной от 1 до 8 цифр. Цифры могут быть 0,1,2,3,4,5,6,7,8,9.
Он забыл код, но помнит, что если вводит цифру 1, то быть могут быть цифры либо 1, либо 2, либо 3 (сама цифра 1 и рядом расположенные по горизонтали и вертикали цифры на табло домофона).
Если вводит цифру 2, то возможные варианты 1, 2, 3, 5.
Если 3, то возможные варианты 2, 3, 6.
4 - варианты 1, 4, 5, 7.
5 - варианты 2, 4, 5, 6, 8.
6 - варианты 3, 5, 6, 9.
7 - варианты 4, 7, 8.
8 - варианты 0, 5, 7, 8, 9.
9 - варианты 6, 8, 9.
0 - варианты 0, 8.

Ограничения по решению: "Исходный пин-код и вероятные варианты пин-кодов с учетом сдвигов, должны быть отсортированы и разделены запятой.
Также пин-коды должны быть строками, так как могут начинаться с 0, и должны быть отсортированы, как строки."


Если бы человек ввёл код домофона 1357, то я бы решил задачу таким образом:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public class Main {
    public static void main(String[] args)  {
        //Пользователь ввёл код 1357     
        String[] ar1 = {"1","2","4"};
        String[] ar2 = {"3","2","6"};
        String[] ar3 = {"5","2","4","6","8"};
        String[] ar4 = {"7","4","8"};       
        for (int i = 0; i <ar1.length; i++) {
            for (int j = 0; j < ar2.length; j++) {
                for (int k = 0; k < ar3.length; k++) {
                    for (int z = 0; z < ar4.length; z++) {
                        String s = ar1[i] + ar2[j] + ar3[k] + ar4[z];
                        System.out.println(s + " ");
                        
                    }
                }
              }     
        }
      }
}
Но как создать количество циклов в зависимости от количества раз ввода (от 1 до 8) пользователем чисел, чтобы они просуммировали из массивов данные не понимаю. Возможно я зажат в рамках своего же ограничения путём решения через цикл и массив. Возможно чего-то не знаю, как выйти за рамки этой головоломки...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2019, 22:15
Ответы с готовыми решениями:

Плохо ли для ryzen 5 3400g, на материнке с 8 пин разъемом, только на 4 пин вставленным
Хорошо посмотрю, отпишу. Если вдруг вам не сложно ответить, по другой теме- плохо ли для ryzen 5 3400g, на материнке с 8 пин разъемом,...

На Бп 4 пин для проца а на мамке 8 пин
На Бп 4 пин для проца а на мамке 8 пин. Что делать?

И опять про пин код
Жду пин код уже 5 месяцев, в итоге уже: испальзовал все три возможных заяки на высылку пина в ходе переписки со слубой поддержки был...

35
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
15.08.2019, 17:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Victor_DB Посмотреть сообщение
чтобы был пин-код не 307, а пин-код, который введёт пользователь?
Вот так можно:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.Arrays;
import java.util.Scanner;
 
public class PinCod {
    public static void main(String[] args) {
        String pin = "";
        Scanner scan = new Scanner(System.in);
        System.out.print("Введите предполагаемый пин-код: ");
        pin = scan.nextLine();
        scan.close();
        pin = pin.replaceAll("[^0-9]", "");
        System.out.println("Предполагаемый пин-код: " + pin);
        String[][] buttons = {
                {"","0","8"}, 
                {"","1","2","4"},
                {"","1","2","3","5"},
                {"","2","3","6"},
                {"","1","4","5","7"},
                {"","2","4","5","6","8"},
                {"","3","5","6","9"},
                {"","4","7","8"},
                {"","0","5","7","8","9"},
                {"","6","8","9"},
                {""}
        };
 
        while (pin.length() < 8)
            pin += ':';
        
        int lenRes = 1, k = 0;
        int L[] = new int[8];
        int I[] = new int[8];
        for (int i = 0; i < 8; i++) {
            int temp = 1;
            L[i] = buttons[pin.charAt(i)-48].length;
            if (L[i] > 1) {
                I[i] = 1;
                temp = L[i] - 1;
            }
            lenRes *= temp;
        }
        String[] result = new String[lenRes];
        
        for (int i7 = I[7]; i7 < L[7]; i7++)
            for (int i6 = I[6]; i6 < L[6]; i6++)
                for (int i5 = I[5]; i5 < L[5]; i5++)
                    for (int i4 = I[4]; i4 < L[4]; i4++)
                        for (int i3 = I[3]; i3 < L[3]; i3++)
                            for (int i2 = I[2]; i2 < L[2]; i2++)
                                for (int i1 = I[1]; i1 < L[1]; i1++)
                                    for (int i0 = I[0]; i0 < L[0]; i0++)
                                        result[k++] =
                                            buttons[pin.charAt(0)-48][i0] + 
                                            buttons[pin.charAt(1)-48][i1] +
                                            buttons[pin.charAt(2)-48][i2] +
                                            buttons[pin.charAt(3)-48][i3] +
                                            buttons[pin.charAt(4)-48][i4] +
                                            buttons[pin.charAt(5)-48][i5] +
                                            buttons[pin.charAt(6)-48][i6] +
                                            buttons[pin.charAt(7)-48][i7];
        Arrays.sort(result);
        System.out.println("Количество вероятных вариантов: " + lenRes);
        System.out.println("Вероятные варианты пин-кодов: " + 
                Arrays.toString(result));
    }
}
Code
1
2
3
4
Введите предполагаемый пин-код: 516sfs513er
Предполагаемый пин-код: 516513
Количество вероятных вариантов: 2700
Вероятные варианты пин-кодов: [213212, 213213, 213216, 213222, 213223, 213226, 213242, 213243, ...
Добавлено через 7 минут
Или прямо в коде вместо "307" написать тот пин-код, который хочется
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
15.08.2019, 18:10
Цитата Сообщение от alicesmagic Посмотреть сообщение
"[^0-9]"
Не исправляю, не взрывайся. Прост можно ещё сделать так "\\D+"
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
15.08.2019, 18:22
Victor_DB, начало кода лучше изменить вот так:
Java
1
2
3
4
5
6
7
8
9
String pin = "";
Scanner scan;
do {
   System.out.print("Введите предполагаемый пин-код "
                 + "длиной 1-8 цифр: ");
   scan = new Scanner(System.in);
   pin = scan.next().replaceAll("[^0-9]", "");
} while (pin.length() == 0 || pin.length() > 8);
scan.close();
Так будет проверка по длине.

Code
1
2
3
4
5
6
Введите предполагаемый пин-код длиной 1-8 цифр: sadgsdfg
Введите предполагаемый пин-код длиной 1-8 цифр: 65161563516
Введите предполагаемый пин-код длиной 1-8 цифр: 125
Предполагаемый пин-код: 125
Количество вероятных вариантов: 60
Вероятные варианты пин-кодов: [112, 114, 115, 116, 118, 122, 124, 125, 126, 128, 132, 134, 135, 136, 138
0
15.08.2019, 18:24

Не по теме:

Цитата Сообщение от Gungala Посмотреть сообщение
та не, я думаю,
може буте))

0
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 7
16.08.2019, 15:26  [ТС]
Да, я имел ввиду что с клавиатуры вводит пользователь...
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.08.2019, 16:58
Цитата Сообщение от alicesmagic Посмотреть сообщение
do {
...
scan = new Scanner(System.in);

...
} while...
Зачем в каждой итерации создавать новый объект сканера?
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
16.08.2019, 17:03
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Зачем в каждой итерации создавать новый объект сканера?
Блондинка же) Туплю, как обычно)))

Java
1
2
3
4
5
6
Scanner scan = new Scanner(System.in);
do {
   System.out.print("Введите предполагаемый пин-код "
        + "длинной 1-8 цифр: ");
   pin = scan.next().replaceAll("[^0-9]", "");
} while (pin.length() == 0 || pin.length() > 8);
Спасибо, что подсказали
0
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 4
07.10.2019, 13:42
iSmokeJC,
Интересное решение, но оно не отвечает двум требованиям:
1. Исходные значения должны вводиться с клавиатуры в консоль.
2. Скорость работы программы не должна превышать 1 секунду, даже в случае, когда у нас исходное значение 55555555...

У меня следующее решение этой задачи. Ввод работает, комбинация обсчитывается и выводится результат рекурсией. Но я не могу сообразить, как мне вывести все результаты перебора в одну строку, чтобы разом вывести весь результат... Может кто нибудь помочь? Я новичок в Java, над задачей сижу уже больше недели. Сейчас рекурсия просто последовательно печатает послежовательные результаты – на это уходит много времени. Надо чтобы результаты «магиески» записались в единую строку или массив и единоразово выдало вывод в консоль.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
 
        Scanner keyboard = new Scanner(System.in);
        String input = keyboard.nextLine();
 
        long mTime = System.currentTimeMillis(); // Начинаем замер времени работы программы
 
        String[] numbersStr = input.split("");
        int[] numbers = new int[numbersStr.length];
 
        for (int i = 0; i < numbersStr.length; i++) {
            numbers[i] = Integer.parseInt(numbersStr[i]);
        }
 
        int[][] fullTaps = new int[numbers.length][];
        for (int k = 0; k < numbers.length; k++) {
            if (numbers[k] == 0) {
                String[] tap0 = {"0", "8"};
                for (int i = 0; i < tap0.length; i++) {
                }
                fullTaps[k] = new int[]{0, 8};
            } else if (numbers[k] == 1) {
                String[] tap1 = {"1", "2", "4"};
 
                for (int i = 0; i < tap1.length; i++) {
                }
                fullTaps[k] = new int[]{1, 2, 4};
            } else if (numbers[k] == 2) {
                String[] tap2 = {"1", "2", "3", "5"};
                for (int i = 0; i < tap2.length; i++) {
                }
                fullTaps[k] = new int[]{1, 2, 3, 5};
            } else if (numbers[k] == 3) {
                String[] tap3 = {"2", "3", "6"};
                for (int i = 0; i < tap3.length; i++) {
                }
                fullTaps[k] = new int[]{2, 3, 6};
            } else if (numbers[k] == 4) {
                String[] tap4 = {"1", "4", "5", "7"};
                for (int i = 0; i < tap4.length; i++) {
                }
                fullTaps[k] = new int[]{1, 4, 5, 7};
            } else if (numbers[k] == 5) {
                String[] tap5 = {"2", "4", "5", "6", "8"};
                for (int i = 0; i < tap5.length; i++) {
                }
                fullTaps[k] = new int[]{2, 4, 5, 6, 8};
            } else if (numbers[k] == 6) {
                String[] tap6 = {"3", "5", "6", "9"};
                for (int i = 0; i < tap6.length; i++) {
                }
                fullTaps[k] = new int[]{3, 5, 6, 9};
            } else if (numbers[k] == 7) {
                String[] tap7 = {"4", "7", "8"};
                for (int i = 0; i < tap7.length; i++) {
                }
                fullTaps[k] = new int[]{4, 7, 8};
            } else if (numbers[k] == 8) {
                String[] tap8 = {"0", "5", "7", "8", "9"};
                for (int i = 0; i < tap8.length; i++) {
                }
                fullTaps[k] = new int[]{0, 5, 7, 8, 9};
            } else if (numbers[k] == 9) {
                String[] tap9 = {"6", "8", "9"};
                for (int i = 0; i < tap9.length; i++) {
                }
                fullTaps[k] = new int[]{6, 8, 9};
            }
 
        }
 
 
        int n = 1;
        for (int j = 0; j < fullTaps.length; j++) {
            n *= fullTaps[j].length;
        }
 
        int l = 0;
        int i[] = new int[fullTaps.length];
        for (int k = 0; k < n; k++) {
            for (int rr = 0; rr < fullTaps.length; rr++) {
                System.out.print(fullTaps[rr][i[rr]] + "");
            }
 
            if (l <= n - 2) {
                System.out.print(",");
            } else if (l == n) {
                System.out.print("");
            }
            l++;
 
            i[fullTaps.length - 1]++;
 
            for (int j = fullTaps.length - 1; j > 0; j--) {
                if (i[j] >= fullTaps[j].length) {
                    i[j] = 0;
                    i[j - 1]++;
                } else
                    break;
            }
        }
 
        System.out.print("\n\n\n");
        System.out.println((double) (System.currentTimeMillis() - mTime) / 1000 + " сек");
 
        long usedBytes = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("Вес программы: " + usedBytes / 1048576 + " мб");
    }
}
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.10.2019, 14:04
Цитата Сообщение от saigontov Посмотреть сообщение
} else if (numbers[k] == 6) {
* * * * * * * * String[] tap6 = {"3", "5", "6", "9"};
* * * * * * * * for (int i = 0; i < tap6.length; i++) {
* * * * * * * * }
* * * * * * * * fullTaps[k] = new int[]{3, 5, 6, 9};
* * * * * * } else if (numbers[k] == 7) {
это че за дичь?
Цитата Сообщение от saigontov Посмотреть сообщение
Скорость работы программы не должна превышать 1 секунду, даже в случае, когда у нас
исходное значение 55555555...
где ты это взял?
Цитата Сообщение от saigontov Посмотреть сообщение
Исходные значения должны вводиться с клавиатуры в консоль.
ввод с клавиатуры уж наверно не проблема самому сделать?
Цитата Сообщение от saigontov Посмотреть сообщение
рекурсией
где ты нашел рекурсию?
0
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 4
07.10.2019, 14:22
Цитата Сообщение от xoraxax Посмотреть сообщение
это че за дичь?
Да, действительно дичь! Это осталось от предыдущего хода мыслей, так что да – эту дичь убрал.


Цитата Сообщение от xoraxax Посмотреть сообщение
это че за дичь?
где ты это взял?
ввод с клавиатуры уж наверно не проблема самому сделать?
где ты нашел рекурсию?
В условиях задачи была эта дичь.


Цитата Сообщение от xoraxax Посмотреть сообщение
ввод с клавиатуры уж наверно не проблема самому сделать?
Да, это я делал. Далее у меня идет сплит, который проверяет каждое число в строке и присваивает подходящую комбинаци.

Цитата Сообщение от xoraxax Посмотреть сообщение
где ты нашел рекурсию?
Как я уже говорил, я новичок и учился в ходе решения этой задачи.
Я не знал как лучше перебрать комбинации и лучшего решения чем рекурсию я не нашел на просторах интернета.



Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int n = 1;
        for (int j = 0; j < fullTaps.length; j++) {
            n *= fullTaps[j].length;
        }
 
        int l = 0;
        int i[] = new int[fullTaps.length];
        for (int k = 0; k < n; k++) {
            for (int rr = 0; rr < fullTaps.length; rr++) {
                System.out.print(fullTaps[rr][i[rr]] + "");
            }
 
            if (l <= n - 2) {
                System.out.print(",");
            } else if (l == n) {
                System.out.print("");
            }
            l++;
 
            i[fullTaps.length - 1]++;
 
            for (int j = fullTaps.length - 1; j > 0; j--) {
                if (i[j] >= fullTaps[j].length) {
                    i[j] = 0;
                    i[j - 1]++;
                } else
                    break;
            }
        }
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
07.10.2019, 14:26
saigontov, похоже, ты вообще не понимаешь значения слова "рекурсия"...
0
 Аватар для Aviz__
2762 / 2069 / 510
Регистрация: 17.02.2014
Сообщений: 9,507
07.10.2019, 14:32

Не по теме:

saigontov, зачем ты вообще выпендривешься, а потом, по детски оправдываешься, то?!


0
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 4
07.10.2019, 14:35
Цитата Сообщение от iSmokeJC Посмотреть сообщение
saigontov, похоже, ты вообще не понимаешь значения слова "рекурсия"...
Да, не исключаю.


Aviz__, вы к чему? Я пришел сюда, чтобы найти решение своей задачи. Что значит я выпендриваюсь?
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
07.10.2019, 14:42
Реку́рсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.

Выпендриваться — всеми способами стараться обратить на себя внимание; важничать, рисоваться.
1
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 4
07.10.2019, 14:44
Gungala, спасибо
0
 Аватар для Aviz__
2762 / 2069 / 510
Регистрация: 17.02.2014
Сообщений: 9,507
07.10.2019, 19:02
Цитата Сообщение от saigontov Посмотреть сообщение
не исключаю
пример рекурсии в 4-ом посте Для начинающих задача
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2019, 19:02

обманку для домофона
Эпопея с клонированием ключа от домофона не дала результата, к тому же жена потеряла последний ключ....Меня подзаебало просить соседей...

16 пин разъем питания на материнке Fujitsu D2990-A Можно ли как-то запитать от БП с 20(24) пин?
Собственно в названии темы сам вопрос и есть. Достался мне тут системный блок, но нужно поменять блок питания(слабенький на 250В). Все бы...

Можно ли воспользоваться 8 пин разъемом БП, как 6 пин того же БП ?
Здравствуйте. Скажите такое. Можно ли использовать 8-ми пиновые разъемы БП Seasonic Prime (отведенные для CPU и PCI-E) для подключения...

4 или 6 пин,вместо 8 пин-это возможно?
Материна требует 8 пин питание к цп,у меня на бп есть 2 6 пин,1 4 пин и 1 6 пин через переходник.,можно ли обойтись тем что имею? Цп i5...

Особенности подключений БП 20 и 24 пин к материнкам 24 пин
Есть мать asus P8H77V. Разъём 24 пин и 8 пин возле процессора. есть БП 20 пин. Отдельными хвостами есть два 4 пин провода. Они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru