require_relative 'euler' # 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 def prime_digit_replacement(number, mask) digits = number.to_digit_list related_primes = [] ('0'..'9').each do |j| copied_digit_list = Array.new(digits) mask.each_with_index do |bit, index| copied_digit_list[index] = j if bit == 1 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 related_primes end def solution(family_count) result = false Prime.take_while do |p| digits = p.to_digit_list bitmasks(digits.count).each do |mask| related_primes = prime_digit_replacement(p, mask) if related_primes.count == family_count and related_primes.include?(p) result = p break end end result == false end result end