Membantu! Saya lupa kata sandi saya!

24

Membantu! Saya baru saja masuk ke Stack Exchange, tetapi saya lupa kata sandi saya! Saya perlu cara untuk menyelesaikannya sebelum saya logout.

Untungnya, saya adalah peretas yang hebat. Tidak hanya saya dapat menemukan hash kata sandi saya, tetapi saya juga menemukan algoritma hashing Stack Exchange! Dibutuhkan nilai ASCII dari setiap digit dikalikan dengan tempat digit itu, lalu menjumlahkan semua nilai itu bersama-sama. Sebagai contoh:

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

Saya ingat kata sandi saya panjangnya 3 digit, dan setiap karakter adalah angka antara 0 dan 5 inklusif (sehingga akan cocok dengan regex:) ^[0-5]{3}$, tapi itu masih terlalu banyak kemungkinan untuk ditebak. Saya memerlukan sebuah program yang dapat mengubah hash kembali menjadi kata sandi potensial, tetapi meskipun merupakan seorang peretas ahli, saya tidak dapat kode untuk menyelamatkan hidup saya! Saya bisa menulis tes ini dengan tangan:

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

Bisakah salah satu dari Anda menulis sebuah program untuk saya yang akan mengambil hash dan mencetak semua kata sandi yang mungkin bisa saya gunakan?

Input akan selalu dapat menghasilkan setidaknya satu kata sandi yang valid. Semua format output diperbolehkan, selama string dapat diidentifikasi dengan jelas. Saya juga tidak khawatir tentang memimpin nol, jadi jika kata sandi potensial 001, saya juga akan menerima 01atau 1.

Tolong bantu saya agar tidak dikunci dari Stack Exchange!

Mencetak gol

Ini , jadi jawaban tersingkat di setiap bahasa menang!

Tuan Farquaad
sumber
Bukankah 1's nilai Ascii 49bukan 48?
LiefdeWen
1
@LordFarquaad test case terlihat baik-baik saja tetapi contohnya seharusnya"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
1
harus dibatasi oleh koma (koma diikuti oleh satu atau lebih spasi juga ok) Mengapa format keluaran terbatas? Kami biasanya mengizinkan format yang fleksibel
Luis Mendo
1
Yang biasa di sini adalah mengatakan sesuatu seperti "format ouput apa pun diizinkan, selama string dapat diidentifikasi dengan jelas". Atau mungkin mengizinkan pemisah non-numerik. Jika Anda mengubahnya, beri tahu penjawab saat ini dengan komentar dalam jawaban mereka
Luis Mendo
1
@FelipeNardiBatista Yap, nol terkemuka adalah opsional. Saya ingat saya menggunakan 3 digit, jadi jika saya hanya melihat 54saya bisa menghitung nol di depan.
Lord Farquaad

Jawaban:

10

05AB1E , 9 byte

5Ý3ãʒÇƶOQ

Cobalah online!

Mengembalikan daftar daftar digit.

Erik the Outgolfer
sumber
3
Itu membuat kata sandi yang cukup baik.
Veedrac
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);}

Sangat unik untuk melihat apa yang dimaksudkan untuk output, output dari format: 200010

Semua kata sandi ditulis sebagai 3 digit tanpa pembatas.

xanoetux
sumber
2
Hei, kode yang bisa saya baca! Sangat kontras dengan Jelly dan semacamnya. +1 untuk menggunakan bahasa klasik. :)
Wildcard
8

Jelly , 16 byte

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

Tautan monadik mengembalikan daftar daftar digit.

Cobalah online!

Bagaimana?

Ṿ€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?
Jonathan Allan
sumber
5

Python 2 , 126 75 byte

-2 Terima kasih kepada @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]

Cobalah online!

Felipe Nardi Batista
sumber
Jika Anda mengganti keduanya P/6/6dengan P/36, Anda menghemat 2 byte
Arnold Palmer
Inilah yang akan saya tulis, +1
musicman523
@Felipe Nardi Batista, saya tidak tahu mengapa itu akan terjadi
Arnold Palmer
4

MATL , 20 byte

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

Cobalah online!

Penjelasan

'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
Luis Mendo
sumber
3

Python 2 , 81 byte

lambda h:[(a,b,c)for a in r for b in r for c in r if a+2*b+3*c+288==h]
r=range(6)

Cobalah online!

musicman523
sumber
3

Haskell, 71 70 64 61 byte

l=[0..5]
f p=[show=<<[a,b,c]|a<-l,b<-l,c<-l,p-288==a+2*b+3*c]

Cobalah online!

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

Cobalah online!

jkelm
sumber
Saya memberikan saran yang lebih menyeluruh sebelumnya, tetapi saya tidak berhasil dengan benar. Untuk saat ini optimasi sederhana saya adalah menggunakan Console.Write($"{i%48}{j%48}{k%48},");untuk output daripada membangun nilai kembali, dan menghapus tanda kurung yang tidak perlu di sekitar pernyataan if untuk menyimpan 8 byte.
Kamil Drakari
Saya mencoba opsi itu sebelumnya, tetapi Lambda membutuhkan nilai kembali. Menghapus braket akan berhasil. Terima kasih :)
jkelm
Lambda membutuhkan nilai kembali jika Anda mendefinisikannya Func<int,string>, tetapi jika Anda mendefinisikannya Action<int>maka tidak mengharapkan nilai kembali.
Kamil Drakari
Tidak menyadarinya! Saya baru mengenal c # dan golf, tetapi memutuskan untuk mencobanya ketika saya tidak punya pekerjaan di tempat lain. Terima kasih lagi untuk tipsnya. Saya sangat menghargai mereka.
jkelm
1
Jika Anda bermain dengan ambiguitas antara chardan intdi C #, Anda dapat mendeklarasikan variabel iterasi Anda seperti chardi loop pertama dan masih melakukan perhitungan hash persis seperti yang Anda lakukan saat menyederhanakan Console.Write()kalimat. Dengan demikian Anda bisa mendapatkan solusi 119 byte yang tepat. Cobalah online!
Charlie
2

Arang , 33 byte

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

Cobalah online!

Pendekatan yang mirip dengan jawaban lain: loop tiga kali dari 0 hingga 5, hitung hash dan cetak status variabel iterasi jika itu bertepatan dengan hash input.

Tautan ke versi verbose .

Charlie
sumber
2

CJam , 26 25 byte

-1 byte terima kasih kepada Challenger5

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

Blok anonim mengharapkan hash pada stack (sebagai integer) dan meninggalkan hasilnya pada stack (sebagai daftar string).

Cobalah online!

Penjelasan

: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.
Kucing Bisnis
sumber
@ LordFarquaad Oh, uh ... Saya bahkan tidak melihatnya di tempat pertama, jadi saya rasa itu beruntung
Bisnis Cat
{:H;6Zm*{s:i3,:).*:+H=},}lebih pendek 1 byte. Ini menggunakan string digit dalam filter daripada angka untuk menggunakan m*rentang otomatis.
Buah Esolanging
@ Challenger5 Bagus, terima kasih!
Business Cat
2

Java, 162 Bytes

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);}}}}
0x45
sumber
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]
Neil
sumber
1

Pyth, 18 byte

fqQs*VS3CMT^jkU6 3
isaacg
sumber
1

QBIC , 40 byte

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

Penjelasan

[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)
steenbergh
sumber
1

R , 67 62 61 byte

-5 byte berkat Jarko Dubbeldam

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

Cobalah online!

membaca nomor dari stdin; mengembalikan matriks di mana baris adalah karakter.

Ini menghasilkan semua trio kemungkinan digit dalam format matriks ( b), menghitung produk matriks b * [1,2,3], mengambil baris byang cocok (mengurangi 288dari input yang ada 1*48+2*28+3*48) dan mengembalikannya.

Giuseppe
sumber
1
t(t(m))adalah singkatan untukas.matrix(m)
JAD