Answers:
say for a..password
根据上面的说明,使用换行符作为分隔符。运行perl -M5.010(或仅运行perl -E 'say for a..password')以启用Perl 5.10+ say功能。对于每个meta,这不算作多余的字符。
(如果您坚持使用空格作为定界符,$,=$";say a..password则只增加两个字符。但是,它也非常慢且浪费内存,以至于在实践中无法使用,因为它会尝试在打印之前在内存中构建整个列表。)
?a.upto('password'){|c|$><<c+' '}
我喜欢'a'.upto('password'); 它确切地告诉您它在做什么。Ruby很棒,表现力很强。:D
当然,print c,' '也将更加清晰,但是使用$>要短两个字符。
$><<[*?a..'password']*' '
这个令牌较短,但是它一次打印所有令牌,因此需要很长时间才能运行!
(?a..'password').to_a可以缩短为[*?a..'password']
32个字符的解决方案:
$_=a;print$_++,$"until/passwore/
关于这一点没有太多要说的。如果可以使用换行符而不是空格来分隔条目,则可以将其减少到27个字符。
Ilmari Karonen指出,..内部调用++,所以一个更好的解决方案(25个字符)将是:
print$_,$"for a..password
通过利用Perl的命令行选项,可以使用等效的24个字符的解决方案:
perl -l40e 'print for a..password'
不熟悉perl标志的规则在这里,供那些不熟悉它们的人使用。
当然,Ilmari的21个字符的解决方案仍然更短,但是它需要一台可以分配129,052,722,140个字符串的数组的机器。
.$"代替," "保存角色吗?
<?for($w=a;$w<passwore;)echo$w++,~ß;
您必须将编码设置为ISO 8859-1并禁用警告。
$w最初设置为“ a”,然后递增直到达到“密码”之后的第一个值(不打印最后一个字符串)。
for循环。这段代码没有什么奇怪的,除了最后两个字符是按位反转的空格。无论如何,是的,我测试了一个简短的单词。
$w<passwore in stead of $w!=passwore.
用a = 1,b = 2,...,z = 26将一串z字母解释为以26为底的数字。
因此,“密码”可以认为是数字N =
16*(26**7) +
1*(26**6) +
19*(26**5) +
19*(26**4) +
23*(26**3) +
15*(26**2) +
18*(26**1) +
4*(26**0)
如果我们让s = "a"(即:1)并且对进行(N-1)次调用s.succ!,则s将是"password"(N)。换句话说,N = 1 +(N-1)。
为了更快地运行示例,为了证明N的计算是正确的,请考虑"pass"作为目标,其中N为
16*(26**3) +
1*(26**2) +
19*(26**1) +
19*(26**0)
和
s = "a"
(N-1).times { s.succ! }
puts s #== "pass"
因为我们也想打印"a",所以我们需要
s = "`"
N.times { print(s.succ! + " ") }
回到完整的“密码”。N = 129052722140,离开:
s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}
我寻找一种更紧凑的形式 129052722140 == 0x1e0c2443db搜寻但找不到。
(已更新,以解决缺少打印的问题"a",这要感谢Cary。)
s=?a,s.succ!开始于“b'`。
s=?a,N-1您会得到“ b c ...密码”;与s =<backtick>一起,N您会得到“ a b ... password”。SO要求输出以开头'a'。就这样。
{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '
从理论上讲,它将一直打印到PASSWORD,但是在ZZZZ之后我遇到了工作空间已满的错误:5维数组实在太棒了。
编辑:自从我上次摆弄APL以来一定已经太久了。我多么想念身份比较(≡)!!!
{...}:声明一个函数,该函数...
⎕A∘.,⍵:在26个大写字母(⎕A)和自变量(之间)上进行级联运算(将左操作数的元素与右操作数的元素相结合的每个组合,就像笛卡尔积)一样。⍵)
{...}¨:对于结果集中的每个元素,将其插入到一个函数中,该函数...
⍞←⍵:
'PASSWORD '≡将其打印出来并与进行比较'PASSWORD '
→:如果比较返回true(1),则中止该程序。
⍵:否则,仅返回打印的字符串。
∇:最后,外部函数自行递归。
(然后,您将外部乘积乘以26 alpha和26 alpha之间的concat,给出所有2个字母的组合,然后将外部乘积乘以concat之间的2个字母组合和26 alpha,等等,等等。达到触发中止的密码)
' ': 火花!!用空格字符启动递归函数。
由于缺乏'z'+1 == 'aa'逻辑,Golfscript无法赢得这一殊荣。
168036262484,(;{27base{96+}%' '+.96?0<*}%
168036262484, 创建从0到168036262483的数组(; 放0{.. }%遍历数组27base 将元素转换为基本27数组{96+}% 每位加96' '+ 转换为字符串并在末尾添加一个空格.96?0<* 如果字符串包含char 96,则将字符串截断为零在Ruby中,39 40。
a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}
..或129052722140。(编辑:以前我有129052722。我丢失了一些剪切和粘贴的数字。以前的十六进制(0x7B13032)代表数字错误。)a=?`从@Doorknob 借来保存字符。
a=?` 问题,它看起来有点怪异,并且在末尾有一个额外的空间,但至少它能起作用:P
ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end 只需打印一些序列就可以很容易地确认这是正确的。
这是一个解决方案,其中包括数字作为可能的字符(“ 0”,“ 1”,“ 2”,..,“ passwor9”,“ passwora”,“ passworb”,“ passworc”,“ password”)
for(i=-1;i++<1982613533017;console.log(i.toString(36)));
这是一个测试的小提琴(只有最近的100次迭代,因此不会锁定您的浏览器)。
print every **letter** combination,保存一个字符:{} -> ;