รายการ PIN กุญแจที่ไม่ซ้ำ!


16

บทนำ

ในการแชทส่วนตัวเพื่อนของฉันเพิ่งสะดุดกับระบบความปลอดภัยซึ่งมีข้อ จำกัด สองข้อต่อไปนี้ในพินที่ถูกต้อง:

  • แต่ละหลักต้องไม่ซ้ำกัน (นั่นคือ "1" อาจปรากฏเพียงครั้งเดียวเท่านั้น)
  • ลำดับของตัวเลขไม่สำคัญ ("1234" = "4321")

ดังนั้นเพื่อแสดงให้เห็นว่าระบบกุญแจนี้แย่เพียงใดเรามาแจกแจง PIN ที่ถูกต้องทั้งหมด!

อินพุต

ข้อมูลที่คุณป้อนจะประกอบด้วยจำนวนเต็มบวกจำนวนเต็มเดียวซึ่งหมายถึงความยาวของ PIN

เอาท์พุต

ผลลัพธ์ของคุณประกอบด้วยรายการจำนวนเต็มหรือสตริงที่ไม่เป็นลบ * ซึ่งระบุ PIN ที่ถูกต้องทั้งหมดของความยาวที่กำหนด

* สิ่งที่มนุษย์สามารถใช้เพื่อลองชุดค่าผสมทั้งหมดหากคุณต้องการพิมพ์ให้พวกเขา ซึ่งหมายความว่าชุดของชุดของตัวเลขและอาร์เรย์ของตัวเลขนั้นใช้ได้

ใครชนะ?

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ! มาตรฐานกฎระเบียบและช่องโหว่ใช้

คดีมุม

  • พฤติกรรมเอาท์พุทไม่ได้กำหนดถ้าจำนวนเต็มมากกว่า 10 คือการป้อนข้อมูล
  • การเรียงลำดับตัวเลขภายในแต่ละรายการเอาต์พุตไม่ได้ถูกกำหนดเนื่องจากรายการที่มีศูนย์ประกอบด้วยศูนย์ดังกล่าวจริงนั่นคือคุณไม่สามารถตัด "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
อินพุตไม่เป็นลบ - ดังนั้นเมื่อมีการป้อนค่าศูนย์โปรแกรมควรเป็นรายการที่มีค่าเดียวคือสตริงว่างหรือไม่
aschepler

@aschepler แน่นอนกรณีศูนย์เป็นเรื่องเกี่ยวกับความรู้สึกเท่ากับ 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

2
@ gnu- ไม่มีใครให้รายการที่ว่างเปล่าเพราะคุณไม่สามารถรวม 11 องค์ประกอบกับ 10 ตัวเลือก
HyperNeutrino

โอ้ØDคือ "0123456789" ขอบคุณ
คุกกี้ Windmill

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

JavaScript (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'และตัวแยกที่ขาดหายไป:

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

จากนั้นเราคำนวณ powerset:

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




3

Pyth, 4 ไบต์

.cUT

ลองที่นี่

คำอธิบาย

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






2

Haskell , 47 ไบต์

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

ลองออนไลน์!

คำอธิบาย

เมื่อจำนวนหลักเป็นศูนย์จะมีเพียงชุดค่าผสมเดียวเท่านั้นนั่นคือชุดค่าว่าง:

f 0=[[]]

เมื่อจำนวนหลักคือnและn/=0การรวมกันเป็นวิธีการเพิ่มตัวเลขไปยังชุดค่าผสมจากf$n-1นั้นจะไม่มีการเพิ่มตัวเลขลงในชุดค่าผสมที่มีอยู่แล้ว

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

2

Gaia ,  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

@ Mr.Xcoder ขอบคุณ ไม่ได้ตระหนักถึงสิ่งนั้น ดูเหมือนว่าเอกสารจะไม่ชัดเจนมากนัก
Giuseppe

2

เรติน่า , 51 36 ไบต์

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

ลองออนไลน์! ไม่แสดงผลใดn>10ๆ คำอธิบาย:

.+
10*

แทนที่อินพุตด้วย 10 _วิ

"$+"{

ทำซ้ำส่วนที่เหลือของnเวลาโปรแกรม

%`^.
*_$&

คำนำหน้าแต่ละหมายเลขด้วย_ซ้ำตามหลักแรก

L$v`_+

จับคู่ทั้งหมด_แต่รวมถึงสิ่งต่อไปนี้ทั้งหมด_ในการแข่งขันด้วยซึ่งเราจำเป็นต้องเปิดใช้งานการจับคู่ที่ทับซ้อนกัน

$.%`$%'

สำหรับการ_พบแต่ละคำนำหน้าจำนวน_s ไปทางซ้ายเพื่อหมายเลข

นี่เป็นเรื่องยุ่งยากเล็กน้อยดังนั้นบางทีกรณีจริงจะดีกว่า สมมติว่าเราได้ใช้งานลูปสองครั้งอยู่แล้วดังนั้น PIN 2 หลักทั้งหมดจึงถูกสร้างขึ้นและเรากำลังดำเนินการผ่านทางพวกเขาเพื่อสร้าง PIN 3 หลัก เราจะมองสิ่งที่เกิดขึ้นกับ36: หลักแรกคือ3เพื่อให้สาม_s ___36จะมีคำนำหน้าเพื่อให้ สิ่งนี้จะสร้างการแข่งขันต่อไปนี้ซึ่งทำเครื่องหมายไว้ที่นี่ด้วย`' s:

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

$%'evalutes ไป36ในทั้งสามกรณีที่เกิดในหมุด 3 หลัก036, และ136236

หากเราต้องสร้างรหัส PIN 4 หลักต่อไป036จะไม่มี_คำนำหน้าใด ๆดังนั้นจึงไม่มีผลลัพธ์ที่ตรงกันเลยในผลลัพธ์สุดท้าย


คำถามที่ว่าอินพุตไม่เป็นลบ บนอินพุตศูนย์เอาต์พุตนี้มีอักขระขีดเส้นใต้สิบตัว
aschepler

@aschepler แน่นอน; ฉันเห็น OP ได้ตัดสินใจยกเว้นกรณีดังกล่าว แต่ในกรณีที่คุณสงสัยการแก้ไขจะเป็นการเพิ่ม^0และมีค่าใช้จ่าย 5 ไบต์
Neil

1

โปรตอน 43 ไบต์

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

ลองออนไลน์!

ในที่สุดโปรตอนมีค่ามากกว่า Python: DI คิดว่า(import itertools)จะคืนค่า แต่ดูเหมือนว่าฉันจะล้มเหลว การนำเข้า*หลังจากนั้นก็ไม่ทำงานเช่นกันเพราะมันไม่ได้อยู่ในแลมบ์ดา แต่เป็นนิพจน์ระดับบนสุด


1

Japt 5 ไบต์

ส่งออกอาร์เรย์ของอาร์เรย์หลัก ขาออกทั้งหมดรวมกันถ้าใส่เป็น0หรืออาร์เรย์ที่ว่างเปล่าถ้าใส่เป็นหรือ<0>10

Ao àU

ลองมัน


คำอธิบาย

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

ฉันไม่คิดว่าเอาต์พุตสำหรับอินพุต 0 นั้นถูกต้อง ผลลัพธ์ควรเป็นรายการที่มีองค์ประกอบหนึ่งซึ่งว่างเปล่า
aschepler

@ aschepler คุณได้รับมาจากไหน
Shaggy

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

ลองออนไลน์! ตัวอย่างการใช้งาน: อัตราผลตอบแทน!2[[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,2],[1,3], ...]

Ungolfed:

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กำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ถูกผูกไว้กับ

127 124 ไบต์

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 (ไม่มีการเข้าสู่ระบบ แต่ต้องใช้ +7 ไบต์เพื่อทำงานกับ Oracle เวอร์ชันล่าง)


1

CJam , 13 11 ไบต์

{Ae!f<:$_|}

ลองออนไลน์!

ในทางเทคนิคไม่สามารถใช้งานบน tio.run เนื่องจากพื้นที่ฮีพหมด อย่างไรก็ตามมันทำงานได้อย่างถูกต้องสำหรับคีย์แพดสูงสุด 9 หลักและควรจะทำงานได้ดีกับ RAM ที่มากขึ้น

บันทึก 2 ไบต์ขอบคุณ Dennis


0

Bash , 113 99 ไบต์

p()(r $1 0 $[10-$1])
r()for i in `seq $2 $3`;{ (($1>1))&&r $[$1-1] $[i+1] $[$3+1] $4$i||echo $4$i;}

ลองออนไลน์!


r 0ไม่ทำงาน
aschepler

rเป็นฟังก์ชั่นวนซ้ำ: ไม่ได้หมายถึงการเปิดตัวด้วยพารามิเตอร์เพียง 1 ตัว p 0พฤติกรรมไม่ได้ระบุในคำถาม
เกล็นแจ็คแมน

0

JavaScript (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.