编写一个程序,执行蛮力字母组合,直到找到“ password”一词


16

该程序应按字母顺序打印每个字母组合(大小写无关紧要)。它必须以开头,a最后打印的组合应该是password

输出应为:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password

2
分隔符必须是空格,还是可以使用换行符?
Ilmari Karonen

是的,您可以,这只是一个小更改。
ST3 2013年

Answers:


32

Perl,19个字符

say for a..password

根据上面的说明,使用换行符作为分隔符。运行perl -M5.010(或仅运行perl -E 'say for a..password')以启用Perl 5.10+ say功能。对于每个meta,这不算作多余的字符。

(如果您坚持使用空格作为定界符,$,=$";say a..password则只增加两个字符。但是,它也非常慢且浪费内存,以至于在实践中无法使用,因为它会尝试在打印之前在内存中构建整个列表。)


18

Ruby,33个字符(最佳版本,但较长)

?a.upto('password'){|c|$><<c+' '}

我喜欢'a'.upto('password'); 它确切地告诉您它在做什么。Ruby很棒,表现力很强。:D

当然,print c,' '也将更加清晰,但是使用$>要短两个字符。

Ruby,29个 25个字符(慢版本)

$><<[*?a..'password']*' '

这个令牌较短,但是它一次打印所有令牌,因此需要很长时间才能运行!


1
不错,尤其是第一个。
卡里·斯沃夫兰

在慢速版本中,(?a..'password').to_a可以缩短为[*?a..'password']
Paul Prestidge 2013年

6

Perl,33 32 24个字符

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个字符串的数组的机器。


.$"代替," "保存角色吗?
拉玛先生先生2013年

是的,我全权监督。谢谢。
面包箱

6

Perl 6,20个字符

say "a".../password/

你不需要其他的东西


5

蟒蛇2,91

b=lambda n:n*' 'and b(n/26-(n%26<1))+chr(~-n%26+97)
i=0
exec"i+=1;print b(i);"*129052722140

4

的PHP 38 37 36个字符

<?for($w=a;$w<passwore;)echo$w++,~ß;

您必须将编码设置为ISO 8859-1并禁用警告。


我没有测试,但是确实可以做到吗???
ST3 2013年

@ ST3这是一个简单的循环。变量$w最初设置为“ a”,然后递增直到达到“密码”之后的第一个值(不打印最后一个字符串)。
lortabac

3
@ ST3这是一个常规for循环。这段代码没有什么奇怪的,除了最后两个字符是按位反转的空格。无论如何,是的,我测试了一个简短的单词。
lortabac

1
@ ST3这是从到的测试。因为键盘的编码不是ISO 8859-1,所以我不得不替换为空格。passwoqspassword
lortabac

1
You can save a char with $w<passwore in stead of $w!=passwore.
Decent Dabbler

2

Ruby(40个字符)

用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。)


1
亚当,那一定是你在我的脑海中。您不希望s在“ a”之前开始吗?
卡里·斯沃夫兰

我认为您得到的是我使用的N而不是N-1我的迭代!谢谢,我将进行修复。(尽管129052722140是Google感兴趣的数字:)。)
Adam Prescott

1
0x1e0c2443db与129052722139一样多。
steenslag 2013年

我的意思是,如果s=?as.succ!开始于“b'`。
卡里·斯沃夫兰

1
使用s=?aN-1您会得到“ b c ...密码”;与s =<backtick>一起,N您会得到“ a b ... password”。SO要求输出以开头'a'。就这样。
卡里·斯沃夫兰

2

Javascript,73

这是@Briguys代码的73个字符的版本,该代码仅打印字母组合

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)


2

APL(Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

从理论上讲,它将一直打印到PASSWORD,但是在ZZZZ之后我遇到了工作空间已满的错误:5维数组实在太棒了。

编辑:自从我上次摆弄APL以来一定已经太久了。我多么想念身份比较()!!!

说明

{...}:声明一个函数,该函数...
⎕A∘.,⍵:在26个大写字母(⎕A)和自变量(之间)上进行级联运算(将左操作数的元素与右操作数的元素相结合的每个组合,就像笛卡尔积)一样。

{...}¨:对于结果集中的每个元素,将其插入到一个函数中,该函数...
⍞←⍵
'PASSWORD '≡将其打印出来并与进行比较'PASSWORD '
:如果比较返回true(1),则中止该程序。
:否则,仅返回打印的字符串。

:最后,外部函数自行递归。

(然后,您将外部乘积乘以26 alpha和26 alpha之间的concat,给出所有2个字母的组合,然后将外部乘积乘以concat之间的2个字母组合和26 alpha,等等,等等。达到触发中止的密码)

' ': 火花!!用空格字符启动递归函数。


2

蟒2 - 153个152 151 149字节

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

使用大写保存一个字节,使用换行代替空格保存一个字节。


1

高尔夫脚本41

由于缺乏'z'+1 == 'aa'逻辑,Golfscript无法赢得这一殊荣。

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, 创建从0到168036262483的数组
  • (; 放0
  • {.. }%遍历数组
  • 27base 将元素转换为基本27数组
  • {96+}% 每位加96
  • ' '+ 转换为字符串并在末尾添加一个空格
  • .96?0<* 如果字符串包含char 96,则将字符串截断为零

1

在Ruby中,39 40。

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

..或129052722140。(编辑:以前我有129052722。我丢失了一些剪切和粘贴的数字。以前的十六进制(0x7B13032)代表数字错误。)a=?`从@Doorknob 借来保存字符。


我试图解决这个a=?` 问题,它看起来有点怪异,并且在末尾有一个额外的空间,但至少它能起作用:P
Doorknob

那么数字129052722哪里来的?根据我的计算,这似乎为您提供了从“ a”到“ kwkokg”的范围……有点小。
面包盒

@Breadbox我用以下方法计算了该数字(对不起格式,但是注释有限制,是吗?):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 只需打印一些序列就可以很容易地确认这是正确的。
卡里·斯沃夫兰

@breadbox你说得对。参见编辑。我在评论中给出的方法还可以。
卡里·斯沃夫兰

围栏错误。您的脚本使用a = 1..z = 26进行计算。您需要计算a = 0..z = 25才能获得正确的计数。从第一行中删除-1,您将得到120699639557,它(为第0个条目添加一个)与我的计算匹配。
面包箱

1

Javascript: 57 56个字符(感谢C5H8NNaO4)

这是一个解决方案,其中包括数字作为可能的字符(“ 0”,“ 1”,“ 2”,..,“ passwor9”,“ passwora”,“ passworb”,“ passworc”,“ password”)

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

这是一个测试的小提琴(只有最近的100次迭代,因此不会锁定您的浏览器)。


3
该解决方案是错误的,它没有遵循规范。
门把手

@Doorknob-是的,我在回答中提到了这一点。它仍然会打印原始要求中的所有案例,但也会打印所有字母数字案例。
Briguy37 2013年

此外,在重新阅读问题之后,如果我在代码中将i设置为9,则除示例输出(他已经为其指定了例外)外,它会满足所有问题的要求(并且代码会变成56个字符)。
Briguy37 2013年

@ Briguy37规范仍然说print every **letter** combination,保存一个字符:{} -> ;
C5H8NNaO4 2013年

@ C5H8NNaO4:我的解决方案无法打印哪个字母组合?谢谢你的提示!
Briguy37 2013年

1

哈斯克尔(101)

main=putStrLn.concat.takeWhile(/="passwore ").tail.concat.iterate(\k->[x:y|x<-['a'..'z'],y<-k])$[" "]

0

Befunge(72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

将字符串“ a”打印为“ password”,并用空格分隔,然后退出。

下面是仅打印前9 * 9 = 81个单词(“ a”至“ dd”)以进行比较的版本。的99*是迭代执行次数。

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_

0

的JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

小提琴 -停在“ pa”。

但是,这确实会重复。


您可以使用初始化循环,i=s=0以保存另外三个字符。
2013年

@minitech完成。
数学冷却器

1
为什么要保留vari以前是全球性的;现在s是全球性的。通常,您可以将两个全局变量都保留在代码中。
Ry-
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.