Lưu bí mật của tôi!


14

Tôi có rất nhiều bí mật và không nơi nào để giữ chúng!

Mục tiêu rất đơn giản: viết chương trình cho phép bạn lưu một chuỗi và bảo vệ nó bằng mật khẩu.

Chương trình sẽ lấy bí danh, mật khẩu và bí mật (tùy chọn) làm tham số.

Nếu đây là lần đầu tiên chương trình được gọi với một bí danh nhất định, thì nó sẽ lưu trữ / ghi nhớ bí mật và xuất ra bất cứ thứ gì bạn muốn.

Nếu chương trình được gọi với một bí danh đã được sử dụng trước đó, thì nó sẽ xuất ra bí mật cho bí danh đó nếu mật khẩu giống như lần đầu tiên chương trình được chạy với bí danh đó.

Các trường hợp khác

  • Nếu đây là lần đầu tiên được gọi với một bí danh nhất định và không có bí mật nào được đưa ra - không lưu trữ gì cả.

  • Nếu chương trình được gọi với một bí danh đã được sử dụng và mật khẩu không chính xác - trả về bất kỳ loại lỗi nào hoặc không có gì cả.

  • Nếu chương trình được gọi với một bí danh đã được sử dụng, mật khẩu là chính xác và một bí mật mới được cung cấp - xuất ra bí mật cũ và thay thế nó bằng bí mật mới để lần sau chỉ có bí mật mới được xuất ra.

  • Nếu chương trình được gọi với một bí danh đã được sử dụng, mật khẩu là chính xác và không có bí mật mới nào được cung cấp - hãy xuất ra bí mật cũ và đảm bảo rằng nó không bị thay thế.

Lưu ý: Những bí mật / mật khẩu này không cần phải được lưu trữ an toàn

Cũng lưu ý: bất kỳ đầu vào chữ và số cho mật khẩu bí mật và bí mật nên được chấp nhận

Áp dụng quy tắc chuẩn, chúc may mắn!


1
Có, sử dụng bất cứ thứ gì để lưu trữ nó - như đối với bí danh Tôi nghĩ rằng nó nên chấp nhận bất kỳ đầu vào chữ và số nào
Quinn

1
Chúng ta có thể sử dụng một chức năng chứ không phải là một chương trình đầy đủ?
Arnauld

1
@Arnauld Tôi sẽ cho phép
Quinn

1
Chúng ta có thể giả sử mật khẩu và bí mật không phải là chuỗi rỗng?
xnor

1
Chúng tôi có thể đưa ra câu trả lời không (như 0 hoặc Không) trong mọi tình huống mà chúng tôi không đưa ra bí mật?
xnor

Câu trả lời:


10

JavaScript (ES6),  60  50 byte

Đã lưu 10 byte nhờ @JonasWilms !

Có đầu vào là một trong hai (alias,password,secret)hoặc (alias,password). Trả về không xác định lần đầu tiên một bí mật được lưu trữ, hoặc sai nếu mật khẩu không chính xác.

f=(a,p,s,[P,v]=f[a]||[p])=>p==P&&(f[a]=[P,s||v],v)

Hãy thử một trường hợp thử nghiệm trực tuyến đầu tiên!

Hãy thử một trường hợp thử nghiệm thứ 2 trực tuyến!

Làm sao?

Chúng tôi định nghĩa một hàm được đặt tên f có đối tượng cơ bản cũng được sử dụng để lưu trữ mật khẩu và các bí mật.

Đã bình luận

f = (             // f = named function whose underlying object is used for storage
  a,              // a = alias
  p,              // p = password
  s,              // s = optional secret
  [P, v] = f[a]   // if f[a] is defined, retrieve the password P and the secret v
           || [p] // otherwise, copy p in P
) =>              //
  p == P && (     // if p is not equal to P, yield false; else:
    f[a] = [      //   update f[a]:
      P,          //     save the new password (or leave it unchanged)
      s || v      //     save the new secret if it's defined, or keep the previous one
    ],            //
    v             //   return the previous secret
  )               //

Mất một giây để nhận ra cách bạn lưu trữ đồ đạc!
Xù xì

hmm, điều này có đúng không?
ngn

1
@ngn Rất có thể là không chính xác. Cảm ơn đã báo cáo này. Nên sửa ngay.
Arnauld

-7 byte thông qua việc lưu trữ một mảng [mật khẩu, giá trị] bên trong đối tượng.
Jonas Wilms

@JonasWilms Hoàn thành tốt! Tôi không thể nghĩ về bất kỳ tình huống nào p&&được yêu cầu. Vì vậy, đó là -3 byte khác.
Arnauld

6

Python 2 , 94 93 byte

def f(a,p,s=0,d={}):
 q,t=d.get(a,(0,0))
 if q==p:d[a]=p,s or t;return t
 elif q<1<s:d[a]=p,s

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

Lần đầu tiên, tham số dict mặc định kỳ lạ của Python hoạt động theo ý tôi ...


Đợi đã, sử dụng một đối số mặc định làm cho nó chỉ là một đối tượng thay vì một đối tượng mới trong lệnh gọi hàm? Hmmm ... Điều này giải thích rất nhiều việc sửa lỗi mà tôi đã phải làm trước đây lol.
HyperNeutrino

3

Ruby , 64 byte

Xây dựng một hàm băm cho các bí danh thành một cặp khóa duy nhất password => secret. Có lẽ có thể thanh lịch hơn.

->a,w,s=p{@q||={};(b=@q[a])?s&&b[w]?b[w]=s:b[w]:s&&@q[a]={w=>s}}

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



1

C # (Trình biên dịch tương tác Visual C #) , 140 138 134 byte

-2 byte nhờ dữ liệu @Expired

a=>p=>s=>(a=P.ContainsKey(a)?P[a]:P[a]=new[]{p,s},o:p==a[0]?a[1]:p,s==""?s:p==a[0]?a[1]=s:s).o;var P=new Dictionary<string,string[]>()

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



1
@ExpiredData 134, như Pkhông phải dynamicbây giờ
đại từ của tôi là monicareinstate


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.