비밀을 지키세요!


14

나는 비밀이 너무 많아서 어디에도 보관할 수 없습니다!

목표는 간단합니다. 문자열을 저장하고 암호로 보호 할 수있는 프로그램을 작성하십시오.

프로그램은 별명, 비밀번호 및 (선택 사항) 비밀번호를 매개 변수로 사용합니다.

프로그램이 지정된 별명으로 처음 호출 된 경우 비밀을 저장 / 기억하고 원하는 것을 출력합니다.

프로그램이 이전에 사용 된 별명으로 호출 된 경우 암호가 프로그램이 해당 별명으로 처음 실행될 때와 동일한 경우 해당 별명에 대한 비밀을 출력합니다.

다른 경우

  • 특정 별칭으로 처음 호출되고 비밀이없는 경우 아무것도 저장하지 마십시오.

  • 프로그램이 사용 된 별명으로 호출되고 암호가 올바르지 않은 경우, 모든 종류의 오류를 리턴하거나 전혀 리턴하지 않습니다.

  • 프로그램이 사용 된 별명으로 호출 된 경우, 암호가 올 바르고 새 암호가 제공됩니다. 이전 암호를 출력하고 새 암호로 바꾸어 다음에 새 암호 만 출력하십시오.

  • 프로그램이 사용 된 별명으로 호출 된 경우, 비밀번호가 올 바르고 새 비밀번호가 제공되지 않습니다. 이전 비밀번호를 출력하고 바꾸지 않도록하십시오.

참고 :이 비밀 / 암호는 안전하게 저장할 필요가 없습니다.

또한 참고 : 별명 비밀번호 및 비밀번호에 대한 영숫자 입력은 허용되어야합니다.

표준 규칙이 적용됩니다. 행운을 빕니다!


1
그렇습니다, 그것을 저장하기 위해 무엇이든 사용하십시오-별명에 대해서는 영숫자 입력을 받아 들여야한다고 생각합니다
Quinn

1
전체 프로그램이 아닌 함수를 사용할 수 있습니까?
Arnauld

1
@Arnauld 허용하겠습니다
Quinn

1
비밀번호와 비밀번호가 빈 문자열이 아니라고 가정 할 수 있습니까?
xnor

1
비밀을 출력하지 않는 상황에서 널 응답 (예 : 0 또는 없음)을 출력 할 수 있습니까?
xnor

답변:


10

자바 스크립트 (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)

온라인으로 첫 번째 테스트 사례를 시도하십시오!

온라인으로 두 번째 테스트 사례를 시도하십시오!

어떻게?

에프

댓글

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

당신이 물건을 어떻게 보관하고 있는지 발견하기 위해 잠깐만 걸렸습니다!
얽히고 설킨 Shake

흠, 이것이 맞습니까?
ngn

1
@ngn 실제로 잘못된 것 같습니다. 보고 해 주셔서 감사합니다. 지금 수정해야합니다.
Arnauld

객체 내부에 [password, value] 배열을 저장하여 -7 바이트
조나스 윌 름스

@JonasWilms 잘 했어요! p&&필요한 상황을 생각할 수 없습니다 . 그래서 그것은 또 다른 -3 바이트입니다.
Arnauld

6

파이썬 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 매개 변수는 내가 선호하는대로 작동합니다 ...


잠깐, 기본 인수를 사용하면 함수 호출시 새 객체 대신 하나의 객체가됩니까? 흠 ... 이것은 이전에 lol했던 많은 디버깅을 설명합니다.
HyperNeutrino



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.