Ruby Monk Number Shuffle - 解决方案的比较

时间:2016-03-23 09:49:05

标签: ruby

我正在做这个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的解决方案更具红宝石风格,但我想更好地理解为什么。 你能分享一下你的想法并给出一些提示吗? 非常感谢提前。

3 个答案:

答案 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)

  1. 即使您创建了包含该确切值的变量(即number.to_s),您也会调用string_rep两次。无需多次进行方法调用。
  2. 正如有人提到的,创建一个新数组然后在你可以简单地使用mapcollect方法(他们做同样的事情)时附加到该数组是一个新手错误。因此,如果读取result = ary.map {|i| i.join.to_i}
  3. ,代码会更好
  4. 无需输入return result.sort。 Ruby默认返回最后一个命令,因此您可以省略return指令并编写result.sort
  5. 此外,示例解决方案使数字唯一。你也这样做吗?