題目是這樣說的,有兩個六面骰子,同一個骰子的六個面的數字都不相同(但是不同顆可以有相同的數字)
然後骰子上來的數字都是來自0~9
當中,問的是有幾種不同的骰子組合可以組出01, 04, 09, ..., 81
,也就是所有的小於一百的平方數。
不過有一點要注意的就是說,題目提到可以將6
和9
混用,所以會比較多組答案。
硬爆才是王道
這題最直接的想法就是將所有的骰子的組合給拿出來檢驗,如果可以組出所有的平方數的話,就讓答案加一。
總之,實做上不難,讓我們直接來看程式碼吧!
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