Збережіть мої секрети!


14

У мене стільки секретів і ніде їх зберігати!

Мета проста: написати програму, яка дозволяє зберегти рядок і захистити її паролем.

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

Якщо це програма вперше викликається з певним псевдонімом, вона зберігатиме / запам'ятовує секрет та видає все, що завгодно.

Якщо програма викликається псевдонімом, який використовувався раніше, то вона виведе секрет для цього псевдоніма, якщо пароль буде таким самим, як і в перший раз, коли програма запускалася з цим псевдонімом.

Інші випадки

  • Якщо його вперше зателефонували з певним псевдонімом і не вказано секрету - нічого не зберігайте.

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

  • Якщо програма викликається псевдонімом, який було використано, пароль є правильним і надається новий секрет - виведіть старий секрет і замініть його на новий, щоб наступного разу виходити тільки новий секрет.

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

Примітка. Ці секрети / паролі не потрібно зберігати надійно

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

Діють стандартні правила, удачі!


1
Так, використовуйте що-небудь для його зберігання - що стосується псевдонімів, я думаю, він повинен приймати будь-які буквено-цифрові введення
Квін

1
Чи можемо ми використовувати функцію, а не повну програму?
Арнольд

1
@Arnauld Я дозволю
Квін

1
Чи можемо ми припустити, що пароль і секрет - це не порожня рядок?
xnor

1
Чи можемо ми отримати нульову відповідь (наприклад, 0 або Ні) в будь-якій ситуації, коли ми не видаємо секрет?
xnor

Відповіді:


10

JavaScript (ES6),  60  50 байт

Збережено 10 байт завдяки @JonasWilms !

Приймає введення як (alias,password,secret)або (alias,password). Повертає невизначений при першому зберіганні секрету або помилковому, якщо пароль невірний.

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

Спробуйте 1-й тестовий випадок онлайн!

Спробуйте другий тестовий випадок онлайн!

Як?

Ми визначаємо іменовану функцію f , базовий об'єкт якої також використовується для зберігання паролів та секретів.

Прокоментував

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 байти.
Арнольд

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 # Interactive Compiler) , 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.