秘密を守れ!


14

私にはたくさんの秘密があり、それらを保管する場所はありません!

目標は単純です。文字列を保存し、パスワードで保護できるプログラムを作成します。

プログラムは、エイリアス、パスワード、および(オプションの)シークレットをパラメーターとして受け取ります。

指定されたエイリアスでプログラムが初めて呼び出された場合、秘密を保存/記憶し、必要なものを出力します。

プログラムが以前に使用されたエイリアスで呼び出された場合、パスワードがそのエイリアスで最初に実行されたときと同じである場合、そのエイリアスのシークレットが出力されます。

その他の場合

  • 特定のエイリアスで最初に呼び出され、シークレットが指定されていない場合は、何も保存しません。

  • 使用されたエイリアスを使用してプログラムが呼び出され、パスワードが正しくない場合-あらゆる種類のエラーを返すか、まったく何も返しません。

  • 使用されたエイリアスでプログラムが呼び出された場合、パスワードは正しく、新しいシークレットが提供されます。古いシークレットを出力し、新しいシークレットに置き換えて、次回は新しいシークレットのみが出力されるようにします。

  • 使用されたエイリアスでプログラムが呼び出された場合、パスワードは正しく、新しいシークレットは提供されません。古いシークレットを出力し、置き換えられないことを確認してください。

注:これらのシークレット/パスワードは安全に保存する必要はありません

また、注:エイリアスのパスワードとシークレットの英数字入力はすべて受け入れる必要があります

標準ルールが適用されます、幸運を祈ります!


1
はい、それを保存するために何でも使用します-エイリアスに関しては、英数字入力を受け入れるべきだと思う
クイン

1
完全なプログラムではなく関数を使用できますか?
アーノールド

1
@Arnauld許可します
クイン

1
パスワードとシークレットが空の文字列ではないと仮定できますか?
xnor

1
シークレットを出力しない状況で、null回答(0またはNoneなど)を出力できますか?
xnor

回答:


10

JavaScript(ES6)、 60  50バイト

@JonasWilmsのおかげで10バイト節約されました

どちらかとして入力を受け取り(alias,password,secret)(alias,password)。シークレットが最初に保存されるときにundefinedを返します。パスワードが正しくない場合はfalseを返します。

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

最初のテストケースをオンラインでお試しください!

2つ目のテストケースをオンラインでお試しください!

どうやって?

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それは確かに間違いそうです。これを報告していただきありがとうございます。今すぐ修正する必要があります。
アーノールド

オブジェクト内に[password、value]配列を格納することで-7バイト
ジョナスウィルムズ

@JonasWilmsよくできました!p&&必要な状況は考えられません。したがって、それはもう3バイトです。
アーナルド

6

Pythonの294の 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

オンラインでお試しください!

かつて、Pythonの奇妙なデフォルトのdictパラメーターが私の好意で機能しています...


待って、デフォルトの引数を使用すると、関数呼び出しで新しいオブジェクトではなく1つのオブジェクトになりますか?うーん...これは私が以前にやらなければならなかった多くのデバッグを説明していますlol。
ハイパーニュートリノ



1

C#の(ビジュアルC#インタラクティブコンパイラ)140 138 134バイト

@Expired Dataのおかげで-2バイト

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.