บันทึกความลับของฉัน!


14

ฉันมีความลับมากมายและไม่มีที่ให้พวกเขาอยู่!

เป้าหมายคือง่าย: เขียนโปรแกรมที่ช่วยให้คุณบันทึกสตริงและมีการป้องกันด้วยรหัสผ่าน

โปรแกรมจะใช้นามแฝงรหัสผ่านและความลับ (ไม่จำเป็น) เป็นพารามิเตอร์

หากนี่เป็นครั้งแรกที่โปรแกรมถูกเรียกด้วยนามแฝงที่กำหนดมันจะจัดเก็บ / จดจำความลับและส่งออกสิ่งที่คุณต้องการ

หากโปรแกรมถูกเรียกใช้ด้วยนามแฝงที่เคยใช้มาก่อนมันจะส่งข้อมูลลับสำหรับนามแฝงนั้นหากรหัสผ่านนั้นเป็นรหัสเดียวกันกับครั้งแรกที่โปรแกรมถูกเรียกใช้ด้วยนามแฝงนั้น

กรณีอื่น ๆ

  • ถ้ามันเป็นครั้งแรกที่ถูกเรียกด้วยนามแฝงบางอย่างและไม่มีความลับให้ - เก็บอะไร

  • หากโปรแกรมถูกเรียกใช้พร้อมนามแฝงที่ใช้งานและรหัสผ่านไม่ถูกต้อง - ส่งคืนข้อผิดพลาดใด ๆ หรือไม่มีอะไรเลย

  • หากโปรแกรมถูกเรียกด้วยนามแฝงที่ใช้รหัสผ่านนั้นถูกต้องและเป็นความลับใหม่ให้ - ส่งออกความลับเก่าและแทนที่ด้วยความลับใหม่ดังนั้นในครั้งต่อไปเฉพาะความลับใหม่จะถูกส่งออก

  • หากโปรแกรมถูกเรียกใช้พร้อมนามแฝงที่ใช้รหัสผ่านนั้นถูกต้องและไม่มีการให้ความลับใหม่ - ส่งความลับเก่าและตรวจสอบให้แน่ใจว่าจะไม่ถูกแทนที่

หมายเหตุ: ความลับ / รหัสผ่านเหล่านี้ไม่จำเป็นต้องจัดเก็บอย่างปลอดภัย

โปรดทราบว่า: ควรยอมรับการป้อนตัวอักษรและตัวเลขสำหรับรหัสผ่านและชื่อแทนใด ๆ

ใช้กฎมาตรฐานโชคดี!


1
ใช่ใช้ทุกอย่างเพื่อเก็บไว้ - สำหรับนามแฝงฉันคิดว่าควรยอมรับอินพุตและตัวอักษรใด ๆ
Quinn

1
เราจะใช้ฟังก์ชั่นแทนโปรแกรมเต็มได้ไหม?
Arnauld

1
@Arnauld ฉันจะอนุญาต
Quinn

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 ทางออนไลน์!

ลองทดสอบกรณีที่ 2 ทางออนไลน์!

อย่างไร?

แสดงความคิดเห็น

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

ใช้เวลาสักครู่ในการสังเกตว่าคุณเก็บสิ่งของอย่างไร!
Shaggy

อืมเป็นนี้ถูกต้องหรือไม่
ngn

1
@ngn มันไม่ถูกต้องแน่นอนที่สุด ขอขอบคุณที่รายงานสิ่งนี้ ควรได้รับการแก้ไขแล้ว
Arnauld

-7 ไบต์ผ่านการจัดเก็บ [รหัสผ่านค่า] อาร์เรย์ภายในของวัตถุ
Jonas Wilms

@ JonasWilms ทำได้ดีมาก! ฉันไม่สามารถนึกถึงสถานการณ์ใด ๆ ที่p&&จำเป็น นั่นคืออีก -3 ไบต์
Arnauld

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.