blob: 21408fd5a61b1c458d7fb93cc714e8a46de16bea (
plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
--
-- Perl Weekly Challenge 236
-- Task 1
--
-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-236/>
--
CREATE SCHEMA IF NOT EXISTS pwc236;
CREATE OR REPLACE FUNCTION
pwc236.task1_plpgsql( cashing int[] )
RETURNS boolean
AS $CODE$
DECLARE
current_cash int;
available_qty_10 int;
available_qty_5 int;
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS remainder( cash int, quantity int default 1 );
TRUNCATE TABLE remainder;
INSERT INTO remainder( cash, quantity )
VALUES
(5, 0 ), ( 10, 0 ), ( 15, 0 );
FOREACH current_cash IN ARRAY cashing LOOP
UPDATE remainder
SET quantity = quantity + 1
WHERE cash = current_cash;
IF current_cash = 5 THEN
CONTINUE;
END IF;
IF current_cash = 10 THEN
SELECT quantity
INTO available_qty_5
FROM remainder
WHERE cash = 5;
IF available_qty_5 > 0 THEN
UPDATE remainder
SET quantity = quantity - 1
WHERE cash = 5;
ELSE
RETURN false;
END IF;
END IF;
IF current_cash = 20 THEN
SELECT quantity
INTO available_qty_10
FROM remainder
WHERE cash = 10;
SELECT quantity
INTO available_qty_5
FROM remainder
WHERE cash = 5;
IF available_qty_10 > 0 AND available_qty_5 > 0 THEN
UPDATE remainder
SET quantity = quantity - 1
WHERE cash IN ( 5, 10 );
ELSIF available_qty_10 = 0 and available_qty_5 >= 3 THEN
UPDATE remainder
SET quantity = quantity - 3
WHERE cash = 5;
ELSE
RETURN false;
END IF;
END IF;
END LOOP;
return true;
END
$CODE$
LANGUAGE plpgsql;
|