Ocal moje sekrety!


14

Mam tak wiele tajemnic i nigdzie ich nie trzymam!

Cel jest prosty: napisać program, który pozwala zapisać ciąg znaków i zabezpieczyć go hasłem.

Program przyjmie alias, hasło i (opcjonalnie) sekret jako parametry.

Jeśli program jest wywoływany po raz pierwszy z danym aliasem, zapisze / zapamięta sekret i wyśle ​​wszystko, co chcesz.

Jeśli program zostanie wywołany z aliasem, który był wcześniej używany, to wyśle ​​sekret dla tego aliasu, jeśli hasło jest takie samo jak przy pierwszym uruchomieniu programu z tym aliasem.

Inne przypadki

  • Jeśli po raz pierwszy zostanie wywołany z pewnym aliasem i nie zostanie podany żaden sekret - nic nie przechowuj.

  • Jeśli program jest wywoływany z użytym aliasem, a hasło jest niepoprawne - zwróć dowolny błąd lub nic.

  • Jeśli program zostanie wywołany z aliasem, który został użyty, hasło jest poprawne i dostarczony jest nowy klucz tajny - wypisz stary klucz tajny i zastąp go nowym, aby następnym razem był wyświetlany tylko nowy klucz tajny.

  • Jeśli program zostanie wywołany z aliasem, który został użyty, hasło jest prawidłowe i nie zostanie podany żaden nowy klucz tajny - wypisz stary klucz tajny i upewnij się, że nie zostanie zastąpiony.

Uwaga: Te tajemnice / hasła nie muszą być bezpiecznie przechowywane

Uwaga: wszelkie dane alfanumeryczne dla haseł aliasów i tajemnic powinny być akceptowane

Obowiązują standardowe zasady, powodzenia!


1
Tak, używaj czegokolwiek do przechowywania - jak w przypadku aliasów, myślę, że powinien akceptować wszelkie dane alfanumeryczne
Quinn

1
Czy możemy użyć funkcji zamiast pełnego programu?
Arnauld

1
@Arnauld Pozwolę na to
Quinn

1
Czy możemy założyć, że hasło i klucz tajny nie są pustym ciągiem?
xnor

1
Czy możemy podać odpowiedź zerową (na przykład 0 lub Brak) w dowolnej sytuacji, w której nie ujawniamy sekretu?
xnor

Odpowiedzi:


10

JavaScript (ES6),  60  50 bajtów

Zaoszczędź 10 bajtów dzięki @JonasWilms !

Staje się jako wkład albo (alias,password,secret)czy(alias,password) . Zwraca niezdefiniowany przy pierwszym przechowywaniu tajnego klucza lub fałsz, jeśli hasło jest niepoprawne.

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

Wypróbuj 1. przypadek testowy online!

Wypróbuj drugi przypadek testowy online!

W jaki sposób?

fa którego bazowy obiekt jest także używany do przechowywania haseł i tajemnice.

Skomentował

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

Zajęło mi sekundę, aby zauważyć, jak przechowujesz rzeczy!
Kudłaty

hmm, czy to prawda?
ngn

1
@ngn To najprawdopodobniej niepoprawne. Dziękujemy za zgłoszenie tego. Powinien zostać teraz naprawiony.
Arnauld

-7 bajtów poprzez przechowywanie tablicy [hasło, wartość] wewnątrz obiektu.
Jonas Wilms

@JonasWilms Ładnie zrobione! Nie mogę wymyślić żadnej sytuacji, w której p&&jest to wymagane. To kolejne 3 bajty.
Arnauld,

6

Python 2 , 94 93 bajty

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

Wypróbuj online!

Tym razem dziwny domyślny parametr dict Pythona działa na moją korzyść ...


Zaraz, użycie domyślnego argumentu powoduje, że jest to tylko jeden obiekt zamiast nowego w wywołaniu funkcji? Hmmm ... To wyjaśnia wiele debugowania, które musiałem zrobić wcześniej LOL.
HyperNeutrino,

3

Rubin , 64 bajty

Tworzy skrót dla aliasów do pojedynczej pary kluczy password => secret . Prawdopodobnie może być bardziej elegancki.

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

Wypróbuj online!



1

C # (interaktywny kompilator Visual C #) , 140 138 134 bajtów

-2 bajty dzięki @Expired Data

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

Wypróbuj online!



1
@ExpiredData 134, ponieważ Pnie musi być dynamicteraz
mój zaimek to monicareinstate


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.