Server domain mengharuskan semua karyawan memiliki kata sandi acak yang kuat dan sesuai dengan aturan berikut:
- Panjangnya tepat 15 karakter.
- Hanya karakter tipe keyboard (seperti yang ditunjukkan pada tipe kode di bawah). Mengajarkan penjualan untuk menggunakan kode ALT + NUMPAD tidak diizinkan.
- Setidaknya 1 huruf kecil:
abcdefghijklmnopqrstuvwxyz
- Setidaknya 1 huruf besar:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Setidaknya 1 digit angka:
0123456789
- Setidaknya 1 simbol:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
Untuk tujuan ini, TI telah menugaskan dan akan mendistribusikan Generator Kata Sandi Acak kepada semua karyawan. Semua karyawan akan diminta untuk menggunakan Penghasil Kata Sandi Acak. Persyaratan untuk Pembuat Kata Sandi Acak adalah, di samping pembatasan kata sandi di atas:
- Itu harus dapat menghasilkan semua permutasi dari semua karakter yang diijinkan.
- Itu harus menampilkan kata sandi yang dihasilkan di layar.
- Kode ini harus sekecil mungkin (dalam byte).
Silakan kirimkan solusi yang Anda usulkan dalam minggu depan.
correcthorsebatterystaple
Jawaban:
Mathematica (18)
Biarkan saya sedikit curang
PS tidak aman :)
sumber
Ruby,
7469 byteContoh saja secara acak dari rentang ascii 33 - 126 sampai semua kelas karakter hadir:
Ruby, 39 byte
Menggunakan penemuan pintar moose:
Edit untuk memuaskan massa:
Perhatikan bahwa aturan berubah setelah saya pertama kali memposting ini. Pada saat itu kedua entri sebelumnya diterapkan pada aturan. Saya juga ingin menunjukkan bahwa aturannya masih belum didefinisikan dengan baik:
"Permutasi". Tidak ada permutasi dari karakter yang diperbolehkan yang sesuai dengan aturan lainnya, karena permutasi dari set karakter yang diijinkan adalah sepanjang set karakter yang diijinkan itu sendiri (sementara password seharusnya sepanjang 15 karakter). Dan tidak ada pengulangan dalam permutasi. Namun entri pertama saya masih lebih "acak" daripada banyak jawaban baik lainnya yang telah di-upgrade-kan di sini.
Namun demikian, di sini Anda memilikinya. Mengizinkan pengulangan karakter dan garis bawah:
Ruby, 77 byte
Saya juga menggunakan
puts
bukannya yangp
ini karenap
mencetak string yang terlampir dalam "tanda kutip" dan beberapa karakter lolos dengan backslash.Ruby, 70 byte
Seperti yang ditunjukkan Ventero,
~
dapat dilewati di depan regex, danprint
dapat menggantikannyaputs$_
. Tetapi dengan output yang jelek ini menyebabkan Anda mungkin juga mencetak semua kata sandi yang ditolak, meremasnya menjadi satu-liner:Penjelasan
Seperti yang diminta.
$_
adalah variabel semi-magis yang berisi baris terakhir yang dibaca dari input - jadi Anda tidak selalu perlu menyimpannya, seperti ini . Namun di sini kita menggunakannya karena properti lain, yaitu bahwa~
operator menerapkan regex langsung ke sana, trik yang pertama kali saya pelajari dengan chron . Saya mengganti penggunaanall
, tetapi seharusnya cukup mudah dimengerti jika Anda mendapatkan sisanya ( lihat dokumen ).sumber
.all?{|r|~r}
harus dilakukan Apa yang$_=
harus dilakukan\W
di Ruby termasuk garis bawah_
? Di sebagian besar dialek regex saya tahu tidak. Dan jika kode Anda tidak dapat menghasilkan kata sandi di mana satu_
-satunya simbol non-alfanumerik, maka itu akan melanggar satu persyaratan. Pendekatan kedua sangat jelas melanggar persyaratan itu, tapi saya kira itu tidak diungkapkan dengan benar pada waktu itu.\W
tidak mengandung garis bawah di RegEx ( sumber ) yang kompatibel dengan Perl .sample
tidak mengulangi elemen, jadi kata sandi dengan elemen berulang tidak dapat dihasilkan oleh kode Anda. Bisakah Anda memperbaiki dua masalah ini untuk membuat jawaban Anda sesuai dengan pertanyaan? Melihat bagaimana solusi Anda adalah yang utama, kecuali Wolfram Alpha, alangkah baiknya jika Anda bisa menyesuaikan diri dan tetap memimpin. Saya kira itu tidak terlalu sulit.Java 8 -
354329319275267 karakterHanya untuk bersenang-senang, menggunakan lambdas dengan Java 8 - setiap output yang mungkin memiliki probabilitas yang sama ditemukan.
Ini menggunakan fakta bahwa karakter yang diizinkan memiliki kode ascii berturut-turut, dari 33 hingga 126.
Output sampel:
Program terkompresi:
class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}
sumber
while(a+A+d+p<4)
bersama dengana|=1
bukana++
? Atau gunakan bitmasks, yaitu hal-hal sepertia|=1
menembusa|=8
, dengana<15
kondisi loop. Ini menyimpan 13 karakter lain jika saya menghitung dengan benar.new String(int[],int,int)
menyimpan 40 karakter aneh lainnya!Python 2.X + 3.X (229 karakter): Hasilkan dan ganti
Ide
r
dengan angka acaks
, dengans != r
, dengan huruf besarKode
Python 2.X + 3.X (194 karakter): Hasilkan dan centang
\u
dan\l
tidak ada di Python regex.random.sample
tanpa penggantian, berarti untuk mendapatkan setiap kata sandi yang dimungkinkan kami perlu pengambilan sampel dengan penggantian.Menggunakan cacat dalam deskripsi masalah
Saat ini, deskripsi masalah tidak menuntut setiap simbol / digit muncul dengan probabilitas yang sama. Dengan solusi berikut, Anda tidak dapat membuat asumsi tentang simbol dan / atau posisi tunggal. Tetapi Anda dapat melakukannya dengan banyak hal.
Python 2.X + 3.X (62 karakter)
Terima kasih kepada daniero untuk ide menggunakan sampel.
sumber
\l
dan seterusnya untuk regex python didokumentasikan? Jangan melihatnya di referensi . Python 3.3.3 saya bahkan tidak akan menerima"\u"
. Itustr(…)
tidak bergabung dengan huruf-huruf dalam 3.3.3 atau 2.7.6. Satu saran untuk optmization:all(s("\\"+i,p)for i in "dluW")
.random.sample
memilih elemen tanpa penggantian, jadi tidak semua kata sandi dimungkinkan.\u
dan\l
hanya vim.Bash on * nix (109)
Agar berfungsi dengan benar,
$a
tidak harus diatur ke kata sandi yang valid tetapi tidak acak di muka. Jika Anda ingin memasukkana=
dan garis memecah di depan, itu tiga karakter lagi tetapi memungkinkan Anda untuk menjalankannya berulang kali. Anda jelas dapat juga mengganti semua baris baru dengan;
sehingga Anda memiliki satu-baris yang dapat Anda jalankan sesering mungkin.Selain itu, Anda harus menetapkan
LC_ALL=C
atau tidak menyetel variabel lingkungan spesifik-lokal apa pun (LANG
danLC_CTYPE
khususnya), karena rentang karakter bergantung pada urutan kolasi yang sama dengan urutan ascii./dev/urandom
adalah sumber byte acak.!-~
adalah rentang semua karakter yang diizinkan, sebagaimana ditentukan dalam pertanyaan.tr -dc
menghapus semua karakter yang tidak tercantum dalam argumen berikutnya.head
mengambil 15 dari karakter yang tersisa.grep
memeriksa apakah masing-masing jenis yang diperlukan memang terjadi setidaknya satu kali. Inputnya terdiri dari empat salinan kandidat, sehingga urutan simbol tidak menjadi masalah, karenanya semua kata sandi yang memungkinkan berpeluang terpilih. Untuk-q
grep menekan output.Untuk alasan yang tidak diketahui,
/dev/random
alih-alih/dev/urandom
membutuhkan waktu lama. Sepertinya entropi cepat habis. Jika Andacd
ke dalam/dev
, Anda dapat menghindari beberapa byte lagi, tapi yang terasa agak seperti kecurangan.Python 2 (138)
Untuk membuat kode dapat dibaca, saya menambahkan baris baru dan lekukan setelah loop yang tidak perlu dan yang saya tidak hitung.
Ini pada dasarnya ide yang sama seperti di versi bash. Sumber acak di sini adalah
random.sample
, yang tidak akan mengulangi elemen. Untuk mengatasi fakta ini, kami menggunakan 15 salinan dari daftar surat yang diizinkan. Dengan begitu, setiap kombinasi masih dapat terjadi, meskipun yang dengan huruf berulang akan lebih jarang terjadi. Tapi saya memutuskan untuk mempertimbangkan ini sebagai fitur, bukan bug, karena pertanyaannya tidak memerlukan probabilitas yang sama untuk semua permutasi, hanya kemungkinan.Python 3 (145)
Satu baris baru dan satu indentasi lagi tidak dihitung. Terlepas dari beberapa sintaksis Python-3 khusus ini adalah solusi yang sama seperti untuk Python 2.
JavaScript (161)
Saya menambahkan baris baru untuk keterbacaan, tetapi tidak menghitungnya.
R (114)
Linebreak dan lekukan di dalam loop ditambahkan tetapi tidak dihitung. Jika Anda menginginkannya, Anda dapat memindahkan ini lagi ke satu
;
baris terpisah.sumber
grepl
dalam kode R. Kalau saja saya berpikir untuk mengulangi kata sandi tes empat kali sehingga Anda bisa melakukan semua pemeriksaan dalam satu. Dan Anda tahu, kalau saja saya memikirkansample
danintToUtf8
. Namun, Anda perlu menambahkanreplace=TRUE
(atau lebih tepatnya, Anda hanya perlu menambahkan,T
) ke metode sampel Anda untuk memastikan Anda mendapatkan semua kata sandi yang mungkin.replace=T
kesalahan itu, terima kasih telah menunjukkan ini. MenemukanintToUtf8
dengan menebak kemungkinan nama-nama dengan penyelesaian tab membutuhkan waktu cukup lama; Saya tahu fungsi semacam itu harus ada, tetapi nama yang lebih umum sepertichr
dan sebagainya tidak digunakan.*4
? Saya pikir regex Anda akan cocok dengan string apa pun, yang pertama iklan satu huruf besar, lalu apa pun, kemudian satu huruf kecil, daripada apa pun ... apa yang salah saya?re.search
tidakre.match
, jadi regex mungkin cocok dengan kata sandi kandidat mana pun. Apakah ini menjelaskan mengapa akhirnya akan berakhir?re.search
bukanre.match
. Itu menjelaskannya. Tapi saya masih berpikir Anda tidak perlu*4
. Terima kasih atas penjelasannya (+1)C # (
123 - 139103 - 127 karakter dipadatkan):Menggunakan metode kerangka kerja yang memadai di
System.Web.dll
:Kompak:
Contoh:
Atau, ambil nilai parameter kedua (
int numberOfNonAlphanumericCharacters
) dari baris perintah:sumber
GeneratePassword
tidak mendukung set lengkap simbol yang ditentukan dalam pertanyaan. Saya juga tidak menemukan jaminan tentang jumlah minimum kemunculan setiap kategori karakter.class P
danstring[] a
.R (
301322 karakter)Koreksi lupa memeriksa digit.
(spasi ditambahkan hanya untuk kejelasan).
Menghasilkan semua kemungkinan permutasi 15 karakter dari 94 karakter. Kemudian secara acak memilih satu sampai cocok dengan kriteria.
Keajaiban ada dalam
q:q
operasi, yang menghasilkan tipe data faktor baru yaitu interaksi dari semua faktor dalamq
daftar pertama dengan semua faktor dalam daftar kedua , dengan setiap kemungkinan kombinasi dari kedua daftar tersebut dimasukkan dalam daftar " tingkat "faktor itu. Berinteraksi 15 salinan daftar karakter yang diizinkan, dan Anda mendapatkan (94 ^ 15) tingkat yang mungkin.Tolong jangan coba ini di rumah. Kode membutuhkan beberapa detik untuk mengetahui semua permutasi tiga karakter, saya benar-benar tidak bisa membayangkan berapa lama untuk mengetahui semua permutasi 15 karakter, jika komputer Anda tidak hanya kehabisan memori di sementara itu. Ketika saya menjalankan skrip (kata sandi tiga karakter) yang sudah selesai untuk memeriksanya, kata sandi pertama yang dilontarkannya adalah "oO =", yang saya pikirkan tentang jumlah reaksi yang harus Anda lakukan terhadap kode ini.
sumber
Mathematica 170
Contohnya
"<]} Pg3 / e? 3 + Z ~ Oz"
"X / 8jWe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"
sumber
Python 2.7 (182)
sumber
join
agak harus ada: pengguna akan diharapkan untuk memahami daftar python sintaks dari output:['q', 'u', ...]
?aA$bc1111111111
) tidak mungkin.Golfscript (60)
Karena obl. golfscript hilang dan sebagai noob saya tetap membutuhkan latihan :)
Itu hanya membangun sebuah array dengan 4 diperlukan + 11 karakter acak dan mengurutkan dalam urutan acak.
sumber
{r}$
. Itu cara yang cukup kotor untuk mengacak daftar - saya suka itu! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225Menggunakan aturan di mana:
function(x){return x*x}
dapat ditulis ulang sebagaifunction(x)x*x
. Tampaknya hanya berfungsi untuk fungsi yang mengembalikan nilai.Iterasi berikutnya, dikurangi
x.sort(function().5-R())
menjadix.sort(y=>.5-R())
Iterasi berikutnya, dikurangi lebih lanjut dengan notasi panah gemuk, yang sayangnya hanya berfungsi untuk Firefox 22 dan di atasnya.
sumber
JavaScript (269 karakter dipadatkan)
Untuk lebih jelasnya, ini adalah kode sebelum saya memadatkannya ke JS-Fiddle :
Ini dia dipadatkan menjadi 269 karakter ( JS-Fiddle ):
sumber
shuffle()
menjadi "fungsi khusus". Apakah ini bagian dari JavaScript atau kode yang harus Anda tulis sendiri?Clojure (63):
Tetapi perlu ditingkatkan untuk memastikan bahwa mengandung setidaknya 1 karakter dari setiap kategori (Atas, Bawah, Digit, Simbol).
sumber
Di sql-server
Lihat dalam aksi - 1
melihatnya dalam Aksi - 2
sumber
~0Aa
, atau kata sandi manab
pun yang diikuti oleha
.SAS (191)
*TQP,(f=h10*)S=
Berkomentar / indentasi:
sumber
PowerShell: 119
Kode Gofled
Tidak bermain golf dan Berkomentar
sumber
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
Anda dapat melakukan satu pertandingan dengan ini, yang hanya akan cocok ketika ada satu Atas, Bawah, Digit, Simbol.1aZ%
dan(p3R
cocok? Saya mengalami kesulitan menemukan cara untuk melakukan itu secara online.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
Pertandingan bagus : PertandinganC>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
gagal:3evthX3_X^nBrR`
.nA ~ uYzrR4YV-r.`u-IjZE48ntQ;HxV
Python 2.7 (149)
Ditulis dengan cara yang lebih mudah dibaca (dan tidak dapat dieksekusi);
Cukup lurus ke depan dan secara mengejutkan tidak lebih lama dari versi "menghasilkan, coba lagi pada pertandingan gagal".
sumber
0Aa~~~~~~~~~~~~
? (Catat itu'~' == chr(126)
.)PSQL (189)
Terasa seperti PSQL agak verbose ... :)
Demo SQLfiddle .
sumber
PHP,
235225Script ini mengacak karakter di sekitar dan kemudian diperiksa melalui RegEx untuk memastikan kata sandi kuat (atau dibuat ulang).
sumber
while(true) ... if (condition) break
Anda dapat menggunakanwhile (!condition)
Javascript (209)
Semi-ungolfed;
sumber
Perl, 92
Tidak sesingkat jawaban Ruby, tapi saya yakin seorang penyihir Perl dapat membuat ini lebih pendek ... Saya tidak terlalu senang dengan semua
m//
s pada akhirnya, tetapi tampaknya bekerja dan harus memenuhi persyaratan untuk akhirnya menghasilkan semua permutasi.Penggunaan sampel:
Diedit untuk memperbaiki validasi dan berubah
[[:punct:]]
menjadi[\W_]
setelah komentar MvG.sumber
aaaaaaaaaaaaaa
akan menyebabkan loop berakhir. Anda harus menguji kriteria dengan kata sandi non-acak untuk memastikan mereka melakukan apa yang Anda inginkan.[[:punct:]]
? Saya kira saya lebih suka, which is shorter and of which I'm even more sure that it is correct, at least combined with your
rentang '[\ W_] 33..127`.\W
tidak termasuk_
, namun Anda benar, itu tidak diperlukan: gist.github.com/anonymous/8301237 . Terima kasih!Java 7 (
270234 karakter)Premisnya sama dengan yang digunakan oleh @assylias dengan java 8 (menghasilkan kata sandi acak hingga kata sandi yang valid). Namun, alih-alih menggunakan lambdas, kata sandi dihasilkan oleh iterasi array char dan divalidasi dengan mencocokkan regex.
Kode Minimum:
sumber
Powershell
Versi One Liner (143 byte)
Versi mini (146 byte)
Versi yang dapat dibaca (860 byte)
sumber
abcd1234ABCD{|}~
tidak akan pernah muncul karena$symbol
memaksa setidaknya salah satu simbol berada di antara ASCII 33 dan 47.$SR
menjadi, mungkin$Q
?(g(65..90))
turun ke65..90|g'. And change the
foreach` pernyataan untukforeach-object
loop menggunakan%
alias. Contoh:foreach($N in (1..11)){
...}
harus bisa dilakukan sebagai1..11|%{
...}
. Saya cukup yakin ada optimasi lain yang mungkin, tetapi saya benar-benar memiliki implementasi yang sangat berbeda dalam pikiran bahwa saya berencana untuk mencobanya nanti.Faktor, 196 karakter
Algoritma yang sama seperti MvG dan moose. Ini bukan yang terpendek tetapi harus memenuhi semua kriteria (saat ini) dalam pertanyaan:
sumber
~{}|1234abcdABCD
akan gagal regex."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 karakter
Bagaimana saya membenci
srand()
? Biarkan saya menghitung cara.sumber
Haskell, 192
String yang dicetak memiliki tanda kutip di sekitarnya dan lolos dari garis miring terbalik dan karakter kutipan; jika itu tidak
print
dapat diterima, dapat diganti denganputStrLn
untuk 3 byte lebih. Ini versi yang lebih mudah dibaca:Ini cukup mudah, hanya menciptakan infinite / daftar malas karakter ASCII acak dalam kisaran
'!'
untuk'~'
, kemudian melemparkan keluar elemen pertama sampai 15 pertama karakter memiliki setidaknya satu karakter dari masing-masing string karakter yang dibutuhkan.sumber
Excel VBA, 209 byte
Secara acak menghasilkan 15 karakter ASCII sehingga semua kemungkinan kombinasi dimungkinkan. Kemudian gunakan pola ekspresi reguler untuk memeriksa apakah mengandung setidaknya satu dari setiap kriteria.
Jika ya maka kata sandi ditampilkan, jika tidak "redo" ditampilkan.
Kredit ke Bart Kiers untuk pola Ekspresi Reguler: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-string-contains-at-least-one-lower-case-char- atas
sumber
AutoHotkey 352
Menggunakan - Cukup jalankan skrip
sumber
Python (121 karakter)
Manfaatkan fakta bahwa Anda dapat mengalikan daftar dengan Python [1,2,3] * 2 memberi [1,2,3,1,2,3]. Impor acak. Angka dalam daftar dikalikan dengan tiga adalah batas antara rentang dalam tabel ascii untuk karakter yang diperlukan, misalnya peta [65, 90] ke huruf besar.
sumber
import random
dalam kode.PHP 5.5 (230 byte)
Atau dalam satu baris (211 byte)
sumber