Создать несколько безопасных ПИН-кодов


17

Вдохновленный этим плохо полученным мигрированным постом .

Руководитель службы безопасности в вашей компании обеспокоен вашей системой генерации ПИН-кода после того, как он ее дал 12345. Он также не очень ценил шутку со «Космическими шарами», которую вы сделали за его счет, поэтому вам поручили переписать генератор ПИН-кода. Так как он должен соответствовать некоторому специальному оборудованию, вы должны сделать его как можно меньше.

Твое задание

  • Вы берете два ввода - количество ПИН и размер ПИН в цифрах.
  • Генерация указанного количества ПИН-кодов указанного размера случайным образом и распечатка.
  • Все действующие ПИН-коды такого размера должны быть распечатаны, даже если они не всегда одинаковы.
  • Тем не менее, существуют некоторые ограничения на PIN-коды - вот недействительные:

    1. Если все пары имеют одну и ту же цифру: 114422(Примечание: очевидно, что это будут все PIN-коды с одинаковыми цифрами).
    2. Все чаще линейные штифты (мод 10): 246802.
    3. Все группы 3 представляют собой физические линии на клавиатуре 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. PIN-код может быть полностью разделен на группы из правила 1 и правила 3.


  • Это , поэтому выигрывает самый короткий код в байтах !

Включает ли правило одно также одну двойную пару (например 55123)?
mynxomaτ

@minxomat хороший момент, изменяя правила, чтобы включить обе группы. Это будет со второй половины 123, но 55432было бы хорошо.
Maltysen

Включает ли правило 3 диагонали?
Мартин Эндер

6
Ирония заключается в том, что это определение так называемого «безопасного» штифта только уменьшает количество штифтов, которые злоумышленники могут использовать для грубой силы!
DankMemes

1
Какая самая короткая длина для правила 2?
Деннис

Ответы:


1

Pyth, 120 байт

Arz7VGJ1WJK%"%0*d",HO-^TH1=J|q1l{m%-F_vMcd1T.:K2u|GHmu|GHm?qlk2:k"(.)\\1"0?qlk3}k+++=bcS"123456789"3_Mb.Tb_M.TbZdZ./K0)K

Тогда я решил добавить реальную реализацию. Генерирует случайные числа, пока не будет найдено одно, отвечающее всем требованиям. Вероятно, может быть улучшено много!

Онлайн версия


1
Я изменил правила, чтобы включить требование, чтобы PIN-коды были случайными, и все PIN-коды должны быть возможны.
Maltysen

Я думал, что вы могли бы :)

0

Perl 5, 244

Начинается с генерации случайных чисел для данного размера.
И печатает только те, которые не соответствуют ограничениям.

Найти решение для линий клавиатуры (без жестких комбинаций) было забавно.

($k,$l)=@ARGV;$m=10**$l-1;while($n<$k){$_=sprintf("%0".$l."d",int(rand($m)));@N=split//,$_;pop@N;$i=$d=0;while(++$i<@N&&$d<1){$d=$N[$i-1]<=>$N[$i]}$b=$_;$b=~s|\d|@A=split//,$';2*$A[0]-$&-$A[1]==0|eg;if((!m/(\d)\1/)&$b>0&$d>=0){$n++;print$_.$/}}

Тестовое задание

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.