鲍勃的密码


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](在这种情况下,它只是姓氏)。位移方向是正确的,因为l为质数,位移值为08+94 = 102

因此,08stackexchangewilliams94$$$变成08qryaicvafylecugjjgykq94$$$。现在,每三个连续的辅音都用元音替换- 08qraaicvafyeecugjigyoq94$$$ 删除同一字母的每个连续的音调- 08qraicvafyecugjigyoq94$$$。别担心,这对Bob来说很明显。

附加信息

  • 域名,名字和姓氏仅包含小写字母。
  • 域地址将始终仅包含第二级和顶级域,例如stackexchange.comand not codegolf.stackexchange.com。同样,.co.uk不允许类似的域, 但仅.uk.in有效。
  • 按字母顺序替换元音是循环的。我的意思是在之后ua用于替换。
  • 凯撒密码的ASCII范围是97-122(含)。
  • 您可以按照此处的说明进行输入。
  • 输出必须是字符串。
  • 出生日期和年份的格式为ddyy02因此可以接受,2不能接受。

这是代码高尔夫球,因此以字节为单位的最短代码获胜。高尔夫快乐!


4
域名会始终只包含第二级和顶级域名吗stackexchange.com,而不是img.stackexchange.com?国家域名之类的bbc.co.uk呢?
briantist

您的示例调用使用的0894总和,102但说明使用08+96=106。密文似乎使用该102值。只是有点不一致,可能会引起混淆...
briantist

6
如果鲍勃能发声,他就是​​个疯狂的傻瓜。
魔术章鱼缸

5
@carusocomputing也许鲍勃是威尔士人吗?
briantist

1
不,我的意思是您输入的内容defualt不正确default
RomanGräf16年

Answers:


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'

在线尝试!

感谢TimmyD,节省了24 26个字节!

哇,这太疯狂了。我认为我无法在晚些时候或明天之前发布完整的详细信息。

注意:所有行的结尾均为\n0x10),因此我不必使用;并将所有内容都放在一行上。

快速概述:

  1. 将域分为第二级和顶级。
  2. 将生日分为月份和年份。
  3. 计算偏移值。
  4. 确定SLD的长度是否为素数。由于该段不能超过63个字符另请参阅RFC 1035),因此我认为它只是为了硬编码素数列表而短:)使用建议的regex方法。
  5. 定义脚本块(本质上是匿名函数)以执行Caesar密码。
  6. 将密码应用于SLD,名字和姓氏
  7. 使用哈希表获取该符号并为有趣的业务建立索引。
  8. 最后,一个巨大的混乱局面,我在其中应用了适当的模板,对辅音三连音运行替换,用一个子表达式(代码)替换每个子表达式,将用适当的值替换该部分,然后通过Invoke-Expressioniex)运行结果字符串以执行生成嵌入代码,然后最终用单个字母替换连续字母。

@TimmyD哇,我以前从未见过,这很棒。谢谢!
briantist '16

@TimmyD你知道,我最初试图用一元代码编写它,-join我可能发誓它是用空格而不是$nulls 连接的,这让我感到惊讶,但是再次尝试后,它按我最初的预期工作了。很奇怪(再次感谢)!
briantist 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.