@@ -11,7 +11,7 @@ interface
11
11
function NewBasket (aBasket: TArray<Integer>): IBasket;
12
12
13
13
implementation
14
- uses System.SysUtils;
14
+ uses System.SysUtils, System.Generics.collections, System.Math ;
15
15
16
16
const
17
17
seriesBooks = ' 12345' ;
@@ -27,6 +27,7 @@ TBasket = class(TInterfacedObject, IBasket)
27
27
private
28
28
fSingleBookPrice: extended;
29
29
fBasket: string;
30
+ fIntList: TList<integer>;
30
31
class function Head (inStr: string): string; static;
31
32
class function Tail (inStr: string): string; static;
32
33
class function ConvertIntArrayToString (const aIntArray: TArray<Integer>): string; static;
@@ -65,6 +66,9 @@ class function TBasket.ConvertIntArrayToString(const aIntArray: TArray<Integer>)
65
66
constructor TBasket.Create(aBasket: TArray<Integer>);
66
67
begin
67
68
fSingleBookPrice := 8 ;
69
+ fIntList := TList<integer>.Create;
70
+ fIntList.AddRange(aBasket);
71
+ fIntList.Sort;
68
72
fBasket := ConvertIntArrayToString(aBasket);
69
73
end ;
70
74
@@ -108,26 +112,42 @@ function TBasket.GroupBasket:TArray<String>;
108
112
end ;
109
113
110
114
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
+
116
134
begin
135
+ fillchar(subResult, sizeof(extended), #0 );
136
+
117
137
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 ]);
125
146
end ;
126
147
127
148
function TBasket.DiscountPercentage (inStr : string):extended;
128
149
var numDiffBooks: integer;
129
150
begin
130
- result := 1 ;
131
151
numDiffBooks := NumberOfDifferentBooks(inStr);
132
152
result := CDiscounts[numDiffBooks];
133
153
end ;
0 commit comments