Salve meus segredos!

14

Eu tenho tantos segredos e nenhum lugar para guardá-los!

O objetivo é simples: escreva um programa que permita salvar uma string e protegê-la por uma senha.

O programa terá um alias, senha e segredo (opcional) como parâmetros.

Se é a primeira vez que o programa é chamado com um determinado alias, ele armazena / lembra o segredo e gera o que quiser.

Se o programa for chamado com um alias que já foi usado anteriormente, ele emitirá o segredo para esse alias se a senha for a mesma da primeira vez que o programa foi executado com esse alias.

Outros casos

  • Se for a primeira vez que é chamado com um certo apelido e nenhum segredo é dado - não armazene nada.

  • Se o programa for chamado com um alias que tenha sido usado e a senha estiver incorreta - retorne qualquer tipo de erro ou nada.

  • Se o programa for chamado com um alias que foi usado, a senha está correta e um novo segredo é fornecido - envie o segredo antigo e substitua-o pelo novo, para que, da próxima vez, apenas o novo segredo seja produzido.

  • Se o programa for chamado com um alias que foi usado, a senha está correta e nenhum novo segredo é fornecido - produza o antigo segredo e verifique se ele não foi substituído.

Nota: Esses segredos / senhas não precisam ser armazenados com segurança

Observe também: qualquer entrada alfanumérica para senhas e segredos de aliases deve ser aceita

Aplicam-se regras padrão, boa sorte!

Quinn
fonte
1
Sim, usar qualquer coisa para armazená-lo - como por aliases eu acho que deveria aceitar qualquer entrada alfanumérica
Quinn
1
Podemos usar uma função em vez de um programa completo?
Arnauld
1
@Arnauld eu vou permitir
Quinn
1
Podemos assumir que a senha e o segredo não são a string vazia?
Xnor
1
Podemos gerar uma resposta nula (como 0 ou Nenhuma) em qualquer situação em que não produzimos o segredo?
Xnor

Respostas:

10

JavaScript (ES6),  60  50 bytes

Economizei 10 bytes graças a @JonasWilms !

Aceita entrada como (alias,password,secret)ou (alias,password). Retorna indefinido na primeira vez que um segredo é armazenado ou falso se a senha estiver incorreta.

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

Experimente um 1º caso de teste online!

Experimente um segundo caso de teste online!

Quão?

Definimos uma função nomeada cujo objeto subjacente também é usado para armazenar as senhas e os segredos.f

Comentado

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
fonte
Levei um segundo para descobrir como você estava armazenando coisas!
Shaggy
hmm, isso está correto?
ngn 17/05/19
1
@ngn É provavelmente incorreto mesmo. Obrigado por denunciar isso. Deve ser corrigido agora.
Arnauld
-7 bytes através do armazenamento de uma matriz [password, value] dentro do objeto.
Jonas Wilms
@JonasWilms Nicely done! Não consigo pensar em nenhuma situação em que p&&seja necessário. Então, isso é mais -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

Experimente online!

Pela primeira vez, o estranho parâmetro dict padrão do Python funciona a meu favor ...

Chas Brown
fonte
Espere, usar um argumento padrão torna apenas um objeto em vez de um novo na chamada de função? Hmmm ... Isso explica muita depuração que tive que fazer anteriormente, lol.
HyperNeutrino 23/05/19
3

Ruby , 64 bytes

Cria um hash para aliases em um único par de chaves de password => secret. Provavelmente poderia ser mais elegante.

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

Experimente online!

Value Ink
fonte