## pebbles.a68

```
1  COMMENT
2
3  @section Synopsis
4
5  Edsger Dijkstra's pebble problem.
6
7  This program originates from the legacy "REVISED MC ALGOL 68 TEST SET":
8
9      Dick Grune, The Revised MC ALGOL 68 Test Set, IW XX/79,
10      Mathematical Centre, Amsterdam.
11
12  The Mathematical Centre ("Stichting Mathematisch Centrum" or SMC) was a Dutch
13  non-profit institution aiming at the promotion of pure mathematics and its
14  applications.
15
16  SMC is now "Stichting Centrum Wiskunde & Informatica" (CWI). The test set
17  is available as an open access publication from the CWI repository:
18
19     https://ir.cwi.nl/pub/
20
21  Selected (modified) "Revised MC ALGOL 68 Test Set" programs are distributed
22  with Algol 68 Genie with kind permission of Dick Grune.
23
24  COMMENT
25
26  BEGIN # 1. Sets in ALGOL 68;
27          2. Pebble problem of E.W. Dijkstra
28        #
29
30      MODE RED   = REF STRUCT (RED red),
31           WHITE = REF STRUCT (WHITE white),
32           BLUE  = REF STRUCT (BLUE blue);
33
34      MODE STONE = UNION (RED, WHITE, BLUE);
35
36      PROC sort = (REF [] STONE st) VOID:
37          (INT pr := 1, pw := 1, pb := UPB st;
38
39           PRIO EXCH = 1;
40           OP EXCH = (REF STONE a, b) VOID: (STONE c = b; b := a; a := c);
41
42           TO UPB st
43           DO CASE st[pw]
44              IN (RED):   (st[pr] EXCH st[pw]; pr +:= 1; pw +:= 1),
45                 (WHITE): pw +:= 1,
46                 (BLUE):  (st[pw] EXCH st[pb]; pb -:= 1)
47              ESAC
48           OD
49          );
50
51      OP PRINT = (REF [] STONE st) VOID:
52         FOR i TO UPB st
53         DO print ((st[i] | (RED): "r", (WHITE): "w", (BLUE): "b"))
54         OD;
55
56      INT n = 20;
57      [1 : n] STONE stone;
58
59      FOR i TO UPB stone
60      DO stone[i] := (ENTIER (random * 3) + 1 | RED (NIL), WHITE (NIL), BLUE (NIL))
61      OD;
62
63      PRINT stone;
64      newline (standout);
65      sort (stone);
66      PRINT stone;
67      newline (standout)
68
69  END

```