รหัสผ่านของ Bob


13

บทนำ

บ๊อบชอบมีรหัสผ่านที่แตกต่างกันสำหรับแต่ละเว็บไซต์ที่เขาใช้ เขาต้องการรหัสผ่านในรูปแบบพิเศษเพื่อให้เขาจำได้ ช่วยเขาด้วยการสร้างเครื่องสร้างรหัสผ่านซึ่งสั้นที่สุดเท่าที่จะเป็นไปได้ในความยาวของรหัสเพราะเขาชอบที่จะรักษาข้อมูลให้สั้นเหมือนกับชื่อของเขา

ท้าทาย

สร้าง Bob เป็นเครื่องมือสร้างรหัสผ่านซึ่งใช้พารามิเตอร์สี่ตัว -

  • ที่อยู่โดเมน (เช่น: stackexchange.com)
  • ชื่อจริง,
  • นามสกุล,
  • วันเดือนปีเกิด

และส่งออกสตริงซึ่งได้รับการแปลงต่อไปนี้

รหัสผ่านทุกคนมีแม่แบบขึ้นอยู่กับความยาวLของชื่อโดเมน ถ้าlเป็นไพรม์เทมเพลตจะอยู่ในแบบฟอร์มนี้ -

[birth-date][domain-name][lastname][birth-year][symbol]

อื่นมันเป็นของแบบฟอร์มนี้ -

[symbol][birth-year][firstname][domain-name][birth-date].

ฟิลด์สัญลักษณ์จะมีค่าตามประเภทของโดเมน

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
ค่าเริ่มต้น -> ~~~

ตอนนี้เขายังต้องการเรียกใช้รหัสซีซาร์เหนือทุ่ง - [firstname][domain-name][lastname]. ทิศทางการเปลี่ยนนั้นถูกต้องหากlเป็นอย่างอื่นที่เหลืออยู่ ค่ากะจะถูกกำหนดโดยมูลค่าของการเพิ่มวันเกิดและปี

หลังจากกระบวนการข้างต้นข้อความไม่สามารถจดจำได้ง่ายดังนั้นเขาจึงต้องการให้ข้อความที่เข้ารหัสนั้นสามารถออกเสียงได้ ในการทำเช่นนี้เขาต้องการแทนที่พยัญชนะลำดับที่สามทุกสระด้วยสระตามลำดับตัวอักษร (เช่น, aeiou)

ในที่สุดเขาต้องการที่จะลบตัวอักษรเดียวกันที่เกิดขึ้นติดต่อกัน

ตัวอย่าง

อินพุต - stackexchange.com bob williams 0894

เอาท์พุท - 08qraicvafyecugjigyoq94 $$$

คำอธิบาย:

เท็มเพลตรหัสผ่านนั้นเป็น[birth-date][domain-name][lastname][birth-year][symbol]เพราะความยาวของชื่อโดเมนstackexchangeเป็นเอกสิทธิ์ สัญลักษณ์จะเป็นประเภทโดเมนคือ$$$.com

ลองเติมค่าเหล่านั้นในแม่แบบ 08stackexchangewilliams94$$$- ตอนนี้รหัสซีซาร์ต้องถูกเรียกใช้บนฟิลด์[firstname][domain-name][lastname](เป็นเพียงนามสกุลในกรณีนี้) ทิศทางการเปลี่ยนแปลงที่ถูกต้องเพราะลิตร08+94 = 102เป็นสำคัญและความคุ้มค่าการเปลี่ยนแปลงคือ

ดังนั้นจะกลายเป็น08stackexchangewilliams94$$$ 08qryaicvafylecugjjgykq94$$$ตอนนี้ทุกพยัญชนะที่สามติดต่อกันจะถูกแทนที่ด้วยสระ - 08qraaicvafyeecugjigyoq94$$$ ทุก ocuurences ติดต่อกันของตัวอักษรเดียวกันจะถูกลบออก 08qraicvafyecugjigyoq94$$$- ไม่ต้องกังวลว่าบ๊อบจะออกเสียงได้

ข้อมูลเพิ่มเติม

  • ที่อยู่โดเมนชื่อและนามสกุลมีตัวอักษรพิมพ์เล็กเท่านั้น
  • อยู่โดเมนมักจะประกอบด้วยเพียงระดับที่สองและโดเมนระดับบนสุดเหมือนและไม่ได้stackexchange.com codegolf.stackexchange.comนอกจากนี้โดเมนเช่น .co.ukนั้นไม่ได้รับอนุญาต แต่เพียงอย่างเดียว.ukหรือ.inถูกต้อง
  • การเปลี่ยนสระตามลำดับตัวอักษรคือวงจร ผมหมายถึงหลังจากu, aจะใช้ในการแทนที่
  • ช่วง ASCII สำหรับรหัสซีซาร์คือ 97 - 122 รวม
  • คุณสามารถใช้การป้อนข้อมูลตามที่อธิบายไว้ที่นี่
  • เอาต์พุตต้องเป็นสตริง
  • รูปแบบของวันเกิดและปีคือddและyyดังนั้น02จึงเป็นที่ยอมรับและ2ไม่

นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ มีความสุขในการเล่นกอล์ฟ!


4
ชื่อโดเมนจะประกอบด้วยโดเมนระดับที่สองและระดับบนสุดstackexchange.comเท่านั้นimg.stackexchange.comใช่ไหม? โดเมนประเทศนั้นเป็นbbc.co.ukอย่างไร
นักเทศน์

คุณใช้ตัวอย่างเช่นการโทร0894ที่เพิ่มขึ้นแต่การใช้คำอธิบาย102 08+96=106ข้อความที่เข้ารหัสปรากฏขึ้นเพื่อใช้102ค่า เพียงแค่ไม่สอดคล้องกันเล็กน้อยที่อาจจะทำให้เกิดความสับสน ...
briantist

6
Bob เป็นคนบ้าคลั่งคนหนึ่งถ้าเขาสามารถออกเสียงได้
Magic Octopus Urn

5
@carusocomputing บางที Bob เป็นชาวเวลส์?
ต้มตุ๋น

1
ไม่ฉันหมายถึงคุณdefualtไม่ได้พิมพ์default
Roman Gräf

คำตอบ:


7

PowerShell 3+, 480 476 474 453 450 448 ไบต์

param($d,$f,$l,$b)$s,$t=$d-split'\.'
$m,$y=$b-split'(?<=..)(?=..)'
$v=+$m+$y
$p='1'*$s.Length-match'^(?!(..+)\1+$)..'
$c={-join([char[]]"$input"|%{[char](97..122)[((+$_-97)+((26-$v),$v)[$p])%26]})}
$s=$s|&$c
$f=$f|&$c
$l=$l|&$c
$a=(($a=@{com='$';org='&';net='%';edu='+';gov='@';mil='>'}.$t),'~')[!$a]*3
("`"$(("$a$y$f$s$m","$m$s$l$y$a")[$p]-replace'([^aeiou\d]{3})',"`$('`$1'-replace'[a-z]`$$',('aeiou'[`$i++%5]))")`""|iex)-replace'([a-z])\1+','$1'

ลองออนไลน์!

บันทึก24 26ไบต์ขอบคุณTimmyD !

ว้าวนี่มันบ้าไปแล้ว ฉันไม่คิดว่าฉันจะโพสต์รายละเอียดทั้งหมดได้จนกว่าจะถึงภายหลังหรือพรุ่งนี้

หมายเหตุ: การจบบรรทัดทั้งหมดเป็น\n( 0x10) เพื่อที่ฉันจะได้ไม่ต้องใช้;และใส่ทั้งหมดไว้ในบรรทัดเดียว

ภาพรวมอย่างรวดเร็ว:

  1. แบ่งโดเมนออกเป็นระดับที่สองและระดับบนสุด
  2. แยกวันเกิดออกเป็นเดือนและปี
  3. คำนวณค่ากะ
  4. ตรวจสอบว่าความยาวของ SLD นั้นดีหรือไม่ เนื่องจากส่วนไม่สามารถยาวเกิน 63 ตัวอักษร ( ดู RFC 1035 ) ฉันคิดว่ามันสั้นลงเพียงเพื่อ hardcode รายการของจำนวนเฉพาะ :)โดยใช้เมธอด regex ที่แนะนำ
  5. กำหนด scriptblock (ฟังก์ชั่นที่ไม่ระบุชื่อเป็นหลัก) เพื่อดำเนินการเข้ารหัสซีซาร์
  6. นำรหัสไปใช้กับ SLD ชื่อและนามสกุล
  7. รับสัญลักษณ์พร้อม hashtable และทำดัชนีธุรกิจตลก
  8. ในที่สุดยุ่งเหยิงยักษ์ที่ฉันใช้แม่แบบที่เหมาะสมเรียกใช้แทนที่สำหรับพยัญชนะสามตัวแทนที่แต่ละคนด้วย subexpression (รหัส) ที่จะแทนที่ส่วนนั้นด้วยค่าที่เหมาะสมจากนั้นเรียกใช้สตริงผลลัพธ์ผ่านInvoke-Expression( iex) เพื่อดำเนินการ สร้างรหัส emebedded แล้วแทนที่ตัวอักษรสุดท้ายติดต่อกันด้วยตัวอักษรเดียว

@ TimmyD ว้าวฉันไม่เคยเห็นมาก่อนและมันก็ยอดเยี่ยม ขอบคุณ!
ต้มตุ๋น

@ TimmyD คุณรู้ไหมตอนแรกฉันพยายามเขียนด้วย unary -joinและฉันสามารถสาบานได้ว่ามันเข้าร่วมกับช่องว่างและไม่ใช่$nulls ซึ่งทำให้ฉันประหลาดใจ แปลก (และขอขอบคุณอีกครั้ง)!
ต้มตุ๋น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.