Sauvez mes secrets!

14

J'ai tellement de secrets et nulle part où les garder!

Le but est simple: écrire un programme qui vous permet d'enregistrer une chaîne et de la faire protéger par un mot de passe.

Le programme prendra comme paramètres un alias, un mot de passe et un secret (facultatif).

Si c'est la première fois que le programme est appelé avec un alias donné, il stockera / se souviendra du secret et affichera tout ce que vous voulez.

Si le programme est appelé avec un alias qui a été utilisé auparavant, il affichera le secret de cet alias si le mot de passe est le même que la première fois que le programme a été exécuté avec cet alias.

Autres cas

  • Si c'est la première fois que vous êtes appelé avec un certain alias et qu'aucun secret n'est donné - ne stockez rien.

  • Si le programme est appelé avec un alias qui a été utilisé et que le mot de passe est incorrect - renvoyez tout type d'erreur ou rien du tout.

  • Si le programme est appelé avec un alias qui a été utilisé, le mot de passe est correct et un nouveau secret est fourni - sortez l'ancien secret et remplacez-le par le nouveau afin que la prochaine fois seul le nouveau secret soit sorti.

  • Si le programme est appelé avec un alias qui a été utilisé, le mot de passe est correct et aucun nouveau secret n'est fourni - sortez l'ancien secret et assurez-vous qu'il n'est pas remplacé.

Remarque: ces secrets / mots de passe n'ont pas besoin d'être stockés en toute sécurité

Notez également: toute entrée alphanumérique pour les mots de passe et secrets d'alias doit être acceptée

Les règles standard s'appliquent, bonne chance!

Quinn
la source
1
Oui, utilisez n'importe quoi pour le stocker - comme pour les alias, je pense qu'il devrait accepter n'importe quelle entrée alphanumérique
Quinn
1
Pouvons-nous utiliser une fonction plutôt qu'un programme complet?
Arnauld
1
@Arnauld Je vais le permettre
Quinn
1
Pouvons-nous supposer que le mot de passe et le secret ne sont pas la chaîne vide?
xnor
1
Pouvons-nous produire une réponse nulle (comme 0 ou Aucune) dans toute situation où nous ne fournissons pas le secret?
xnor

Réponses:

10

JavaScript (ES6),  60  50 octets

10 octets enregistrés grâce à @JonasWilms !

Prend l'entrée en tant que (alias,password,secret)ou (alias,password). Renvoie undefined la première fois qu'un secret est stocké, ou false si le mot de passe est incorrect.

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

Essayez un 1er cas de test en ligne!

Essayez un 2ème cas de test en ligne!

Comment?

F

Commenté

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
la source
Cela m'a pris une seconde pour voir comment vous stockiez les choses!
Shaggy
hmm, est- ce correct?
ngn
1
@ngn C'est très probablement incorrect. Merci d'avoir signalé cela. Devrait être corrigé maintenant.
Arnauld
-7 octets en stockant un tableau [mot de passe, valeur] à l'intérieur de l'objet.
Jonas Wilms
@JonasWilms Bien joué! Je ne peux penser à aucune situation où cela p&&est nécessaire. Donc, c'est un autre -3 octets.
Arnauld
6

Python 2 , 94 93 octets

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

Essayez-le en ligne!

Pour une fois, l'étrange paramètre dict par défaut de Python fonctionne en ma faveur ...

Chas Brown
la source
Attendez, l'utilisation d'un argument par défaut en fait un seul objet au lieu d'un nouvel lors de l'appel de fonction? Hmmm ... Cela explique beaucoup de débogage que j'ai dû faire auparavant lol.
HyperNeutrino
3

Ruby , 64 octets

Construit un hachage pour les alias d'une seule paire de clés de password => secret. Cela pourrait probablement être plus élégant.

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

Essayez-le en ligne!

Encre de valeur
la source