Cứu giúp! Tôi quên mật khẩu của tôi!


24

Cứu giúp! Tôi vừa đăng nhập vào Stack Exchange, nhưng tôi quên mật khẩu của mình là gì! Tôi cần một cách để giải quyết nó trước khi tôi đăng xuất.

May mắn thay, tôi là một hacker xuất sắc. Tôi không chỉ có thể tìm thấy hàm băm của mật khẩu mà còn tìm thấy thuật toán băm của Stack Exchange! Nó lấy giá trị ASCII của mỗi chữ số nhân với vị trí của chữ số đó, sau đó tổng hợp tất cả các giá trị đó lại với nhau. Ví dụ:

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

Tôi nhớ rằng mật khẩu của tôi dài 3 chữ số và mỗi ký tự là một số nằm trong khoảng từ 0 đến 5 (như vậy nó sẽ khớp với biểu thức chính quy ^[0-5]{3}$:), nhưng vẫn còn quá nhiều khả năng để đoán. Tôi cần một chương trình có thể chuyển đổi một hàm băm trở lại thành mật khẩu tiềm năng, nhưng mặc dù là một hacker chuyên nghiệp, tôi không thể mã hóa để cứu mạng tôi! Tôi đã có thể viết các bài kiểm tra này bằng tay:

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

Một trong số các bạn có thể viết một chương trình cho tôi để lấy một hàm băm và in tất cả các mật khẩu có thể tôi đã sử dụng không?

Đầu vào sẽ luôn có thể tạo ra ít nhất một mật khẩu hợp lệ. Bất kỳ định dạng đầu ra đều được cho phép, miễn là các chuỗi có thể được xác định rõ ràng. Tôi cũng không quan tâm đến các số 0 hàng đầu, vì vậy nếu mật khẩu tiềm năng là 001, tôi cũng sẽ chấp nhận 01hoặc 1.

Xin hãy giúp tôi khỏi bị khóa khỏi Stack Exchange!

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!


Không phải 1là giá trị Ascii 49thay vì 48?
LiefdeWen

1
Các trường hợp kiểm tra @LordFarquaad trông ổn nhưng ví dụ nên "135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen 17/07/17

1
phải được phân cách bằng dấu phẩy (dấu phẩy được theo sau bởi một hoặc nhiều khoảng trắng cũng được) Tại sao định dạng đầu ra hạn chế? Chúng tôi thường cho phép các định dạng linh hoạt
Luis Mendo

1
Thông thường ở đây là để nói một cái gì đó như "bất kỳ định dạng ouput nào được cho phép, miễn là các chuỗi có thể được xác định rõ ràng". Hoặc có thể cho phép bất kỳ dấu tách không số. Nếu bạn thay đổi nó, hãy thông báo cho người trả lời hiện tại bằng một bình luận trong câu trả lời của họ
Luis Mendo

1
@FelipeNardiBatista Yep, các số 0 hàng đầu là tùy chọn. Tôi nhớ tôi đã sử dụng 3 chữ số, vì vậy nếu tôi nhìn thấy 54tôi có thể tìm ra các số 0 ở phía trước.
Chúa Farquaad

Câu trả lời:



9

C , 113 108 byte

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

Thật là độc đáo để xem những gì có nghĩa là đầu ra, đầu ra có định dạng: 200010

Tất cả mật khẩu được viết dưới dạng 3 chữ số mà không có dấu phân cách.


2
Này, mã tôi có thể đọc! Đẹp tương phản với Jelly và như vậy. +1 để sử dụng ngôn ngữ cổ điển. :)
tự đại diện

8

Thạch , 16 byte

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

Một liên kết đơn thể trả về một danh sách các danh sách các chữ số.

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

Làm sao?

Ṿ€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?


4

MATL , 20 byte

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

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

Giải trình

'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 byte

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},");}

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


Tôi đã đưa ra lời khuyên kỹ lưỡng hơn trước đây, nhưng tôi đã không làm cho nó hoạt động tốt. Hiện tại, tối ưu hóa đơn giản của tôi là sử dụng Console.Write($"{i%48}{j%48}{k%48},");cho đầu ra thay vì xây dựng giá trị trả về và loại bỏ các dấu ngoặc không cần thiết xung quanh câu lệnh if để lưu 8 byte.
Kamil Drakari

Tôi đã thử tùy chọn đó trước đây, nhưng Lambda yêu cầu giá trị trả về. Loại bỏ các dấu ngoặc sẽ làm việc mặc dù. Cảm ơn :)
jkelm 17/07/17

Lambda yêu cầu một giá trị trả về nếu bạn xác định nó là Func<int,string>, nhưng nếu bạn xác định nó là Action<int>giá trị trả về.
Kamil Drakari

Không nhận ra điều đó! Tôi chưa quen với cả c # và chơi gôn, nhưng đã quyết định thử nó khi tôi không có gì khác để làm trong công việc. Cảm ơn một lần nữa cho những lời khuyên. Tôi rất thích hợp với họ.
jkelm

1
Nếu bạn chơi với sự không rõ ràng giữa charinttrong C #, bạn có thể khai báo các biến lặp của mình như chartrong vòng lặp đầu tiên và vẫn thực hiện phép tính băm chính xác như bạn làm trong khi đơn giản hóa Console.Write()câu. Do đó, bạn có thể có được một giải pháp 119 byte thích hợp. Hãy thử trực tuyến!
Charlie

2

Than , 33 byte

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

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

Một cách tiếp cận tương tự với các câu trả lời khác: ba lần lặp từ 0 đến 5, tính toán hàm băm và in trạng thái của các biến lặp nếu nó trùng với hàm băm đầu vào.

Liên kết đến phiên bản dài dòng .


2

CJam , 26 25 byte

-1 byte nhờ Challenger5

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

Khối ẩn danh mong đợi hàm băm trên ngăn xếp (dưới dạng số nguyên) và để lại kết quả trên ngăn xếp (dưới dạng danh sách các chuỗi).

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

Giải trình

: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 Oh, uh ... Tôi thậm chí không nhìn thấy điều đó ở nơi đầu tiên nên tôi đoán đó là điều may mắn
Business Cat

{:H;6Zm*{s:i3,:).*:+H=},}ngắn hơn 1 byte. Nó sử dụng các chuỗi chữ số trong bộ lọc thay vì số như sử dụng m*phạm vi tự động.
Trái cây Esolanging

@ Challenger5 Rất vui, cảm ơn!
Mèo kinh doanh

2

Java, 162 byte

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

2

JavaScript (Firefox 30-57), 72 byte

n=>[for(i of s="012345")for(j of s)for(k of s)if(n-i-j*2-k*3==288)i+j+k]


1

QBIC , 40 byte

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

Giải trình

[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 byte

-5 byte nhờ Jarko Dubbeldam

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

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

đọc số từ stdin; trả về một ma trận trong đó các hàng là các ký tự.

Nó tạo ra tất cả các bộ ba chữ số có thể có ở định dạng ma trận ( b), tính toán sản phẩm ma trận b * [1,2,3], lấy các hàng bkhớp với nhau (trừ đi 288đầu vào 1*48+2*28+3*48) và trả về chúng.


1
t(t(m))là một tốc ký choas.matrix(m)
JAD
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.