Keep Hacking :)

Life is complex, it has both real and imaginary parts.

Project Euler 90的解答

題目是這樣說的,有兩個六面骰子,同一個骰子的六個面的數字都不相同(但是不同顆可以有相同的數字) 然後骰子上來的數字都是來自0~9當中,問的是有幾種不同的骰子組合可以組出01, 04, 09, ..., 81,也就是所有的小於一百的平方數。

不過有一點要注意的就是說,題目提到可以將69混用,所以會比較多組答案。

硬爆才是王道

這題最直接的想法就是將所有的骰子的組合給拿出來檢驗,如果可以組出所有的平方數的話,就讓答案加一。

總之,實做上不難,讓我們直接來看程式碼吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env ruby

def update_array(ary)
  flag6 = ary.include?(6)
  flag9 = ary.include?(9)
  if flag6 && flag9 || !flag6 && !flag9
    ary
  elsif flag6
    ary << 9
    return ary
  elsif flag9
    ary << 6
    return ary
  end
end

square_dice =
  [[0, 1], [0, 4], [0, 9], [1, 6], [2, 5], [3, 6], [4, 9], [6, 4], [8, 1]]
ans = 0

[*0 .. 9].combination(6).to_a.combination(2).each do |ary1, ary2|
  ary1 = update_array(ary1)
  ary2 = update_array(ary2)
  flag = true
  square_dice.each do |x, y|
    if !(ary1.include?(y) && ary2.include?(x)) &&
      !(ary1.include?(x) && ary2.include?(y))
      flag = false
      break
    end
  end
  ans += 1 if flag
end
puts ans

實際上跑起來也是挺快的:P 看來因為組合數沒有很大的關係:)

BTW,這題是我在ProjectEuler上解的第一百五十題,呼~~

又往前多進了一步了:D

Comments