pengantar
Rupanya, pertanyaan ini telah ditanyakan di sini dan sayangnya ditutup. Saya pikir itu ide yang bagus untuk mencoba lagi dengannya, tetapi dilakukan dengan benar.
XKCD melihat bagaimana kita dilatih untuk menggunakan "kata sandi yang sulit untuk diingat", berpikir itu aman, tetapi sebaliknya, akan membutuhkan komputer 3 hari untuk retak. Di sisi lain, mengingat 4-5 kata-kata akan meningkatkan Kata Sandi Kuan, dan mudah diingat. Gila cara kerjanya, ya?
Tantangan
Pekerjaan hari ini adalah membuat 5 kata sandi menggunakan kata-kata. 4 kata per kata sandi dan minimal 4 huruf per kata, tetapi tidak maksimal. Kata sandi Kuan akan perlu dihitung untuk setiap kata sandi, tetapi minimum yang dipaksakan tidak akan ditetapkan.
Apakah Intropi Kata Sandi Kuan?
Kuan's Password Intropy adalah ukuran seberapa tidak terduga suatu kata sandi, menurut Kuan. Ada perhitungan sederhana: E = log 2 (R) * L . E menjadi Kuan's Password Intropy, R menjadi rentang karakter yang tersedia dan L untuk panjang kata sandi.
Rentang karakter yang tersedia cukup jelas. Rentang karakter yang dapat dimiliki kata sandi, dalam hal ini huruf besar dan kecil. Karena ada 26 karakter dalam alfabet, 26 x 2 = 52 karakter di seluruh rentang kata sandi.
Panjang kata sandi juga cukup jelas. Panjang total kata sandi setelah pembuatan.
Kendala
- Tidak ada input
- Sebuah kata tidak dapat muncul kembali dengan kata sandi yang sama.
- Tidak ada simbol atau angka yang diizinkan dalam kata sandi.
- 4 kata per kata sandi, tetapi dipaksa minimal 4 huruf per kata.
- Tidak ada spasi di antara kata-kata.
- Anda tidak dapat membuat kata sandi yang sama berulang kali.
- Setiap kata harus dikapitalisasi dengan kata sandi.
- Keluaran harus dapat dibaca oleh manusia, harus diberi spasi. Harus juga menyertakan Kata Sandi Intropi kata sandi Kuan dengan menggunakan persamaan Intropi Kata Kuan di atas.
- Kamus . Anda harus menggunakan ini, mengunduhnya sebagai file teks dan mengintegrasikannya. Ini akan menjadi daftar dari mana Anda mengambil kata-kata. Kode Anda harus mengasumsikan tersedia.
- Ini adalah kode-golf , byte terpendek menang.
Keluaran
TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0
N
simbol dari setS
, kata sandi entropi adalahlog2(|S|)*N
. Di sini ukuran set simbol adalah ukuran kamus (|S|=4284
) dan jumlah simbol adalah jumlah kata (N=4
), sehingga entropi untuk setiap kata sandi adalah48.3
.3t1ta#asd
), maka entropi akan menjadi logaritma dari jumlah kata sandi yang mungkin. Jika Anda selalu memilih 4 kata secara acak dari kamus 4284 kata, maka ada 4284 ^ 4 kata sandi, masing-masing dengan log entropi (4284) * 4 ≈ 48,26.Jawaban:
Python 2,
1021019791 byteMenganggap kamus sebagai daftar bernama
f
.Dapat diuji dengan menyimpan file sebagai
dict.txt
dan memanggilsumber
exec
(exec
adalah kata kunci dalam Python 2).shuffle(f);
.57*len(x)/10.
. Simpan byte lain dengan menghapus tanda kurung membuat cetakan mengambil tuple. Berikut ini adalah versi cut-down: TIOsample(f,4)
sebagai gantishuffle
. Jugaf
bisa menjadiopen('dict.txt').read().split('\n')
,open('dict.txt').readlines()
, atau hanyaopen('dict.txt')
(saya tahu itu tidak golfed tapi masih).PowerShell (3.0+), 77 byte
Cobalah online!
Menggunakan Jonathan Allan 's
57*len/10
trik.$d
berisi kamus sebagai susunan kata. Jika Anda bermain di rumah dan ingin mengisi$d
:Menggunakan versi golf
(Get-Culture).TextInfo.ToTitleCase()
untuk memanfaatkan huruf pertama; Saya tidak berpikir ada cara yang lebih singkat untuk melakukan itu di PowerShell.Sisanya cukup mudah saya pikir.
TIO memiliki seluruh kamus; menonaktifkan cache dan menjadi gila!
sumber
$d
sebagaimana seharusnya dengan asumsi itu ada di lingkungan.(gc d)| random..
di mana kamus adalah file yang disebut d dalam direktori yang sama.Jelly , 22 byte
Tautan monadik yang mengambil daftar daftar karakter, kamus yang diuraikan (sebagaimana diizinkan dalam obrolan ).
Cobalah online! (Klik "Argumen" untuk menyembunyikan kamus dan mengurangi kebutuhan untuk menggulir.)
Bagaimana?
Karena kamus hanya berisi kata-kata yang valid (
4
karakter atau lebih, hanya[a-z]
), tidak perlu memeriksa kondisi ini.Karena semua kata-kata dalam kamus memiliki panjang di
[4-8]
mungkin panjang sandi berada di[16,32]
, dan mungkin entropi tidak akan pernah putaran berbeda ke satu tempat desimal dari dengan menggantilog(52,2)
dengan5.7
. Satu-satunya masalah adalah bahwa menggunakan nilai floating point dari5.7
akan memberikan floating point kesalahan pembulatan untuk panjang18
,26
dan31
. Namun mengalikan dengan57
dan kemudian membaginya dengan10
menggunakan×57÷⁵
menghindari ini (sementara masih byte lebih pendek daripada mencetak nilai presisi menggunakan titik mengambang penuh×52l2¤
).sumber
Ruby,
8983 byteDiasumsikan bahwa kata sandi disimpan dalam variabel
d
. Anda dapat menambahkan baris ini sebelum kode:dan panggil skrip misalnya seperti ini:
Output sampel:
KitchenMiseryLurkJoints ... wow.
-6 byte dari Ajedi32
sumber
shuffle!
dan menggantipop
dengansample
.A word cannot reappear in the same password
, berpikir itu berarti tidak ada penggunaan kembali kata-kata di semua kata sandi. Terima kasih :)Mathematica, 178 byte
Cobalah online
salin dan tempel menggunakan ctrl-v dan tekan shift + enter untuk menjalankan
Mathematica, 136 byte
dengan asumsi bahwa m adalah kamus kodenya
.
sumber
hosts
file).Bash ,
6665 byteCobalah online!
Kamus diterima oleh STDIN. Kocok semua kata dalam kamus dan hasilkan terlebih dahulu 4.
Untuk setiap kata, tambahkan panjangnya dalam var l, dan gema kata dengan huruf besar. Pada akhirnya panggilan bc untuk melakukan perhitungan.
Solusi awk, 112 byte, empat kata sandi:
sumber
(Ini adalah adaptasi dari jawaban Martmists, tapi saya tidak punya perwakilan untuk berkomentar)
Python,
8886 byteDengan mengeksploitasi bagaimana
set
nondeterministic, Anda dapat menghindari keharusan mengimpor pustaka acak.sumber
set(f).pop()
.set(f).pop()
tidak berhasil, saya mencobanya. Ini memberikan hasil yang sama setiap kali.Japt , 30 byte
Cobalah online!
sumber
JavaScript (ES6), 164 byte
Menganggap kamus dilewatkan ke fungsi sebagai array.
Cuplikan Tes
sumber
Mathematica, 71 Bytes
Dengan asumsi kamus sudah dimuat ke dalam array yang disebut
d
.Penjelasan:
sumber
ColdFusion 216 byte
Ini berfungsi di ColdFusion 11+ dan Lucee 4.5+
Untuk menjalankannya: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai
Tautan TryCF memiliki lebih sedikit golf tetapi kode yang sama.
Saya tidak benar-benar berharap mendapat jawaban golf yang kompetitif; Saya hanya ingin melihat apa yang diperlukan untuk menyelesaikan tantangan ini di ColdFusion. Terutama karena tidak banyak CF dalam jawaban ini. :-) Setelah setup, ternyata lebih pendek dari yang saya duga.
Upaya pertama saya sedikit lebih pendek sampai saya ingat bahwa kata yang sama tidak dapat digunakan lebih dari sekali. Meskipun sangat tidak mungkin bahwa pengacak akan memilih indeks yang sama lebih dari sekali, saya membuang indeks ke dalam kunci struktur, yang akan mencegah duplikasi. Kemudian saya menggunakan daftar kunci untuk membangun string kata sandi terakhir saya. Saya juga menggunakan trik matematika untuk menemukan entropi.
sumber
PHP ,
136129 byte-7 byte, terima kasih Jörg
Cobalah online!
sumber
Python 3, 252 byte
Ini adalah tantangan golf kode pertama yang pernah saya lakukan! Saya tahu ada jawaban Python lain di sini (yang mungkin lebih baik dari saya) tetapi ini tampak menyenangkan, jadi saya ingin mencobanya. Ini versi golfnya:
Saya akan memposting Coba Online! tautan, tetapi itu tidak mendukung banyak file. Jadi, inilah tautan repl.it: https://repl.it/InIl/0
Juga, inilah versi yang tidak disunat:
Seperti yang saya katakan, ini adalah kode waktu pertama saya gofling, jadi saya yakin ini bisa diperbaiki banyak.
sumber
tcl, 137
Bukan seorang pemenang pasti, tapi saya pikir itu bisa menjadi golf sedikit lebih.
demo - Tujuan baris 1 hanya untuk memasukkan isi kamus ke dalam variabel
d
sumber
Vim, 87 penekanan tombol
Mengasumsikan bahwa kamus ada dalam file bernama
w
. Akan selalu menggunakan 4 kata berurutanPenjelasan:
sumber
q / kdb +,
76746556 byteLarutan:
Contoh:
Penjelasan:
Baca di daftar kata, pisahkan pada "", pilih 4 kata acak dari daftar ini, huruf besar setiap kata, lalu gabung bersama. Masukkan ini ke dalam fungsi lambda yang mengembalikan kata sandi dan 'entropi' yang dihitung:
Catatan:
Saya menyerah dan menggunakan 5.70044 bukannya
2 xlog 52 xexp
...sumber