Изменение внутренней реализации a..b на IntRange, CharRange и т.д.
Range(a,b) - это неудачное моделирование конструкции a..b. В данной версии реализация заменена на InternalRange, который в зависимости от типов a и b возвращает IntRange, CharRange и т.д. IntRange … реализует интерфейс последовательности.
Скрытие в dll пространств имен, специфических для PascalABC.NET
В настоящее время библиотека lll.dll, генерируемая PascalABC.NET, содержит ряд пространств имен, специфичных для PascalABC.NET:
lll_implementation____
PABCSystem
PABCSystem_implementation____
PABCExtensions
PABCExtensions_implementation____
Все эти пространства имен в настоящий момент скрыты от системы Intellisense Visual Studio.
Кроме того, из dll исключена генерация пустого класса Program (использовался в предыдущих версиях, в настоящий момент - нет).
Как результат, в C# отображаются только пространство имен lll, в котором определен статический класс lll (содержащий все глобальные процедуры, функции и переменные) и другие классы, которые мы определили в интерфейсной секции dll (для dll упрощённой структуры - все)
Ускорение перенаправленного ввода
В новой версии ввод, перенаправленный из файла, работает в 3-6 раз быстрее (важно для олимпиадных задач). Это сделано за счёт ручной буферизации ввода (автоматическая в .NET не работает или работает медленно).
В частности, для сравнения приводится время работы кода в старой и новой версии. Сравнение проводилось для файла из N=20 млн целых от 1 до 99999, расположенных в одной строке, разделенных одним пробелом. Компьютер: Intel Core I7 8700 (3.7 ГГц) 16 Гб
Старая версия (a.exe < a.txt) | Старая версия с Assign(input) | Новая версия (a.exe < a.txt) | Новая версия с Assign(input) | |
---|---|---|---|---|
ReadString | 4100 мс | 2100 мс | 910 мс | 390 мс |
ReadString.ToIntegers | 6000 мс | 4200 мс | 1280 мс | 780 мс |
ReadString.ToIntegers(N) | - | - | 1200 мс | 680 мс |
loop N do ReadLexem | - | - | 1640 мс | 1520 мс |
loop N do StrToInt(ReadLexem) | - | - | 1920 мс | 1740 мс |
loop N do ReadInteger | 6500 мс | 3400 мс | 1120 мс | 560 мс |
ReadArrInteger(N) | 6500 мс | 3400 мс | 1150 мс | 580 мс |
s.JoinToString
Старое название метода последовательности s.JoinIntoString
будет заменено на s.JoinToString
s.IndicesOf
s.IndicesOf(SubS: string; overlay: boolean := False): sequence of integer
- новое расширение для строк, реализующее поиск индексов (позиций) вхождения подстроки SubS в строку s. Если задать для параметра overlay
значение True
, будут также учтены позиции перекрывающихся вхождений подстроки.
s.IndicesOf
реализует алгоритм Кнута - Моррисса - Пратта, который дает асимптотическую оценку решения O(n), в то время как примитивный поиск вхождений подстроки в строку имеет оценку O(n2). На основе полученного массива индексов можно находить первое, последнее, а также любые другие разновидности наборов вхождений. Позиции в строке s индексируются от нуля.
Для строк небольшой длины расширение s.Matches(SubS)
работает быстрее, но перекрывающиеся вхождения найти нельзя.
Методы расширения EachCount, Each
Arr(1,2,3,2,2,3,1,4).GroupBy(x->x).EachCount.Println
выводит (1,2) (2,3) (3,2) (4,1)
Each
- более общая версия, проектирует группу с данным ключом на произвольное значение:
a.GroupBy(x->x.year).Each(g->g.Select(x->x.Height).Average).Println
Чтение BigInteger: процедура Read(bi) и функция ReadBigInteger
begin
var b := ReadBigInteger;
Print(b);
end.
Автозавершение кода - правки
При включённом автозавершении кода убрано автоматическое завершение оператора присваивания точкой с запятой. Данная возможность срабатывала неправильно если выражение в операторе присваивания распространялось на несколько строк.
В ситуации
if a>b then
min := a
|
после Enter будет произведен обратный отступ с выравниванием по строке с if. То же - если предыдущая строка заканчивается на then или do
В ситуации
type A = class
|
будет произведен отступ (то же для record)
Точка с запятой перед else убирается также при нажатии Enter в конце строки с else в большинстве случаев