Simpan rahasiaku!

14

Saya punya begitu banyak rahasia dan tidak punya tempat untuk menyimpannya!

Tujuannya sederhana: menulis sebuah program yang memungkinkan Anda menyimpan string dan membuatnya dilindungi oleh kata sandi.

Program akan menggunakan alias, kata sandi, dan rahasia (opsional) sebagai parameter.

Jika ini adalah pertama kalinya program dipanggil dengan alias yang diberikan, maka ia akan menyimpan / mengingat rahasia, dan menampilkan apa pun yang Anda inginkan.

Jika program dipanggil dengan alias yang telah digunakan sebelumnya, maka itu akan menampilkan rahasia untuk alias itu jika kata sandinya sama dengan pertama kali program dijalankan dengan alias itu.

Kasus lainnya

  • Jika ini pertama kalinya dipanggil dengan alias tertentu dan tidak ada rahasia yang diberikan - simpan apa pun.

  • Jika program dipanggil dengan alias yang telah digunakan, dan kata sandi salah - kembalikan segala jenis kesalahan atau tidak ada sama sekali.

  • Jika program dipanggil dengan alias yang telah digunakan, kata sandi sudah benar dan rahasia baru diberikan - output rahasia lama dan ganti dengan yang baru sehingga lain kali hanya rahasia baru yang dihasilkan.

  • Jika program dipanggil dengan alias yang telah digunakan, kata sandinya benar dan tidak ada rahasia baru yang diberikan - output rahasia lama dan pastikan tidak diganti.

Catatan: Rahasia / kata sandi ini tidak perlu disimpan dengan aman

Perhatikan juga: masukan alfanumerik apa pun untuk kata sandi dan rahasia alias harus diterima

Aturan standar berlaku, semoga berhasil!

Quinn
sumber
1
Ya, gunakan apa saja untuk menyimpannya - untuk alias saya pikir itu harus menerima input alfanumerik
Quinn
1
Bisakah kita menggunakan fungsi daripada program lengkap?
Arnauld
1
@Arnauld saya akan mengizinkannya
Quinn
1
Bolehkah kita menganggap kata sandi dan rahasia bukan string kosong?
xnor
1
Bolehkah kami mengeluarkan jawaban nol (seperti 0 atau Tidak Ada) dalam situasi apa pun di mana kami tidak mengeluarkan rahasia?
xnor

Jawaban:

10

JavaScript (ES6),  60  50 byte

Disimpan 10 byte berkat @JonasWilms !

Mengambil input sebagai salah satu (alias,password,secret)atau (alias,password). Pengembalian tidak terdefinisi saat rahasia pertama kali disimpan, atau salah jika kata sandi salah.

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

Coba test case 1 online!

Coba test case ke-2 secara online!

Bagaimana?

f

Berkomentar

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
sumber
Butuh waktu sebentar untuk mengetahui bagaimana Anda menyimpan barang!
Shaggy
hmm, apakah ini benar?
ngn
1
@ ngn Ini kemungkinan besar memang salah. Terima kasih telah melaporkan ini. Harus diperbaiki sekarang.
Arnauld
-7 byte melalui penyimpanan array [kata sandi, nilai] di dalam objek.
Jonas Wilms
@JonasWilms Bagus sekali! Saya tidak bisa memikirkan situasi di mana p&&diperlukan. Jadi, itu -3 byte lagi.
Arnauld
6

Python 2 , 94 93 byte

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

Cobalah online!

Untuk sekali ini, parameter dict default aneh Python bekerja dalam hati saya ...

Chas Brown
sumber
Tunggu, menggunakan argumen default menjadikannya hanya satu objek, bukan yang baru pada panggilan fungsi? Hmmm ... Ini menjelaskan banyak debug yang harus saya lakukan sebelumnya lol.
HyperNeutrino
3

Ruby , 64 byte

Membangun hash untuk alias ke sepasang kunci tunggal password => secret. Mungkin bisa lebih elegan.

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

Cobalah online!

Nilai Tinta
sumber