Mật khẩu của Bob


13

Giới thiệu

Bob thích có mật khẩu khác nhau cho mỗi trang web anh ta sử dụng. Anh ấy muốn mật khẩu ở một định dạng đặc biệt để anh ấy có thể nhớ. Giúp anh ta bằng cách xây dựng một trình tạo mật khẩu ngắn nhất có thể theo chiều dài mã, bởi vì anh ta thích giữ những thứ ngắn như tên của mình.

Thử thách

Xây dựng Bob một trình tạo mật khẩu có bốn tham số -

  • Địa chỉ tên miền, (ví dụ: stackexchange.com)
  • Tên đầu tiên,
  • họ
  • Ngày sinh và năm.

và đưa ra một chuỗi đã trải qua các biến đổi sau đây.

Mỗi mật khẩu có một mẫu dựa trên độ dài l của tên miền. Nếu l là số nguyên tố thì mẫu có dạng này -

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

khác là nó ở dạng này -

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

Trường biểu tượng sẽ có các giá trị dựa trên loại miền.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
mặc định -> ~~~

Bây giờ, anh ta cũng muốn chạy một mật mã caesar trên các trường - [firstname][domain-name][lastname]. Hướng dịch chuyển là đúng nếu l là số nguyên tố khác thì nó được để lại. Giá trị thay đổi được xác định bởi giá trị thêm vào ngày sinh và năm.

Sau quá trình trên, văn bản không thể dễ nhớ nên anh ta muốn văn bản được mã hóa có thể phát âm được. Để làm điều này, ông muốn thay thế mọi phụ âm thứ ba liên tiếp bằng một nguyên âm theo thứ tự bảng chữ cái (nghĩa là aeiou).

Cuối cùng, anh ta muốn xóa các lần xuất hiện liên tiếp của cùng một chữ cái.

Thí dụ

Đầu vào - stackexchange.com bob williams 0894

Đầu ra - 08qraicvafyecugjigyoq94 $$$.

Giải trình :

Mẫu mật khẩu là [birth-date][domain-name][lastname][birth-year][symbol]bởi vì độ dài của tên miền stackexchangelà số nguyên tố. Biểu tượng sẽ $$$là loại tên miền .com.

Hãy điền các giá trị đó vào mẫu - 08stackexchangewilliams94$$$. Bây giờ mật mã caesar phải được chạy trên các trường [firstname][domain-name][lastname](nó chỉ là họ trong trường hợp này). Hướng dịch chuyển là đúng vì l là số nguyên tố và giá trị dịch chuyển là 08+94 = 102.

Thế là 08stackexchangewilliams94$$$biến thành 08qryaicvafylecugjjgykq94$$$. Bây giờ, mọi phụ âm thứ ba liên tiếp được thay thế bằng một nguyên âm - 08qraaicvafyeecugjigyoq94$$$ mọi khoảng cách liên tiếp của cùng một chữ cái sẽ bị xóa - 08qraicvafyecugjigyoq94$$$. Đừng lo lắng nó có thể phát âm được cho Bob.

thông tin bổ sung

  • Địa chỉ tên miền, tên và họ chỉ chứa bảng chữ cái chữ thường.
  • Địa chỉ tên miền sẽ luôn chỉ bao gồm một tên miền cấp hai và cấp cao nhất, thích stackexchange.comvà không codegolf.stackexchange.com. Ngoài ra, các tên miền như .co.ukkhông được phép nhưng chỉ .ukhoặc .inhợp lệ.
  • Thay thế nguyên âm theo thứ tự bảng chữ cái là tuần hoàn. Ý tôi là sau u, ađược dùng để thay thế.
  • Phạm vi ASCII cho mật mã Caesar là 97 - 122.
  • Bạn có thể lấy đầu vào như mô tả ở đây .
  • Đầu ra phải là một chuỗi.
  • Định dạng của ngày sinh và năm là ddyy. Vì vậy, 02có thể chấp nhận được và 2không.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Chúc bạn chơi golf vui vẻ!


4
Tên miền sẽ luôn chỉ bao gồm một tên miền cấp hai và cấp cao nhất, giống như stackexchange.com, không img.stackexchange.com? Những gì về miền quốc gia như thế bbc.co.uknào?
nghĩa tự do

Cuộc gọi ví dụ của bạn sử dụng 0894bổ sung 102nhưng giải thích sử dụng 08+96=106. Các văn bản được mã hóa xuất hiện để sử dụng 102giá trị. Chỉ cần một sự mâu thuẫn nhỏ có thể gây nhầm lẫn ...
briantist

6
Bob là một mofo điên nếu anh ta có thể phát âm nó.
Bạch tuộc ma thuật Urn

5
@carusocomputing Có lẽ Bob là người xứ Wales?
briantist

1
Không, ý tôi là bạn defualtkhông gõdefault
Roman Gräf

Câu trả lời:


7

PowerShell 3+, 480 476 474 453 450 448 byte

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'

Hãy thử trực tuyến!

Đã lưu 24 26 byte nhờ TimmyD !

Wow, đây là một điều điên rồ. Tôi không nghĩ rằng tôi có thể đăng một sự cố đầy đủ về điều này cho đến sau này hoặc ngày mai.

Lưu ý: tất cả các kết thúc dòng là \n( 0x10), do đó tôi không phải sử dụng ;và đặt tất cả các dòng này trên một dòng.

Tổng quan nhanh:

  1. Chia miền thành cấp thứ hai và cấp cao nhất.
  2. Chia ngày sinh thành tháng và năm.
  3. Tính giá trị dịch chuyển.
  4. Xác định xem độ dài của SLD là số nguyên tố. phân đoạn không thể dài hơn 63 ký tự ( xem thêm RFC 1035 ), tôi nghĩ rằng nó ngắn hơn chỉ để mã hóa danh sách các số nguyên tố :) Sử dụng phương thức regex được đề xuất.
  5. Xác định một scriptblock (về cơ bản là hàm ẩn danh) để thực hiện mật mã Caesar.
  6. Áp dụng mật mã cho SLD, tên và họ
  7. Lấy biểu tượng với một doanh nghiệp hài hước băm và lập chỉ mục.
  8. Cuối cùng, một mớ hỗn độn khổng lồ nơi tôi áp dụng mẫu thích hợp, chạy thay thế cho các bộ ba phụ âm, thay thế mỗi mẫu bằng một biểu thức con (mã) sẽ thay thế phần đó bằng giá trị phù hợp, sau đó chạy chuỗi kết quả thông qua Invoke-Expression( iex) để thực thi đã tạo mã được mã hóa, sau đó thay thế cuối cùng các chữ cái liên tiếp bằng một chữ cái duy nhất.

@TimmyD wow tôi chưa bao giờ thấy điều đó trước đây, và nó thật tuyệt vời. Cảm ơn!
briantist

@TimmyD bạn biết đấy, ban đầu tôi đã cố gắng viết nó bằng unary -joinvà tôi có thể đã thề rằng nó được nối với các khoảng trắng và không $nulllàm tôi ngạc nhiên, nhưng chỉ cần thử lại nó hoạt động như tôi mong đợi ban đầu. Lạ (và cảm ơn lần nữa)!
briantist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.