Hasilkan Beberapa PIN Aman


17

Terinspirasi oleh pos migrasi yang diterima dengan buruk ini .

Kepala keamanan di perusahaan Anda khawatir tentang sistem penghasil PIN Anda setelah diberikan kepadanya 12345. Dia juga tidak terlalu menghargai lelucon Spaceballs yang Anda buat atas biaya sendiri, jadi Anda telah diutus untuk menulis ulang generator PIN. Karena harus sesuai dengan beberapa perangkat keras khusus, Anda harus membuatnya sekecil mungkin.

Tugas Anda

  • Anda mengambil dua input - # PIN, dan ukuran PIN dalam digit.
  • Hasilkan jumlah PIN yang ditentukan dengan ukuran yang ditentukan secara acak dan cetaklah.
  • Semua PIN yang valid dengan ukuran harus dimungkinkan untuk dicetak, meskipun kemungkinan tidak seragam.
  • Namun, ada beberapa batasan pada PIN - ini adalah yang tidak valid:

    1. Jika semua pasangan adalah digit yang sama: 114422(Catatan: ini jelas akan mencakup semua PIN digit yang sama).
    2. PIN semakin linear (mod 10): 246802.
    3. Semua kelompok 3 adalah garis fisik pada keypad dari 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. PIN sepenuhnya dapat dibagi menjadi beberapa kelompok dari aturan 1 dan aturan 3.


  • Ini adalah , jadi kode terpendek dalam byte menang!

Apakah aturan satu juga termasuk pasangan ganda tunggal (suka 55123)?
mınxomaτ

@minxomat poin bagus, mengubah aturan untuk menyertakan kedua grup. Yang satu akan sejak babak kedua 123, tetapi 55432akan baik-baik saja.
Maltysen

Apakah aturan 3 termasuk diagonal?
Martin Ender

6
Ironisnya, definisi pin yang disebut "aman" ini hanya mengurangi jumlah pin yang mungkin diserang oleh penyerang!
DankMemes

1
Berapa panjang terpendek untuk aturan 2?
Dennis

Jawaban:


1

Pyth, 120 byte

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

Kupikir aku harus menambahkan implementasi nyata. Menghasilkan angka acak sampai ditemukan bahwa memenuhi semua persyaratan. Mungkin bisa banyak diperbaiki!

Versi online


1
Saya telah mengubah aturan untuk memasukkan persyaratan bahwa PIN harus acak, dan semua PIN harus dimungkinkan.
Maltysen

Saya pikir Anda mungkin :)

0

Perl 5, 244

Mulai dengan menghasilkan angka acak untuk ukuran yang diberikan.
Dan hanya mencetak yang tidak memenuhi batasan.

Menemukan solusi untuk garis keypad (tanpa kombinasi hardcoding) agak menyenangkan.

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

Uji

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.