Bash on * ระวัง (109)
while ! grep -Pq [A-Z].*[a-z].*[0-9].*[\\W_]<<<$a$a$a$a
do a=`tr -dc !-~</dev/urandom|head -c15`
done
echo $a
ในการทำงานอย่างถูก$a
ต้องจะต้องไม่ตั้งค่ารหัสผ่านที่ถูกต้อง แต่ไม่ใช่แบบสุ่มล่วงหน้า ถ้าคุณต้องการที่จะรวมa=
และแยกแถวหน้านั่นคือตัวละครอีกสามตัว แต่มันก็ช่วยให้คุณสามารถทำสิ่งนั้นซ้ำ ๆ ได้ เห็นได้ชัดว่าคุณสามารถแทนที่บรรทัดใหม่ทั้งหมดด้วย;
เพื่อให้คุณมีหนึ่งซับซึ่งคุณสามารถดำเนินการได้บ่อยเท่าที่คุณต้องการ
นอกจากนี้คุณควรตั้งค่าLC_ALL=C
หรือไม่ตั้งค่าตัวแปรสภาพแวดล้อมเฉพาะโลแคล ( LANG
และLC_CTYPE
โดยเฉพาะ) เนื่องจากช่วงอักขระขึ้นอยู่กับลำดับการเรียงจะเท่ากับลำดับ ascii
/dev/urandom
เป็นแหล่งของการสุ่มไบต์ !-~
คือช่วงของอักขระที่อนุญาตทั้งหมดตามที่ระบุในคำถาม tr -dc
ลบอักขระทั้งหมดที่ไม่ได้ระบุไว้ในอาร์กิวเมนต์ถัดไป head
ใช้เวลา 15 ตัวอักษรที่เหลือ grep
ตรวจสอบว่าแต่ละชนิดที่ต้องการเกิดขึ้นอย่างน้อยหนึ่งครั้งหรือไม่ ข้อมูลที่ป้อนประกอบด้วยสำเนาสี่ชุดของผู้สมัครดังนั้นลำดับของสัญลักษณ์จึงไม่สำคัญดังนั้นรหัสผ่านที่เป็นไปได้ทั้งหมดจึงมีโอกาสในการเลือก -q
ที่จะไม่ใส่ grep เอาท์พุท
ด้วยเหตุผลที่ไม่รู้จัก/dev/random
แทนที่จะ/dev/urandom
ใช้เวลานาน ดูเหมือนว่าเอนโทรปีหมดเร็วแล้ว หากคุณcd
เข้าไป/dev
คุณสามารถหลีกเลี่ยงไบต์เพิ่มเติม แต่รู้สึกเหมือนการโกง
Python 2 (138)
import re,random
a=''
while not re.search('[A-Z].*[a-z].*[0-9].*[\W_]',a*4):
a=''.join(random.sample(map(chr,range(33,127))*15,15))
print a
ในการทำให้โค้ดอ่านได้ฉันได้เพิ่มบรรทัดใหม่และการเยื้องหลังลูปที่ไม่จำเป็นและฉันไม่ได้นับ
นี่เป็นหลักความคิดเดียวกับในเวอร์ชั่นทุบตี แหล่งสุ่มนี่คือrandom.sample
ซึ่งจะไม่ทำซ้ำองค์ประกอบ เพื่อต่อต้านความจริงนี้เราใช้ 15 ฉบับของรายการจดหมายที่อนุญาต ด้วยวิธีนี้ชุดค่าผสมทุกชุดยังสามารถเกิดขึ้นได้แม้ว่าชุดค่าผสมที่มีตัวอักษรซ้ำ ๆ จะเกิดขึ้นน้อยลง แต่ฉันตัดสินใจที่จะพิจารณาคุณลักษณะนี้ไม่ใช่ข้อผิดพลาดเนื่องจากคำถามไม่ต้องการความน่าจะเป็นที่เท่ากันสำหรับการเรียงสับเปลี่ยนทั้งหมดเป็นไปได้เท่านั้น
Python 3 (145)
import re,random
a=''
while not re.search('[A-Z].*[a-z].*[0-9].*[\W_]',a*4):
a=''.join(random.sample(list(map(chr,range(33,127)))*15,15))
print(a)
หนึ่งบรรทัดใหม่และอีกหนึ่งการเยื้องไม่นับ นอกเหนือจากค่าใช้จ่ายเฉพาะของ Python-3 บางส่วนของไวยากรณ์นี้เป็นโซลูชั่นเดียวกันสำหรับ Python 2
จาวาสคริปต์ (161)
a=[];for(i=33;i<127;)a.push(s=String.fromCharCode(i++));
while(!/[A-Z].*[a-z].*[0-9].*[\W_]/.test(s+s+s+s))
for(i=0,s="";i<15;++i)s+=a[Math.random()*94|0];alert(s)
ฉันเพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้ แต่ไม่นับ
R (114)
s<-""
while(!grepl("[A-Z].*[a-z].*[0-9].*(\\W|_)",paste(rep(s,4),collapse="")))
s<-intToUtf8(sample(33:126,15,T))
s
Linebreak และเยื้องในวงเพิ่ม แต่ไม่นับ หากคุณรู้สึกว่ามันคุณสามารถย้ายสิ่งนี้ไปยัง;
บรรทัดที่แยกกันอีกครั้ง