1

Rubyは初めてで、3桁の数字「abc」を見つけようとしています。

for a in 0..9
    for b in 0..9
        for c in 0..9
            if a*a+b*b+c*c == (100*a+10*b+c)/11.0
                puts "#{a}#{b}#{c}"
            end
        end
    end
end

これは長すぎますが、それを最適化する方法、または別の「ルビー」な方法で書く方法はありますか?

4

2 に答える 2

3

解決策:Wolfram Alpha :)

別の楽しい解決策があります。それがあなたが探していたものであるならば、本当に速くはなく、ただもっとコンパクトで、おそらくもっとルビーのようです:

(0..9).to_a.repeated_permutation(3).select { |a,b,c| 
  a*a+b*b+c*c == (100*a+10*b+c)/11.0 
}
=> [[0, 0, 0], [5, 5, 0], [8, 0, 3]]
于 2012-06-30T20:06:29.933 に答える
2

これは、次のようなa、b、cを見つけることと同じです。

100*a + 10*b + c = 11 * (a*a + b*b +c*c)

つまり100*a + 10*b + c、11で割り切れる必要があります。単純な数論では、a、b、cが数字の場合、これは次のことを意味します。

`a + c - b`

11の倍数でなければならないので

`a + c = b or a + c = 11 +b`

したがって、aとbの特定の値については、10ではなくc:b-aと11+b-aの2つの値をチェックするだけで済みます。検索スペースをもう一度2つにカットできます。これら2つの値の後者を確認し、a <= bの場合は、前者のみを確認する必要があります。

したがって、1000トリプレットの数値をチェックする代わりに、100をチェックするだけで済みます。これは10倍高速である必要があります。

for a in 0..9
  for b in 0..9
    if a > b
      c = 11 +b -a
    else
      c = b - a
    end
    if a*a+b*b+c*c == (100*a+10*b+c)/11.0
      puts "#{a}#{b}#{c}"
    end
  end
end
于 2012-06-30T21:45:41.603 に答える