最終更新: 2011-02-10T04:56+0900
ただただ、手と CPUを動かすだけで精一杯。(頭は役に立ってないよ)
primes = [2]
is_prime = lambda{|x|
result = true
primes.each{|prime|
quo, rem = x.divmod(prime)
if rem == 0
result = false
break
end
break if quo < prime
}
return result
}
# replace 2 digits or 3 digits. キ・メ・ウ・チ
def find_8_prime_family(a)
return [] if a.size < 8
a.map!{|x| x.to_s }
h = Hash.new{|h,k| h[k] = [] }
# 2 digits
0.upto(a.first.size-3){|i|
(i+1).upto(a.first.size-2){|j|
h.clear
a.each do |prime|
if prime[i] == prime[j]
h[prime[0...i]+prime[(i+1)...j]+prime[(j+1)...(prime.size)]].push prime
end
end
h.each do |_,v|
return v if v.size == 8
end
}
}
# 3 digits
0.upto(a.first.size-4){|i|
(i+1).upto(a.first.size-3){|j|
(j+1).upto(a.first.size-2){|k|
h.clear
a.each do |prime|
if prime[i] == prime[j] and prime[j] == prime[k]
h[prime[0...i]+prime[(i+1)...j]+prime[(j+1)...k]+prime[(k+1)...(prime.size)]].push prime
end
end
h.each do |_,v|
return v if v.size == 8
end
}
}
}
return []
end
x = 1
start = 0 # start of primes of a width.
loop {
x += 2
next unless is_prime.call x
print "#{x}\r"
if primes[start].to_s.length != x.to_s.length
a = find_8_prime_family primes.last(primes.size-start)
if ! a.empty?
puts a.sort.join(" ")
exit
end
start = primes.size
end
primes.push x
}
桁数ごとに探索範囲を決めて、総当たり。
問題が xについても同じ数の組み合わせであることを求めてると思わなくてチェックしてないけど、結果的に xも 2x,3xなんかと同じ数字で構成されてた。
digits = 10
loop {
digits *= 10
(digits/2).upto((digits*10-1)/6){|x|
print "#{x}\r"
x2 = (x*2).to_s.split(//).sort
if [3,4,5,6].all?{|n|
x2 == (x*n).to_s.split(//).sort
} then
puts [1,2,3,4,5,6].map{|n| x*n }.join(" ")
exit
end
}
}
浮動小数点数なんてファジーなものを使っちゃったよ。Math.sqrtの使用をこれまで頑なに避けてたのも、結果が Floatになるからだったり。
count = 0
23.upto(100){|n|
cmb = 1.0
1.upto(n/2){|r|
cmb /= r
cmb *= (n-r+1)
count += (n-r == r) ? 1 : 2 if 1_000_000 < cmb
}
}
p count
問題文が難しかった。3割ぐらいは推測。
あっけなく答えが出たので to_s.reverse.to_i みたいなのをなくすべく、Integer#reverse を自作してみたら、かえって遅くなったし。
class Integer
# 負数については考えてない。
def reverse
x = 0
this = self
begin
this, rem = this.divmod(10)
x = 10*x + rem
end while 0 < this
x
end
end
count = 0
10.upto(10_000-1){|x|
is_lychrel = true
50.times{
x = x + x.reverse
if x == x.reverse
is_lychrel = false
break
end
}
count += 1 if is_lychrel
}
p count