Tulis program yang melakukan kombinasi brute force letter hingga kata "kata sandi" ditemukan

16

Program harus mencetak setiap kombinasi huruf (huruf kecil atau huruf besar, tidak masalah) dalam urutan abjad. Itu harus dimulai dengan adan kombinasi yang dicetak terakhir harus password.

Outputnya harus:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password
ST3
sumber
2
Apakah pemisah harus spasi, atau dapatkah saya menggunakan baris baru?
Ilmari Karonen
Ya Anda bisa, itu hanya perubahan kecil.
ST3

Jawaban:

32

Perl, 19 karakter

say for a..password

Gunakan baris baru sebagai pembatas, sesuai klarifikasi di atas. Jalankan dengan perl -M5.010(atau hanya perl -E 'say for a..password') untuk mengaktifkan fitur Perl 5.10+ say. Per meta , ini tidak dihitung sebagai karakter tambahan.

(Jika Anda bersikeras spasi sebagai pembatas, $,=$";say a..passwordhanya dua karakter lagi. Namun, itu juga sangat lambat dan boros memori, sampai-sampai tidak dapat digunakan dalam praktik, karena mencoba membangun seluruh daftar dalam memori sebelum mencetaknya.)

Ilmari Karonen
sumber
18

Ruby, 33 karakter (versi optimal tetapi lebih lama)

?a.upto('password'){|c|$><<c+' '}

Saya suka 'a'.upto('password'); itu memberitahu Anda persis apa yang dilakukannya. Ruby hebat dan ekspresif seperti itu.:D

Tentu saja, print c,' ' juga akan jauh lebih jelas, tetapi menggunakan $>dua karakter lebih pendek.

Ruby, 29 25 karakter (versi lambat)

$><<[*?a..'password']*' '

Yang ini lebih pendek, tetapi mencetak semua token sekaligus, sehingga butuh waktu yang sangat lama untuk dijalankan!

Gagang pintu
sumber
1
Bagus, terutama yang pertama.
Cary Swoveland
Dalam versi lambat, (?a..'password').to_adapat disingkat menjadi[*?a..'password']
Paul Prestidge
6

Perl, 33 32 24 karakter

Solusi dalam 32 karakter:

$_=a;print$_++,$"until/passwore/

Tidak banyak yang bisa dikatakan tentang yang satu ini. Saya bisa mengurangi ini menjadi 27 karakter jika saya bisa menggunakan baris baru dan bukan spasi untuk memisahkan entri.

Ilmari Karonen menunjukkan bahwa ..panggilan internal ++, jadi solusi yang lebih baik (25 karakter) adalah:

print$_,$"for a..password

Dengan memanfaatkan opsi baris perintah Perl, berikut ini adalah solusi setara 24 karakter:

perl -l40e 'print for a..password'

Aturan untuk menghitung flag perl ada di sini, bagi mereka yang tidak terbiasa dengannya.

Tentu saja, solusi 21-karakter Ilmari masih lebih pendek, tetapi membutuhkan mesin yang dapat mengalokasikan sejumlah 129.052.722.140 string.

kotak roti
sumber
Bukankah .$"alih-alih ," "menyimpan karakter?
Tn. Llama
Yap, pengawasan total di pihak saya. Terima kasih.
kotak roti
6

Perl 6, 20 karakter

say "a".../password/

Anda tidak membutuhkan hal lain

Demayl
sumber
5

Python 2, 91

b=lambda n:n*' 'and b(n/26-(n%26<1))+chr(~-n%26+97)
i=0
exec"i+=1;print b(i);"*129052722140
feersum
sumber
4

PHP 38 37 36 karakter

<?for($w=a;$w<passwore;)echo$w++,~ß;

Anda harus mengatur penyandian ke ISO 8859-1 dan menonaktifkan peringatan.

lortabac
sumber
Saya tidak mengujinya, tetapi apakah benar-benar melakukannya ???
ST3
@ ST3 Ini adalah loop sederhana. Variabel $wawalnya diatur ke 'a' dan kemudian bertambah hingga mencapai nilai pertama setelah 'kata sandi' (string terakhir tidak dicetak).
lortabac
3
@ ST3 Ini adalah forloop biasa . Tidak ada yang aneh dalam kode ini, kecuali untuk 2 karakter terakhir, yang merupakan spasi putih terbalik. Lagi pula, ya, saya mengujinya hingga kata yang lebih pendek.
lortabac
1
@ ST3 Ini adalah tes dari passwoqske password. Karena pengkodean codepad bukan ISO 8859-1, saya harus mengganti dengan spasi putih.
lortabac
1
Anda dapat menyimpan char dengan $w<passworesebagai pengganti $w!=passwore.
Decent Dabbler
2

Ruby (40 karakter)

Menafsirkan string huruf az sebagai angka dalam basis 26, dengan a = 1, b = 2, ..., z = 26.

Jadi "kata sandi" dapat dianggap sebagai angka N =

16*(26**7) + 
1*(26**6) + 
19*(26**5) + 
19*(26**4) + 
23*(26**3) + 
15*(26**2) + 
18*(26**1) + 
4*(26**0)

Jika kami membiarkan s = "a"(yaitu: 1) dan kami melakukan (N-1) panggilan kes.succ! , s akan menjadi "password"(N). Dengan kata lain, N = 1 + (N-1).

Untuk contoh yang akan berjalan lebih cepat, untuk membuktikan perhitungan N sudah benar, anggap "pass"sebagai target, di mana N berada

16*(26**3) + 
1*(26**2) + 
19*(26**1) + 
19*(26**0)

dan

s = "a"
(N-1).times { s.succ! }
puts s #== "pass"

Karena kami ingin mencetak "a"juga, kami perlu

s = "`"
N.times { print(s.succ! + " ") }

Jadi kembali ke "kata sandi" penuh. N = 129052722140, pergi:

s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}

Saya mencari bentuk yang lebih ringkas 129052722140 == 0x1e0c2443dbtetapi tidak dapat menemukannya.

(Diperbarui untuk memperbaiki kekurangan pencetakan "a", terima kasih kepada Cary.)

Adam Prescott
sumber
1
Adam, itu pasti kau dalam pikiranku. Tidakkah Anda ingin memulai sebelum 'a'?
Cary Swoveland
Saya pikir apa yang Anda maksudkan adalah bahwa saya telah menggunakan Nalih-alih N-1dalam iterasi saya! Terima kasih, saya akan mengedit untuk memperbaikinya. (Meskipun 129052722140 adalah nomor yang menarik untuk Google :).)
Adam Prescott
1
0x1e0c2443db sama dengan karakter sebanyak 129052722139.
steenslag
Yang saya maksudkan adalah bahwa jika s=?a, s.succ!dimulai pada 'b'`.
Cary Swoveland
1
Dengan s=?adan N-1Anda mendapatkan 'b ... password'; dengan s =<backtick> dan NAnda mendapatkan 'a ... kata sandi'. SO meminta output untuk memulai 'a'. Itu saja.
Cary Swoveland
2

Javascript, 73

Ini adalah versi 73 karakter dari kode @Briguys ', yang hanya mencetak kombinasi huruf

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)

C5H8NNaO4
sumber
2

APL (Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

Secara teoritis, itu akan mencetak sampai PASSWORD, tapi saya mengalami kesalahan ruang kerja penuh setelah ZZZZ: array 5-dimensi terlalu mengagumkan.

EDIT: Pasti sudah terlalu lama sejak terakhir saya mengutak-atik APL. Beraninya aku merindukan perbandingan identitas ( ) !!!

Penjelasan

{...}: Mendeklarasikan fungsi yang ...
⎕A∘.,⍵: Mengambil produk luar dari penggabungan (Setiap kombinasi elemen dari operan kiri digabungkan dengan elemen dari operan kanan, seperti halnya Produk Cartesian) antara 26 huruf besar alfa ( ⎕A) dan argumen ( )

{...}¨: Dan untuk setiap elemen dari himpunan yang dihasilkan, hubungkan itu ke fungsi yang ...
⍞←⍵: mencetaknya
'PASSWORD '≡dan membandingkannya dengan 'PASSWORD '
: Jika perbandingan mengembalikan true ( 1), maka batalkan program.
: Lain hanya mengembalikan string yang dicetak.

: Akhirnya, fungsi luar berulang sendiri.

(Kemudian Anda mengambil produk luar atas concat antara 26 alpha dan 26 alpha, yang memberikan semua kombinasi 2 huruf, dan kemudian produk luar atas concat antara kombinasi 2 huruf dan 26 alpha, dll ... Sampai Anda mencapai PASSWORD yang memicu pembatalan)

' ': Percikan!! Itu memulai fungsi rekursif dengan karakter spasi.

TwiNight
sumber
2

Python 2 - 153 152 151 149 byte

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

Disimpan satu byte dengan menggunakan UPPERCASE dan satu dengan menggunakan baris baru, bukan spasi.

pppery
sumber
1

Naskah Golf 41

Karena kurangnya 'z'+1 == 'aa'logika, Golfscript tidak dapat memenangkan yang satu ini.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, buat array dari 0 hingga 168036262483
  • (; jatuhkan 0
  • {.. }%iterate over array
  • 27base konversi elemen ke basis 27 array
  • {96+}% tambahkan 96 ke setiap digit
  • ' '+ konversi ke string dan tambahkan spasi ke ujung
  • .96?0<* potong string ke nol jika berisi char 96
aaaaaaaaaaaa
sumber
1

Di Ruby, 39 40.

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

..atau 129052722140. (Sunting: sebelumnya saya punya 129052722. Saya telah kehilangan beberapa digit memotong dan menempel. Sebelumnya hex ( 0x7B13032) adalah untuk nomor yang salah.). Dipinjam a=?`dari @Doorknob untuk menyimpan karakter.

Cary Swoveland
sumber
Saya mencoba untuk memperbaikinya a=?` , kelihatannya agak aneh dan memiliki ruang ekstra pada akhirnya, tetapi setidaknya berhasil: P
Doorknob
Jadi dari mana angka 129052722 berasal? Menurut perhitungan saya, itu akan memberi Anda kisaran "a" ke "kwkokg" ... agak kecil.
kotak roti
@Breadbox Saya menghitung angka itu dengan metode berikut (maaf untuk pemformatan, tetapi komentar memiliki keterbatasan, eh?): ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end Sangat mudah untuk mengkonfirmasi ini benar dengan hanya mencetak beberapa urutan.
Cary Swoveland
@breadbox Anda benar. Lihat edit. Metode yang saya berikan dalam komentar adalah OK.
Cary Swoveland
Kesalahan Fencepost. Script Anda sedang menghitung menggunakan a = 1..z = 26. Anda harus menghitung a = 0..z = 25 untuk mendapatkan jumlah yang tepat. Menghapus -1 dari baris pertama, Anda akan mendapatkan 120699639557, yang (menambahkan satu untuk entri nol) cocok dengan perhitungan saya.
kotak roti
1

Javascript: 57 56 karakter (terima kasih C5H8NNaO4)

Berikut solusi yang menyertakan angka sebanyak mungkin karakter ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "passworc", "password")

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

Berikut biola untuk pengujian (dengan hanya 100 iterasi terakhir sehingga tidak mengunci browser Anda).

Briguy37
sumber
3
Solusi ini salah, tidak mengikuti spesifikasi.
Gagang Pintu
@ Doorknob - Ya, saya sebutkan itu dalam jawaban saya. Masih mencetak semua case dari persyaratan aslinya, tetapi juga mencetak semua case alpha-numeric.
Briguy37
Juga, setelah membaca kembali pertanyaan, jika saya menetapkan i ke 9 dalam kode saya, itu akan memenuhi SEMUA persyaratan pertanyaan kecuali untuk output contohnya, yang telah dia berikan pengecualian untuk (dan itu akan membawa kode ke 56 karakter ).
Briguy37
@ Briguy37 Spesifikasinya berkata print every **letter** combinationPokoknya, simpan karakter:{} -> ;
C5H8NNaO4
@ C5H8NNaO4: Kombinasi huruf apa yang tidak dicetak oleh solusi saya? Terima kasih atas tipnya!
Briguy37
1

Haskell, 101

main=putStrLn.concat.takeWhile(/="passwore ").tail.concat.iterate(\k->[x:y|x<-['a'..'z'],y<-k])$[" "]
Olathe
sumber
0

Befunge (72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

Mencetak string 'a' ke 'kata sandi' yang dipisahkan oleh spasi, lalu keluar.

Di bawah ini adalah versi yang hanya mencetak 9 * 9 = 81 kata pertama ('a' to 'dd'), untuk perbandingan. Ini 99*adalah jumlah iterasi yang harus dilakukan.

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_
FireFly
sumber
0

JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

biola - berhenti di "pa".

Namun ini mengulangi hal-hal.

Chiller matematika
sumber
Anda dapat menginisialisasi loop dengan i=s=0untuk menyimpan tiga karakter lagi.
Ry-
@minitech selesai.
Math chiller
1
Mengapa menyimpannya var? iadalah global sebelumnya; sekarang sadalah global. Anda bisa menyimpan kedua bola golf dalam kode golf, biasanya.
Ry-