unit SF; type int = integer; bool = boolean; bi = BigInteger; FunI = () -> int; FunR = () -> real; FunS = () -> string; FunII = int -> int; FunIR = int -> real; FunIS = int -> string; FunRI = real -> int; FunRR = real -> real; FunRS = real -> string; FunSI = string -> int; FunSR = string -> real; FunSS = string -> string; Pred = () -> bool; PredI = int -> bool; PredR = real -> bool; PredS = string -> bool; Act = procedure; ProcI = int -> (); ProcR = real -> (); ProcS = string -> (); HS = HashSet; procedure Pr(params a: array of object) := Print(a); procedure Pr(o: object) := Print(o); procedure Pr(s: string) := Print(s); procedure Prln(params a: array of object) := Println(a); function RI := ReadInteger; function RBI := ReadBigInteger; function RI64 := ReadInt64; function RR := ReadReal; function RC := ReadChar; function RS := ReadString; function RL := ReadLexem; function RlnI := ReadlnInteger; function RlnBI := ReadlnBigInteger; function RlnI64 := ReadlnInt64; function RlnR := ReadlnReal; function RlnC := ReadlnChar; function RlnS := ReadlnString; function RI2 := ReadInteger2; function RR2 := ReadReal2; function RC2 := ReadChar2; function RS2 := ReadString2; function RlnI2 := ReadlnInteger2; function RlnR2 := ReadlnReal2; function RlnC2 := ReadlnChar2; function RlnS2 := ReadlnString2; function RI3 := ReadInteger3; function RR3 := ReadReal3; function RC3 := ReadChar3; function RS3 := ReadString3; function RlnI3 := ReadlnInteger3; function RlnR3 := ReadlnReal3; function RlnC3 := ReadlnChar3; function RlnS3 := ReadlnString3; function RI4 := ReadInteger4; function RR4 := ReadReal4; function RC4 := ReadChar4; function RS4 := ReadString4; function RlnI4 := ReadlnInteger4; function RlnR4 := ReadlnReal4; function RlnC4 := ReadlnChar4; function RlnS4 := ReadlnString4; function RAI(n: integer) := ReadArrInteger(n); function RAR(n: integer) := ReadArrReal(n); function Pr(Self: integer): integer; extensionmethod := Self.Print; function Pr(Self: real): real; extensionmethod := Self.Print; function Pr(Self: Biginteger): Biginteger; extensionmethod := Self.Print; function Pr(Self: char): char; extensionmethod := Self.Print; function Pr(Self: boolean): boolean; extensionmethod := Self.Print; function Pr(Self: string): string; extensionmethod := Self.Print; function Pr(Self: array [,] of T; w: integer := 4): array [,] of T; extensionmethod := Self.Print(w); function Prln(Self: integer): integer; extensionmethod := Self.Println; function Prln(Self: real): real; extensionmethod := Self.Println; function Prln(Self: Biginteger): Biginteger; extensionmethod := Self.Println; function Prln(Self: char): char; extensionmethod := Self.Println; function Prln(Self: boolean): boolean; extensionmethod := Self.Println; function Prln(Self: string): string; extensionmethod := Self.Println; function D(Self,b: integer): boolean; extensionmethod := Self mod b = 0; function ND(Self,b: integer): boolean; extensionmethod := Self mod b <> 0; /// Записывает в min значение x если xmax procedure ReMax(var max: integer; x: integer); begin if x > max then max := x end; /// Записывает в min значение x если xmax procedure ReMax(var max: real; x: real); begin if x > max then max := x end; /// Возвращает все перестановки function Prm(Self: array of T): sequence of array of T; extensionmethod := Self.Permutations; /// Возвращает все сочетания по m элементов function Cmb(Self: array of T; m: integer): sequence of array of T; extensionmethod := Self.Combinations(m); /// Преобразует объект в строку function ToS(Self: Object): string; extensionmethod := Self.ToString; /// Преобразует строку в массив слов function ToW(Self: string): array of string; extensionmethod := Self.ToWords; /// Возвращает элементы последовательности без повторяющихся function Dst(Self: sequence of T): sequence of T; extensionmethod := Self.Distinct; /// Преобразует последовательность в строку function ToS(Self: sequence of T; delim: string): string; extensionmethod := Self.JoinToString(delim); /// Преобразует последовательность в строку function JtS(Self: sequence of T; delim: string): string; extensionmethod := Self.JoinToString(delim); /// Преобразует последовательность в строку function JtS(Self: sequence of T): string; extensionmethod := Self.JoinToString(); /// Сливает последовательнсть строк в одну строку function Concat(Self: sequence of string): string; extensionmethod := Self.JoinToString(''); /// Преобразует строку в целое function ToI(Self: string); extensionmethod := Self.ToInteger; /// Преобразует строку в вещественное function ToR(Self: string); extensionmethod := Self.ToReal; /// Преобразует строку в массив целых function ToIs(Self: string); extensionmethod := Self.ToIntegers; /// Преобразует строку в массив вещественных function ToRs(Self: string); extensionmethod := Self.ToReals; function operator-(c,c1: char): integer; extensionmethod := Ord(c) - Ord(c1); /// Возвращает длину строки function Len(Self: string): integer; extensionmethod := Self.Length; /// Возвращает длину массива function Len(Self: array of T): integer; extensionmethod := Self.Length; /// Возвращает среднее элементов последовательности function Av(Self: sequence of integer): real; extensionmethod := Self.Average; /// Возвращает среднее элементов последовательности function Av(Self: sequence of real): real; extensionmethod := Self.Average; /// Возвращает количество элементов последовательности function Cnt(Self: sequence of T): integer; extensionmethod := Self.Count; /// Возвращает количество элементов последовательности, удовлетворяющих условию function Cnt(Self: sequence of T; pred: T->boolean): integer; extensionmethod := Self.Count(pred); /// Возвращает количество элементов последовательности, равных заданному значению function Cnt(Self: sequence of T; elem: T): integer; extensionmethod := Self.CountOf(elem); function Ord(Self: sequence of T): sequence of T; extensionmethod := Self.Order; function OrdD(Self: sequence of T): sequence of T; extensionmethod := Self.OrderDescending; /// Преобразует последовательность в строку function Str(Self: sequence of T): string; extensionmethod := Self.JoinToString; /// Выводит последовательность, разделяя элементы пробелами function Pr(Self: sequence of T): sequence of T; extensionmethod := Self.Print; /// Выводит последовательность, разделяя элементы пробелами, и переходит на новую строку function Prln(Self: sequence of T): sequence of T; extensionmethod := Self.Println; /// Выводит последовательность, каждый элемент выводится на новой строке function PL(Self: sequence of T); extensionmethod := Self.PrintLines; /// Выводит последовательность, каждый элемент отображается с помощью функции map и выводится на новой строке function PL(Self: sequence of T; map: T->T1); extensionmethod := Self.PrintLines(map); /// Возвращает инвертированную последовательность function Rev(Self: sequence of T): sequence of T; extensionmethod := Self.Reverse; /// Преобразует каждый элемент последовательности в последовательность и сливает полученные последовательности в одну function SelM(Self: sequence of T; transform: T->sequence of T1): sequence of T1; extensionmethod := Self.SelectMany(transform); /// Преобразует последовательность, используя функцию transform function Sel(Self: sequence of T; transform: T->T1): sequence of T1; extensionmethod := Self.Select(transform); /// Преобразует последовательность, используя функцию transform с индексом function Sel(Self: sequence of T; transform: (T,int)->T1): sequence of T1; extensionmethod := Self.Select(transform); /// Создаёт словарь в ссответствии с заданными функциями проекции на ключ и значение function ToD(Self: sequence of T; keySelector: T->TKey; valueSelector: T->TValue): Dictionary; extensionmethod := Self.ToDictionary(keySelector,valueSelector); /// Создаёт словарь в ссответствии с заданной функцией проекции на ключ function ToD(Self: sequence of T; keySelector: T->TKey): Dictionary; extensionmethod := Self.ToDictionary(keySelector); /// Применяет к каждому элементы последовательности агрегатную функцию. Последнее значение агрегатной функции является результатом function Agr(Self: sequence of T; seed: TAcc; func: (TAcc,T)->TAcc): TAcc; extensionmethod := Self.Aggregate(seed,func); /// Фильтрует последовательность по условию cond function Wh(Self: sequence of T; cond: T->boolean): sequence of T; extensionmethod := Self.Where(cond); /// Фильтрует последовательность по условию cond с индексом function Wh(Self: sequence of T; cond: (T,integer)->boolean); extensionmethod := Self.Where(cond); /// Группирует элементы последовательности в соответствии с заданной функцией проекции на ключ группы function GrBy(Self: sequence of T; selector: T->TKey): sequence of System.Linq.IGrouping; extensionmethod := Self.GroupBy(selector); /// Преобразует последовательность в массив function ToA(Self: sequence of T): array of T; extensionmethod := Self.ToArray; /// Преобразует последовательность в список function ToL(Self: sequence of T): List; extensionmethod := Self.ToList; /// Преобразует последовательность в HashSet function ToHS(Self: sequence of T): HashSet; extensionmethod := Self.ToHashSet; /// Преобразует последовательность в SortedSet function ToSS(Self: sequence of T): SortedSet; extensionmethod := Self.ToSortedSet; /// Инвертирует последовательность procedure Rev(a: array of T) := Reverse(a); /// Возвращает индекс минимального элемента function IMin(Self: array of T): integer; extensionmethod; where T: IComparable; begin Result := Self.IndexMin; end; /// Возвращает индекс максимального элемента function IMax(Self: array of T): integer; extensionmethod; where T: IComparable; begin Result := Self.IndexMax; end; /// Возвращает True если массивы равны function Eq(Self,b: array of T): boolean; extensionmethod := Self.ArrEqual(b); /// Возвращает в виде массива все элементы, удовлетворяющие cond function Filt(Self: array of T; cond: T->boolean): array of T; extensionmethod := Self.FindAll(cond); /// Возвращает массив с элементами, преобразованными по правилу transform function Tr(Self: array of T; transform: T->T): array of T; extensionmethod := Self.ConvertAll(transform); /// Преобразует массив по правилу transform procedure Tr(a: array of T; transform: T->T) := a.Transform(transform); /// Возвращает индекс последнего элемента массива function H(Self: array of T): integer; extensionmethod := Self.High; /// Возвращает все перестановки множества элементов, заданного массивом function Prm(Self: array of T): sequence of array of T; extensionmethod := Self.Permutations; /// Возвращает все перестановки множества элементов, заданного массивом function Prm(Self: sequence of T): sequence of array of T; extensionmethod := Self.Permutations; /// Возвращает все частичные перестановки из n элементов по m function Prm(Self: array of T; m: integer): sequence of array of T; extensionmethod := Self.Permutations(m); /// Возвращает все частичные перестановки из n элементов по m function Prm(Self: sequence of T; m: integer): sequence of array of T; extensionmethod := Self.Permutations(m); /// Возвращает n-тую декартову степень множества элементов, заданного массивом function Cart(Self: array of T; n: integer): sequence of array of T; extensionmethod := Self.Cartesian(n); /// Возвращает n-тую декартову степень множества элементов, заданного массивом function Cart(Self: sequence of T; n: integer): sequence of array of T; extensionmethod := Self.Cartesian(n); /// Возвращает n-тую декартову степень множества символов, заданного строкой function Cart(Self: string; n: integer): sequence of string; extensionmethod := Self.CartesianPower(n); /// Возвращает декартово произведение последовательностей в виде последовательности пар function Cart(Self: sequence of T; b: sequence of T1): sequence of (T, T1); extensionmethod := Self.Cartesian(b); /// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение function Cart(Self: sequence of T; b: sequence of T1; func: (T,T1)->T2): sequence of T2; extensionmethod := Self.Cartesian(b,func); /// Возвращает исходную последовательность или одноэлементную последовательность если исходная последовательность пуста function DefIfE(Self: sequence of T; def: T): sequence of T; extensionmethod := Self.DefaultIfEmpty(def); /// Возвращает все сочетания по m элементов function Cmb(Self: array of T; m: integer): sequence of array of T; extensionmethod := Self.Combinations(m); /// Возвращает все сочетания по m элементов function Cmb(Self: sequence of T; m: integer): sequence of array of T; extensionmethod := Self.Combinations(m); /// Выводит кортеж function Pr(Self: (T1,T2)): (T1,T2); extensionmethod; begin Result := Self; Self.Print; end; /// Выводит кортеж function Pr(Self: (T1,T2,T3)): (T1,T2,T3); extensionmethod; begin Result := Self; Self.Print; end; /// Выводит кортеж function Pr(Self: (T1,T2,T3,T4)): (T1,T2,T3,T4); extensionmethod; begin Result := Self; Self.Print; end; /// Выводит кортеж function Pr(Self: (T1,T2,T3,T4,T5)): (T1,T2,T3,T4,T5); extensionmethod; begin Result := Self; Self.Print; end; /// Выводит кортеж function Prln(Self: (T1,T2)): (T1,T2); extensionmethod; begin Result := Self; Self.Println; end; /// Выводит кортеж function Prln(Self: (T1,T2,T3)): (T1,T2,T3); extensionmethod; begin Result := Self; Self.Println; end; /// Выводит кортеж function Prln(Self: (T1,T2,T3,T4)): (T1,T2,T3,T4); extensionmethod; begin Result := Self; Self.Println; end; /// Выводит кортеж function Prln(Self: (T1,T2,T3,T4,T5)): (T1,T2,T3,T4,T5); extensionmethod; begin Result := Self; Self.Println; end; /// Возвращает минимальный элемент кортежа function Min(Self: (T,T)): T; extensionmethod; where T: IComparable; begin Result := Min(Self[0],Self[1]); end; /// Возвращает максимальный элемент кортежа function Max(Self: (T,T)): T; extensionmethod; where T: IComparable; begin Result := Max(Self[0],Self[1]); end; /// Возвращает минимальный элемент кортежа function Min(Self: (T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Min(Self[0],Self[1],Self[2]); end; /// Возвращает максимальный элемент кортежа function Max(Self: (T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Max(Self[0],Self[1],Self[2]); end; /// Возвращает минимальный элемент кортежа function Min(Self: (T,T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Min(Self[0],Self[1],Self[2],Self[3]); end; /// Возвращает максимальный элемент кортежа function Max(Self: (T,T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Max(Self[0],Self[1],Self[2],Self[3]); end; /// Возвращает минимальный элемент кортежа function Min(Self: (T,T,T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Min(Self[0],Self[1],Self[2],Self[3],Self[4]); end; /// Возвращает максимальный элемент кортежа function Max(Self: (T,T,T,T,T)): T; extensionmethod; where T: IComparable; begin Result := Max(Self[0],Self[1],Self[2],Self[3],Self[4]); end; ///-- procedure __InitModule__; begin end; ///-- procedure __FinalizeModule__; begin end; end.