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