Make ruby/2017/15 much slower
This commit is contained in:
parent
a285882869
commit
f10e57eb79
@ -1,38 +1,7 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
require "dueling_generator"
|
||||||
|
|
||||||
def generate(value, factor)
|
gg = DuelingGenerator::GeneratorPair.for STDIN.read.chomp
|
||||||
(value * factor) % 2147483647
|
|
||||||
end
|
|
||||||
|
|
||||||
line_1, line_2 = STDIN.read.chomp.split("\n").to_a
|
puts "Part 1: #{gg.loose_pair_count}"
|
||||||
generator_a_start = line_1.gsub("Generator A starts with ", "").to_i
|
puts "Part 2: #{gg.strict_pair_count}"
|
||||||
generator_b_start = line_2.gsub("Generator B starts with ", "").to_i
|
|
||||||
|
|
||||||
a_factor = 16807
|
|
||||||
b_factor = 48271
|
|
||||||
|
|
||||||
a = generator_a_start
|
|
||||||
b = generator_b_start
|
|
||||||
pairs = 0
|
|
||||||
|
|
||||||
40000000.times do
|
|
||||||
a = generate(a, a_factor)
|
|
||||||
b = generate(b, b_factor)
|
|
||||||
pairs += 1 if (a & 65535 == b & 65535)
|
|
||||||
end
|
|
||||||
|
|
||||||
puts "Part 1: #{pairs}"
|
|
||||||
|
|
||||||
a = generator_a_start
|
|
||||||
b = generator_b_start
|
|
||||||
pairs = 0
|
|
||||||
|
|
||||||
5000000.times do
|
|
||||||
a = generate(a, a_factor)
|
|
||||||
a = generate(a, a_factor) until (a % 4) == 0
|
|
||||||
b = generate(b, b_factor)
|
|
||||||
b = generate(b, b_factor) until (b % 8) == 0
|
|
||||||
pairs += 1 if (a & 65535 == b & 65535)
|
|
||||||
end
|
|
||||||
|
|
||||||
puts "Part 2: #{pairs}"
|
|
||||||
|
|||||||
85
ruby/2017/15/lib/dueling_generator.rb
Normal file
85
ruby/2017/15/lib/dueling_generator.rb
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
class DuelingGenerator
|
||||||
|
attr_reader :value, :start
|
||||||
|
def initialize(value)
|
||||||
|
@value = value
|
||||||
|
@start = value
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.for(string)
|
||||||
|
type, value = string.gsub("Generator ", "").split(" starts with ")
|
||||||
|
Object.const_get("DuelingGenerator::Generator#{type}").new value.to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def reset!
|
||||||
|
@value = start
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate!
|
||||||
|
@value = (value * factor) % 2147483647
|
||||||
|
end
|
||||||
|
|
||||||
|
def strict_generate!
|
||||||
|
@value = (value * factor) % 2147483647
|
||||||
|
generate! until meets_criterion?
|
||||||
|
end
|
||||||
|
|
||||||
|
def meets_criterion?
|
||||||
|
value % criterion == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
class GeneratorA < DuelingGenerator
|
||||||
|
def factor
|
||||||
|
16807
|
||||||
|
end
|
||||||
|
|
||||||
|
def criterion
|
||||||
|
4
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class GeneratorB < DuelingGenerator
|
||||||
|
def factor
|
||||||
|
48271
|
||||||
|
end
|
||||||
|
|
||||||
|
def criterion
|
||||||
|
8
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class GeneratorPair
|
||||||
|
attr_reader :g1, :g2
|
||||||
|
def initialize(g1, g2)
|
||||||
|
@g1 = g1
|
||||||
|
@g2 = g2
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.for(input)
|
||||||
|
new *input.split("\n").map { |line| DuelingGenerator.for line }
|
||||||
|
end
|
||||||
|
|
||||||
|
def loose_pair_count(comparisons = 40000000)
|
||||||
|
g1.reset!
|
||||||
|
g2.reset!
|
||||||
|
pairs = 0
|
||||||
|
comparisons.times do
|
||||||
|
g1.generate!
|
||||||
|
g2.generate!
|
||||||
|
pairs += 1 if g1.value & 65535 == g2.value & 65535
|
||||||
|
end
|
||||||
|
pairs
|
||||||
|
end
|
||||||
|
|
||||||
|
def strict_pair_count(comparisons = 5000000)
|
||||||
|
g1.reset!
|
||||||
|
g2.reset!
|
||||||
|
pairs = 0
|
||||||
|
comparisons.times do
|
||||||
|
g1.strict_generate!
|
||||||
|
g2.strict_generate!
|
||||||
|
pairs += 1 if g1.value & 65535 == g2.value & 65535
|
||||||
|
end
|
||||||
|
pairs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user