Wygeneruj niektóre bezpieczne kody PIN

17

Zainspirowany tym źle odebranym migrowanym postem .

Szef bezpieczeństwa w Twojej firmie jest zaniepokojony systemem generowania PIN-u po jego przekazaniu 12345. Nie docenił też żartu Kosmicznych Kul, który zrobiłeś na jego koszt, więc zostałeś delegowany do ponownego napisania generatora PIN. Ponieważ musi zmieścić się na jakimś specjalnym sprzęcie, musisz uczynić go tak małym, jak to możliwe.

Twoje zadanie

  • Podajesz dwa dane wejściowe - liczbę PIN i rozmiar PIN w cyfrach.
  • Wygeneruj losowo określoną liczbę kodów PIN o określonym rozmiarze i wydrukuj ją.
  • Wszystkie prawidłowe kody PIN o rozmiarze muszą być możliwe do wydrukowania, nawet jeśli nie są jednoznacznie prawdopodobne.
  • Istnieją jednak pewne ograniczenia dotyczące kodów PIN - tutaj są nieprawidłowe:

    1. Jeśli wszystkie pary mają tę samą cyfrę: 114422(Uwaga: będzie to oczywiście obejmowało wszystkie te same cyfry PIN).
    2. PIN coraz bardziej liniowe (10): mod 246802.
    3. Wszystkie grupy 3 są linie fizyczne na klawiaturze 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. Kod PIN można całkowicie podzielić na grupy z reguły 1 i reguły 3.


  • To jest , więc wygrywa najkrótszy kod w bajtach !
Maltysen
źródło
Czy reguła pierwsza obejmuje również pojedynczą podwójną parę (jak 55123)?
mınxomaτ
@minxomat dobry punkt, zmieniając zasady, aby uwzględnić obie grupy. Ten będzie od drugiej połowy 123, ale 55432byłoby dobrze.
Maltysen
Czy reguła 3 obejmuje przekątne?
Martin Ender
6
Ironia polega na tym, że ta definicja tak zwanego „bezpiecznego” pinu ogranicza tylko liczbę pinów, które atakujący mogą potrzebować brutalnej siły!
DankMemes,
1
Jaka jest najkrótsza długość dla reguły 2?
Dennis

Odpowiedzi:

1

Pyth, 120 bajtów

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

Pomyślałem, że powinienem wtedy dodać prawdziwą implementację. Generuje losowe liczby, dopóki nie zostanie znaleziona jedna spełniająca wszystkie wymagania. Prawdopodobnie można go znacznie poprawić!

Wersja online


źródło
1
Zmieniłem zasady, aby uwzględnić wymóg, aby kody PIN były losowe, a wszystkie kody PIN muszą być możliwe.
Maltysen
Myślałem, że możesz :)
0

Perl 5, 244

Zaczyna się od generowania liczb losowych dla danego rozmiaru.
I drukuje tylko te, które nie spełniają ograniczeń.

Znalezienie rozwiązania dla linii klawiatury (bez kombinacji kodowania) było trochę zabawne.

($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$_.$/}}

Test

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
LukStorms
źródło