회사의 보안 책임자는 PIN 생성 시스템이 제공된 후 PIN 생성 시스템에 대해 우려하고 있습니다 12345
. 그는 또한 당신이 그의 비용으로 행한 Spaceballs 농담을 정말로 좋아하지 않았으므로 PIN 생성기를 다시 쓰도록 위임되었습니다. 특정 하드웨어에 맞아야하므로 가능한 작게 만들어야합니다.
당신의 작업
- PIN 수와 PIN 크기 (숫자)의 두 가지 입력을받습니다.
- 지정된 크기의 지정된 PIN 수를 임의로 생성하여 인쇄하십시오.
- 크기가 일정하지 않은 경우에도 유효한 모든 크기의 PIN을 인쇄 할 수 있어야합니다.
-
그러나 PIN에는 몇 가지 제한이 있습니다. 잘못된 PIN은 다음과 같습니다.
- 모든 쌍이 동일한 숫자 인 경우 :
114422
(참고 : 분명히 모든 동일한 숫자 PIN이 포함됩니다). - 점점 선형적인 PIN (mod 10) :
246802
. - 3 모든 그룹의 키패드에 물리적 라인이다
1 2 3;4 5 6;7 8 9;bksp 0 enter;
:147369
. - PIN은 규칙 1과 규칙 3의 그룹으로 완전히 나눌 수 있습니다.
- 모든 쌍이 동일한 숫자 인 경우 :
- 이것은 code-golf 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!
답변
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