Skip to content

Commit e1c94b0

Browse files
authored
Merge pull request #187 from rpottsoh/updateBookStore
book-store: Update to v1.1.0
2 parents 02d3164 + bd1e8c9 commit e1c94b0

File tree

2 files changed

+70
-15
lines changed

2 files changed

+70
-15
lines changed

exercises/book-store/uBookStoreExample.pas

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ interface
1111
function NewBasket(aBasket: TArray<Integer>): IBasket;
1212

1313
implementation
14-
uses System.SysUtils;
14+
uses System.SysUtils, System.Generics.collections, System.Math;
1515

1616
const
1717
seriesBooks = '12345';
@@ -27,6 +27,7 @@ TBasket = class(TInterfacedObject, IBasket)
2727
private
2828
fSingleBookPrice: extended;
2929
fBasket: string;
30+
fIntList: TList<integer>;
3031
class function Head(inStr: string): string; static;
3132
class function Tail(inStr: string): string; static;
3233
class function ConvertIntArrayToString(const aIntArray: TArray<Integer>): string; static;
@@ -65,6 +66,9 @@ class function TBasket.ConvertIntArrayToString(const aIntArray: TArray<Integer>)
6566
constructor TBasket.Create(aBasket: TArray<Integer>);
6667
begin
6768
fSingleBookPrice := 8;
69+
fIntList := TList<integer>.Create;
70+
fIntList.AddRange(aBasket);
71+
fIntList.Sort;
6872
fBasket := ConvertIntArrayToString(aBasket);
6973
end;
7074

@@ -108,26 +112,42 @@ function TBasket.GroupBasket:TArray<String>;
108112
end;
109113

110114
function TBasket.Total:extended;
111-
var hpBook : char;
112-
totalBooks : integer;
113-
subBaskets : TArray<String>;
114-
wrkSubBasket: string;
115-
subTotal : extended;
115+
var
116+
subBaskets : TArray<String>;
117+
subResult : array[0..1] of extended;
118+
lSortedBasket : TArray<integer>;
119+
120+
function computeTotal: extended;
121+
var wrkSubBasket: string;
122+
totalBooks : integer;
123+
subTotal : extended;
124+
begin
125+
result := 0;
126+
for wrkSubBasket in subBaskets do
127+
begin
128+
totalBooks := wrkSubBasket.Length;
129+
subTotal := totalBooks * (fSingleBookPrice * DiscountPercentage(wrkSubBasket));
130+
Result := Result + subTotal;
131+
end;
132+
end;
133+
116134
begin
135+
fillchar(subResult, sizeof(extended), #0);
136+
117137
subBaskets := GroupBasket;
118-
result := 0;
119-
for wrkSubBasket in subBaskets do
120-
begin
121-
totalBooks := wrkSubBasket.Length;
122-
subTotal := totalBooks * (fSingleBookPrice * DiscountPercentage(wrkSubBasket));
123-
result := result + subTotal;
124-
end;
138+
subResult[0] := computeTotal;
139+
140+
lSortedBasket := fIntList.ToArray;
141+
fBasket := ConvertIntArrayToString(lSortedBasket);
142+
subBaskets := GroupBasket;
143+
subResult[1] := computeTotal;
144+
145+
result := min(subResult[0], subResult[1]);
125146
end;
126147

127148
function TBasket.DiscountPercentage(inStr : string):extended;
128149
var numDiffBooks: integer;
129150
begin
130-
result := 1;
131151
numDiffBooks := NumberOfDifferentBooks(inStr);
132152
result := CDiscounts[numDiffBooks];
133153
end;

exercises/book-store/uBookStoreTests.pas

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ interface
44
uses
55
DUnitX.TestFramework;
66

7+
const
8+
CanonicalVersion = '1.1.0';
9+
710
type
811
[TestFixture]
912
hpTests = class(TObject)
1013
public
1114
[Test]
12-
// [Ignore('Comment the "[Ignore]" statement to run the test')]
15+
// [Ignore('Comment the "[Ignore]" statement to run the test')]
1316
procedure A_basket_containing_only_a_single_book;
1417

1518
[Test]
@@ -55,6 +58,10 @@ hpTests = class(TObject)
5558
[Test]
5659
[Ignore]
5760
procedure A_basket_containing_twelve_books_consisting_of_three_copies_of_the_first_two_books_plus_two_each_of_the_remaining_three_books_in_the_series;
61+
62+
[Test]
63+
[Ignore]
64+
procedure Four_groups_of_four_are_cheaper_than_two_groups_each_of_five_and_three;
5865
end;
5966

6067
implementation
@@ -130,6 +137,34 @@ procedure hpTests.A_basket_with_three_different_books;
130137
assert.AreEqual(Expected, fBasket.Total, MinDelta, format('Total should be %0.2f',[Expected]));
131138
end;
132139

140+
procedure hpTests.Four_groups_of_four_are_cheaper_than_two_groups_each_of_five_and_three;
141+
var Basket: TArray<integer>;
142+
fBasket: IBasket;
143+
Expected: double;
144+
begin
145+
SetLength(Basket, 16);
146+
Basket[0] := 1;
147+
Basket[1] := 1;
148+
Basket[2] := 2;
149+
Basket[3] := 2;
150+
Basket[4] := 3;
151+
Basket[5] := 3;
152+
Basket[6] := 4;
153+
Basket[7] := 5;
154+
Basket[8] := 1;
155+
Basket[9] := 1;
156+
Basket[10] := 2;
157+
Basket[11] := 2;
158+
Basket[12] := 3;
159+
Basket[13] := 3;
160+
Basket[14] := 4;
161+
Basket[15] := 5;
162+
Expected := 102.40;
163+
164+
fBasket := NewBasket(Basket);
165+
assert.AreEqual(Expected, fBasket.Total, MinDelta, format('Total should be %0.2f',[Expected]));
166+
end;
167+
133168
procedure hpTests.A_basket_with_four_different_books;
134169
var Basket: TArray<integer>;
135170
fBasket: IBasket;

0 commit comments

Comments
 (0)