Редактировать

Изменение внутренней реализации 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 в большинстве случаев