我正在做这个Ruby Monk挑战http://rubymonk.com/learning/books/1-ruby-primer/problems/154-permutations并提出了这个解决方案:
procedure TForm1.Button1Click(Sender: TObject);
var
AuthRef: AuthorizationRef;
Status: OSStatus;
argv: array[0..0] of PAnsiChar;
begin
ArgV[0] := nil;
AuthRef := nil;
Status := AuthorizationCreate(nil,kAuthorizationEmptyEnvironment,kAuthorizationFlagDefaults,@AuthRef);
Status := AuthorizationExecuteWithPrivileges(AuthRef, '/sbin/dmesg', 0, @argv[0], nil);
AuthorizationFree(AuthRef, kAuthorizationFlagDefaults);
end;
与此同时,这是Ruby Monk的解决方案:
def number_shuffle(number)
string_rep = number.to_s
ary = string_rep.split('').permutation(number.to_s.length).to_a
result = []
ary.each do |i|
x = i.join.to_i
result << x
end
return result.sort
end
我觉得Ruby Monk的解决方案更具红宝石风格,但我想更好地理解为什么。 你能分享一下你的想法并给出一些提示吗? 非常感谢提前。
答案 0 :(得分:2)
Ruby Monk的解决方案是糟糕的编程,但风格还不错。您的解决方案是可以接受的,但风格可以改进。
无论如何,这可以通过单行完成:
def number_shuffle(number)
number.to_s.split('').permutation.to_a.collect {|a| a.join.to_i}.sort
end
已编辑:sort
因为permutation
makes no guarantees about the order。
答案 1 :(得分:1)
有一件事是&#34;非红宝石&#34;是...
result = []
ary.each do |i|
x = i.join.to_i
result << x
end
这是一个典型的&#34;新的红宝石&#34;错误使用each
并在每次迭代时添加一个数组,方法map
将自动返回一个数组。
result = ary.map {|i| i.join.to_i }
另请注意,我们并不需要中间结果x
,并且因为块相对较短,我们会更好地使用{}
代替do end
答案 2 :(得分:0)
number.to_s
),您也会调用string_rep
两次。无需多次进行方法调用。map
或collect
方法(他们做同样的事情)时附加到该数组是一个新手错误。因此,如果读取result = ary.map {|i| i.join.to_i}
return result.sort
。 Ruby默认返回最后一个命令,因此您可以省略return
指令并编写result.sort
。此外,示例解决方案使数字唯一。你也这样做吗?