Skip to content

Commit aded6dd

Browse files
committed
first attempt to make a solution
1 parent 78350b7 commit aded6dd

File tree

1 file changed

+138
-82
lines changed

1 file changed

+138
-82
lines changed
Lines changed: 138 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,138 @@
1-
# def merge_sort(array, start: nil, finish: nil, buffer: nil)
2-
# return if start == finish
3-
4-
# mid = (finish - start) / 2 + start
5-
6-
# merge_sort(array, start: start, finish: mid, buffer: buffer)
7-
# merge_sort(array, start: mid + 1, finish: finish, buffer: buffer)
8-
9-
# i = 0
10-
# j = 0
11-
# b = 0
12-
# loop do
13-
# remaining = (j + mid + 1)..finish if i == mid + 1 - start
14-
# remaining = (i + start)..mid if j == finish - mid
15-
# if remaining
16-
# remaining.each do |k|
17-
# buffer[b] = array[k]
18-
# b += 1
19-
# end
20-
# break
21-
# end
22-
# x = array[i + start]
23-
# y = array[j + mid + 1]
24-
# if x < y
25-
# buffer[b] = x
26-
# i += 1
27-
# else
28-
# buffer[b] = y
29-
# j += 1
30-
# end
31-
# b += 1
32-
# end
33-
# (0...b).each do |k|
34-
# array[start + k] = buffer[k]
35-
# end
36-
37-
# array
38-
# end
39-
40-
# n = 10
41-
# a = n.times.map { rand(0..99) }.sort + n.times.map { rand(0..99) }.sort
42-
# b = Array.new(n)
43-
44-
# p a
45-
46-
# k = 0
47-
# i = 0
48-
# j = n
49-
50-
# while k < n do
51-
# if a[i] <= a[j]
52-
# b[k] = a[i]
53-
# a[i] = nil
54-
# i += 1
55-
# else
56-
# b[k] = a[j]
57-
# a[j] = nil
58-
# j += 1
59-
# end
60-
# k += 1
61-
# end
62-
63-
# i = 2 * n - 1
64-
# k = 2 * n - 1
65-
# while k >= n do
66-
# if a[i]
67-
# a[k] = a[i] unless k == i
68-
# k -= 1
69-
# end
70-
# i -= 1
71-
# end
72-
73-
# b.each_with_index do |e, i|
74-
# a[i] = e
75-
# end
76-
77-
# merge_sort(a, start: n, finish: 2*n - 1, buffer: b)
78-
79-
# p b
80-
# p a
81-
# p a.sort
82-
# p a == a.sort
1+
class Obj
2+
attr_reader :size
3+
4+
def initialize(size)
5+
@size = size
6+
end
7+
8+
def <(other)
9+
(self <=> other) < 0
10+
end
11+
12+
def >(other)
13+
(self <=> other) > 0
14+
end
15+
16+
def >=(other)
17+
(self <=> other) >= 0
18+
end
19+
20+
def <=(other)
21+
(self <=> other) <= 0
22+
end
23+
24+
def ==(other)
25+
(self <=> other) == 0
26+
end
27+
28+
def <=>(other)
29+
raise "Can compare only nuts and bolts" unless comparable?(other)
30+
size <=> other.size
31+
end
32+
33+
def comparable?(other)
34+
other.is_a?(other_class)
35+
end
36+
37+
def inspect
38+
"#{self.class.to_s[0]}#{size}"
39+
end
40+
end
41+
42+
class Nut < Obj
43+
def other_class
44+
Bolt
45+
end
46+
end
47+
48+
class Bolt < Obj
49+
def other_class
50+
Nut
51+
end
52+
end
53+
54+
def sort(array1, array2, start: nil, finish: nil)
55+
start ||= 0
56+
finish ||= array1.size - 1
57+
58+
return if start >= finish
59+
60+
divider1 = array1[(finish - start) / 2 + start]
61+
divider2 = nil
62+
63+
# p divider1.size
64+
65+
# p [start, finish, divider1, divider2]
66+
67+
# p array1
68+
# p array2
69+
# p "==="
70+
71+
left = start
72+
right = finish
73+
while left <= right
74+
left += 1 while array2[left] < divider1
75+
right -= 1 while array2[right] > divider1
76+
77+
unless divider2
78+
divider2 = array2[left] if array2[left] == divider1
79+
divider2 = array2[right] if array2[right] == divider1
80+
end
81+
82+
if left <= right
83+
# p [left, right, array2[left], array2[right]]
84+
array2[left], array2[right] = array2[right], array2[left]
85+
left += 1
86+
right -= 1
87+
end
88+
end
89+
left1 = left
90+
right1 = right
91+
92+
# p array1[start..finish]
93+
# p array2[start..finish]
94+
# p [left, right]
95+
# p array2[left]
96+
# p [array2[start..right], divider1, array2[left..finish], :!, start, right, left, finish]
97+
98+
# p [start, finish, divider1, divider2, array1, array2]
99+
100+
left = start
101+
right = finish
102+
while left <= right
103+
left += 1 while array1[left] < divider2
104+
right -= 1 while array1[right] > divider2
105+
106+
if left <= right
107+
array1[left], array1[right] = array1[right], array1[left]
108+
left += 1
109+
right -= 1
110+
end
111+
end
112+
left2 = left
113+
right2 = right
114+
115+
# p [array1[start..right], divider2, array1[left..finish], :!, start, right, left, finish]
116+
# p array1[start..finish]
117+
# p array2[start..finish]
118+
# p [left, right]
119+
# p array1[left]
120+
121+
# return if start == finish - 1
122+
123+
right = [right1, right2].max
124+
left = [left1, left2 ].min
125+
126+
sort(array1, array2, start: start, finish: right)
127+
sort(array1, array2, start: left, finish: finish)
128+
end
129+
130+
n = 10
131+
132+
bolt_pile = (0...n).map { |l| Bolt.new(l) }.shuffle
133+
nut_pile = (0...n).map { |l| Nut.new(l) }.shuffle
134+
135+
p [bolt_pile, nut_pile]
136+
sort(bolt_pile, nut_pile)
137+
p [bolt_pile, nut_pile]
138+
p bolt_pile.zip(nut_pile).map { |bolt, nut| bolt == nut }.uniq

0 commit comments

Comments
 (0)