Menghasilkan kata sandi yang memadai

8

Cerita

Saya perlu mengingat banyak kata sandi dan tidak ingin menggunakan kata sandi yang sama untuk beberapa situs web, jadi saya membuat aturan, tetapi aturannya seharusnya tidak transparan sehingga yang saya lakukan adalah:

  • Pikirkan kata atau konsep yang panjang seperti breadpudding.
  • Ganti huruf pertama dengan situs tempat kita masuk. Jika kita masuk google, kata kita menjadi greadpudding.
  • Buat huruf besar pertama.
  • Ubah huruf kedua menjadi sebuah @tanda.
  • Jika kata sandi dimulai dengan non-konsonan, tambahkan nomor tertentu (seperti 1234); jika tidak, tambahkan nomor lain (seperti 4321).

Ta da, Anda sekarang memiliki kata sandi yang memadai.

Proses ini sulit, jadi saya perlu program untuk menghasilkan ini untuk saya berdasarkan hal berikut:

Masalah

Masukan yang diberikan:

  • a : kata awal, yang merupakan string dan selalu huruf kecil, dan dijamin lebih dari 3 karakter.
  • b : situs tempat kami masuk, yang merupakan string dan selalu huruf kecil, dan dijamin tidak kosong.
  • c : angka untuk non-konsonan, yang merupakan bilangan bulat positif yang mungkin memiliki nol terkemuka.
  • d : angka untuk konsonan, yang merupakan bilangan bulat positif yang mungkin memiliki nol terkemuka.

Keluarkan string berdasarkan kriteria di atas.

Uji kasus

Memasukkan a="volvo", b="gmail", c=5555, d="0001"

G@lvo0001

Memasukkan a="sherlock", b="9gag", c=31415926535, d=3

9@erlock31415926535

Memasukkan a="flourishing", b="+google", c=11111, d=2222

+@ourishing11111

Aturan

  • y adalah konsonan.
  • Jika Anda memutuskan catau dbilangan bulat, Anda dapat menguraikannya seperti itu, dan angka nol di depannya dapat diabaikan ( 0091diperlakukan sebagai 91)
  • Ruang putih dan baris baru yang tertinggal diizinkan.
  • Anda dapat menampilkan hasilnya ke STDOUT atau mengembalikan hasilnya dalam suatu fungsi.
  • Karakter diizinkan masuk adan bsedang [a-z0-9!@#$%^&*()_+=-].
  • Anda dapat menerima 4 input dalam urutan yang konsisten.

Ini adalah . Kode terpendek dalam byte menang.

LiefdeWen
sumber
5
Melalui upaya 20 tahun, kami telah berhasil melatih semua orang untuk menggunakan kata sandi yang sulit diingat manusia, tetapi mudah ditebak oleh komputer. Kekuatan kata sandi tidak pernah ditentukan oleh berapa banyak huruf besar / karakter khusus yang ada dalam kata sandi.
Leaky Nun
@ LeakyNun Ya saya setuju tetapi jumlah set karakter yang diperbolehkan membuat lebih sulit juga, jadi bayangkan jika kotak kata sandi hanya memungkinkan huruf kecil, yang mengurangi kesulitan banyak memaksa kasar.
LiefdeWen
Ya, pada penyertaan panjang yang diberikan lebih banyak jenis karakter (angka, huruf besar, simbol) meningkatkan keamanan, tetapi tidak secara eksponensial. Kata sandi huruf kecil semua panjang jauh lebih kuat daripada kata sandi jenis karakter campuran pendek. Menurut zxcvbn: "4321breadpudding" (10 ^ 9) dipecah dalam <1s disimpan sebagai hash cepat, "4321G @ eadpudding" (10 ^ 11) dipecah dalam 8s, "nenek membuat puding roti besar" (10 ^ 24) rusak dalam berabad-abad , "Nenek, buat puding roti yang enak!" (10 ^ 27) rusak selama berabad-abad. Ingatlah untuk menghitung kesulitan kata sandi dalam urutan besarnya, dalam hal ini 2 tidak banyak!
vee_ess
3
"Berapa lama G @ anny membuat roti puding yang enak dibutuhkan untuk rusak"? Nah, sekarang ada di semua daftar crackz0rd jadi kurang dari 1 detik :-P
Olivier Grégoire
1
@ LeakyNun Apakah Anda membaca teks rasa untuk komik xkcd itu ..?
Poke

Jawaban:

2

Jelly , 17 byte

Ḣ©Œu;”@o;⁶⁵®eØC¤?

Sebuah program penuh, mengambil argumen dalam urutan b, a, c, d.

Cobalah online!

Bagaimana?

Link utama adalah diad, mengambil bdan a, masukan Program kemudian b, a, c, dan d(ke-3 melalui argumen baris perintah keenam), sehingga cdan ddiakses seperti itu.

Ḣ©Œu;”@o;⁶⁵®eØC¤?  Main link: b, a           e.g. "gmail", "volvo" (c="5555" and d="0001")
Ḣ                  head b                         'g'
 ©                 copy to register and yield     'g'
  Œu               convert to uppercase           "G"
     ”@            literal '@' character          '@'
    ;              concatenate                    "G@"
       o           logical or with a (vectorises) "G@lvo"
                ?  if:
               ¤     nilad followed by link(s) as a nilad:
           ®           recall value from register  'g'
             ØC        yield consonants            "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
            e          exists in?                  1
         ⁶         ...then: 6th arg = 4th in = d   "0001" 
          ⁵        ...else: 5th arg = 3rd in = c   "5555"
        ;          concatenate                     "G@lvo0001"
                   implicit print
Jonathan Allan
sumber
3

Python 3 , 69 byte

lambda a,b,*c:b[0].upper()+"@"+a[2:]+c[b[0]in"bcdfghjklmnpqrstvwxyz"]

Cobalah online!

Biarawati Bocor
sumber
Kenapa tidak digunakan b[0]not in"aeiou"saja?
officialaimm
3
@officialaimm karena alasan terkutuk 9dianggap sebagai non-konsonan.
Leaky Nun
Ya, aturan dalam pertanyaan tidak mengatakan apa-apa tentang angka-angka secara eksplisit ...
officialaimm
2
Hemat 3 byte (catatan: zadalah char maksimum yang mungkin):('a'<b[0])*b[0]not in"eiou"
Jonathan Allan
2

05AB1E , 22 20 18 byte

н©u'@I¦¦žN®åiI\}IJ

Input diambil sebagai b,a,c,d

Cobalah online!

Penjelasan (kedaluwarsa)

¦                     # remove the first char of a
 s                    # swap b to the top of the stack
  н©                  # push the head of b and store a copy in register
    uì                # convert the head to upper case and prepend to a
      U               # store in variable X
       žN®åi          # if the head of b is a consonant
            \}        # discard c
              X«      # concatenate X with c or d
                '@1ǝ  # insert an "@" at character position 1

digunakan dalam tautan karena нbelum ditarik ke TIO.

Emigna
sumber
2

Javascript ES6, 87 byte

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:c)

Demo

Weedoze
sumber
Saya akan memposting ini. Maksud saya, secara harfiah , karakter demi karakter. Nyebelin, lol
Hankrecords
@Hankrecords Hehe, kita mungkin bisa memperbaikinya
Weedoze
Karena {|}~bukan karakter yang valid, Anda dapat menggantinya /[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:cdengan /[ -_aeiou]/.test(b[0])?c:dminus 13 byte
PunPun1000
2

C, 441 286 139 Bytes

#define o(c)*a[1]==0xc
int main(int b,char** a){printf("%c@%s%s",*a[1],a[2]+2,(*a[1]>97&*a[1]<128)
&!(o(65)|o(69)|o(6F)|o(75))?a[4]:a[3]);}
ulascan
sumber
1
erm ... bukannya 21 set di argv[1][0]='c'|argv[1][0]='c'|...mana c = konsonan, Anda dapat dengan mudah mengurangi ini dengan melakukan !(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')Mengurangi skor sebesar 264 hanya dengan itu!
Baldrickk
Tidak, seperti yang disebutkan sebaliknya, yang memungkinkan angka dan karakter lainnya
Biru
@muddyfish maka Anda membuatnya (argv[0][1]>='a'&argv[0][1]<='z'&!(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o‌​'|argv[1][0]='u')). Masih lebih pendek dengan selisih. Namun ada begitu banyak cara untuk bermain golf kode ini saya tidak tahu harus mulai dari mana ...: s
Olivier Grégoire
Saya terbuka untuk ide :) Ini adalah usaha pertama saya bermain golf
ulascan
Nah, kamu baik-baik saja! Saya yakin itu masih bisa ditingkatkan, seperti menggunakan variabel daripada menggunakan makro, tapi ya, Anda mulai dengan langkah yang benar! :) Anda mungkin bisa memanfaatkan tips golf ini !
Olivier Grégoire
2

R , 105 103 byte

pryr::f({m=substr(b,0,1);paste0(toupper(m),'@',substring(a,3),'if'(grepl("[b-df-hj-np-tv-z]",m),d,c))})

Fungsi anonim. Mengevaluasi ke

function (a, b, c, d) 
{
    m = substr(b, 0, 1)                      #first letter of website
    paste0(toupper(m),                       #concatenate that letter, capitalized,
           "@",                              #an '@',     
           substring(a, 3),                  #the rest of the long string,
           if(                               #and
           grepl("[b-df-hj-np-tv-z]", m)),   #if the first letter is a consonant,
           d                                 #the consonant string/num,
           else c)                           #else the other one
}

yang ada di TIO. Tolong bantu saya golf regex itu karena saya buruk pada mereka.

Disimpan 2 byte dari Giuseppe.

Cobalah online!

BLT
sumber
Anda bisa menggunakan!grepl('[aeiouy]',m)
Giuseppe
1
atau lebih baik lagi, grepl('[aeiouy]',m)dan hanya swap cdan d.
Giuseppe
93 byte "if" membuat ifsintaks lebih rapi daripada menggunakan elseatau ifelse; Saya juga menyimpan substringke variabel dan mlangsung ke huruf besar untuk menyimpan byte.
Giuseppe
1
Saya mencoba menjalankan fungsi Anda dan mengalami dua masalah: pryrmencoba membuat substringargumen; dan Anda greplhanya menemukan "bukan vokal", yang tidak sama dengan konsonan. Hal "if"yang baru saja saya lewatkan, terima kasih telah menunjukkan itu.
BLT
Saya belum benar-benar mengujinya; Saya tidak sadar pryr::ftidak akan menyukainya; Anda bisa menggunakan regex '[az && [^ aeiouy]]' dari jawaban Kevin Cruijissen?
Giuseppe
2

Retina , 80 75 byte

^..(.*)¶(.).*
$2@$1
^([ -_aeiou].*)¶(.*)¶.*
$1$2
(.*)¶.*¶(.*)
$1$2
T`l`L`^.

Cobalah online!

Mencoba bahasa baru di sini, mengambil input sesuai urutan yang diberikan dalam pertanyaan

Penjelasan:

^..(.*)¶(.).*
$2@$1

Buat kata yang merupakan kata kedua huruf pertama, tanda @, kata pertama dari karakter ke-3 aktif.

^([ -_aeiou].*)¶(.*)¶.*
$1$2

Jika kata itu dimulai dengan non-konsonan, tambahkan nomor pertama

(.*)¶.*¶(.*)
$1$2

Jika masih ada 3 baris yang tersisa (tidak ada substitusi pada langkah terakhir, jadi itu dimulai dengan konsonan), tambahkan angka kedua

T`l`L`^.

Huruf besar huruf pertama

PunPun1000
sumber
1

QBIC , 81 byte

G=ucase$(_s;,1|)+@@`+_s;,3,_lC||~instr(@bcdfghjklmnpqrstvwxyz`,_sC,1|)|?G+;\?G+;

Penjelasan

Parameters are Website(A$), base word(C$), consonant-number(E$), and nonsonant-number(F$)
G=                           SET G$ to
 ucase$(      )              the upper-case version of (also works for '9gag', '+google')
        _s;,1|                  the first char of the website A$ read from cmd line
 +@@`                        plus a literal @ (B$)
 +_s;,3,_lC||                plus all characters from base word C$ from 3rd char onwards
~instr(                      IF the second arg to INSTR is in the first
 @bcdfghjklmnpqrstvwxyz`,      with all consonants in the first arg
 _sC,1|                        and the first char of the base word C$ in the second
 )
|?G+;                        THEN print G$ plus the consonant addition
\?G+;                        ELSE print G$ plus the other addition

Perhatikan bahwa dua baris terakhir tampak sama, tetapi penerjemah sedikit mengubah perilaku pada masing-masing ;: Setiap kali melihat ;instruksi, itu menciptakan variabel baru (dalam hal ini, vars È $ andF $ `adalah yang pertama tersedia setelah membaca semua argumen literal dan garis cmd lainnya) dan menetapkan paraeter baris cmd yang belum ditugaskan untuk variabel tersebut.

steenbergh
sumber
1

JavaScript (ES6), 76 byte

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[aeiou\d_\W]/.test(b[0])?c:d)

Saya akan menambahkan ini sebagai saran sebagai peningkatan pada solusi Weedoze , tetapi sepertinya saya tidak bisa mengomentari itu karena saya kebanyakan mengintai

Ian
sumber
1

C # , 111 byte

(a,b,c,d)=>Char.ToUpper(b[0])+"@"+a.Substring(2)+(b.IndexOfAny("bcdfghjklmnpqrstvwxyz".ToCharArray()==0)?d:c);

Memeriksa konsonan sangat mahal tanpa kemampuan regex langsung pada stringjenisnya.


sumber
1

F # , 157 byte

let f(a:string)(b:string)c d=System.Char.ToUpper(b.[0]).ToString()+"@"+a.[2..]+(if((Seq.except['e';'i';'o';'u']['b'..'z'])|>Seq.contains b.[0])then d else c)

F # masih sangat baru bagi saya sehingga mungkin ada pendekatan yang lebih baik untuk ini.


sumber
1

Java 8, 112 99 92 87 byte

(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)

-13 byte dengan mengambil parameter bterakhir, bukan yang kedua.
-1 byte dengan menghapus y
-7 byte terima kasih kepada @ OlivierGrégoire (dan parameter sudah beres lagi)
-5 byte terima kasih kepada @ PunPun1000

Penjelasan:

Coba di sini.

(a,b,c,d)->                     // Method with 4 String parameters and String return-type
  b.toUpperCase().charAt(0)     //  First character of B capitalized
  +"@"                          //  + literal "@"
  +a.substring(2)               //  + A excluding first two characters
  +(b.matches("[ -_aeiou].*")?  //  If B starts with a consonant:
    d                           //   + D
   :                            //  Else:
    c)                          //   + C
                                // End of method (implicit / lambda with single return)
Kevin Cruijssen
sumber
1
yadalah konsonan sehingga Anda dapat menjatuhkan ydi regex Anda selama 1 byte.
LiefdeWen
2
(a,b,c,d)->lebih pendek dari a->b->c->d->. Kari hanya membantu untuk 2 parameter. Untuk 3, currying sama dengan no currying. Untuk 4 dan di atas, tidak ada kari yang lebih pendek.
Olivier Grégoire
1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)panjangnya 92 byte. Juga, ia menggunakan parameter dalam urutan yang tepat (yang membingungkan saya pada awalnya :-().
Olivier Grégoire
1
@ OlivierGrégoire Terima kasih. Kedua kalinya saya membuat kesalahan tentang pengerjaan kari dengan empat parameter .. Dan pertama toUpperCase()dan kemudian .charAt(0)memang lebih pendek .. Tidak yakin bagaimana saya melewatkan itu. (Dan urutan yang berbeda adalah untuk memungkinkan (b=...), yang tidak akan mungkin terjadi jika itu bukan parameter terakhir dengan kari, karena dengan demikian harus final/ implisit final.)
Kevin Cruijssen
1
Karena {|}~bukan karakter yang valid, Anda dapat menggunakan [ -_aeiou]untuk non konsonan dan swap ddan cuntuk minus 5 byte
PunPun1000
0

V , 25 byte

ldvjr@Ç^[aeiou]ü^Á/j

DÍî

Cobalah online!

Membawa argumen dalam buffer secara berurutan:

website
word/phrase
consonant number
non-consonant number
nmjcman101
sumber
0

Bash 4 , 76 byte

g(){
a=${2:0:1}
c=$4
[[ "aeiou[0-9]" =~ .*$a.* ]]&&c=$3
p="${a^}@${1:2}$c"
}

Bekerja di Bash 4:

g volvo gmail 5555 0001; echo $p
g sherlock 9gag 31415926535 3; echo $p
g flourishing +google 11111 2222; echo $p
vee_ess
sumber
0

Ruby , 73 byte

->a,b,c,d{a.sub(/..(.*)/){b[0].upcase+"@#$1#{b[0]=~/[aeiou_\d\W]/?c:d}"}}

Cobalah online!

Nilai Tinta
sumber
0

JavaScript (ES6), 69 byte

(a,b,c,d)=>e=a[0].toUpperCase()+"@"+a.slice(2)+/[AEIOU]/.test(e)?c:d

Cukup sederhana, mungkin bisa bermain golf

MayorMonty
sumber