problem 51 solution
parent
38412d7d78
commit
84b7ee2f31
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue