1 Function getLengthOfTheInput() Which Returns Integer32 Is External;
2 Function getCharacterAtIndex(Integer32 index)
3 Which Returns Character Is External;
4 Function printString(PointerToCharacter string) Which Returns Nothing
5 Is External;
6
7 PointerToCharacter elements[13] := {"I", "IV", "V",
8 "IX", "X", "XL",
9 "L", "XC", "C",
10 "CD", "D", "CM",
11 "M"};
12 Integer16 meaningsOfElements[13] := { 1, 4, 5,
13 9 10, 40,
14 50, 90, 100,
15 400, 500, 900,
16 1000};
17 Character result[64], input[64], debugPrint[128];
18
19 Function strcat(PointerToCharacter dest, PointerToCharacter src)
20 Which Returns Nothing Is Declared;
21
22 Function convertToRomanNumerals(Integer16 number) Which Returns Nothing Does
23 result[0] := 0;
24 PointerToCharacter result := AddressOf(result[0]);
25 If number = 0 Then
26 strcat(result,"N");
27 Return;
28 ElseIf number < 0 or number >= 4000 Then
29 strcat(result,"\"Please enter a number between 0 and 4000.\"");
30 Return;
31 EndIf
32 Integer32 pointerToElement := 12; While number Loop
34 If number > meaningsOfElements[pointerToElement] - 1 Then
35 strcat(result, elements[pointerToElement]);
36 number -= meaningsOfElements[pointerToElement];
37 Else
38 pointerToElement -= 1;
39 EndIf
40 EndWhile
41 EndFunction
42
43 Function strlen(PointerToCharacter str) Which Returns Integer32 Does
44 Integer32 length : = 0;
45 While ValueAt(str + length) Loop
46 length += 1;
47 EndWhile
48 Return length;
49 EndFunction
50
51 Function strcpy(PointerToCharacter dest,
52 PointerToCharacter src) Which Returns Nothing Does
53 While ValueAt(src) Loop
54 ValueAt(dest) := ValueAt(src);
55 dest += 1;
56 src += 1;
57 EndWhile
58 ValueAt(dest) : = 0;
59 EndFunction
60
61 Function strcat(PointerToCharacter dest,
62 PointerToCharacter src) Which Returns Nothing Does
63 strcpy(dest + strlen(dest), src);
64 EndFunction
65
66 Function strcmp(PointerToCharacter first, PointerToCharacter second)
67 Which Returns Integer32 Does
68 While ValueAt(first) = ValueAt(second) and not(ValueAt(first) = 0) Loop
69 first += 1;
70 second += 1;
71 EndWhile
72 If ValueAt(first) < ValueAt(second) Then Return -1; EndIf
73 If ValueAt(first) > ValueAt(second) Then Return 1; EndIf
74 Return 0;
75 EndFunction
76
77 Function toUpperCase(Character chr) Which Returns Character Does
78 Return 'a' <= chr <= 'z' ? chr - ('a' - 'A') : chr;
79 EndFunction
80
81 Function solve() Which Returns Integer32 Does
82 debugPrint[0] := 0;
83 strcat(AddressOf(debugPrint[0]), "strcmp(\"MMXXIV\",\"MMX\")+5 is equal to: ");
84 Character testArray[2] := {strcmp("MMXXIV","MMX")+'5', 0};
85 strcat(AddressOf(debugPrint[0]), AddressOf(testArray[0]));
86 printString(AddressOf(debugPrint[0]));
87 Integer32 i := 0;
88 While i < getLengthOfTheInput() Loop
89 input[i] := toUpperCase(getCharacterAtIndex(i));
90 i += 1;
91 EndWhile
92 input[i] := 0;
93 debugPrint[0] := 0;
94 strcat(AddressOf(debugPrint[0]),"The input is: ");
95 strcat(AddressOf(debugPrint[0]),AddressOf(input[0]));
96 printString(AddressOf(debugPrint[0]));
97 i := 0;
98 result[0] := 0;
99 While not(strcmp(AddressOf(result[0]), AddressOf(input[0])) = 0) and i < 4_000 Loop
100 i += 1;
101 convertToRomanNumerals(i);
102 printString(AddressOf(input[0]));
103 printString(AddressOf(result[0]));
104 EndWhile
105 Return i;
106 EndFunction
107
108