Rette meine Geheimnisse!

14

Ich habe so viele Geheimnisse und kann sie nirgendwo aufbewahren!

Das Ziel ist einfach: Schreiben Sie ein Programm, mit dem Sie eine Zeichenfolge speichern und durch ein Kennwort schützen können.

Das Programm verwendet einen Alias, ein Passwort und ein (optionales) Geheimnis als Parameter.

Wenn das Programm zum ersten Mal mit einem bestimmten Alias ​​aufgerufen wird, speichert / speichert es das Geheimnis und gibt alles aus, was Sie wollen.

Wenn das Programm mit einem zuvor verwendeten Alias ​​aufgerufen wird, wird das Geheimnis für diesen Alias ​​ausgegeben, wenn das Kennwort mit dem Kennwort übereinstimmt, mit dem das Programm zum ersten Mal ausgeführt wurde.

Andere Fälle

  • Wenn es das erste Mal ist, dass es mit einem bestimmten Alias ​​aufgerufen wird und kein Geheimnis bekannt ist, speichern Sie nichts.

  • Wenn das Programm mit einem verwendeten Alias ​​aufgerufen wird und das Kennwort falsch ist, wird ein Fehler oder gar nichts zurückgegeben.

  • Wenn das Programm mit einem verwendeten Alias ​​aufgerufen wird, ist das Passwort korrekt und es wird ein neues Geheimnis angegeben - geben Sie das alte Geheimnis aus und ersetzen Sie es durch das neue, damit beim nächsten Mal nur das neue Geheimnis ausgegeben wird.

  • Wenn das Programm mit einem verwendeten Alias ​​aufgerufen wird, ist das Kennwort korrekt und es wird kein neues Geheimnis angegeben. Geben Sie das alte Geheimnis aus und stellen Sie sicher, dass es nicht ersetzt wird.

Hinweis: Diese Geheimnisse / Passwörter müssen nicht sicher gespeichert werden

Beachten Sie auch, dass alle alphanumerischen Eingaben für Aliase, Passwörter und Geheimnisse akzeptiert werden sollten

Es gelten die üblichen Regeln, viel Glück!

Quinn
quelle
1
Ja, verwende irgendetwas, um es zu speichern - wie für Aliase, ich denke, es sollte jede alphanumerische Eingabe akzeptiert werden
Quinn
1
Dürfen wir eine Funktion anstelle eines vollständigen Programms verwenden?
Arnauld
1
@ Arnauld Ich werde es erlauben
Quinn
1
Dürfen wir annehmen, dass das Passwort und das Geheimnis nicht die leere Zeichenfolge sind?
17.
1
Dürfen wir in jeder Situation, in der wir das Geheimnis nicht ausgeben, eine Nullantwort (wie 0 oder Keine) ausgeben?
17.

Antworten:

10

JavaScript (ES6),  60 bis  50 Byte

10 Bytes gespart dank @JonasWilms !

Nimmt die Eingabe als entweder (alias,password,secret)oder (alias,password). Gibt undefiniert zurück , wenn ein Geheimnis zum ersten Mal gespeichert wird, oder falsch, wenn das Passwort falsch ist.

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

Probieren Sie einen ersten Testfall online aus!

Probieren Sie einen zweiten Testfall online aus!

Wie?

Wir definieren eine benannte Funktion f , deren zugrunde liegende Aufgabe wird auch die Passwörter zu speichern , verwendet und die Geheimnisse.

Kommentiert

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
  )               //
Arnauld
quelle
Ich habe eine Sekunde gebraucht, um zu sehen, wie Sie die Dinge aufbewahrt haben!
Shaggy
hmm, ist das richtig?
ngn
1
@ngn Es ist höchstwahrscheinlich falsch. Vielen Dank für den Hinweis. Sollte jetzt behoben sein.
Arnauld
-7 Bytes durch Speichern eines Arrays [password, value] innerhalb des Objekts.
Jonas Wilms
@ JonasWilms Schön gemacht! Ich kann mir keine Situation vorstellen, in der etwas p&&erforderlich ist. Das sind also noch mal -3 Bytes.
Arnauld
6

Python 2 , 94 93 Bytes

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

Probieren Sie es online!

Ausnahmsweise funktioniert Pythons seltsamer Standard-Dikt-Parameter zu meinen Gunsten ...

Chas Brown
quelle
Warten Sie, wenn Sie ein Standardargument verwenden, wird es beim Funktionsaufruf nur zu einem Objekt und nicht zu einem neuen. Hmmm ... Das erklärt eine Menge Debugging, das ich vorher machen musste lol.
HyperNeutrino
3

Ruby , 64 Bytes

Erstellt einen Hash für Aliase für ein einzelnes Schlüsselpaar von password => secret. Wahrscheinlich könnte eleganter sein.

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

Probieren Sie es online!

Wert Tinte
quelle