Salva mis secretos!

14

¡Tengo tantos secretos y ningún lugar donde guardarlos!

El objetivo es simple: escribir un programa que le permita guardar una cadena y protegerla con una contraseña.

El programa tomará un alias, contraseña y secreto (opcional) como parámetros.

Si es la primera vez que se llama al programa con un alias dado, almacenará / recordará el secreto y generará lo que desee.

Si se llama al programa con un alias que se ha usado antes, generará el secreto de ese alias si la contraseña es la misma que la primera vez que el programa se ejecutó con ese alias.

Otros casos

  • Si es la primera vez que se llama con un cierto alias y no se da ningún secreto, no guarde nada.

  • Si se llama al programa con un alias que se ha utilizado y la contraseña es incorrecta, devuelva cualquier tipo de error o nada.

  • Si se llama al programa con un alias que se ha utilizado, la contraseña es correcta y se proporciona un nuevo secreto: envíe el secreto antiguo y reemplácelo por el nuevo, de modo que la próxima vez solo salga el nuevo secreto.

  • Si se llama al programa con un alias que se ha utilizado, la contraseña es correcta y no se proporciona ningún secreto nuevo: envíe el secreto anterior y asegúrese de que no se reemplace.

Nota: estos secretos / contraseñas no necesitan almacenarse de forma segura

También tenga en cuenta: cualquier entrada alfanumérica para contraseñas y secretos de alias debe ser aceptada

Se aplican reglas estándar, ¡buena suerte!

Quinn
fuente
1
Sí, use cualquier cosa para almacenarlo, en cuanto a los alias, creo que debería aceptar cualquier entrada alfanumérica
Quinn
1
¿Podemos usar una función en lugar de un programa completo?
Arnauld
1
@Arnauld lo permitiré
Quinn
1
¿Podemos suponer que la contraseña y el secreto no son la cadena vacía?
xnor
1
¿Podemos generar una respuesta nula (como 0 o Ninguna) en cualquier situación en la que no generemos el secreto?
xnor

Respuestas:

10

JavaScript (ES6),  60  50 bytes

¡ Ahorré 10 bytes gracias a @JonasWilms !

Toma entrada como cualquiera (alias,password,secret) o (alias,password). Devuelve indefinido la primera vez que se almacena un secreto, o falso si la contraseña es incorrecta.

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

¡Pruebe un primer caso de prueba en línea!

¡Pruebe un segundo caso de prueba en línea!

¿Cómo?

Definimos una función con nombre. 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
fuente
¡Me tomó un segundo descubrir cómo estabas almacenando cosas!
Shaggy
hmm, esto es correcto?
ngn
1
@ngn Es muy probable que sea incorrecto. Gracias por informar esto. Debería arreglarse ahora.
Arnauld
-7 bytes mediante el almacenamiento de una matriz [contraseña, valor] dentro del objeto.
Jonas Wilms
@JonasWilms ¡Bien hecho! No puedo pensar en ninguna situación donde p&&se requiera. Entonces, eso es otro -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

Pruébalo en línea!

Por una vez, el extraño parámetro predeterminado dict de Python funciona a mi favor ...

Chas Brown
fuente
Espera, ¿usar un argumento predeterminado lo convierte en un solo objeto en lugar de uno nuevo en la llamada a la función? Hmmm ... Esto explica un montón de depuración que he tenido que hacer anteriormente jajaja.
HyperNeutrino
3

Ruby , 64 bytes

Crea un hash para alias para un solo par de claves de password => secret. Probablemente podría ser más elegante.

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

Pruébalo en línea!

Tinta de valor
fuente