いくつかの安全なPINを生成する


17

このひどく受信された移行された投稿に触発されました。

あなたの会社のセキュリティ責任者は、彼に与えたPIN生成システムを心配しています12345。彼はまた、あなたが彼の費用で行ったスペースボールのジョークを本当に感謝していなかったので、あなたはPINジェネレータを書き直すように委任されました。いくつかの特別なハードウェアに収まる必要があるため、できるだけ小さくする必要があります。

あなたのタスク

  • PINの数とPINの桁数の2つの入力を受け取ります。
  • 指定されたサイズの指定された数のPINをランダムに生成し、印刷します。
  • サイズが均一である可能性がなくても、すべての有効なPINを印刷できる必要があります。
  • ただし、PINにはいくつかの制限があります。無効なものは次のとおりです。

    1. すべてのペアが同じ数字である場合:(114422注:これには明らかにすべて同じ数字のPINが含まれます)。
    2. ますます線形のPIN(MOD 10): 246802
    3. 3のすべてのグループは以下のキーパッドの物理的な線です1 2 3;4 5 6;7 8 9;bksp 0 enter;147369
    4. PINはルール1とルール3からグループに完全に分割できます。


  • これはなので、バイト単位の最短コードが勝ちです!

ルール1には単一の二重ペア(など55123)も含まれていますか?
mınxomaτ

@minxomatの良い点は、両方のグループを含めるようにルールを修正することです。その一つが、後半はありますので、123しかし、55432罰金になります。
マルティセン

ルール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が使用可能でなければならないという要件を含めるようにルールを変更しました。
マルティセン

:)

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.