|
module Faster |
|
DELIMITER = '\t' |
|
NL = '\n' |
|
|
|
module Naive |
|
def self.process_lines(io, key_index, value_index) |
|
io.each_line do |line| |
|
fields = line.split(DELIMITER) |
|
yield fields[key_index], fields[value_index] |
|
end |
|
end |
|
|
|
def self.process_data(io, key_index, value_index) |
|
sums = {} of Int32 => Int32 |
|
process_lines(io, key_index, value_index) do |key, value| |
|
key = key.to_i |
|
sums[key] = sums.fetch(key, 0) + value.to_i |
|
end |
|
sums.max_by &.[](1) |
|
end |
|
end |
|
|
|
module Simple |
|
def self.process_lines(io, key_index, value_index) |
|
field_index = 0 |
|
key = IO::Memory.new |
|
value = IO::Memory.new |
|
|
|
io.each_char do |c| |
|
case c |
|
when NL |
|
yield key.to_s, value.to_s |
|
key.clear |
|
value.clear |
|
field_index = 0 |
|
when DELIMITER |
|
field_index += 1 |
|
else |
|
case field_index |
|
when key_index |
|
key << c |
|
when value_index |
|
value << c |
|
end |
|
end |
|
end |
|
end |
|
|
|
def self.process_data(io, key_index, value_index) |
|
sums = {} of Int32 => Int32 |
|
process_lines(io, key_index, value_index) do |key, value| |
|
key = key.to_i |
|
sums[key] = sums.fetch(key, 0) + value.to_i |
|
end |
|
sums.max_by &.[](1) |
|
end |
|
end |
|
|
|
module IntParser |
|
def self.process_lines(io, key_index, value_index) |
|
field_index = 0 |
|
key = 0 |
|
value = 0 |
|
|
|
io.each_char do |c| |
|
case c |
|
when '\n' |
|
yield key, value |
|
key = 0 |
|
value = 0 |
|
field_index = 0 |
|
when DELIMITER |
|
field_index += 1 |
|
else |
|
case field_index |
|
when key_index |
|
key = key * 10 + c.to_i |
|
when value_index |
|
value = value * 10 + c.to_i |
|
end |
|
end |
|
end |
|
end |
|
|
|
def self.process_data(io, key_index, value_index) |
|
sums = {} of Int32 => Int32 |
|
process_lines(io, key_index, value_index) do |key, value| |
|
sums[key] = sums.fetch(key, 0) + value |
|
end |
|
sums.max_by &.[](1) |
|
end |
|
end |
|
|
|
module Array |
|
def self.process_lines(io, key_index, value_index) |
|
field_index = 0 |
|
key = 0 |
|
value = 0 |
|
|
|
io.each_char do |c| |
|
case c |
|
when '\n' |
|
yield key, value |
|
key = 0 |
|
value = 0 |
|
field_index = 0 |
|
when DELIMITER |
|
field_index += 1 |
|
else |
|
case field_index |
|
when key_index |
|
key = key * 10 + c.to_i |
|
when value_index |
|
value = value * 10 + c.to_i |
|
end |
|
end |
|
end |
|
end |
|
|
|
def self.process_data(io, key_index, value_index) |
|
sums = ::Array(Int32).new(4096, 0) |
|
process_lines(io, key_index, value_index) do |key, value| |
|
sums[key] += value |
|
end |
|
|
|
max = {-1, 0} |
|
sums.each_with_index do |value, key| |
|
max = {key, value} if value > max[1] |
|
end |
|
|
|
max |
|
end |
|
end |
|
|
|
module ArrayWithBackup |
|
ARRAY_SIZE = 4096 |
|
|
|
def self.process_lines(io, key_index, value_index) |
|
field_index = 0 |
|
key = 0 |
|
value = 0 |
|
|
|
io.each_char do |c| |
|
case c |
|
when '\n' |
|
yield key, value |
|
key = 0 |
|
value = 0 |
|
field_index = 0 |
|
when DELIMITER |
|
field_index += 1 |
|
else |
|
case field_index |
|
when key_index |
|
key = key * 10 + c.to_i |
|
when value_index |
|
value = value * 10 + c.to_i |
|
end |
|
end |
|
end |
|
end |
|
|
|
def self.process_data(io, key_index, value_index) |
|
sums = ::Array(Int32).new(ARRAY_SIZE, 0) |
|
sums_hash = {} of Int32 => Int32 |
|
process_lines(io, key_index, value_index) do |key, value| |
|
if(key >= ARRAY_SIZE) |
|
sums_hash[key] = sums_hash.fetch(key, 0) + value |
|
else |
|
sums[key] += value |
|
end |
|
end |
|
|
|
max = {-1, 0} |
|
max = sums_hash.max_by &.[](1) unless sums_hash.empty? |
|
sums.each_with_index do |value, key| |
|
max = {key, value} if value > max[1] |
|
end |
|
|
|
max |
|
end |
|
end |
|
end |