PascalABC.NET официальный канал
前往频道在 Telegram
1 859
订阅者
-124 小时
-117 天
-2630 天
帖子存档
Очередная статья на Хабре - Нужна ли айтишнику вышка
Отвлечемся от программирования, языковых конструкций, вопросов ЕГЭ и проч.
На самом известном ИТ-ресурсе России - очередная статья "Нужна ли айтишнику вышка?". С кучей комментариев и высоким рейтингом автора.
https://habr.com/ru/articles/813611/
И на всякий случай - днем позже - повинуясь инстинкту - другая: "Вышка не нужна. В чём причина?"
https://habr.com/ru/articles/813743/
С разницей в один день. Вчера и позавчера.
Что движет этими людьми? Почему они конденсируются вокруг самого популярного ИТ-ресурса в России? Связано ли это с высокими зарплатами в области ИТ?
Или с чем вообще?
Задачи на олимпиадном сайте acmp.ru
Сайт олимпиадного программирования https://acmp.ru/ содержит огромное количество олимпиадных задач разного уровня.
Он интересен тем, что для каждой задачи лучшие попытки определяет по длине кода. И нетрудно видеть, что во многих задачах PascalABC.NET - первый.
На скриншоте - лучшие попытки по задаче 19 "Ферзь, ладья и конь".
Как видим, большинство решений на Python, но решение на PascalABC.NET - на первом месте.
Засилье Питона объясняется его популярностью. Напомним, одним из главных аргументов его использования является понятный и компактный код.
На PascalABC.NET код многих задач не менее компактен. Просто не все умеют его готовить. Но есть куда стремиться!
Задачи на массивы - прагматичный подход
В данном тексте без воды описывается, какие средства надо применять при решении простейших задач на массивы
https://teletype.in/@pascalabcnet/ArrPragmatic
#начинающим
Повороты 3D объектов вокруг локальных и глобальных осей
В данном примере показано, как повернуть объект дважды вокруг разных осей. Сложность заключается в том, что Rotate осуществляет поворот вокруг локальной оси объекта, поэтому следующий поворот лучше делать вокруг глобальной оси OZ, используя RotateAtAbsolute.
Ось, вокруг которой выполняется второй поворот, показана трёхмерным вектором.
#графика
Строим замок или 3D-графика для школьников
Как научить школьников 3D-графике и анимации? Используем модуль Graph3D в PascalABC.NET.
uses Graph3D;
begin
Camera.LookDirection := V3D(-2,-18,-21);
var b := Box(5.5,-4.5,2,1,1,4,Colors.Orange);
b.AddChild(Cylinder(0,0,2,1,0.4,Colors.Red));
b.AddChild(Cone(0,0,3,1.5,0.4,Colors.Gold));
var Wall := Group(b);
for var i:=1 to 11 do
Wall.AddChild(b.Clone.MoveByX(-i));
var Castle := Group(Wall);
for var i:=1 to 3 do
Castle.AddChild(Wall.Clone.RotateAt(OrtZ,90*i,Origin));
View3D.HideAll;
Castle.AnimRotate(OrtZ,180,5).AutoReverse.Forever.Begin;
end.
Всего 15 строк кода - и замок готов. Здесь - перспективная проекция, 3D-примитивы Бокс, Цилиндр и Конус, дочерние элементы, группировка и клонирование, трёхмерные векторы и орты осей, перемещения на вектор и вращения вокруг осей, камера и направление взгляда, а также алгоритмическая анимация и её модификаторы AutoReverse и Forever.Функция TypeName
Стандартная функция
TypeName выводит тип любого выражения в программе на PascalABC.NET. При этом в отличие от метода .GetType используются обозначения типов PascalABC.NET. В частности, для типа последовательности возвращается sequence of.Параллельное выполнение задач
С помощью класса Task можно запустить несколько задач одновременно. Выражение t1.Result+t2.Result+t3.Result будет вычислено только тогда когда все задачи завершатся.
На скриншоте хорошо видно, что ускорение по сравнению с последовательным выполнением - в три раза, что означает, что каждая задача выполняется примерно за одно и то же время.
#параллельность
Алгоритм генерации случайного лабиринта
В стандартные примеры PascalABC.NET входит программа MazeGen.pas генерации случайного лабиринта.
Алгоритм там неоптимальный, лабиринт получается разреженный.
В комментариях ждем идеи хороших алгоритмов или ссылки на них
Метод расширения OfType
С помощью метода расширения OfType в последовательности разнотипных элементов можно отфильтровать элементы только заданного типа, после чего применить к ним специфическую операцию.
PascalABC.NET в английской Википедии
PascalABC.NET представлен в английской Википедии
https://en.wikipedia.org/wiki/PascalABC.NET
Весьма обстоятельная статья с современными примерами, хорошими ссылками на литературные источники, среди которых - книга Александра Осипова "Введение в современное программирование", несколько педагогических статей Дженджера В.О. и др. в научных журналах, несколько научных статей в журналах вычислительной математики, а также несколько качественных ссылок на YouTube-ролики.
Ускорение вычислений за счет правильного размещения в памяти
Перед нами - три эквивалентных алгоритма умножения матриц. Во втором и третьем случае матрица b транспонируется, в результате данные в самом внутреннем цикле располагаются непрерывно в памяти, что ускоряет вычисления за счет того что рядом стоящие данные попадают в кеш процессора.
Третий пример использует массивы массивов, которые оказываются здесь эффективнее матриц.
Результаты для случайной матрицы размера n = 1000:
алгоритм 1 - 2.7 с алгоритм 2 - 1.6 с алгоритм 3 - 0.9 с
Анимация на основе кадра
Именно анимация на основе кадра - лежит в основе игровых движков. Вначале кадр формируется и затем он перерисовывается. Перерисовку имеет смысл проводить с частотой обновления экрана - на обычных мониторах это 60 Гц.
В GraphWPF имеется соответствующее событие onDrawFrame, которое вызывается всякий раз когда пришла пора перерисовать экран.
Параметр dt здесь - время с момента предыдущей перерисовки. Это позволяет задавать перемещение объектов в физических терминах.
На скриншоте - программа движения двух кругов со скоростями 300 и 200 пикселей в секунду. Перерисовка - плавная - без мерцаний и подёргиваний.
# графика
# анимация
Сравнение скорости программ с Where + Select и циклами
Программа, использующая наиболее частые методы Where и Select работает примерно в 2 раза медленнее такой же программы, использующей циклы. Но она короче, понятнее и модифицируемее.
#производительность
Repost from PascalABC.NET официальный канал
Сортировка деревом
На скрине вы видите одну из самых быстрых сортировок - сортировку с помощью бинарного дерева поиска. Её асимптотическая сложность в среднем - O(n log(n)) - такая же как и у быстрой сортировки Хоара.
Просто добавляем элементы в дерево: если элемент меньше корня, то добавляем в левое поддерево, если больше значения в корне - добавляем в правое поддерево.
И потом печатаем дерево - элементы в нем уже отсортированы.
Repost from PascalABC.NET официальный канал
Сортировка деревом
На скрине вы видите одну из самых быстрых сортировок - сортировку с помощью бинарного дерева поиска. Её асимптотическая сложность в среднем - O(n log(n)) - такая же как и у быстрой сортировки Хоара.
Просто добавляем элементы в дерево: если элемент меньше корня, то добавляем в левое поддерево, если больше значения в корне - добавляем в правое поддерево.
И потом печатаем дерево - элементы в нем уже отсортированы.
Исключение StackOverflow
При рекурсивном зацикливании стек быстро переполняется, и мы получаем исключение StackOverflow, которое невозможно обработать.
Память под стек выделяется в момент запуска программы и не может быть изменена.
Как следует из эксперимента, в простом рекурсивном вызове с одним параметром достаточно всего лишь 16000 рекурсивных вызовов - и стек переполнится. Поэтому в рекурсивных алгоритмах следует отдавать предпочтение с малой глубиной рекурсии.
#рекурсия
CreateVisual и DrawOnVisual - способ нарисовать объект и потом перерисовать его, заменив на другое графическое представление. Не надо объект стирать, поскольку в WPF - нарисованные объекты - это не пиксели на экране, а именно объекты
#графика
WPFObjects - создание заготовки игры
На скриншоте - заготовка игры, в которой игрок управляется клавиатурой.
Здесь используются свойства WPF-объектов Direction и Velocity. Анимация на основе кадра позволяет перерисовывать экран в нужный момент когда будет полностью прорисован предыдущий кадр. Параметр dt позволяет определить время между двумя последовательными прорисовками кадра, метод MoveTime(dt) - переместить объект на нужное расстояние при заданной скорости.
Обработчики OnReyDown и OnKeyUp позволяют эффективно начинать и заканчивать перемещение.
Repost from PascalABC.NET официальный канал
Задача о ханойских башнях
Задача о ханойских башнях - пример, показывающий мощность и краткость использования рекурсии.
Постановка задачи - на слайде. Чтобы переложить пирамиду из n дисков с 1 стержня на 3, перекладываем вначале рекурсивно пирамиду из n-1 диска с 1 стержня на 2, затем перекладываем самый большой диск с 1 на 3 и наконец перекладываем пирамиду их n-1 диска со 2 стержня на 3. Бинго!
Обожаю эту задачу! Мои коллеги из Бостона, зная это, привезли мне в подарок эту головоломку - решаю её прямо сейчас!
Пост годичной давности. Вновь у студентов рассматриваем рекурсию. Вновь беру с собой эту замечательную головоломку :)
