Skip to content

Instantly share code, notes, and snippets.

@tobiashm
Created September 2, 2016 14:31
Show Gist options
  • Save tobiashm/1a896257432d69e1599de0f00447347a to your computer and use it in GitHub Desktop.
Save tobiashm/1a896257432d69e1599de0f00447347a to your computer and use it in GitHub Desktop.
Partition dates exercise. Implement `Transformer#call`
# encoding: UTF-8
#
# Given dates `dx = [dX...] and dates `dy = [dYY...]`
# and d1 <= d11
#
# d1 d2 d3
# --------------------------------------------
# d11 d12 d13 d21 d22 d23 d31 d32 d33
#
# becomes
#
# { d1 => [d11, d12, d13], d2 => [d13, d21, d22, d3], d3 => [d23, d31, d32, d33] }
#
# and
#
# d1 d2 d2' d3
# ------------------------------------------------
# d11 d12 d13 d21 d22 d23 d31 d32 d33
#
# becomes
#
# { d1 => [d11, d12, d13], d2 => [d13], d2' => [d13, d21, d22, d23], d3 => [d23, d31, d32, d33]}
#
class Transformer
def initialize(dy)
@dy = dy
end
def call(*dx)
# TODO: Implement
{}
end
end
require "date"
require "minitest/autorun"
require "minitest/spec"
require "pp"
class Test < Minitest::Test
def setup
@transformer = Transformer.new(dy)
end
def test_1
assert_transform(
{ d1 => dy },
@transformer.call(d1)
)
end
def test_2
assert_transform(
{
d1 => dy1,
d2 => [dy1.last] + dy2,
d3 => [dy2.last] + dy3
},
@transformer.call(d1, d2, d3)
)
end
def test_3
assert_transform(
{
d1 => dy1,
d2 => [dy1.last],
d2x => [dy1.last] + dy2,
d3 => [dy2.last] + dy3
},
@transformer.call(d1, d2, d2x, d3)
)
end
def assert_transform(expected, actual)
expected = stringify_dates(expected)
actual = stringify_dates(actual)
assert expected == actual, format_message(expected, actual)
end
def stringify_dates(hash)
hash.map { |k, v| [k.to_s, v.map(&:to_s)] }.to_h
end
def format_message(expected, actual)
msg = StringIO.new
msg << "Expected:\n"
PP.pp(expected, msg)
msg << "But got:\n"
PP.pp(actual, msg)
msg.string
end
# DATA
def d1
@d1 ||= Date.new(2001, 1, 1)
end
def d2
@d2 ||= d1.next_year
end
def d2x
@d2x ||= d2 + 1
end
def d3
@d3 ||= d2.next_year
end
Array.new(3) do |i|
class_eval <<-eoruby, __FILE__, __LINE__ + 1 + (i * 4)
def dy#{i + 1}
@dy#{i + 1} ||= Array.new(3) { |n| send("d#{i + 1}") >> (n + 1) }
end
eoruby
end
def dy
@dy ||= [dy1, dy2, dy3].flatten
end
end
Test.new(nil).tap do |t|
puts "dx", [t.d1, t.d2, t.d2x, t.d3].map(&:to_s).inspect
puts "dy", t.dy.map(&:to_s).inspect
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment