problem 51 solution

master
Evan Hemsley 2016-09-06 00:08:56 -07:00
parent 38412d7d78
commit 84b7ee2f31
3 changed files with 89 additions and 20 deletions

View File

@ -64,5 +64,13 @@ module Euler
true true
end end
def non_empty_subsets(list)
(1..list.count).map { |x| list.combination(x).to_a }.flatten(1)
end
def powerset(list)
(0..list.count).map { |x| list.combination(x).to_a }.flatten(1)
end
end end
end end

View File

@ -1,28 +1,61 @@
def permutations?(number_list) require_relative 'euler'
comparison_digit_list = to_digit_list(number_list.first).sort
number_list.all? { |x| to_digit_list(x).sort == comparison_digit_list } # i = 0
# Prime.take_while do |p|
# i += 1
# result = false
# digits = p.to_digit_list
# Euler.non_empty_subsets(digits).each do |index_list|
# related_primes = []
# ('1'..'9').each do |j|
# copied_digit_list = Array.new(digits)
# index_list.each do |index|
# copied_digit_list[index] = j
# end
# new_num = Euler.from_digit_list(copied_digit_list)
# related_primes.push(new_num) if new_num.prime? and !related_primes.include?(new_num)
# end
# if related_primes.count == 7
# puts p
# puts '---'
# puts related_primes.inspect
# result = related_primes
# end
# end
# puts result if i % 1000
# result == false
# end
def bitmasks(length)
(1..2**length-1).map { |n| n.to_s(2) }.map { |s| s.rjust(4, '0')}.map { |s| s.split('').map(&:to_i)}
end end
def six_multiples(x) def prime_digit_replacement(number, mask)
[x, 2 * x, 3 * x, 4 * x, 5 * x, 6 * x] digits = number.to_digit_list
end related_primes = []
('0'..'9').each do |j|
def infinite_series copied_digit_list = Array.new(digits)
Enumerator.new do |y| mask.each_with_index do |bit, index|
n = 1 copied_digit_list[index] = j if bit == 1
loop do
y << n
n += 1
end end
new_num = Euler.from_digit_list(copied_digit_list)
related_primes.push(new_num) if new_num.prime? and !related_primes.include?(new_num) and new_num.to_digit_list.count == digits.count
end end
related_primes
end end
def same_digit_six_multiples def solution(family_count)
series = infinite_series result = false
n = series.next Prime.take_while do |p|
loop do digits = p.to_digit_list
result = permutations?(six_multiples(n)) bitmasks(digits.count).each do |mask|
return six_multiples(n) if result related_primes = prime_digit_replacement(p, mask)
n = series.next if related_primes.count == family_count and related_primes.include?(p)
result = p
break
end
end
result == false
end end
result
end end

28
ruby/euler052.rb Normal file
View File

@ -0,0 +1,28 @@
def permutations?(number_list)
comparison_digit_list = to_digit_list(number_list.first).sort
number_list.all? { |x| to_digit_list(x).sort == comparison_digit_list }
end
def six_multiples(x)
[x, 2 * x, 3 * x, 4 * x, 5 * x, 6 * x]
end
def infinite_series
Enumerator.new do |y|
n = 1
loop do
y << n
n += 1
end
end
end
def same_digit_six_multiples
series = infinite_series
n = series.next
loop do
result = permutations?(six_multiples(n))
return six_multiples(n) if result
n = series.next
end
end