1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
=begin
O(1) -> key -> location -> bucket
hash(x) -> int
-------
| | [ [1, value], [4, value], [40, value] ]
-------
| | [ [1, value] ]
-------
| |
-------
=end
def assert_equals(x, y)
raise [x, y].inspect unless x == y
end
class KV
def initialize
@items = Hash.new do |hash, key|
hash[key] = []
end
end
def set(key, value)
@items[key] << [Time.now.to_i, value]
end
def get(key, at = nil)
if at
@items[key].bsearch { |(timestamp, _value)| timestamp <= at }&.at(-1)
else
@items[key].last&.at(-1)
end
end
end
kv = KV.new
kv.set('foo', 'bar')
# challenge 1
assert_equals(kv.get('foo'), 'bar')
kv.set(42, 'forty two')
assert_equals(kv.get(42), 'forty two')
assert_equals(kv.get('baz'), nil)
# challenge 2
kv.set('foo', 'bar')
now = Time.now.to_i
sleep(3)
kv.set('foo', 'bar2')
assert_equals(kv.get('foo'), 'bar2')
assert_equals(kv.get('foo', now), 'bar')
# challenge 3
assert_equals(kv.get('foo', now + 1), 'bar')
assert_equals(kv.get('foo', now + 2), 'bar')
puts 'yay!'
|