Tạo mật khẩu đầy đủ


8

Câu chuyện

Tôi cần nhớ rất nhiều mật khẩu và không muốn sử dụng cùng một mật khẩu cho nhiều trang web vì vậy tôi đã đưa ra một quy tắc, nhưng quy tắc không nên minh bạch nên điều tôi làm là:

  • Hãy nghĩ về một từ dài hoặc khái niệm như breadpudding.
  • Thay thế chữ cái đầu tiên bằng trang web chúng tôi đang đăng nhập. Nếu chúng ta đang đăng nhập google, từ của chúng ta trở thành greadpudding.
  • Làm chữ hoa đầu tiên.
  • Thay đổi chữ cái thứ hai thành một @dấu hiệu.
  • Nếu mật khẩu bắt đầu bằng một phụ âm, hãy thêm một số nhất định (chẳng hạn như 1234); mặt khác, thêm một số khác (chẳng hạn như 4321).

Ta da, bây giờ bạn có một mật khẩu đầy đủ.

Tuy nhiên, quá trình này rất khó khăn vì vậy tôi cần một chương trình để tạo nó cho tôi dựa trên những điều sau đây:

Vấn đề

Đưa ra đầu vào:

  • a : từ ban đầu, là một chuỗi và luôn luôn là chữ thường và được đảm bảo dài hơn 3 ký tự.
  • b : trang web chúng tôi đang đăng nhập, là một chuỗi và luôn là chữ thường và được đảm bảo không trống.
  • c : số cho các phụ âm không phụ âm, là số nguyên dương có thể có các số 0 đứng đầu.
  • d : số cho phụ âm, là số nguyên dương có thể có các số 0 đứng đầu.

Xuất ra một chuỗi dựa trên các tiêu chí trên.

Các trường hợp thử nghiệm

Đầu vào a="volvo", b="gmail", c=5555, d="0001"

G@lvo0001

Đầu vào a="sherlock", b="9gag", c=31415926535, d=3

9@erlock31415926535

Đầu vào a="flourishing", b="+google", c=11111, d=2222

+@ourishing11111

Quy tắc

  • y là một phụ âm.
  • Nếu bạn quyết định choặc dlà một số nguyên, bạn có thể phân tích cú pháp như vậy và các số 0 đứng đầu có thể bị bỏ qua ( 0091được coi là 91).
  • Trailing khoảng trắng và dòng mới được cho phép.
  • Bạn có thể xuất kết quả thành STDOUT hoặc trả về kết quả trong hàm.
  • Nhân vật được phép trong ab[a-z0-9!@#$%^&*()_+=-].
  • Bạn có thể chấp nhận 4 đầu vào theo thứ tự nhất quán.

Đây là . Mã ngắn nhất trong byte thắng.


5
Qua 20 năm nỗ lực, chúng tôi đã đào tạo thành công cho mọi người sử dụng mật khẩu mà con người khó nhớ, nhưng máy tính dễ đoán. Độ mạnh của mật khẩu không bao giờ được xác định bởi có bao nhiêu chữ hoa / ký tự đặc biệt trong mật khẩu.
Rò rỉ Nun

@LeakyNun Có, tôi đồng ý nhưng số lượng bộ ký tự được phép cũng khó hơn, vì vậy hãy tưởng tượng nếu một hộp mật khẩu chỉ cho phép chữ thường, điều đó làm giảm độ khó của việc bắt buộc rất nhiều.
LiefdeWen

Có, với một độ dài nhất định, bao gồm nhiều loại ký tự hơn (số, chữ hoa, ký hiệu) làm tăng tính bảo mật, nhưng không theo cấp số nhân. Một mật khẩu chữ thường viết thường mạnh hơn nhiều so với mật khẩu loại ký tự hỗn hợp ngắn. Theo zxcvbn: "4321breadpudding" (10 ^ 9) bị hỏng trong <1s được lưu trữ dưới dạng băm nhanh, "4321G @ eadpudding" (10 ^ 11) bị hỏng trong 8 giây, "bà già làm bánh pudding tuyệt vời" (10 ^ 24) bị hỏng trong nhiều thế kỷ , "Granny, làm bánh pudding tuyệt vời!" (10 ^ 27) bị phá vỡ trong nhiều thế kỷ. Hãy nhớ tính toán độ khó của mật khẩu theo thứ tự độ lớn, trong trường hợp 2 không nhiều!
vee_ess

3
"G @ anny làm bánh pudding1234 mất bao lâu để bị hỏng"? Chà, bây giờ nó đã có trên tất cả các danh sách crackz0rd chưa đầy 1 giây :-P
Olivier Grégoire

1
@LeakyNun Bạn đã đọc văn bản hương vị cho truyện tranh xkcd đó chưa ..?
Chọc

Câu trả lời:


2

Thạch , 17 byte

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

Một chương trình đầy đủ, lấy các đối số theo thứ tự b, a, c, d.

Hãy thử trực tuyến!

Làm sao?

Các liên kết chính là cặp đôi, lấy ba, đầu vào chương trình này sau đó được b, a, c, và d(thứ 3 thông qua đối số dòng lệnh thứ sáu), do đó cdđược truy cập như vậy.

Ḣ©Œ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

3

Python 3 , 69 byte

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

Hãy thử trực tuyến!


Tại sao không sử dụng b[0]not in"aeiou"thay thế?
chính thức

3
@officialaimm vì một số lý do thất bại 9được tính là không phụ âm.
Rò rỉ Nun

Phải, quy tắc trong câu hỏi không nói gì về các con số một cách rõ ràng ...
chính thức tuyên bố

2
Lưu 3 byte (lưu ý: zlà char tối đa có thể):('a'<b[0])*b[0]not in"eiou"
Jonathan Allan

2

05AB1E , 22 20 18 byte

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

Đầu vào được lấy là b,a,c,d

Hãy thử trực tuyến!

Giải thích (lỗi thời)

¦                     # 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

được sử dụng trong liên kết khi нchưa được kéo đến TIO.


2

Javascript ES6, 87 byte

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

Bản giới thiệu


Tôi đã định đăng bài này. Ý tôi là, nghĩa đen này, từng nhân vật. Bummer, lol
Hankrecords

@Hankrecords Hehe, chúng ta có thể cải thiện nó
Weedoze

{|}~không phải là ký tự hợp lệ, bạn có thể thay thế /[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:cbằng /[ -_aeiou]/.test(b[0])?c:dâm 13 byte
PunPun1000

2

C, 441 286 139 byte

#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]);}

1
erm ... thay vì 21 bộ trong argv[1][0]='c'|argv[1][0]='c'|...đó c = phụ âm, bạn có thể giảm bớt điều này bằng cách !(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')giảm số điểm xuống 264 chỉ bằng cách đó!
Baldrickk

Không, như đã đề cập khác, điều đó cho phép số và các nhân vật khác
Blue

@muddyfish thì bạn làm nó (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')). Vẫn ngắn hơn bởi một lề. Tuy nhiên, có rất nhiều cách để chơi mã này, tôi không biết bắt đầu từ đâu ...: s
Olivier Grégoire

Tôi cởi mở với những ý tưởng :) Đây là nỗ lực đầu tiên của tôi khi chơi gôn
ulascan

Vâng, bạn đang làm tốt! Tôi chắc chắn rằng nó vẫn có thể được cải thiện, như sử dụng một biến thay vì sử dụng macro, nhưng vâng, bạn đang bắt đầu đi bằng chân phải! :) Bạn có thể có thể sử dụng tốt các mẹo chơi golf này !
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))})

Chức năng ẩn danh. Đánh giá

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
}

đó là những gì trên TIO. Xin hãy giúp tôi chơi golf đó vì tôi rất tệ với họ.

Đã lưu 2 byte từ Giuseppe.

Hãy thử trực tuyến!


bạn có thể sử dụng!grepl('[aeiouy]',m)
Giuseppe

1
hoặc tốt hơn nữa, grepl('[aeiouy]',m)và chỉ trao đổi cd.
Giuseppe

93 byte "if" làm cho ifcú pháp gọn gàng hơn nhiều thay vì sử dụng elsehoặc ifelse; Tôi cũng lưu substringvào một biến và đặt mchữ hoa ngay lập tức để lưu một byte.
Giuseppe

1
Tôi đã thử chạy chức năng của bạn và gặp hai vấn đề: pryrđang cố gắng đưa ra substringmột lập luận; và bạn greplchỉ tìm thấy "không phải nguyên âm", không giống với phụ âm. Các "if"điều tôi chỉ bỏ lỡ, cảm ơn vì đã chỉ ra rằng.
BLT

Tôi đã không thực sự thử nghiệm nó; Tôi đã không nhận ra pryr::fsẽ không như thế; bạn có thể sử dụng regex '[az && [^ aeiouy]]' từ câu trả lời của Kevin Cruijissen không?
Giuseppe

2

Võng mạc , 80 75 byte

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

Hãy thử trực tuyến!

Thử một ngôn ngữ mới ở đây, nhận các đầu vào theo thứ tự được đưa ra trong câu hỏi

Giải trình:

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

Tạo một từ đó là từ thứ hai chữ cái đầu tiên, ký hiệu @, từ đầu tiên từ ký tự thứ 3 trở đi.

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

Nếu từ bắt đầu bằng một phụ âm không, hãy thêm số đầu tiên

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

Nếu vẫn còn 3 dòng (không có sự thay thế trong bước cuối cùng, vì vậy nó bắt đầu bằng một phụ âm), nối thêm số thứ hai

T`l`L`^.

Chữ cái đầu tiên


1

QBIC , 81 byte

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

Giải trình

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

Lưu ý rằng hai dòng cuối cùng xuất hiện giống nhau, nhưng trình thông dịch thay đổi hành vi một chút trên mỗi dòng ;: Bất cứ khi nào nhìn thấy ;hướng dẫn, nó sẽ tạo một biến mới (trong trường hợp này, các vars $ andF $ `là đầu tiên có sẵn sau khi đọc tất cả các đối số dòng chữ và cmd khác) và gán paraeter dòng cmd chưa được gán đầu tiên cho biến đó.


1

JavaScript (ES6), 76 byte

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

Tôi đã thêm điều này như một gợi ý như là một cải tiến cho giải pháp của Weedoze , nhưng có vẻ như tôi không thể nhận xét về nó vì tôi chủ yếu ẩn giấu


1

C # , 111 byte

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

Kiểm tra phụ âm là đặc biệt đắt tiền không có khả năng regex trực tiếp trên stringloại.


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 # vẫn còn rất mới đối với tôi vì vậy có lẽ có những cách tiếp cận tốt hơn cho việc này.


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 bằng cách lấy tham số bcuối cùng thay vì thứ hai.
-1 byte bằng cách loại bỏ y
-7 byte nhờ @ OlivierGrégoire (và các tham số lại theo thứ tự)
-5 byte nhờ @ PunPun1000

Giải trình:

Hãy thử nó ở đây.

(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)

1
ylà một phụ âm để bạn có thể thả yregex của mình xuống 1 byte.
LiefdeWen

2
(a,b,c,d)->ngắn hơn a->b->c->d->. Currying chỉ hữu ích cho 2 thông số. Đối với 3, cà ri cũng giống như không có cà ri. Đối với 4 trở lên, không có cà ri là ngắn hơn.
Olivier Grégoire

1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)dài 92 byte. Ngoài ra, nó sử dụng các tham số theo đúng thứ tự (lúc đầu làm tôi bối rối :-().
Olivier Grégoire

1
@ OlivierGrégoire Cảm ơn. Lần thứ hai tôi mắc lỗi đó liên quan đến việc cà ri với bốn thông số .. Và lần đầu tiên toUpperCase()và sau đó .charAt(0)thực sự ngắn hơn .. Không chắc tôi đã bỏ lỡ điều đó như thế nào. (Và thứ tự khác là cho phép (b=...), điều đó sẽ không thể xảy ra nếu đó không phải là thông số cuối cùng với cà ri, bởi vì sau đó nó phải final/ là ẩn final.)
Kevin Cruijssen

1
{|}~không phải là ký tự hợp lệ, bạn có thể sử dụng [ -_aeiou]cho các phụ âm và hoán đổi dctrừ 5 byte
PunPun1000


0

Bash 4 , 76 byte

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

Hoạt động trong Bash 4:

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


0

JavaScript (ES6), 69 byte

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

Khá đơn giản, có thể chơi gôn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.