aboutsummaryrefslogtreecommitdiff
path: root/challenge-279/deadmarshal/modula-3/ch1/src/Ch1.m3
blob: eb9c9146eaed19306f0f26ed44b81ad7a8c2429a (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
MODULE Ch1 EXPORTS Main;

IMPORT SIO,Integer,Text;
IMPORT CharIntPair,CharIntPairArraySort;

VAR
  L1:ARRAY[0..3] OF CHAR := ARRAY OF CHAR{'R','E','P','L'};
  W1:ARRAY[0..3] OF CARDINAL := ARRAY OF CARDINAL{3,2,1,4};
  L2:ARRAY[0..3] OF CHAR := ARRAY OF CHAR{'A','U','R','K'};
  W2:ARRAY[0..3] OF CARDINAL := ARRAY OF CARDINAL{2,4,1,3};
  L3:ARRAY[0..5] OF CHAR := ARRAY OF CHAR{'O','H','Y','N','P','T'};
  W3:ARRAY[0..5] OF CARDINAL := ARRAY OF CARDINAL{5,4,2,6,1,3};

PROCEDURE Compare(READONLY a,b:CharIntPair.T):[-1..1] =
  BEGIN
    RETURN Integer.Compare(CharIntPair.Second(a),
                           CharIntPair.Second(b))
  END Compare;

PROCEDURE SortLetters(READONLY L:ARRAY OF CHAR;
                      READONLY W:ARRAY OF CARDINAL):TEXT =
  VAR
    A:REF ARRAY OF CharIntPair.T :=
        NEW(REF ARRAY OF CharIntPair.T,NUMBER(L));
    Sorted:REF ARRAY OF CHAR :=
        NEW(REF ARRAY OF CHAR,NUMBER(L));
  BEGIN
    FOR I := FIRST(L) TO LAST(L) DO
      A[I] := CharIntPair.Create(L[I],W[I])
    END;
    CharIntPairArraySort.Sort(A^,Compare);
    FOR I := FIRST(A^) TO LAST(A^) DO
      Sorted[I] := CharIntPair.First(A[I])
    END;
    RETURN Text.FromChars(Sorted^)
  END SortLetters;

BEGIN
  SIO.PutText(SortLetters(L1,W1)); SIO.Nl();
  SIO.PutText(SortLetters(L2,W2)); SIO.Nl();
  SIO.PutText(SortLetters(L3,W3)); SIO.Nl()
END Ch1.