function EsRomano(Roman : String) : Boolean; const Romanos : Array[1..13] of String = ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'); var i : Integer; Ro : String; Longitud : Integer; Temporal : String; RomanTemp : String; Cantidad : Integer; NumMayor : Boolean; Entrado : Boolean; Sucesion : Boolean; begin Result := False; Temporal := ''; NumMayor := True; Entrado := False; Sucesion := True; for i := 1 to 13 do begin Longitud := Length(Romanos[i]); Ro := Copy(RomanTemp, 1, Longitud); Cantidad := 0; while ((Length(RomanTemp)>0) and (Ro = Romanos[i])) do begin RomanTemp := Copy(RomanTemp, 1 + Longitud, Length(RomanTemp) - Longitud); Temporal := Temporal + Romanos[i]; Ro := Copy(RomanTemp, 1, Longitud); Inc(Cantidad); Entrado := True; end; if Entrado then begin case i of 5, 9, 13 : if Cantidad > 3 then NumMayor := False; 2, 3, 4, 6, 7, 8, 10, 11, 12 : if Cantidad > 1 then NumMayor := False; end; Entrado := False; end; end; if ((Temporal = Roman) and NumMayor) then begin RomanTemp := Roman; for i := 1 to 13 do begin Longitud := Length(Romanos[i]); Ro := Copy(RomanTemp, 1, Longitud); while (Sucesion and (Length(RomanTemp)>0) and (Ro = Romanos[i])) do begin case i of 2, 6, 10 : // Si es CM, XC o IX. begin if (Copy(RomanTemp,3,1) = Romanos[i+1]) then Sucesion := False else if (Copy(RomanTemp,3,2) = Romanos[i+2]) then Sucesion := False else if (Copy(RomanTemp,3,1) = Romanos[i+3]) then Sucesion := False; end; 3, 7, 11 : if (Copy(RomanTemp,2,2) = Romanos[i+1]) then Sucesion := False; 4, 8, 12 : if (Copy(RomanTemp,3,1) = Romanos[i+1]) then Sucesion := False end; RomanTemp := Copy(RomanTemp, 1 + Longitud, Length(RomanTemp) - Longitud); Ro := Copy(RomanTemp, 1, Longitud); end; end; Result := Sucesion; end else Result := False; end; function RomanToDec(Roman : String): LongInt; const Numeros : Array[1..13] of Integer = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1); Romanos : Array[1..13] of String = ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'); var i : Integer; Ro : String; Longitud : Integer; begin Result := 0; Roman := UpperCase(Roman); if EsRomano(Roman) then for i := 1 to 13 do begin Longitud := Length(Romanos[i]); Ro := Copy(Roman, 1, Longitud); while ((Length(Roman)>0) and (Ro = Romanos[i])) do begin Roman := Copy(Roman, 1 + Longitud, Length(Roman) - 1); Result := Result + Numeros[i]; Ro := Copy(Roman, 1, Longitud); end; end; end;
|