Сохрани мои секреты!

14

У меня так много секретов и некуда их хранить!

Цель проста: написать программу, которая позволит вам сохранить строку и защитить ее паролем.

Программа примет псевдоним, пароль и (необязательно) секрет в качестве параметров.

Если это первый раз, когда программа вызывается с заданным псевдонимом, она сохранит / запомнит секрет и выведет все, что вы захотите.

Если программа вызывается с псевдонимом, который использовался ранее, она выведет секрет для этого псевдонима, если пароль будет таким же, как в первый раз, когда программа была запущена с этим псевдонимом.

Другие случаи

  • Если в первый раз вызывается с определенным псевдонимом и секрет не указан - ничего не храните.

  • Если программа вызывается с использованием псевдонима, который был использован, и пароль неверен - верните любую ошибку или вообще ничего.

  • Если программа вызывается с использованием псевдонима, который был использован, пароль верен и предоставлен новый секрет - выведите старый секрет и замените его новым, чтобы в следующий раз выводился только новый секрет.

  • Если программа вызывается с использованным псевдонимом, пароль верен и новый секрет не указывается - выведите старый секрет и убедитесь, что он не заменен.

Примечание: эти секреты / пароли не должны храниться надежно

Также обратите внимание: любой буквенно-цифровой ввод для псевдонимов паролей и секретов должен быть принят

Применяются стандартные правила, удачи!

Quinn
источник
1
Да, используйте что-нибудь, чтобы сохранить это - что касается псевдонимов, я думаю, что он должен принимать любой буквенно-цифровой ввод
Куинн
1
Можем ли мы использовать функцию, а не полную программу?
Arnauld
1
@Arnauld Я позволю это
Куинн
1
Можем ли мы предположить, что пароль и секрет не являются пустой строкой?
xnor
1
Можем ли мы вывести нулевой ответ (например, 0 или Нет) в любой ситуации, когда мы не выводим секрет?
xnor

Ответы:

10

JavaScript (ES6),  60  50 байт

Сохранено 10 байтов благодаря @JonasWilms !

Принимает ввод либо либо, (alias,password,secret)либо (alias,password). Возвращает undefined при первом хранении секрета или false, если пароль неверный.

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

Попробуйте первый тестовый пример онлайн!

Попробуйте второй тестовый пример онлайн!

Как?

е

комментарии

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
источник
Мне потребовалась секунда, чтобы определить, как вы хранили вещи!
Лохматый
хм, это правильно?
NGN
1
@ngn Скорее всего, это действительно неправильно. Спасибо за сообщение об этом. Должно быть исправлено сейчас.
Арно
-7 байт за счет хранения массива [пароль, значение] внутри объекта.
Джонас
@JonasWilms Отлично сделано! Я не могу думать ни о какой ситуации, где p&&это требуется. Итак, это еще 3 байта.
Arnauld
6

Python 2 , 94 93 байта

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

Попробуйте онлайн!

На этот раз странный по умолчанию параметр dict в Python работает в мою пользу ...

Час Браун
источник
Подождите, использование аргумента по умолчанию делает его одним объектом вместо нового при вызове функции? Хммм ... Это объясняет много отладок, которые мне приходилось делать раньше, лол.
HyperNeutrino
3

Рубин , 64 байта

Создает хэш для псевдонимов для одной пары ключей password => secret. Вероятно, может быть более элегантным.

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

Попробуйте онлайн!

Значение чернил
источник
1

C # (интерактивный компилятор Visual C #) , 140 138 134 байта

-2 байта благодаря @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[]>()

Попробуйте онлайн!

мое местоимение monicareinstate
источник
1
138 байт
Данные с
1
@ExpiredData 134, как Pне должно быть dynamicсейчас
мое местоимение monicareinstate