안전한 PIN 생성 위임되었습니다. 특정 하드웨어에 맞아야하므로 가능한 작게 만들어야합니다. 당신의

이 잘못 접수이 게시물에서 영감을 받았습니다 .

회사의 보안 책임자는 PIN 생성 시스템이 제공된 후 PIN 생성 시스템에 대해 우려하고 있습니다 12345. 그는 또한 당신이 그의 비용으로 행한 Spaceballs 농담을 정말로 좋아하지 않았으므로 PIN 생성기를 다시 쓰도록 위임되었습니다. 특정 하드웨어에 맞아야하므로 가능한 작게 만들어야합니다.

당신의 작업

  • PIN 수와 PIN 크기 (숫자)의 두 가지 입력을받습니다.
  • 지정된 크기의 지정된 PIN 수를 임의로 생성하여 인쇄하십시오.
  • 크기가 일정하지 않은 경우에도 유효한 모든 크기의 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의 그룹으로 완전히 나눌 수 있습니다.

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


답변

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

그때 실제 구현을 추가해야한다고 생각했습니다. 모든 요구 사항을 충족하는 숫자가 발견 될 때까지 난수를 생성합니다. 아마 많이 향상 될 수 있습니다!

온라인 버전


답변

펄 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