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
,保存一个字符:{} -> ;