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


14

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

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

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

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

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

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

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

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

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

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

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

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

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


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
  )               //

Мне потребовалась секунда, чтобы определить, как вы хранили вещи!
Лохматый

хм, это правильно?
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



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[]>()

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



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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.