## roman-decimal.a68

```
1  COMMENT
2
3  @section Synopsis
4
5  Translation between decimal and Roman notation.
6
7  This Algol 68 version 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
27  BEGIN # Translation decimal number to Roman notation and vice versa #
28    PROC roman = (INT number) STRING:
29      BEGIN INT n:= number, STRING result,
30        [] STRUCT (INT value, STRING r) table =
31          ((1000, "M"), (900, "CM"), (500,"D"), (400,"CD"),
32           (100,"C"), (90,"XC"), (50,"L"), (40,"XL"),
33           (10,"X"), (9,"IX"), (5,"V"), (4,"IV"), (1,"I"));
34        FOR i TO UPB table
35        DO INT v = value OF table[i], STRING r = r OF table[i];
36           WHILE v LE n
37           DO (result +:= r, n -:= v)
38           OD
39        OD;
40        result
41      END,
42
43    PROC value of roman = (STRING text) INT:
44      IF text = ""
45      THEN 0
46      ELSE OP ABS = (CHAR s) INT:
47           CASE INT p; char in string (s,p, "IVXLCDM"); p
48           IN 1, 5, 10, 50, 100, 500, 1000
49           ESAC,
50           INT v, maxv := 0, maxp;
51           FOR p TO UPB text
52           DO IF (v := ABS text[p]) > maxv
53              THEN maxp := p; maxv := v
54              FI
55           OD;
56           maxv - value of roman (text[: maxp - 1]) + value of roman (text[maxp + 1:])
57      FI;
58      print ((roman (1968), new line));                          # "MCMLXVIII" #
59      print ((whole (value of roman ("MCMLXXVI"), 0), new line)) # 1976        #
60  END

```