Рисование по клеткам в модуле Coords
Модуль Coords можно использовать по-разному, в том числе для рисования на нем как в тетради в клетку.
Особенность здесь в том, что мышью мы рисуем точки в целочисленных координатах.
Конечно, модуль Coords не предназначен для такой задачи - внутренности в виде объекта fso не очень хорошо смотрятся. Но как прототип - вполне компактная программа.
Модуль Coords можно использовать по-разному, в том числе для рисования на нем как в тетради в клетку.
Особенность здесь в том, что мышью мы рисуем точки в целочисленных координатах.
Конечно, модуль Coords не предназначен для такой задачи - внутренности в виде объекта fso не очень хорошо смотрятся. Но как прототип - вполне компактная программа.
uses Coords,GraphWPF;
var (prevx, prevy) := (-1.0,-1.0);
begin
Scale := 49;
Origin := (7,5);
OnMouseDown := (x,y,mb) -> begin
if mb = 2 then
begin
(prevx, prevy) := (-1.0,-1.0);
exit;
end;
var p := fso.ScreenToReal(Pnt(x,y));
var xx := Round(p.X);
var yy := Round(p.Y);
Coords.DrawCircle(xx,yy,0.05);
if (prevx, prevy) <> (-1.0,-1.0) then
DrawLine(prevx, prevy, xx, yy);
(prevx, prevy) := (xx,yy);
end;
end.
❤4✍2
Замечательные Кубики для всех
Замечательная, потрясающая, многогранная головоломка Кубики для всех, описанная в книге Мартина Гарднера "Математические головоломки и развлечения".
Мы реализовали ее с помощью модуля Graph3D. Теперь вы можете собирать фигуры в интерактивном 3D-режиме
Изящно сделаны вращения - с помощью алгоритмической анимации
Весь код - порядка 350 строк, в комментарии
Замечательная, потрясающая, многогранная головоломка Кубики для всех, описанная в книге Мартина Гарднера "Математические головоломки и развлечения".
Мы реализовали ее с помощью модуля Graph3D. Теперь вы можете собирать фигуры в интерактивном 3D-режиме
Изящно сделаны вращения - с помощью алгоритмической анимации
Весь код - порядка 350 строк, в комментарии
🔥8👍2🥰2
Инициализация массива пустой коллекцией
В версии 3.10.3.3635 от 12.06.25 уточнен механизм инициализации пустой коллекцией.
Теперь пустую коллекцию можно использовать в качестве первого элемента массива.
#новое
В версии 3.10.3.3635 от 12.06.25 уточнен механизм инициализации пустой коллекцией.
Теперь пустую коллекцию можно использовать в качестве первого элемента массива.
#новое
// Уточнение инициализации элемента массива пустой коллекцией
begin
var a: array of array of integer := [[],[],[1]];
Println(a,TypeName(a));
var b := [[],[1],[]];
Println(b,TypeName(b));
var aa: array of array of array of integer := [[[],[2]],[]];
Print(aa,TypeName(aa));
end.
👍2✍1
Обход ориентированного графа в глубину
Пусть граф задан списками смежности:
0 → 1, 2
1 → 3
2 → 1, 4
3 → 5
4 → 6
5 → 4, 7
6 →
7 →
Данный рекурсивный алгоритм демонстрирует, в какие вершины можно попасть, начав с некоторой вершины x и перемещаясь только по ребрам графа.
Такой способ посещения вершин называется обходом в глубину (DFS).
#алгоритмы
Пусть граф задан списками смежности:
0 → 1, 2
1 → 3
2 → 1, 4
3 → 5
4 → 6
5 → 4, 7
6 →
7 →
Данный рекурсивный алгоритм демонстрирует, в какие вершины можно попасть, начав с некоторой вершины x и перемещаясь только по ребрам графа.
Такой способ посещения вершин называется обходом в глубину (DFS).
// Обход ориентированного графа в глубину
procedure TraverseDepth(gr: array of array of integer; p: array of boolean; x: integer);
begin
Print(x);
p[x] := True;
foreach var y in gr[x] do
if not p[y] then
TraverseDepth(gr,p,y);
end;
begin
var gr := [[1, 2], [3], [1, 4], [5], [6], [4, 7], [], []];
var p := [False] * gr.Count;
TraverseDepth(gr,p,0);
end.
#алгоритмы
👍7❤1
Парсер выражений с построением AST - дерева
Ниже представлен парсер выражений с предварительным построением AST-дерева - на 127 строк.
Интерфейсы, автоклассы, короткие функции - всё как мы любим.
https://rosettacode.org/wiki/Arithmetic_evaluation#PascalABC.NET
Тут много реализаций на разных языках, НО! Не стоит нас учить, как писать парсеры :)
А мы в Rosetta Code на 57 месте с 609 решениями. Еще немного - и обойдем Swift.
Ниже представлен парсер выражений с предварительным построением AST-дерева - на 127 строк.
Интерфейсы, автоклассы, короткие функции - всё как мы любим.
https://rosettacode.org/wiki/Arithmetic_evaluation#PascalABC.NET
Тут много реализаций на разных языках, НО! Не стоит нас учить, как писать парсеры :)
А мы в Rosetta Code на 57 месте с 609 решениями. Еще немного - и обойдем Swift.
👍4
Интеграция SPython и PascalABC.NET в лице GraphWPF
Скоро сказка сказывается, да не скоро дело делается.
Вот и в SPython наконец-то завезли модуль GraphWPF - подключаем, пользуемся, радуемся синтаксису Питона без этих ваших begin-end и точек с запятой, зато с проверкой ошибок на этапе компиляции
#SPython
Скоро сказка сказывается, да не скоро дело делается.
Вот и в SPython наконец-то завезли модуль GraphWPF - подключаем, пользуемся, радуемся синтаксису Питона без этих ваших begin-end и точек с запятой, зато с проверкой ошибок на этапе компиляции
#SPython
🔥9👍4❤1
SPython - map, filter, sorted
Стандартные функции Питона реализованы в SPython на PascalABC.NET.
Тем, кому нравится писать вложенные вызовы функций, а также всем настоящим питонистам этот код - золото!
А мы имеем в сухом остатке обязательные аннотации типов, что приучает к строгости, контроль ошибок на этапе компиляции и скорость выполнения как в C#.
Здравствуй, дивный новый старый мир!
#SPython
Стандартные функции Питона реализованы в SPython на PascalABC.NET.
Тем, кому нравится писать вложенные вызовы функций, а также всем настоящим питонистам этот код - золото!
А мы имеем в сухом остатке обязательные аннотации типов, что приучает к строгости, контроль ошибок на этапе компиляции и скорость выполнения как в C#.
Здравствуй, дивный новый старый мир!
#SPython
👍12❤1
Новый метод
Теперь в PascalABC.NET появился метод
В отличие от обычного
Пример
📌 В этом примере элементы разбиваются на группы подряд идущих одинаковых действий (
Полезно, если нужно анализировать поведение пользователей, логи или последовательности событий.
#новое
AdjacentGroupBy
для последовательностейТеперь в PascalABC.NET появился метод
AdjacentGroupBy
, который группирует подряд идущие элементы последовательности по ключу (автор - Сергей Латченко). В отличие от обычного
GroupBy
, который собирает все элементы с одинаковым ключом, AdjacentGroupBy
сохраняет порядок и делит на группы при смене значения.Пример
type
ActionData = auto class
Action: string;
Page: string
end;
begin
var actions := [
new ActionData('Клик', 'Главная'),
new ActionData('Клик', 'Каталог'),
new ActionData('Клик', 'Корзина'),
new ActionData('Прокрутка', 'Каталог'),
new ActionData('Прокрутка', 'Оформление заказа'),
new ActionData('Клик', 'Оформление заказа')
];
foreach var g in actions.AdjacentGroupBy(x -> x.Action) do
begin
Println($'Действие = {g.Key}');
g.PrintLines(a -> ' ' + a.Page);
end;
end.
📌 В этом примере элементы разбиваются на группы подряд идущих одинаковых действий (
'Клик'
, 'Прокрутка'
, 'Клик'
).Полезно, если нужно анализировать поведение пользователей, логи или последовательности событий.
#новое
❤5
Почему PascalABC.NET лучше C#
Заголовок конечно провокационный. Но действительно - C# при всех огромных ресурсах на его разработку содержит дыры в безопасности.
В теории типов хорошо известен факт: если тип String является подтипом object, то тип "массив string" не должен быть подтипом "массив object"
Язык C# это нарушает. Проблема, которая при этом возникает - на скрине. Программа падает в невинном коде неожиданно в рантайме.
PascalABC.NET отслеживает эту хорошо известную ошибку на этапе компиляции.
#типы
Заголовок конечно провокационный. Но действительно - C# при всех огромных ресурсах на его разработку содержит дыры в безопасности.
В теории типов хорошо известен факт: если тип String является подтипом object, то тип "массив string" не должен быть подтипом "массив object"
Язык C# это нарушает. Проблема, которая при этом возникает - на скрине. Программа падает в невинном коде неожиданно в рантайме.
PascalABC.NET отслеживает эту хорошо известную ошибку на этапе компиляции.
#типы
❤12👍3
Русские исполнители
В PascalABC.NET в примерах используется модуль Исполнители, который позволяет младшим школьникам лучше воспринимать код с объектами, методами и лямбдами.
По-существу, Исполнитель - это объект класса с русскими методами, максимально изолированный от английского интерфейса.
Ключевые слова при этом остаются английскими, что выделяет конструкции PascalABC.NET.
В PascalABC.NET в примерах используется модуль Исполнители, который позволяет младшим школьникам лучше воспринимать код с объектами, методами и лямбдами.
По-существу, Исполнитель - это объект класса с русскими методами, максимально изолированный от английского интерфейса.
Ключевые слова при этом остаются английскими, что выделяет конструкции PascalABC.NET.
👍6❤1
Что может PascalABC.NET и не может Python
Попробуйте возвести 2 в степень 100000. В PascalABC.NET - легко! А Python падает )
Попробуйте возвести 2 в степень 100000. В PascalABC.NET - легко! А Python падает )
👏11🔥2❤1🤔1🤡1
Рисуем изображения из набора MNIST для распознавания рукописных цифр
Перед вами - небольшая программа для рисования цифр из набора MNIST. Каждая цифра представлена монохромным изображением размера 28 на 28 пикселей.
Размер каждого пиксела при рисовании равен w.
Программа:
Перед вами - небольшая программа для рисования цифр из набора MNIST. Каждая цифра представлена монохромным изображением размера 28 на 28 пикселей.
Размер каждого пиксела при рисовании равен w.
Программа:
uses GraphWPF;
function Reshape(data: array of integer; w,h: integer): array [,] of integer;
begin
if data.Length <> w * h then
raise new Exception('Несоответствие размерности при Reshape()');
Result := MatrByCol(data.Batch(w))
end;
procedure DrawPixels(pixels: array [,] of integer; x: real := 0; y: real := 0; width: real := 10)
:= FastDraw(dc -> begin
for var ix := 0 to pixels.RowCount-1 do
for var iy := 0 to pixels.ColCount-1 do
DrawRectangleDC(dc,x + ix * width, y + iy * width, width, width, GrayColor(pixels[ix,iy]),Colors.Transparent,1);
end);
begin
var sz_img := 28;
var strs: array of string := ReadLines('mnist_test.csv').Skip(1).ToArray;
var data: array of array of integer := strs.Select(s -> s.ToWords(',').Skip(1).Select(x -> x.ToInteger).ToArray).ToArray;
var digits := data.Select(arr -> Reshape(arr,sz_img,sz_img)).ToArray;
var w := 2;
var digits_in_col := 15;
var digits_in_row := 11;
for var iy:=0 to digits_in_row-1 do
for var ix:=0 to digits_in_col-1 do
DrawPixels(digits[iy * digits_in_col + ix],ix*w*sz_img,iy*w*sz_img,w);
end.
🤯7❤1
Использование сериалазации Json с помощью Newtonsoft.Json
Создаем проект, устанавливаем Newtonsoft.Json в качестве NuGet-пакета.
И пишем вот такую программу. Здесь сериализуется в строку в формате json словарь из целых в массивы целых.
Затем происходит десериализация, проверка типа и вывод содержимого в неизменном виде.
Код:
#json #nuget
Создаем проект, устанавливаем Newtonsoft.Json в качестве NuGet-пакета.
И пишем вот такую программу. Здесь сериализуется в строку в формате json словарь из целых в массивы целых.
Затем происходит десериализация, проверка типа и вывод содержимого в неизменном виде.
Код:
uses Newtonsoft.Json;
begin
var d0 := Dict (1 to [2,3,4],
3 to [4,5,6]
);
var json := JsonConvert.SerializeObject(d0);
Println(json);
var obj := JsonConvert.DeserializeObject&<Dictionary<integer,array of integer>>(json);
Println(TypeName(obj));
var d := obj as Dictionary<integer,array of integer>;
foreach var (k,v) in d do
Println(k,v);
end.
#json #nuget
✍6❤2🔥1
Обращаемся к LLM из PascalABC.NET
Чтобы сделать запрос к большой языковой модели из PascalABC.NET, воспользуемся сервисом openrouter.ai.
За одну минуту получим там API Token, который будет использован в нашей программе в переменной KEY.
Для работы с JSON создадим проект и двумя нажатиями подключим к нему NuGet-пакет NewtonSoft.Json.
Отправим запрос с вопросом о смысле жизни к одной из самых лучших моделей - deepseek-r1 free с ризонингом (то есть со способностью рассуждать).
И через несколько секунд получим ответ - тоже в виде json, который выведем в отформатированном виде, используя сериализацию с форматированием.
Попутно в пришедшем json мы видим сам reasoning - рассуждение модели, как отвечать на наш вопрос.
Итак, в чем смысл жизни? Ответ LLM вы видите:
Как писал Виктор Франкл, "Жизнь требует от человека не вопросов, а ответов - через дела и любовь". Так что, возможно, смысл жизни в пути: в том, чтобы задаваться вопросами, искать, расти и находить своё собственное предназначение. 🌱✨
#PascalABCNET #LLM #любовь #предназначение
Чтобы сделать запрос к большой языковой модели из PascalABC.NET, воспользуемся сервисом openrouter.ai.
За одну минуту получим там API Token, который будет использован в нашей программе в переменной KEY.
Для работы с JSON создадим проект и двумя нажатиями подключим к нему NuGet-пакет NewtonSoft.Json.
Отправим запрос с вопросом о смысле жизни к одной из самых лучших моделей - deepseek-r1 free с ризонингом (то есть со способностью рассуждать).
И через несколько секунд получим ответ - тоже в виде json, который выведем в отформатированном виде, используя сериализацию с форматированием.
Попутно в пришедшем json мы видим сам reasoning - рассуждение модели, как отвечать на наш вопрос.
Итак, в чем смысл жизни? Ответ LLM вы видите:
Как писал Виктор Франкл, "Жизнь требует от человека не вопросов, а ответов - через дела и любовь". Так что, возможно, смысл жизни в пути: в том, чтобы задаваться вопросами, искать, расти и находить своё собственное предназначение. 🌱✨
#PascalABCNET #LLM #любовь #предназначение
👍9🔥6
🎨 Ray Tracing на PascalABC.NET: Красота физики в 300 строках!
В этой демо-сцене PascalABC.NET собраны все классические и современные технологии трассировки лучей. Это не просто картинка, а настоящий учебник компьютерной графики в коде.
Код программы
Что здесь под капотом? 👇
💡 Физика света:
✔️ Закон Снеллиуса (рефракция стекла, кристаллов)
✔️ Рекурсивное отражение и преломление
✔️ Модель освещения Фонга (диффузия + спекулярность)
✔️ Тени от точечных источников
✔️ Градиентное небо
🎨 Рендеринг и материалы:
✔️ Антиалиасинг (3x3 суперсэмплинг)
✔️ Субпиксельные смещения
✔️ Цветное освещение (каждый источник — свой цвет)
✔️ Эмиссивные материалы (свечение объектов)
✔️ Матовые поверхности
✔️ Металлы (золото, зеркала)
✔️ Диэлектрики (стекло, кристаллы)
✔️ Градиентная эмиссия (сильнее в центре)
✔️ Falloff эффекты свечения
✔️ Тон-маппинг (улучшенная обработка ярких цветов)
✔️ Затухание света с расстоянием
✔️ Улучшенное смешивание цветов от разных источников
⚙️ Технологии:
✔️ Параллельные вычисления (OpenMP)
✔️ Оптимизация производительности
✔️ Перегрузка операций в классах
💡 Почему PascalABC.NET?
📍 Быстро, наглядно, красиво.
📍 Читаемый код.
📍 Всё работает прямо в IDE.
📍 Идеально для изучения физики света, трассировки лучей, алгоритмов визуализации.
🎥 Сцена рендерится за секунды.
👨💻 Всего ~300 строк кода.
✨ PascalABC.NET легко учит сложным вещам!
В этой демо-сцене PascalABC.NET собраны все классические и современные технологии трассировки лучей. Это не просто картинка, а настоящий учебник компьютерной графики в коде.
Код программы
Что здесь под капотом? 👇
💡 Физика света:
✔️ Закон Снеллиуса (рефракция стекла, кристаллов)
✔️ Рекурсивное отражение и преломление
✔️ Модель освещения Фонга (диффузия + спекулярность)
✔️ Тени от точечных источников
✔️ Градиентное небо
🎨 Рендеринг и материалы:
✔️ Антиалиасинг (3x3 суперсэмплинг)
✔️ Субпиксельные смещения
✔️ Цветное освещение (каждый источник — свой цвет)
✔️ Эмиссивные материалы (свечение объектов)
✔️ Матовые поверхности
✔️ Металлы (золото, зеркала)
✔️ Диэлектрики (стекло, кристаллы)
✔️ Градиентная эмиссия (сильнее в центре)
✔️ Falloff эффекты свечения
✔️ Тон-маппинг (улучшенная обработка ярких цветов)
✔️ Затухание света с расстоянием
✔️ Улучшенное смешивание цветов от разных источников
⚙️ Технологии:
✔️ Параллельные вычисления (OpenMP)
✔️ Оптимизация производительности
✔️ Перегрузка операций в классах
💡 Почему PascalABC.NET?
📍 Быстро, наглядно, красиво.
📍 Читаемый код.
📍 Всё работает прямо в IDE.
📍 Идеально для изучения физики света, трассировки лучей, алгоритмов визуализации.
🎥 Сцена рендерится за секунды.
👨💻 Всего ~300 строк кода.
✨ PascalABC.NET легко учит сложным вещам!
👍10🔥6❤1
Rosetta Code - Abbreviations, easy
Решение еще одной задачи из Rosetta Code
https://rosettacode.org/wiki/Abbreviations,_easy#PascalABC.NET
Здесь - использование многострочных строк, создание словаря с помощью Each, использование FirstOrDefault, а также операций ?. и ??
А PascalABC.NET - на 57 месте в рейтинге с 616 решениями!
Решение еще одной задачи из Rosetta Code
https://rosettacode.org/wiki/Abbreviations,_easy#PascalABC.NET
Здесь - использование многострочных строк, создание словаря с помощью Each, использование FirstOrDefault, а также операций ?. и ??
А PascalABC.NET - на 57 месте в рейтинге с 616 решениями!
👍5
Rosetta Code - Abbreviations, simple
Продолжаем решать задачи из Rosetta Code.
На этот раз подключаем ИИ DeepSeek
https://rosettacode.org/wiki/Abbreviations,_simple#PascalABC.NET
ИИ некоторые вещи не знает - приходится ему рассказывать, что есть
и прочие плюшки.
В целом - слушается :) И генерирует работоспособный алгоритм
Продолжаем решать задачи из Rosetta Code.
На этот раз подключаем ИИ DeepSeek
https://rosettacode.org/wiki/Abbreviations,_simple#PascalABC.NET
ИИ некоторые вещи не знает - приходится ему рассказывать, что есть
{$zerobasedstrings on}
Dict('' to '')
и прочие плюшки.
В целом - слушается :) И генерирует работоспособный алгоритм
❤6
🚀 Метод Each в PascalABC.NET: создание словарей из последовательностей
В PascalABC.NET метод
Пример группировки слов по длине из строки:
Здесь:
ключ — длина слова
значение — последовательность слов с этой длиной
В PascalABC.NET метод
Each
позволяет быстро преобразовать последовательность в словарь, где ключами являются элементы исходной последовательности, а значениями — результат применения функции к каждому ключу. Это удобно для создания ассоциативных структур без лишнего кода.Пример группировки слов по длине из строки:
var text := 'Do not count your chickens before they hatch';
var words := text.ToWords;
var dict := words.Select(w -> w.Length)
.Distinct
.Order
.Each(len -> words.Where(w -> w.Length = len));
dict.PrintLines;
Здесь:
ключ — длина слова
значение — последовательность слов с этой длиной
❤3✍2
Модуль Graph3D - дым из труб
В Graph3D появилась возможность создавать анимацию типа "дым из труб" с помощью нового 3D-объекта ParticleSystem.
В Graph3D появилась возможность создавать анимацию типа "дым из труб" с помощью нового 3D-объекта ParticleSystem.
uses Graph3D;
begin
View3D.BackgroundColor := Colors.Black;
Cylinder(0,0,0,2,0.5);
var ps := ParticleSystem(0,0,0,'smoke.png');
// ps.TextureName := 'smoke.png';
ps.LifeTime := 5;
ps.FadeOutTime := 0;
ps.VelocityDamping := 0.999;
ps.AngularVelocity := 10;
ps.SizeRate := 1;
ps.AccelerationDirection := V3D(3,0,-1);
ps.Acceleration := 4;
ps.AccelerationSpreading := 10;
ps.EmitRate := 100;
ps.StartRadius := 0;
ps.StartSize := 0.5;
ps.StartDirection := V3D(0,0,1);
ps.StartSpreading := 10;
ps.StartVelocity := 4;
ps.StartVelocityRandomness := 2;
ps.Position := P3D(0, 0, 0);
end.
👍6🔥6❤1