Danh sách mã khóa móc độc đáo!


16

Giới thiệu

Trong một cuộc trò chuyện riêng tư, một người bạn của tôi gần đây đã tình cờ phát hiện ra một hệ thống bảo mật có hai hạn chế sau đối với các chân hợp lệ của nó:

  • Mỗi chữ số phải là duy nhất (đó là "1" chỉ có thể xuất hiện một lần)
  • Thứ tự của các chữ số không quan trọng ("1234" = "4321")

Vì vậy, để minh họa mức độ tồi tệ của hệ thống ổ khóa này, hãy thực sự liệt kê tất cả các mã PIN hợp lệ!

Đầu vào

Đầu vào của bạn sẽ bao gồm một số nguyên dương duy nhất, biểu thị độ dài của mã PIN.

Đầu ra

Đầu ra của bạn bao gồm một danh sách các số nguyên hoặc chuỗi không âm *, liệt kê tất cả các mã PIN hợp lệ có độ dài cho trước.

* Chính xác hơn là thứ mà con người có thể sử dụng để thử tất cả các kết hợp nếu bạn in nó cho họ. Điều này có nghĩa là tập hợp các bộ chữ số và mảng các mảng chữ số đều ổn.

Ai thắng?

Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng! Quy tắc tiêu chuẩn và sơ hở áp dụng.

Góc trường hợp

  • Hành vi đầu ra không được xác định nếu một số nguyên lớn hơn 10 là đầu vào.
  • Thứ tự của các chữ số trong mỗi mục nhập đầu ra là không xác định, vì các mục có số 0 thực sự chứa số 0 nói trên, nghĩa là bạn không được tước "0123" thành "123" nhưng "1230", "1203" và "1023" đều hợp lệ như "0123".

Các trường hợp thử nghiệm

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
Đầu vào không âm - vậy trên đầu vào số 0, chương trình nên là một danh sách chứa một giá trị, chuỗi rỗng?
aschepler

@aschepler thực sự, trường hợp số 0 cũng hợp lý như trường hợp 11, vì vậy tôi đã thay đổi nó thành "số nguyên dương".
SEJPM

Câu trả lời:


7

Thạch , 4 byte

ØDœc

Hãy thử trực tuyến!

Giải trình

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

Hành vi cho n > 10là danh sách trống.


Làm thế nào nó không hoạt động với đầu vào lớn hơn 10 (đã thử nó và có vẻ kỳ lạ với tôi)?
Bánh quy cối xay gió

2
@ gnu-không ai đưa ra danh sách trống vì bạn không thể có sự kết hợp của 11 yếu tố với 10 lựa chọn.
HyperNeutrino

ồ, ØD là "0123456789". cảm ơn.
Bánh quy cối xay gió

6

05AB1E , 5 byte

žhæsù

Hãy thử trực tuyến!

Giải trình

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

Không biết ùlà một điều. Khá chắc chắn tôi đã sử dụng bộ lọc trước đây. Làm thế nào mới là một?
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn: Khá cũ. Ở đó rất lâu: P
Emigna

Tôi não không thấy lệnh trước giờ. Tôi não không thông minh.
Bạch tuộc ma thuật Urn

Đã xảy ra với tôi một vài lần. Hơn một lần đối với một số lệnh, đó là ...
Emigna

... chấp nhận được một 05AB1Er cấp bậc (05AB1E-ite? 05AB1E-an?) như chính bạn.
Bạch tuộc ma thuật Urn

6

JavaScript (ES7), 89 byte

Trả về danh sách các danh sách các chữ số (dưới dạng ký tự) hoặc danh sách trống nếu n> 10 .

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

Hãy thử trực tuyến!

Làm sao?

Trước tiên, chúng tôi tạo danh sách tất cả các chữ số thập phân dưới dạng ký tự bằng cách tính 2 29 = 536870912 , thêm '4' bị thiếu và tách:

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

Sau đó, chúng tôi tính toán quyền hạn:

.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

Cuối cùng, chúng tôi lọc kết quả theo chiều dài của chúng:

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




3

Bình thường, 4 byte

.cUT

Hãy thử nó ở đây

Giải trình

.cUT
  UT     [0, 1, ..., 9].
.c  Q    All (implicit input)-element subsets.



2

MATL , 6 byte

4Y2wXN

Hãy thử trực tuyến!

Trả về không có gì (mảng trống) cho 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

Haskell , 47 byte

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

Hãy thử trực tuyến!

Giải trình

Khi số chữ số bằng 0, chỉ có một kết hợp, đó là kết hợp trống:

f 0=[[]]

Khi số lượng chữ số là nn/=0các kết hợp là tất cả các cách để thêm chữ số vào các kết hợp sao f$n-1cho không có chữ số nào được thêm vào một kết hợp đã chứa nó.

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

2

Gaia ,  4  3 byte

₸…K

Hãy thử trực tuyến!

Lâu lắm rồi tôi mới đăng câu trả lời trên Gaia! Cảm ơn ông Xcoder đã tiết kiệm một byte!

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

Bạn không cần @.
Ông Xcoder

@ Mr.Xcoder cảm ơn. Không nhận ra điều đó; nó dường như không được ghi lại rất rõ ràng.
Giuseppe

2

Võng mạc , 51 36 byte

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

Hãy thử trực tuyến! Đầu ra không có gì cho n>10. Giải trình:

.+
10*

Thay thế đầu vào bằng 10 _s.

"$+"{

Lặp lại phần còn lại của chương trình n thời gian .

%`^.
*_$&

Tiền tố mỗi số với _ lặp lại theo chữ số đầu tiên của nó.

L$v`_+

Phù hợp với tất cả _ s, nhưng bao gồm tất cả các _s sau trong trận đấu, mà chúng ta cần kích hoạt các kết quả trùng lặp.

$.%`$%'

Đối với mỗi _tìm thấy, tiền tố số _s bên trái của nó với số.

Đây là một chút khó khăn để có lẽ một trường hợp thực tế sẽ tốt hơn. Giả sử rằng chúng tôi đã chạy vòng lặp hai lần, để tất cả các mã PIN 2 chữ số đã được tạo và chúng tôi hiện đang làm việc thông qua chúng để tạo mã PIN 3 chữ số. Chúng ta sẽ xem xét điều gì xảy ra 36: Chữ số đầu tiên là 3, vì vậy ba chữ số _được đặt trước ___36. Điều này sau đó tạo ra các kết quả khớp sau, được đánh dấu ở đây bằng `'s:

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

$%'evalutes để 36trong cả ba trường hợp, kết quả là mã PIN 3 chữ số 036, 136236.

Nếu sau đó chúng tôi tiếp tục tạo mã PIN gồm 4 chữ số, thì 036sẽ không có bất kỳ _tiền tố nào, và do đó sẽ không có kết quả trùng khớp nào ở đầu ra cuối cùng.


Câu hỏi cho biết đầu vào là không âm. Trên đầu vào 0, điều này xuất ra mười ký tự gạch dưới.
aschepler

@aschepler Thật vậy; Tôi thấy OP đã quyết định loại trừ trường hợp đó, nhưng trong trường hợp bạn đang tự hỏi, cách khắc phục sẽ là trả trước ^0với chi phí là 5 byte.
Neil

1

Proton , 43 byte

(0..9)&__import__("itertools").combinations

Hãy thử trực tuyến!

Proton cuối cùng đã vượt qua Python: DI nghĩ (import itertools)sẽ trả về giá trị nhưng dường như tôi đã thất bại ở đó. Ngoài ra, nhập *sau đó không hoạt động vì nó không phải trong lambda, đó là biểu thức cấp cao nhất.


1

Japt, 5 byte

Xuất ra một mảng các mảng số. Đầu ra tất cả các kết hợp nếu đầu vào là 0hoặc một mảng trống nếu đầu vào là <0hoặc >10.

Ao àU

Thử nó


Giải trình

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

Tôi không nghĩ đầu ra cho đầu vào 0 là chính xác. Đầu ra phải là một danh sách chứa một phần tử trống.
aschepler

@aschepler, bạn lấy từ đâu vậy?
Xù xì

1

Stax , 4 byte

Vd,S

Hãy thử trực tuyến!

Vd"0123456789". ,đẩy đầu vào vào ngăn xếp chính. Sđược kết hợp của kích thước quy định.

Trong liên kết tio, mđược sử dụng ở chân trang để in từng đầu ra.


1

ML chuẩn , 124 122 121 byte

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))))

Hãy thử trực tuyến! Ví dụ sử dụng: !2sản lượng [[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...].

Ung dung:

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))))

Một số lựa chọn thay thế:

125 123 byte

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;

Hãy thử trực tuyến! Xác định một hàm ẩn danh được ràng buộc it.

127 124 byte

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

Hãy thử trực tuyến!



1

Oracle 18 SQL, 169 byte

Không phải là ngôn ngữ chơi gôn nhưng:

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

Dự kiến ​​đầu vào sẽ ở trong một bảng icó cột a:

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

Dùng thử trực tuyến tại Oracle Live SQL (yêu cầu đăng nhập miễn phí sau đó sao chép-dán giải pháp vào bảng tính) hoặc SQLFiddle (không đăng nhập nhưng yêu cầu +7 byte để hoạt động trên phiên bản Oracle thấp hơn).


1

CJam , 13 11 byte

{Ae!f<:$_|}

Hãy thử trực tuyến!

Về mặt kỹ thuật không chạy trên tio.run, vì không gian heap hết. Tuy nhiên, nó hoạt động đúng với bàn phím tối đa 9 chữ số và chỉ chạy tốt với nhiều RAM hơn.

Đã lưu 2 byte nhờ Dennis



0

JavaScript (Firefox 30-57), 67 byte

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

Cổng câu trả lời Retina của tôi, nhưng cũng hoạt động n=0(trả về danh sách một chuỗi trống, khác với danh sách trống cho n>10).


0

Than , 21 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

⊞υω

Đẩy chuỗi trống vào danh sách được xác định trước.

Fχ

Lặp lại trên mỗi chữ số.

Eυ⁺κIι

Nối chữ số vào mỗi chuỗi trong danh sách.

≔⁺υ...υ

Nối kết quả vào danh sách ban đầu.

Φυ⁼θLι

In tất cả các chuỗi với số chữ số chính xác.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.