Sırlarımı sakla!


14

Çok fazla sırrım var ve onları tutacak hiçbir yerim yok!

Amaç basit: bir dizeyi kaydetmenizi ve bir şifre ile korunmasını sağlayan bir program yazın.

Program parametre olarak bir takma ad, şifre ve (isteğe bağlı) sır alacaktır.

Program belirli bir takma adla ilk kez çağrılırsa, sırrı saklar / hatırlar ve ne istersen çıkar.

Program daha önce kullanılmış bir takma adla çağrılırsa, programın diğer adla ilk kez çalıştırılmasıyla aynı ise, bu takma adın sırrını verir.

Diğer durumlar

  • İlk kez belirli bir takma adla çağrılıyorsa ve hiçbir sır verilmiyorsa - hiçbir şey saklamayın.

  • Program kullanılmış bir takma adla çağrılırsa ve parola yanlışsa - herhangi bir hata veya hiçbir şey döndürmeyin.

  • Program kullanılmış bir takma adla çağrılırsa, parola doğrudur ve yeni bir sır verilir - eski sırrı çıkar ve yenisiyle değiştir, böylece bir dahaki sefere yalnızca yeni sır çıkar.

  • Program kullanılmış bir takma adla çağrılırsa, parola doğrudur ve yeni bir sır verilmez - eski sırrı çıktılayın ve değiştirilmediğinden emin olun.

Not: Bu sırların / şifrelerin güvenli bir şekilde saklanması gerekmez

Ayrıca not: takma ad şifreleri ve sırları için herhangi bir alfasayısal giriş kabul edilmelidir

Standart kurallar geçerlidir, iyi şanslar!


1
Evet, saklamak için herhangi bir şey kullanın - takma adlarda olduğu gibi herhangi bir alfasayısal girişi kabul etmesi gerektiğini düşünüyorum
Quinn

1
Tam bir program yerine bir fonksiyon kullanabilir miyiz?
Arnauld

1
@Ona izin veririm
Quinn

1
Parolanın ve sırrının boş dize olmadığını varsayabilir miyiz?
xnor

1
Sırrı vermediğimiz herhangi bir durumda null bir cevap verebilir miyiz (0 veya Hiçbiri gibi)?
xnor

Yanıtlar:


10

JavaScript (ES6),  60  50 bayt

@JonasWilms sayesinde 10 bayt tasarruf edildi !

Girdiyi ya (alias,password,secret)da olarak alır (alias,password). İade tanımsız ilk gizli depolandığı saat veya false şifre yanlış ise.

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

Çevrimiçi bir 1. test vakasını deneyin!

Çevrimiçi bir 2. test vakası deneyin!

Nasıl?

Parolaları ve sırları saklamak için temel alınan nesne de kullanılan adlandırılmış bir işlev tanımlarız .f

Yorumlananlar

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

Bir şeyleri nasıl sakladığınızı tespit etmek için bir saniye aldı!
Shaggy

hmm, bu doğru mu?
ngn

1
@ngn Büyük olasılıkla yanlıştır. Bunu bildirdiğiniz için teşekkürler. Şimdi düzeltilmelidir.
Arnauld

Nesnenin içine bir [parola, değer] dizisi depolayarak -7 bayt .
Jonas Wilms

@JonasWilms Güzel yapılır! p&&Gerekli olan herhangi bir durumu düşünemiyorum . Yani, bu -3 bayt daha.
Arnauld

6

Python 2 , 94 93 bayt

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

Çevrimiçi deneyin!

Bir keresinde, Python'un garip varsayılan dict parametresi benim lehime çalışıyor ...


Bekle, varsayılan bir argüman kullanarak onu işlev çağrısında yeni bir nesne yerine sadece bir nesne yapar? Hmmm ... Bu daha önce yapmak zorunda olduğum birçok hata ayıklamayı açıklıyor lol.
HyperNeutrino

3

Ruby , 64 bayt

Tek bir anahtar çiftine takma adlar için bir karma oluşturur password => secret. Muhtemelen daha zarif olabilir.

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

Çevrimiçi deneyin!



1

C # (Visual C # Etkileşimli derleyicisi) , 140 138 134 bayt

@Expired Data sayesinde -2 bayt

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

Çevrimiçi deneyin!



1
@ExpiredData 134 olarak Polmak zorunda değildir dynamicartık
benim zamir monicareinstate olduğunu


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.