고유 한 자물쇠 PIN 목록!


16

소개

비공개 채팅에서 내 친구는 최근 유효한 핀에 대해 다음 두 가지 제한 사항이있는 보안 시스템을 우연히 발견했습니다.

  • 각 숫자는 고유해야합니다 (즉, "1"은 한 번만 나타날 수 있음)
  • 숫자의 순서는 중요하지 않습니다 ( "1234"= "4321")

이 자물쇠 시스템이 얼마나 나쁜지 설명하기 위해 실제로 모든 유효한 PIN을 열거합시다!

입력

입력은 PIN의 길이를 나타내는 단일 양의 정수로 구성됩니다.

산출

출력은 음수가 아닌 정수 또는 문자열 * 목록으로 구성되며 주어진 길이의 유효한 모든 PIN을 열거합니다.

* 인쇄를 위해 모든 조합을 시도하기 위해 인간이 사용할 수있는 더 정확하게. 이것은 일련의 숫자 집합과 숫자 배열 배열이 양호 함을 의미합니다.

누가 이겼어?

이것은 이므로 바이트 단위의 최단 답변이 이깁니다! 표준 규칙 및 허점이 적용됩니다.

코너 케이스

  • 10보다 큰 정수가 입력되면 출력 동작이 정의되지 않습니다.
  • 0이있는 항목에는 실제로 0이 포함되어 있으므로 각 출력 항목 내의 숫자 순서는 정의되어 있지 않습니다. 즉, "0123"을 "123"으로 제거 할 수는 없지만 "1230", "1203"및 "1023"은 모두 유효합니다. "0123"과 같습니다.

테스트 사례

1
[0,1,2,3,4,5,6,7,8,9]

2
[10,20,30,40,50,60,70,80,90,21,31,41,51,61,71,81,91,32,42,52,62,72,82,92,43,53,63,73,83,93,54,64,74,84,94,65,75,85,95,76,86,96,87,97,98]

3
[210,310,410,510,610,710,810,910,320,420,520,620,720,820,920,430,530,630,730,830,930,540,640,740,840,940,650,750,850,950,760,860,960,870,970,980,321,421,521,621,721,821,921,431,531,631,731,831,931,541,641,741,841,941,651,751,851,951,761,861,961,871,971,981,432,532,632,732,832,932,542,642,742,842,942,652,752,852,952,762,862,962,872,972,982,543,643,743,843,943,653,753,853,953,763,863,963,873,973,983,654,754,854,954,764,864,964,874,974,984,765,865,965,875,975,985,876,976,986,987]

4
[3210,4210,5210,6210,7210,8210,9210,4310,5310,6310,7310,8310,9310,5410,6410,7410,8410,9410,6510,7510,8510,9510,7610,8610,9610,8710,9710,9810,4320,5320,6320,7320,8320,9320,5420,6420,7420,8420,9420,6520,7520,8520,9520,7620,8620,9620,8720,9720,9820,5430,6430,7430,8430,9430,6530,7530,8530,9530,7630,8630,9630,8730,9730,9830,6540,7540,8540,9540,7640,8640,9640,8740,9740,9840,7650,8650,9650,8750,9750,9850,8760,9760,9860,9870,4321,5321,6321,7321,8321,9321,5421,6421,7421,8421,9421,6521,7521,8521,9521,7621,8621,9621,8721,9721,9821,5431,6431,7431,8431,9431,6531,7531,8531,9531,7631,8631,9631,8731,9731,9831,6541,7541,8541,9541,7641,8641,9641,8741,9741,9841,7651,8651,9651,8751,9751,9851,8761,9761,9861,9871,5432,6432,7432,8432,9432,6532,7532,8532,9532,7632,8632,9632,8732,9732,9832,6542,7542,8542,9542,7642,8642,9642,8742,9742,9842,7652,8652,9652,8752,9752,9852,8762,9762,9862,9872,6543,7543,8543,9543,7643,8643,9643,8743,9743,9843,7653,8653,9653,8753,9753,9853,8763,9763,9863,9873,7654,8654,9654,8754,9754,9854,8764,9764,9864,9874,8765,9765,9865,9875,9876]

1
입력은 음이 아니므로 입력 0에서 프로그램은 하나의 값을 포함하는 목록이어야합니다. 빈 문자열?
aschepler

@ aschepler는 실제로 0의 경우는 11의 경우와 거의 비슷하므로 "양의 정수"로 변경했습니다.
SEJPM

답변:


7

젤리 , 4 바이트

ØDœc

온라인으로 사용해보십시오!

설명

ØDœc  Double-builtin; main link
  œc  Number of combinations of          of length
ØD                              [digits]
                                                   <right argument>

의 동작 n > 10은 빈 목록입니다.


입력이 10보다 큰 경우 어떻게 작동하지 않습니까 (시도했지만 이상하게 보입니까)
Windmill Cookies

2
@ gnu-nobody 10 개의 선택과 11 개의 요소를 조합 할 수 없기 때문에 빈 목록을 제공합니다.
HyperNeutrino

아, ØD는 "0123456789"입니다. 감사.
Windmill Cookies

6

05AB1E , 5 바이트

žhæsù

온라인으로 사용해보십시오!

설명

   sù  # keep elements the length of the input
  æ    # from the powerset
žh     # of 0123456789

몰랐어요 ù. 필자는 전에 필터를 사용해 보았습니다. 저것은 얼마나 새롭습니까?
Magic Octopus Urn

1
@MagicOctopusUrn : 꽤 낡았습니다. 오랫동안 거기에 있었다 : P
Emigna

나는 지금까지 명령을 볼 수 없다고 생각합니다. 나는 똑똑하지 않다.
Magic Octopus Urn

나에게 몇 번 일어났다. 몇 가지 명령에 대해 두 번 이상, 즉 ...
Emigna

... 자신과 같은 신 계층 05AB1Er (05AB1E-ite? 05AB1E-an?)을 사용할 수 있습니다.
Magic Octopus Urn

6

자바 스크립트 (ES7), 89 바이트

자릿수 목록 (문자로) 또는 n> 10 인 경우 빈 목록을 리턴합니다 .

n=>[...2**29+'4'].reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).filter(a=>a.length==n)

온라인으로 사용해보십시오!

어떻게?

먼저 2 29 = 536870912 를 계산 하여 누락 된 '4'를 추가 하고 분할 하여 모든 10 진수 목록을 문자로 생성합니다 .

[...2**29+'4']  [ '5', '3', '6', '8', '7', '0', '9', '1', '2', '4' ]

그런 다음 파워 셋을 계산합니다.

.reduce(                                   ,[[]]) // starting with a[] holding an empty list
        (a,x)=>[                          ]       // for each decimal digit x:
                ...a,                             //   copy all previous entries in a[]
                     ...a.map(y=>        )        //   and duplicate each previous entry y
                                 [x,...y]         //   with x prepended at the beginning

마지막으로 길이에 따라 결과를 필터링합니다.

.filter(a=>a.length==n)







2

MATL , 6 바이트

4Y2wXN

온라인으로 사용해보십시오!

에 대해 아무것도 (빈 배열)을 반환합니다 k>10.

          % implicit input k
4Y2       % push '0':'9'
   w      % swap top two elements of stack
    XN    % nchoosek, select all k-combinations of '0':'9' as a char array
          % implicit output



2

하스켈 , 47 바이트

f 0=[[]]
f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]

온라인으로 사용해보십시오!

설명

자릿수가 0이면 하나의 조합 만 있습니다. 즉 비어있는 것입니다.

f 0=[[]]

자릿수가 n있고 n/=0조합이 숫자를 포함하는 조합에 숫자가 추가 f$n-1되지 않도록 조합에 숫자를 추가하는 모든 방법 인 경우.

f n=[a:x|x<-f$n-1,a<-[0..9],all(/=a)x]

2

가이아 ,  4  3 바이트

₸…K

온라인으로 사용해보십시오!

Gaia에 답변을 게시 한 지 오래되었습니다! 바이트를 저장해 준 Mr. Xcoder에게 감사합니다!

      % implicit input n
₸     % push 10
 …    % pop 10, push 0..9
  K   % all subsets of size n
      % print top of stack implicitly

당신은 필요하지 않습니다 @.
Mr. Xcoder 2018 년

@ Mr.Xcoder 감사합니다. 그것을 몰랐다; 매우 명확하게 문서화되지 않은 것 같습니다.
주세페

2

레티 나 , 51 36 바이트

.+
10*
"$+"{%`^.
*_$&
L$v`_+
$.%`$%'

온라인으로 사용해보십시오! 에 대해서는 아무것도 출력하지 않습니다 n>10. 설명:

.+
10*

입력을 10 _초로 교체하십시오 .

"$+"{

나머지 프로그램 n시간을 반복하십시오 .

%`^.
*_$&

각 번호 앞에 _첫 번째 자릿수에 따라 반복 붙입니다.

L$v`_+

모두 일치 _하지만 다음을 모두 포함하십시오._ 겹치는 일치를 활성화해야하는 일치시킵니다.

$.%`$%'

각각 _발견 된_ 왼쪽에있는 s 수를 숫자 앞에 붙 입니다.

이것은 약간 까다로워 실제 사례가 더 좋을 것입니다. 루프를 두 번 실행하여 모든 2 자리 PIN이 생성되었고 현재 3 자리 PIN을 생성하기 위해 작업 중이라고 가정합니다. 우리는 어떻게되는지 살펴볼 것입니다 36: 첫 번째 숫자는 3이므로 세 개의 숫자가 _앞에 붙습니다 ___36. 그런 다음 여기에 `'s 로 표시된 다음 일치 항목이 작성됩니다 .

Match   $%` $.%`
`___'36     0
_`__'36 _   1
__`_'36 __  2

$%'evalutes로 363 자리의 PIN 결과, 세 가지 경우 모두에 036, 136236 .

4 자리 PIN을 만들려고 036하면 _접두사가 붙지 않으므로 최종 출력에서 ​​전혀 일치하지 않습니다.


문제는 입력이 음이 아니라고 말합니다. 0을 입력하면 10 개의 밑줄 문자가 출력됩니다.
aschepler 2018 년

사실 @aschepler; OP 가이 경우를 제외하기로 결정했지만 궁금한 점이 있으면 수정 ^0하고 5 바이트의 비용을 지불해야합니다.
Neil


1

apt, 5 바이트

자릿수 배열을 출력합니다. 출력 모두 입력된다 조합하는 경우 0입력되는 경우 비어있는 배열 <0또는 >10.

Ao àU

시도 해봐


설명

          :Implicit input of integer U
A         :10
 o        :Range [0,10)
   àU     :Combinations of length U

입력 0의 출력이 정확하지 않다고 생각합니다. 출력은 하나의 요소를 포함하는 목록이어야하며 비어 있습니다.
aschepler 2018 년

@ aschepler, 어디서 얻었습니까?
얽히고 설킨

1

Stax , 4 바이트

Vd,S

온라인으로 사용해보십시오!

Vd입니다 "0123456789". ,입력을 기본 스택으로 푸시합니다. S지정된 크기의 조합을 가져옵니다.

tio 링크 m에서 바닥 글에서 각 출력을 인쇄하는 데 사용됩니다.


1

표준 ML , 124 (122) 121 바이트

open List;fun f(s:: &)m=(if exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!0=[[]]| !n=concat(tabulate(10,f(!(n-1))))

온라인으로 사용해보십시오! 사용법 예 : !2yields [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

언 골프 드 :

open List;

(* int list list -> int -> int list list *)
fun f (s::r) m =
    if exists (fn x => x=m) s 
    then f r m
    else (m::s) :: f r m
  | f [] m = []

(* int -> int list list *)
fun g 0 = [[]]
  | g n = concat(tabulate(10, f(g(n-1))))

일부 대안 :

125 123 바이트

fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&m= &
fun!m 0=[[]]| !10n=[]| !m n=f(!0(n-1))m@ !(m+1)n;!0;

온라인으로 사용해보십시오!바인딩되는 익명 함수를 정의합니다it .

127124 바이트

fun!0=[[]]| !n=let fun f(s:: &)m=(if List.exists(fn x=>x=m)s then[]else[m::s])@f&m|f&9=[]|f&m=f(!(n-1))(m+1)in f(!(n-1))0end

온라인으로 사용해보십시오!



1

Oracle 18 SQL, 169 바이트

골프 언어는 아니지만 :

WITH t(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1,2,3,4,5,6,7,8,9)),n(a,b,c)AS(SELECT a,-1,''FROM i UNION ALL SELECT a-1,v,v||c FROM n,t WHERE v>b)SELECT c FROM n WHERE a=0

입력 i이 열이 있는 테이블에있을 것으로 예상했습니다 a.

CREATE TABLE i (a INT);
INSERT INTO i VALUES ( 3 );

Oracle Live SQL (무료 로그인이 필요하고 솔루션을 워크 시트에 복사하여 붙여 넣기) 또는 SQLFiddle (로그인은 없지만 하위 Oracle 버전에서 작동하려면 +7 바이트가 필요함 ) 에서 온라인으로 사용해보십시오 .


1

CJam , 13 11 바이트

{Ae!f<:$_|}

온라인으로 사용해보십시오!

힙 공간이 부족하여 기술적으로 tio.run에서 실행되지 않습니다. 그러나 최대 9 자리 키패드에서 제대로 작동하며 더 많은 RAM으로도 제대로 작동해야합니다.

Dennis 덕분에 2 바이트 절약



0

자바 스크립트 (Firefox 30-57), 67 바이트

n=>n?[for(x of f(n-1))for(y of Array(x?+x[0]:10).keys())y+x]:['']

내 Retina 포트가 응답하지만 작동합니다 n=0(에 대한 빈 목록과 구별되는 빈 문자열 목록 반환 n>10).


0

, 21 바이트

⊞υωFχ≔⁺υEυ⁺κIιυΦυ⁼θLι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

⊞υω

빈 문자열을 사전 정의 된 목록으로 푸시하십시오.

Fχ

각 숫자를 반복합니다.

Eυ⁺κIι

목록의 모든 문자열에 숫자를 추가하십시오.

≔⁺υ...υ

결과를 원래 목록에 추가하십시오.

Φυ⁼θLι

모든 문자열을 올바른 자릿수로 인쇄하십시오.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.