ช่วยด้วย! ฉันลืมรหัสผ่าน!


24

ช่วยด้วย! ฉันเพิ่งเข้าสู่ Stack Exchange แต่ฉันลืมรหัสผ่านของฉัน! ฉันต้องการวิธีการทำงานก่อนที่จะออกจากระบบ

โชคดีที่ฉันเป็นแฮ็คเกอร์ที่ยอดเยี่ยม ไม่เพียง แต่ฉันสามารถค้นหาแฮชของรหัสผ่านของฉัน แต่ฉันยังพบอัลกอริทึมการแฮชของ Stack Exchange! มันต้องใช้ค่า ASCII ของแต่ละหลักคูณด้วยสถานที่ของตัวเลขนั้นแล้วรวมค่าทั้งหมดเหล่านั้นเข้าด้วยกัน ตัวอย่างเช่น:

"135" -> 1*49 + 2*51 + 3*53 = 310

ฉันจำได้ว่ารหัสผ่านของฉันมีความยาว 3 หลักและตัวละครแต่ละตัวมีตัวเลขระหว่าง 0 ถึง 5 รวม (ซึ่งจะตรงกับ regex:) ^[0-5]{3}$แต่ก็มีความเป็นไปได้ที่จะเดาได้มากเกินไป ฉันต้องการโปรแกรมที่สามารถแปลงแฮชกลับเป็นรหัสผ่านที่เป็นไปได้ แต่แม้จะเป็นแฮ็กเกอร์ผู้เชี่ยวชาญ แต่ฉันไม่สามารถเขียนโค้ดเพื่อช่วยชีวิตฉันได้! ฉันสามารถเขียนแบบทดสอบเหล่านี้ด้วยมือแม้ว่า:

input -> output
288   -> 000                      // lowest possible hash
290   -> 200, 010
298   -> 022, 050, 103, 131, 212, 240, 321, 402, 430, 511   
318   -> 555                      // highest possible hash

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

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

โปรดช่วยฉันจากการถูกล็อกจากการแลกเปลี่ยนสแต็ค!

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะชนะ!


ไม่ใช่1ค่า Ascii 49ของมันแทนที่จะเป็น48?
LiefdeWen

1
กรณีทดสอบ @LordFarquaad ดูดี แต่ควรเป็นตัวอย่าง"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen

1
ต้องคั่นด้วยเครื่องหมายจุลภาค (เครื่องหมายจุลภาคตามด้วยเว้นวรรคหนึ่งรายการขึ้นไปก็โอเคด้วย)ทำไมรูปแบบเอาต์พุตที่ จำกัด ? เราอนุญาตรูปแบบที่ยืดหยุ่น
Luis Mendo

1
ปกติที่นี่จะพูดอะไรบางอย่างเช่น "รูปแบบ ouput ใด ๆ ที่ได้รับอนุญาตตราบใดที่สตริงสามารถระบุได้อย่างชัดเจน" หรืออาจอนุญาตให้มีตัวคั่นที่ไม่ใช่ตัวเลข หากคุณเปลี่ยนให้แจ้งผู้ตอบปัจจุบันพร้อมความคิดเห็นในคำตอบ
Luis Mendo

1
@FelipeNardiBatista ใช่แล้วศูนย์นำหน้าเป็นตัวเลือก ฉันจำได้ว่าฉันใช้เลข 3 ตัวดังนั้นถ้าฉันเห็น54ฉันสามารถหาเลขศูนย์หน้าได้
ลอร์ด Farquaad

คำตอบ:



9

C , 113 108 ไบต์

f(int h){int i=47,j,k;while(++i<54)for(j=47;++j<54)for(k=47;++k<54;)if(h==i+j+j+k*3)printf("%c%c%c",i,j,k);}

มันไม่ซ้ำกันเพื่อดูสิ่งที่มีความหมายสำหรับการส่งออกการส่งออกในรูปแบบ: 200010

รหัสผ่านทั้งหมดจะถูกเขียนเป็นตัวเลข 3 หลักโดยไม่มีตัวคั่น


2
เฮ้รหัสฉันอ่าน! ความแตกต่างที่ดีกับเยลลี่และเช่น +1 สำหรับการใช้ภาษาคลาสสิก :)
ไวด์การ์ด

8

เยลลี่ขนาด 16 ไบต์

Ṿ€Oæ.J
6Ḷṗ3Ç⁼¥Ðf

ลิงก์ monadic ส่งคืนรายการของตัวเลข

ลองออนไลน์!

อย่างไร?

Ṿ€Oæ.J - Link 1, hash: list of integers (the digits of a password)
Ṿ€     - unevaluate €ach (giving a list of characters)
  O    - cast to ordinals (Ṿ€O could actually be replaced with +48 too)
     J - range of length (i.e. [1,2,3] in all use-cases)
   æ.  - dot product

6Ḷṗ3Ç⁼¥Ðf - Main link: number, n
6Ḷ        - lowered range of 6 = [0,1,2,3,4,5]
  ṗ3      - Cartesian power with 3 = [[0,0,0],[0,0,1],...,[5,5,5]] (all passwords)
       Ðf - filter keep if:
      ¥   -   last two links as a dyad (right implicitly n):
    Ç     -     call last link (1) as a monad
     ⁼    -     equals right?

5

Python 2 , 126 75 ไบต์

-2 ขอบคุณ @ArnoldPalmer

lambda h:[(P/36,P%36/6,P%6)for P in range(216)if P/36+P%36/6*2+P%6*3==h&31]

ลองออนไลน์!


หากคุณแทนที่ทั้งสองP/6/6ด้วยP/36คุณจะประหยัด 2 ไบต์
Arnold Palmer

ตรงนี้เป็นสิ่งที่ฉันกำลังจะเขียน +1
musicman523


4

MATL , 20 ไบต์

'0':'5'3Z^t3:*!si=Y)

ลองออนไลน์!

คำอธิบาย

'0':'5'   % Push inclusive range from '0' to '5', that is, '012345'
3Z^       % Cartesian power with exponent 3. Each Cartesian tuple is a row
t         % Duplicate
3:        % Push [1 2 3]
*         % Multiply element-wise with broadcast
!s        % Sum of each row
i         % Input number
=         % Logical mask of values that equal the input
Y)        % Use as logical index into the rows of the matrix. Implicit display



2

C # (. NET Core) , 133 131 125 123 ไบต์

n=>{int i,j,k;for(i=48;i<54;++i)for(j=48;j<54;++j)for(k=48;k<54;++k)if(i+j*2+k*3==n)Console.Write($"{i%48}{j%48}{k%48},");}

ลองออนไลน์!


ก่อนหน้านี้ฉันให้คำแนะนำอย่างละเอียดมากขึ้น แต่ฉันไม่ได้ทำงานให้ถูกต้อง สำหรับตอนนี้การเพิ่มประสิทธิภาพอย่างง่ายของฉันคือการใช้Console.Write($"{i%48}{j%48}{k%48},");สำหรับเอาต์พุตแทนที่จะสร้างค่าส่งคืนและลบวงเล็บเหลี่ยมที่ไม่จำเป็นออกรอบคำสั่ง if เพื่อบันทึก 8 ไบต์
Kamil Drakari

ฉันลองตัวเลือกก่อนหน้านี้ แต่แลมบ์ดาต้องการค่าตอบแทน การลบวงเล็บจะทำงานได้ ขอบคุณ :)
jkelm

แลมบ์ดาต้องการค่าตอบแทนถ้าคุณกำหนดเป็นFunc<int,string>แต่ถ้าคุณกำหนดตามAction<int>นั้นจะไม่คาดหวังค่าส่งคืน
Kamil Drakari

ไม่ทราบว่า! ฉันใหม่สำหรับทั้ง c # และการเล่นกอล์ฟ แต่ตัดสินใจลองเมื่อฉันไม่มีอะไรทำที่ทำงาน ขอบคุณอีกครั้งสำหรับเคล็ดลับ ฉันเอาใจพวกเขาอย่างมาก
jkelm

1
หากคุณเล่นด้วยความกำกวมระหว่างcharและintใน C # คุณสามารถประกาศตัวแปรการวนซ้ำcharในวงแรกและยังคงทำการคำนวณแฮชเหมือนกับที่คุณทำในขณะที่ทำให้Console.Write()ประโยคง่ายขึ้น ดังนั้นคุณจะได้รับโซลูชัน 119 ไบต์ที่เหมาะสม ลองออนไลน์!
Charlie

2

ถ่าน 33 ไบต์

F⁶F⁶F⁶¿⁼⁺℅Iι⁺×℅Iκ²×℅Iλ³Iθ«IιIκIλ⸿

ลองออนไลน์!

วิธีการที่คล้ายกันกับคำตอบอื่น ๆ : วนซ้ำสามครั้งจาก 0 ถึง 5, คำนวณแฮชและพิมพ์สถานะของตัวแปรการทำซ้ำหากมันสอดคล้องกับอินพุตแฮช

เชื่อมโยงไปยังรุ่นอย่างละเอียด


2

CJam , 26 25 ไบต์

-1 ไบต์ขอบคุณ Challenger5

{:H;6Zm*{s:i3,:).*:+H=},}

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

ลองออนไลน์!

คำอธิบาย

:H;    e# Store the hash in H.
6Zm*   e# 3rd Cartesian power of [0 1 2 3 4 5].
{      e# For each tuple in the power:
 s     e#  Stringify the tuple.
 :i    e#  Get the code point of each digit.
 3,:)  e#  Push [1 2 3].
 .*    e#  Element-wise multiplication of the two lists.
 :+    e#  Sum the result.
 H=    e#  Check if it's equal to the hash.
},     e# Filter the tuples to only ones for which this block gave a truthy result.

@ LordFarquaad โอ้เอ่อ ... ฉันไม่เคยเห็นมาก่อนเลยฉันคิดว่านั่นเป็นโชคดี
Business Cat

{:H;6Zm*{s:i3,:).*:+H=},}สั้นลง 1 ไบต์ มันใช้สายอักขระตัวเลขในตัวกรองมากกว่าตัวเลขเพื่อใช้m*ช่วงอัตโนมัติของ
แยกผลไม้

@ Challenger5 ดีมากขอบคุณ!
แมวธุรกิจ

2

Java, 162 ไบต์

static void f(int n){for(int i=48;i<54;i++){for(int j=48;j<54;j++){for(int k=48;k<54;k++){if(i+j*2+k*3==n)System.out.println((char)i+""+(char)j+""+(char)k);}}}}



1

QBICขนาด 40 ไบต์

[0,5|[0,5|[0,5|~a+b+b+c+c+c+288=:\?a,b,c

คำอธิบาย

[0,5|                Make a FOR loop run through the possible digits for pos 1, called a
[0,5|                Loop for #2, b
[0,5|                Loop for #3, c
                     Calculate the hash by taking a once, b twice and c thrice, 
                     and raising all to their ASCII codepoints
 a+b+b+c+c+c+288       
~               =:   IF thta is euqal to the given hash (read from cmd line)
\?a,b,c              THEN print the digits
                     (the IF and the FOR loops are auto-closed by QBIC)

1

R , 67 62 61 ไบต์

-5 ไบต์ขอบคุณ Jarko Dubbeldam

b=t(t(expand.grid(rep(list(0:5),3))));b[b%*%1:3==scan()-288,]

ลองออนไลน์!

อ่านหมายเลขจากstdin; ส่งกลับเมทริกซ์ที่แถวเป็นตัวละคร

มันจะสร้างตัวเลขสามส่วนที่เป็นไปได้ทั้งหมดในรูปแบบเมทริกซ์ ( b) คำนวณผลิตภัณฑ์เมทริกซ์b * [1,2,3]ใช้แถวของการbจับคู่ (ลบออก288จากอินพุตซึ่งคือ1*48+2*28+3*48) และส่งกลับค่า


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