ตัวสร้างรหัสผ่าน XKCD


34

บทนำ

เห็นได้ชัดว่าคำถามนี้ถูกถามที่นี่และมันปิดอย่างน่าเสียดาย ฉันคิดว่ามันเป็นความคิดที่ดีที่จะลองอีกครั้ง แต่ทำถูกต้อง

XKCDดูที่วิธีการที่เราได้รับการฝึกฝนให้ใช้ "รหัสผ่านที่จำยาก" โดยคิดว่าปลอดภัย แต่ใช้เวลาคอมพิวเตอร์ 3 วันในการถอดรหัส ในทางกลับกันการจดจำความยาว 4-5 คำจะทำให้รหัสผ่านของควน Intropy อัพและง่ายต่อการจดจำ บ้าแล้วมันใช้ได้ยังไงเหรอ?

ท้าทาย

งานวันนี้คือสร้างรหัสผ่าน 5 คำโดยใช้คำ 4 คำต่อรหัสผ่านและอย่างน้อย 4 ตัวอักษรต่อคำ แต่ไม่เกิน รหัสผ่านของ Kuan จะต้องมีการคำนวณสำหรับทุกรหัสผ่าน แต่จะไม่ได้ตั้งค่าขั้นต่ำที่บังคับ

รหัสผ่านของควน Intropy คืออะไร?

รหัสผ่านของ Kuan Intropy เป็นการวัดว่ารหัสผ่านไม่สามารถคาดเดาได้ มีการคำนวณง่ายๆคือE = เข้าสู่ระบบ2 (R) * L E เป็นรหัสผ่านของ Kuan Intropy, R เป็นช่วงของอักขระที่มีอยู่และ L สำหรับความยาวรหัสผ่าน

ช่วงของตัวละครที่มีอยู่เป็นตัวอธิบาย เป็นช่วงของอักขระที่รหัสผ่านสามารถมีได้ในกรณีนี้คือตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก เนื่องจากมี 26 ตัวอักษรในตัวอักษร 26 x 2 = 52 ตัวอักษรในช่วงทั้งหมดของรหัสผ่าน

ความยาวของรหัสผ่านยังอธิบายด้วยตนเอง มันคือความยาวรวมของรหัสผ่านหลังการสร้าง

ข้อ จำกัด

  • ไม่มีอินพุต
  • คำไม่สามารถปรากฏขึ้นอีกครั้งในรหัสผ่านเดียวกัน
  • ไม่อนุญาตให้ใช้สัญลักษณ์หรือตัวเลขในรหัสผ่าน
  • 4 คำต่อรหัสผ่าน แต่บังคับขั้นต่ำ 4 ตัวอักษรต่อคำ
  • ไม่มีช่องว่างระหว่างคำ
  • คุณไม่สามารถสร้างรหัสผ่านเดิมซ้ำแล้วซ้ำอีก
  • แต่ละคำจะต้องเป็นตัวพิมพ์ใหญ่ในรหัสผ่าน
  • เอาต์พุตจะต้องสามารถอ่านได้โดยมนุษย์และต้องเว้นระยะ ต้องรวมรหัสผ่าน Intropy ของ Kuan ด้วยโดยใช้สมการรหัสผ่านของ Kuan ด้านบน
  • พจนานุกรม คุณต้องใช้สิ่งนี้ดาวน์โหลดมันเป็นไฟล์ข้อความและรวมเข้าด้วยกัน นี่จะเป็นรายการที่คุณใช้ค้นหาคำ รหัสของคุณควรถือว่าใช้ได้
  • นี่คือไบต์ที่สั้นที่สุดชนะ

เอาท์พุต

TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0

16
สำหรับกรณีทดสอบทำไมรหัสผ่านของเอนโทรปีจึงแตกต่างกัน? รหัสผ่าน 4 คำทั้งหมดที่สร้างจากพจนานุกรมเดียวกันควรมีเอนโทรปีเดียวกัน
ไม่เป็นเชิงเส้น

20
รหัสผ่านของเอนโทรปีขึ้นอยู่กับชุดสัญลักษณ์ หากรหัสผ่านของคุณเป็นNสัญลักษณ์จากชุดที่เอนโทรปีรหัสผ่านS log2(|S|)*Nนี่ขนาดของชุดสัญลักษณ์คือขนาดของพจนานุกรม (คน|S|=4284) และจำนวนของสัญลักษณ์ที่มีจำนวนคำ (คนN=4) 48.3ดังนั้นเอนโทรปีสำหรับรหัสผ่านของแต่ละคน
ไม่เป็นเชิงเส้น

48
คำนิยามของเอนโทรปีนี้ผิดอย่างอันตราย! หากตัวละครแต่ละตัวได้รับการสุ่มเลือกอย่างสม่ำเสมอจากชุดของขนาด R ดังนั้นรหัสผ่านยาว -L จึงมีความเป็นไปได้ที่ R ^ L ดังนั้นเอนโทรปีจึงเป็นบันทึกของ: log₂ (R ^ L) = log₂ (R) * L ซึ่งเป็นสูตรของคุณ อย่างไรก็ตามหากมีการสุ่มเลือกรหัสผ่านจากชุดอื่น (เช่นคุณจะไม่มีรหัสผ่านเหมือนกัน3t1ta#asd) เอนโทรปีจะเป็นลอการิทึมของจำนวนรหัสผ่านที่เป็นไปได้ หากคุณสุ่มเลือก 4 คำอย่างสม่ำเสมอจากพจนานุกรม 4284 คำนั้นจะมีรหัสผ่าน 4284 ^ 4 ซึ่งแต่ละรหัสจะมี entropy log₂ (4284) * 4 ≈ 48.26
ShreevatsaR

5
สำหรับการบันทึกรหัสผ่านประเภทนี้มีมาก่อนหน้าการ์ตูน XKCD พวกเขากำลังเรียกรหัสผ่าน "diceware"
user2428118

5
นอกเหนือจากปัญหาของคำที่มีเอนโทรปีน้อยกว่าตัวอักษรแบบสุ่มคำถามของคุณต้องการให้คำเป็นตัวพิมพ์ใหญ่ซึ่งหมายถึงกรณีได้รับการแก้ไขและไม่สามารถนับสำหรับเอนโทรปี
Niet the Dark Absolute

คำตอบ:


13

Python 2, 102 101 97 91 ไบต์

from random import*
exec"x=''.join(x.title()for x in sample(f,4));print(x,57*len(x)/10);"*5

fถือว่าพจนานุกรมเป็นรายการที่มีชื่อว่า

สามารถทดสอบได้โดยการบันทึกไฟล์เป็นdict.txtและการโทร

f = open('dict.txt').readlines()

รายการ Python ไม่มีวิธีการสลับและคุณสามารถบันทึกสองไบต์ใน Python 2 ได้ด้วยการลบวงเล็บexec( execเป็นคำหลักใน Python 2)
Konrad Borowski

@xfix shuffle(f);ใช่มันควรจะเป็น
Jonathan Allan

อ๊ะแก้ไขให้เร็วที่สุด
Martmists

4
คุณสามารถใช้เคล็ดลับของฉันสังเกตว่าการปัดเศษ 5.7 จะปรับไปยังสถานที่ 1 57*len(x)/10.ทศนิยมตราบใดที่ลอยข้อผิดพลาดจุดจะไม่ได้รับการแนะนำให้รู้จักและประหยัดห้าไบต์ด้วย บันทึกไบต์อื่นด้วยการลบวงเล็บซึ่งทำให้การพิมพ์ใช้ tuple นี่คือรุ่นที่ตัดทอน: TIO
Jonathan Allan

ใช้แทนsample(f,4) shuffleนอกจากนี้ยังfเป็นเพียงแค่สามารถopen('dict.txt').read().split('\n'), open('dict.txt').readlines()หรือเพียงแค่open('dict.txt')(ฉันรู้ว่ามันไม่แข็งแรงเล่นกอล์ฟ แต่ยังคง)
Alex Hall

10

PowerShell (3.0+), 77 ไบต์

1..5|%{($p=-join($d|random -c 4|%{culture|% te*|% tot* $_}));57*$p.Length/10}

ลองออนไลน์!

ใช้กลอุบายของJonathan Allan57*len/10

$dมีพจนานุกรมเป็นอาร์เรย์ของคำ หากคุณกำลังเล่นที่บ้านและต้องการเติม$d:

$d=-split(irm pastebin.com/raw/eMRSQ4u2)

ใช้เวอร์ชัน golfed ของ(Get-Culture).TextInfo.ToTitleCase()เพื่อใช้ประโยชน์อักษรตัวแรก; ฉันไม่คิดว่าจะมีวิธีที่สั้นกว่าในการทำเช่นนั้นใน PowerShell

ที่เหลือฉันคิดว่าตรงไปตรงมา

ลิงก์ TIO มีทั้งพจนานุกรม ปิดการใช้งานแคชและไปถั่ว!


ใครสามารถชี้ให้ฉันอ้างอิงถึง "เคล็ดลับของ Jonathan Jonathan ที่ 57 * len / 10" ได้หรือไม่?
James Curran

@JamesCurran ดูรายละเอียดของคำตอบที่นี่และความเห็นของเขาที่มีต่อคำตอบนี้
ต้มตุ๋น

สิ่งนี้จะไม่ทำงานใน 2.0 ที่ถูกต้อง ที่ควรสังเกตในหัวข้อ ฉันยังคิดว่าคุณต้องอ่าน$dอย่างที่ควรจะสมมติว่ามันมีอยู่ในสภาพแวดล้อม (gc d)| random..โดยที่ dictionary เป็นไฟล์ที่เรียกว่า d ในไดเรกทอรีเดียวกัน
แมตต์

1
@ แมตต์ดังนั้นฉันอาจออกไปเพื่อให้คำตอบใช้ได้กับ v2 (หรือทำ 2 เวอร์ชัน) แต่นี่คือรหัสนักกอล์ฟ! ยิ่ง arcane ดีกว่า ;-p
briantist

1
ฉันแค่พยายามบันทึกไบต์ในชื่อคำตอบของฉัน
Matt

7

เยลลี่ , 22 ไบต์

Ẋḣ4ŒtFµL×57÷⁵⁸,K
çЀ5Y

ลิงก์ monadic ที่ใช้รายการรายการอักขระพจนานุกรมแยกวิเคราะห์ (ตามที่อนุญาตในการแชท )

ลองออนไลน์! (คลิก "อาร์กิวเมนต์" เพื่อซ่อนพจนานุกรมและลดความจำเป็นในการเลื่อน)

อย่างไร?

เนื่องจากพจนานุกรมมีเพียงคำที่ถูกต้อง ( 4ตัวอักษรหรือมากกว่าเท่านั้น[a-z]) จึงไม่จำเป็นต้องตรวจสอบสภาพนี้

เนื่องจากทุกคำในพจนานุกรมมีความยาวใน[4-8]ความยาวของรหัสผ่านที่เป็นไปได้ใน[16,32]และ entropies เป็นไปได้ที่จะไม่แตกต่างกันไปรอบหนึ่งสถานทศนิยมกว่าโดยการแทนที่ด้วยlog(52,2) 5.7ปัญหาเดียวก็คือว่าการใช้ค่าจุดลอยตัว5.7จะให้ลอยข้อผิดพลาดจุดปัดเศษสำหรับความยาว18, และ26 31อย่างไรก็ตามคูณด้วย57และแล้วหารด้วย10โดยใช้×57÷⁵หลีกเลี่ยงนี้ (ในขณะที่ยังคงความไบต์สั้นกว่าการพิมพ์เต็มรูปแบบค่าความแม่นยำโดยใช้จุดลอย×52l2¤)

çЀ5Y - Main link: list of list of characters (the parsed dictionary)
   5  - literal 5
 Ѐ   - map across the implicit range [1,2,3,4,5]:
ç     -   last link (1) as a dyad
    Y - join with newlines
      - implicit print

Ẋḣ4ŒtFµL×57÷⁵⁸,K - Link 1, get password and entropy: list of lists of characters, number
Ẋ                - shuffle the list of lists (shuffle all the words)
 ḣ4              - head to 4 (the first four words)
   Œt            - title case (make the first letter of each uppercase)
     F           - flatten into one list of characters
      µ          - monadic chain separation, call that p
       L         - length of p
         57      - 57
        ×        - multiply
            ⁵    - 10
           ÷     - divide -> entropy to 1 decimal place
             ⁸   - link's left argument, p
              ,  - pair -> [p, entropy]
               K - join with (a) space(s)

5

Ruby, 89 83 ไบต์

d.select!{|w|w[3]}
5.times{p w=d.sample(4).map(&:capitalize)*'',5.700439718*w.size}

dสันนิษฐานว่ารหัสผ่านที่ถูกเก็บไว้ในตัวแปร คุณสามารถเพิ่มบรรทัดนี้ก่อนรหัส:

d=$<.map(&:chomp)

และเรียกใช้สคริปต์เช่นนี้:

$ ruby generate_passwords.rb < dictionary_file.txt

ตัวอย่างผลลัพธ์:

"MarginStarvedOnusInsulted"
142.51099295
"KitchenMiseryLurkJoints"
131.110113514
"InducesNotablePitfallsPrecede"
165.312751822
"FarmersAbortFutileWrapper"
142.51099295
"RoutesBishopGlowFaithful"
136.81055323200002

KitchenMiseryLurkJoints ... ว้าว


-6 ไบต์จาก Ajedi32


1
อาจจะสามารถบันทึกไม่กี่ไบต์โดยการลบshuffle!และแทนที่ด้วยpop sample
Ajedi32

@ Ajedi32 โอ้คุณพูดถูก! ฉันคิดจริงๆเกี่ยวกับเรื่องนี้ แต่ฉันได้อ่านกฎนี้ผิดA word cannot reappear in the same passwordโดยคิดว่ามันไม่ได้ใช้คำซ้ำในรหัสผ่านทั้งหมด ขอบคุณ :)
daniero

4

Mathematica, 178 ไบต์

t=1;l=Length;While[t<6,s=RandomChoice[Import["https://pastebin.com/raw/eMRSQ4u2"],4];c=Capitalize/@s;f=Flatten@Characters[c];Print[StringJoin[c]," ",Log[2,l@Union@f]*l@f//N];t++]

ลองออนไลน์

คัดลอกและวางโดยใช้ ctrl-v แล้วกด Shift + enter เพื่อเรียกใช้


Mathematica, 136 ไบต์

สมมติว่า m คือพจนานุกรมรหัสคือ

m=ImportString[Import["C:\a.txt"]]

.

t=1;l=Length;While[t<6,s=RandomChoice[m,4];c=Capitalize/@s;f=Flatten@Characters[c];Print[StringJoin[c]," ",Log[2,l@Union@f]*l@f//N];t++]

"งานวันนี้คือการสร้างรหัสผ่าน 5 คำโดยใช้คำศัพท์" ต้องการ 5 แทนที่จะเป็นรหัสเดียว
KuanHulio

ตกลง ... 5 รหัสผ่าน .. แก้ไข ..
J42161217

ทำไมคุณไม่ทำให้พจนานุกรมพร้อมใช้งานในท้องถิ่นเพื่อย่อรหัสโดยหลีกเลี่ยงข้อความไฮเปอร์ลิงก์
sergiol

เพื่อให้ง่ายสำหรับคุณที่จะทดสอบ ...
J42161217

วิธีที่ดีที่สุดคือให้รหัสผู้ช่วยที่เรียบง่ายและไม่อัปโหลดเพื่อความสะดวกในการทดสอบมากกว่าการส่งข้อมูลของคุณน้อยลง นอกจากนี้พจนานุกรมควรจะเป็นตัวแปรโดยไม่ต้องจี้เซิร์ฟเวอร์ DNS ในเครื่อง (หรือแก้ไขhostsไฟล์)
wizzwizz4

4

ทุบตี ,66 65 ไบต์

for w in `shuf -n4 -`;{((l+=${#w}));printf ${w^};};bc<<<$l*5.7004

ลองออนไลน์!

พจนานุกรมถูกเรียกคืนโดย STDIN สลับคำทั้งหมดในพจนานุกรมและส่งออกก่อน 4

สำหรับแต่ละคำให้เพิ่มความยาวเป็น var l และสะท้อนคำที่เป็นตัวพิมพ์ใหญ่ ในที่สุดเรียก bc เพื่อทำคณิตศาสตร์

วิธีแก้ปัญหา Awk 112 ไบต์สี่รหัสผ่าน:

shuf -n16 -|xargs -n4|awk '{for(i=1;i<5;i++)printf toupper(substr($i,1,1))substr($i,2);print(length($0)-3)*5.7}'

3

(นี่คือการปรับคำตอบของ Martmists แต่ฉันไม่มีตัวแทนที่จะแสดงความคิดเห็น)

Python, 88ไบต์

g={*f}
exec('x="".join(g.pop().title()for i in "a"*4);print(x,len(x)*5.700439718);'*5)

โดยการใช้ประโยชน์จากsetnondeterministic คุณสามารถหลีกเลี่ยงการนำเข้าไลบรารีแบบสุ่มใด ๆ ได้


สิ่งนี้สร้างผลลัพธ์เดียวกันสำหรับฉันอย่างสม่ำเสมอ set(f).pop()ถ้ามันไม่ทำงานในการดำเนินงานบางส่วนแล้วคุณสามารถบันทึกไม่กี่ไบต์โดยการทำ
Jonathan Allan

1
ฉันไม่คิดว่ามันจะถูกต้องจริงๆ มันไม่ได้กำหนดไว้ดังนั้นจึงไม่รับประกันว่าจะใช้รหัสผ่านเดียวกัน แต่ในทางปฏิบัติมันไม่ค่อยจะสร้างผลลัพธ์ที่แตกต่างกัน
DJMcMayhem

ฉันสงสัยว่าอาจขึ้นอยู่กับการนำไปใช้งาน ฉันทำมันใน Anaconda Python 3 Windows ที่ติดตั้งใหม่และมันใช้งานได้ อย่างไรก็ตามset(f).pop()มันใช้งานไม่ได้ฉันลองแล้ว มันให้ผลลัพธ์เดียวกันทุกครั้ง
เดน

"ในทางปฏิบัติมันไม่ค่อยสร้างผลลัพธ์ที่แตกต่าง" - สำหรับฉันนี่เป็นตัวอย่าง: pastebin.com/raw/ZHiHgzxV
dain

@dain ฉันอยากรู้ โปรดให้ข้อมูลเกี่ยวกับการสร้าง Python ของคุณ
wizzwizz4

3

Japt , 30 ไบต์

5Ç[V=Uö4 ®g u +Zt1ìMm52 *Vl]¸

ลองออนไลน์!


ดี! แต่น่าเสียดายที่มันจะสร้างรหัสผ่านเดียวกัน 5 ครั้งและมันควรจะแตกต่างกันทุกครั้ง ..
เอียนวอร์ด

นี่อาจเป็น 30 ตัวอักษร แต่อย่างน้อยใน UTF-8 ระบบของฉันจะบันทึกที่ 35 ไบต์
CVn

1
@ MichaelKjörling Japt ใช้ ISO 8859-1 ไม่ใช่ UTF-8
Dennis

@Dennis ที่น่าสนใจ ขอขอบคุณ.
CVn


2

Mathematica, 71 ไบต์

สมมติว่าพจนานุกรมโหลดลงในอาร์เรย์dแล้ว

Table[{#,Log[2,52]StringLength[#]}&[""<>Capitalize@d~RandomSample~4],5]

ชี้แจง:

                                        Capitalize@d                    - Capitalize all the dictionary
                                                    ~RandomSample~4     - make an array with 4 values. By default values can not repeat.
                                    ""<>                                - Concatenate with empty string to turn array into single string.
      {#,Log[2,52]StringLength[#]}&[                               ]    - Put current string next to log(2,52) times length of current string
Table[                                                              ,5] - Repeat this 5 times.

แล้วหมายเลขเอนโทรปีล่ะ!
Jonathan Allan

โอ๊ะพลาดนิดหน่อย Updated
เอียนมิลเลอร์

2

ColdFusion 216 ไบต์

p={};z=arrayLen(c);for(x=0;x<5;x++){pw="";r={};while(structCount(r)<4){n=RandRange(1,z);r.append({"#c[n]#":true});}for(w in structKeyList(r)){pw&=REReplace(w,"\b(\w)","\u\1","All");};p.append({"#pw#":57*len(pw)/10})}

ใช้งานได้ใน ColdFusion 11+ และ Lucee 4.5+

หากต้องการเรียกใช้: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai

ลิงก์ TryCF มีสนามกอล์ฟน้อยกว่า แต่เป็นรหัสเดียวกัน

ฉันไม่ได้คาดหวังว่าจะได้คำตอบในการแข่งขันกอล์ฟ ฉันแค่อยากจะเห็นสิ่งที่จะใช้ในการท้าทายนี้ใน ColdFusion โดยเฉพาะอย่างยิ่งเนื่องจากมี CF ไม่มากในคำตอบเหล่านี้ :-) หลังจากการตั้งค่ามันสั้นกว่าที่ฉันคาดไว้อย่างน่าประหลาดใจ

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



2

Python 3, 252 ไบต์

นี่เป็นความท้าทายครั้งแรกของฉันที่ฉันได้ทำ! ฉันรู้ว่ามีคำตอบอื่น ๆ ของ Python อยู่ที่นี่ (อาจจะดีกว่าของฉัน) แต่นี่ดูสนุกและฉันก็อยากลองต่อไป นี่คือเวอร์ชั่น golfed:

import random, math
with open("d") as f: d=f.read()
l=d.split()
for a in range(5):
 u=[]
 p=""
 for b in range(4):
  w=random.choice([w for w in l if not w in u and len(w)>=4])
  u.append(w)
  w=w.title()
  p+=w
 print("%s %s"%(p,math.log2(52)*len(p)))

ฉันจะโพสต์ลองออนไลน์! ลิงก์ แต่ไม่รองรับไฟล์หลายไฟล์ ดังนั้นนี่คือลิงค์ repl.it: https://repl.it/InIl/0

นอกจากนี้ยังเป็นรุ่นที่ไม่ได้แต่งแต้ม:

import random
import math
with open("d") as f:
    dictionary = f.read() #this is the dictionary text file, simply saved as "d" as to use as few bytes as possible
words = dictionary.split() #here we turn that dictionary string into a list
for a in range(5): #here we iterate through 5 passwords
    used_words = []
    password = ""
    for b in range(4): #here we iterate through the 4 words in each password
        word = ""
        word = random.choice([word for word in words if not word in used_words and len(word) >= 4]) #Thanks to blackadder1337 from #python on freenode IRC for helping me with this.
        used_words.append(word)
        word = word.title()
        password = password + word
    print("%s %s"%(password, math.log2(52) * len(password)))

อย่างที่ฉันบอกนี่เป็นครั้งแรกที่ฉันใช้รหัส gofling ดังนั้นฉันจึงมั่นใจว่านี่น่าจะดีขึ้นมาก


ยินดีต้อนรับสู่ PPCG!
เทย์เลอร์สกอตต์

2

tcl, 137

ไม่ใช่ผู้ชนะแน่นอน แต่ฉันคิดว่ามันสามารถเป็นสนามกอล์ฟได้อีกเล็กน้อย

time {set p "";time {set p [string totitle [lindex $d [expr int(rand()*[llength $d])]]]$p} 4;puts $p\ [expr 5.7004*[string length $p]]} 5

ตัวอย่าง - วัตถุประสงค์ของบรรทัดที่ 1 มีไว้เพื่อใส่เนื้อหาพจนานุกรมลงในตัวแปรเท่านั้นd


คุณอาจตีมันลงได้เนื่องจากรหัสผ่านต้องการ 4 คำแทน 5
KuanHulio

และคุณขอรหัสผ่าน 5 ตัวแทนที่จะเป็น 4 LOL! ฉันไม่ตรงกันตัวเลข!
sergiol

ฮ่าฮ่าฮ่า! @sergiol
KuanHulio

หนี้! @KuanHulio
sergiol

นั่นดีกว่า. งานที่ดี.
KuanHulio

0

เป็นกลุ่ม 87 การกดแป้น

qq:r!echo "$RANDOM"l<CR>D:w o|e w<CR>@"ev4bd:w|bp<CR>p0~wX~wX~wX~Y:.!wc -c<CR>A*5.7003<Esc>:.!bc<CR>PJq4@q

wสันนิษฐานว่าพจนานุกรมอยู่ในไฟล์ชื่อ จะใช้คำที่ต่อเนื่องกัน 4 คำเสมอ

:

qq                       Start recording a macro named 'q'
:r!echo "$RANDOM"l<CR>   Append the result of the shell command `echo "$RANDOM"l`
D                        Delete what you just appended
:w o|                    Save the buffer to the file 'o' and ..
e w<CR>                  Open the file 'w'
@"                       Execute the text we deleted as a normal-mode command
                         This will move the cursor a random number of characters
                         to the right
e                        Go to the end of the next word
v4bd                     Delete 4 words backwards
:w|                      Save the file and ..
bp<CR>                   Open the last buffer (the 'o' file)
p                        Paste the 4 words we deleted
0                        Move the cursor to the beginning of the line
~wX~wX~wX~               Remove the spaces between the words and capitalize
Y                        Copy current line
:.!wc -c<CR>             Pipe the current line through 'wc -c'
A*5.7003<Esc>            Append "*5.7003" to the end of the line
:.!bc<CR>                Pipe the current line through 'bc'
P                        Paste the password above the current line
J                        Join with line bellow
q                        Stop recording the 'q' macro
4@q                      Run the 'q' macro 4 times

0

q / kdb +, 76 74 65 56 ไบต์

วิธีการแก้:

{(x;5.70044*(#)x)}(,/)@[;0;upper]each -4?" "vs(*)(0:)`:w

ตัวอย่าง:

q){(x;5.70044*(#)x)}(,/)@[;0;upper]each -4?" "vs(*)(0:)`:w
"RulingOverheadSaddensPriest"
153.9119

คำอธิบาย:

อ่านในรายการคำแยกเป็น "" เลือกคำที่สุ่ม 4 คำจากรายการนี้ตัวอักษรตัวพิมพ์ใหญ่ตัวแรกของแต่ละคำจากนั้นรวมเข้าด้วยกัน ฟีดนี้เป็นฟังก์ชั่นแลมบ์ดาซึ่งส่งคืนรหัสผ่านและ 'เอนโทรปี' ที่คำนวณได้:

                                                     `:w / the wordlist is a file called 'w'
                                                 (0:)    / read in the file list (\n separated list)
                                              (*)        / take first (and only) item in the list
                                         " "vs           / split this on " "
                                      -4?                / take 4 random items from this list, neg means 'dont put back'
                      @[; ;     ]                        / apply a function to variable at indices (variable is implicit)
                           upper                         / uppercase (the function being applied)
                         0                               / index 0, the first character
                                 each                    / each of the 4 random items
                  (,/)                                   / 'raze' (flatten lists)
{                }                                       / anonymous lambda function
 (x;            )                                        / a 2-item list, x is first item
            (#)x                                         / count x, return the length of the list
    5.70044*                                             / multiply by 5.70044

หมายเหตุ:

ฉันยุบและใช้ 5.70044 แทน2 xlog 52 xexp...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.