✍️По всем вопросам: @Andryukha
👨👩👧👦 Чат: https://t.me/za_rabotay1
🎬YouTube: https://youtube.com/@za_rabotay
Купить рекламу: https://telega.in/c/zarabotay_yt
Никого не принуждаем, все выкладывается исключительно в ознакомительных целях!
Last updated 3 months, 1 week ago
Построение графа маршрутов между городами
Дан список городов и прямых маршрутов между ними. Требуется построить граф, в котором:
✔️ Вершины — это города.
✔️ Рёбра — это прямые маршруты между городами.
🔹 Маршруты между городами:
🟢 Москва → 🔵 Череповец
🟢 Москва → 🔵 Петрозаводск
🟢 Москва → 🔵 Великий Устюг
🟢 Москва → 🔵 Екатеринбург
🟢 Москва → 🔵 Сочи
🔵 Череповец → 🟢 Москва
🔵 Череповец → 🔴 Санкт-Петербург
🔵 Петрозаводск → 🟢 Москва
🔴 Санкт-Петербург → 🔵 Череповец
🔵 Апатиты → 🟢 Москва
🔴 Санкт-Петербург → 🔵 Апатиты
🔵 Ухта → 🟢 Москва
🔵 Череповец → 🟣 Мурманск
🔵 Череповец → 🟠 Сочи
🔵 Череповец → 🟡 Екатеринбург
📌 Цель — визуализировать этот граф, расположив Москву в центре и минимизировав пересечения рёбер.
GhatGPT сгенерировал такую программу:
```
uses GraphWPF;
begin
var edges := [
'Москва' to 'Череповец',
'Москва' to 'Петрозаводск',
'Москва' to 'Великий Устюг',
'Москва' to 'Екатеринбург',
'Москва' to 'Сочи',
'Череповец' to 'Москва',
'Череповец' to 'Санкт-Петербург',
'Петрозаводск' to 'Москва',
'Санкт-Петербург' to 'Череповец',
'Апатиты' to 'Москва',
'Санкт-Петербург' to 'Апатиты',
'Ухта' to 'Москва',
'Череповец' to 'Мурманск',
'Череповец' to 'Сочи',
'Череповец' to 'Екатеринбург'
];
var positions := Dict(
'Москва' to Pnt(400, 300), // Центр
'Череповец' to Pnt(550, 250),
'Петрозаводск' to Pnt(500, 150),
'Великий Устюг' to Pnt(600, 300),
'Екатеринбург' to Pnt(700, 350),
'Сочи' to Pnt(400, 500),
'Санкт-Петербург' to Pnt(300, 150),
'Апатиты' to Pnt(200, 100),
'Ухта' to Pnt(250, 400),
'Мурманск' to Pnt(150, 200)
);
Window.Title := 'Граф маршрутов';
foreach var e in edges do
Line(positions[e.Key], positions[e.Value], Colors.Black);
foreach var p in positions do
Circle(p.Value.X, p.Value.Y, 5, Colors.Red);
foreach var p in positions do
TextOut(p.Value.X + 10, p.Value.Y, p.Key);
end.
```
Находим главных героев в тексте произведения "Война и мир"
Можно ли установить главных героев, не читая произведение "Война и мир"?
Да, надо выдать частоту встречаемости имен.
Мы видим, что наиболее часто встречаются имена собственные Андрей, Ростов, Пьер и Анна.
faststring - новый тип в PascalABC.NET 3.10.3
На самом деле faststring - это просто синоним StringBuilder с немного дополненной функциональностью (методами Replace и IndexOf и операцией in)
Однако faststring работает действительно быстро: в примере на скрине, предложенном @tpehep33, метод PascalABC.NET опережает аналогичную функцию Python, написанную на C++, в 2 раза.
```
// 6.0 sec PascalABC.NET vs 11.4 sec Python
begin
var mx := 0;
for var n := 4 to 9999 do
begin
var s: faststring := '4' + '1' * n;
while ('411' in s) or ('1111' in s) do
s.Replace('411', '14', 1)
.Replace('1111', '1', 1);
mx := max(mx, s.ToString.Sum(d \-> d.todigit));
end;
print(mx, Milliseconds / 1000);
end.
```
Алгоритм Дейкстры на Rosetta Code
Алгоритм полностью сгенерирован ChatGPT по коду на Python с минимальными правками.
https://rosettacode.org/wiki/Dijkstra%27s_algorithm#PascalABC.NET
Ну а мы в Rosetta Code уже на 67 месте с 553 задачами благодаря стараниям тайного друга. Позади Elixir, Erlang, PowerShell и Groovy.
```
type
Edge = auto class
start, &end: char;
cost: real;
end;
Graph = auto class
edges: array of Edge;
vertices: HashSet;
constructor(params edges: array of (char, char, real));
begin
Self.edges := edges.Select(e \-> new Edge(e[0], e[1], e[2])).ToArray;
Self.vertices := new HashSet<char>(
Self.edges.Select(e \-> e.start) + Self.edges.Select(e \-> e.end)
);
end;
function Dijkstra(source, dest: char): sequence of char;
begin
assert(vertices.Contains(source));
var inf := real.MaxValue;
var dist := Dict(vertices.Select(v \-> (v, inf)));
var previous := Dict(vertices.Select(v \-> (v, ' ')));
dist[source] := 0;
var q := vertices.ToHashSet;
var neighbours := Dict(vertices.Select(v \-> (v, new HashSet<(char, real)>)));
foreach var edge in edges do
begin
neighbours[edge.start].Add((edge.end, edge.cost));
neighbours[edge.end].Add((edge.start, edge.cost));
end;
while q.Count > 0 do
begin
var u := q.MinBy(v \-> dist[v]);
q.Remove(u);
if (dist[u] = inf) or (u = dest) then
break;
foreach var (v, cost) in neighbours[u] do
begin
var alt := dist[u] + cost;
if alt < dist[v] then
begin
dist[v] := alt;
previous[v] := u;
end;
end;
end;
var s := new List<char>;
var u := dest;
while previous[u] <> ' ' do
begin
s.Insert(0, u);
u := previous[u];
end;
s.Insert(0, u);
Result := s;
end;
end;
begin
var gr := new Graph(
('a', 'b', 7.0), ('a', 'c', 9.0), ('a', 'f', 14.0),
('b', 'c', 10.0), ('b', 'd', 15.0), ('c', 'd', 11.0),
('c', 'f', 2.0), ('d', 'e', 6.0), ('e', 'f', 9.0)
);
gr.Dijkstra('a', 'e').Println; // Результат: ['a', 'c', 'f', 'e']
end.
```
Перевод градусов Цельсия в градусы Фаренгейта
Перевод градусов Цельсия в градусы Фаренгейта и обратно можно выполнить с помощью operator implicit.
```
type
Farenheit = class;
Celsius = auto class
value: real;
public
constructor (v: real) := value := v;
static function operator implicit(c: Celsius): Farenheit;
function ToString: string; override
:= $'{value}°C';
end;
Farenheit = auto class
value: real;
public
constructor (v: real) := value := v;
static function operator implicit(f: Farenheit): Celsius;
function ToString: string; override
:= $'{value}°F';
end;
static function Celsius.operator implicit
(c: Celsius): Farenheit
:= new Farenheit(c.value * 9 / 5 + 32);
static function Farenheit.operator implicit
(f: Farenheit): Celsius
:= new Celsius((f.value - 32) * 5 / 9);
begin
var c := new Celsius(25);
var f: Farenheit := c; // Неявное преобразование из Цельсия в Фаренгейт
Println($'Температура: {c} = {f}');
var f2 := new Farenheit(77);
var c2: Celsius := f2; // Неявное преобразование из Фаренгейта в Цельсий
Println($'Температура: {f2} = {c2}');
end.
```
2025 год. В виде шутки
- Запретят ли Паскалев?
- Тогда у нас будет своих Питонов!
- Красивое...
Текстовые файлы в PascalABC.NET
Простая задача - добавить в конец каждой строки слово 'строка'.
Работа с файловыми переменными в PascalABC.NET - полностью объектно-ориентированная. И открывается файл - одной строкой - на чтение или за запись.
Рейтинг TIOBE 2025
Вышел рейтинг TIOBE популярности языков программирования январь 2025.
Питон объявлен языком года - он вырос почти на 10%.
Из других наблюдений. Языки из Top 12 тоже выросли. Это значит, что остальные языки уменьшились.
С++ поднялся на 2 позицию, повторив результат 2000 года.
C# и JavaScript сохраняют свои позиции как 5-го и 6-го языков.
Язык Go с 11 места переместился на 7-е.
Вновь ворвался в десятку Фортран.
И - Delphi - на 11 месте, поднявшись на 2 позиции. А всё потому что сделали for var i. Сделают лямбды как у нас - поднимутся ещё выше.
Язык Kotlin выскочил из двадцатки. А мы на него равняемся :(
Язык Rust поднялся с 19 места на 14-е.
Замыкает 20-ку COBOL, никуда не собираясь уходить.
Функции как объекты первого класса
Функции называют "объектами первого класса" (first-class objects) в языках программирования, если они обладают такими же возможностями, как и другие типы данных (например, числа, строки, массивы). Это означает, что функции можно передавать, возвращать, присваивать переменным и использовать в выражениях, как любые другие объекты.
В примере на скриншоте создается словарь, значениями которого являются лямбда-функции, которые затем вызываются по строковому ключу.
Learn PascalABC.NET in Y minutes
На вики-странице Learn PascalABC.NET in Y minutes впервые представлены все ключевые возможности PascalABC.NET, отражающие 17 лет его эволюции.
📌 Важнейшие разделы:
🔹 Структуры данных: кортежи, диапазоны, строки, массивы, списки, словари, множества, записи и классы.
🔹 Современные языковые средства: автовыведение типа, внутриблочные описания, циклы loop и foreach, цикл for с шагом, интерполяция строк, многострочные строки, параметры по умолчанию и именованные аргументы.
🔹 Современные операции: in
, срезы, индексация с конца. to
для создания пар "ключ-значение" — лаконичные инструменты для работы с данными.
🔹 Новые литеральные массивы [1,2,3]
.
🔹 Лямбда-выражения и функциональные переменные: гибкость функционального подхода.
🔹 Последовательности: мощный инструмент для работы с данными, включая LINQ.
🔹 Поддержка разных парадигм: процедурное, функциональное, обобщенное и объектно-ориентированное программирование.
🔹 Полная интеграция со стандартной библиотекой .NET.
📖 Этот документ — уникальное собрание возможностей, отражающих эволюцию и современность PascalABC.NET.
🎖 Специальная благодарность @ulysses4ever за идею создания данного документа.
✍️По всем вопросам: @Andryukha
👨👩👧👦 Чат: https://t.me/za_rabotay1
🎬YouTube: https://youtube.com/@za_rabotay
Купить рекламу: https://telega.in/c/zarabotay_yt
Никого не принуждаем, все выкладывается исключительно в ознакомительных целях!
Last updated 3 months, 1 week ago