PascalABC.NET официальный канал
Ir al canal en Telegram
Официальный канал языка и системы программирования PascalABC.NET
Mostrar más1 859
Suscriptores
-124 horas
-117 días
-2630 días
Archivo de publicaciones
Треугольник Флойда
Задача. Написать процедуру, выводящую треугольник Флойда с rows рядами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Решение.
procedure FloydTriangle(rows: integer);
begin
var r := 1;
for var i:=1 to rows do
begin
for var j:=1 to i do
begin
Write(r: (j>8 ? 4 : 3));
r += 1;
end;
Writeln
end;
end;
begin
FloydTriangle(5);
Writeln;
FloydTriangle(14);
end.
https://rosettacode.org/wiki/Floyd%27s_triangle#PascalABC.NETБесконечная последовательность
Задача. Выведите все натуральные числа
Решение.
## 1.Step.Print
https://rosettacode.org/wiki/Integer_sequence#PascalABC.NET
Это решение - самое короткое на Rosetta CodeФункция Flatten для списка
Имеется список элементов, каждый из которых может быть либо списком, либо атомарным элементом. Требуется получить из него список атомарных элементов.
function Flatten(lst: List<object>): List<object>;
begin
Result := new List<object>;
foreach var x in lst do
if x is List<object> then
Result.Addrange(Flatten(x as List<object>))
else Result.Add(x)
end;
function LstObj(params a: array of object): List<Object> := new List<Object>(a);
begin
var lst := LstObj(1,LstObj(2,LstObj(3,4),LstObj(5,6)), LstObj(LstObj(7,8),9));
Println(lst);
Println(Flatten(lst));
end.
https://rosettacode.org/wiki/Flatten_a_list#PascalABC.NETБлижайшая пара точек
Задача. Дан массив точек. Найти пару ближайших точек и расстояние между ними.
`type Point = auto class
x,y: real;
function Distance(p: Point): real := Sqrt((x-p.x)**2 + (y-p.y)**2);
end;
function Pnt(x,y: real) := new Point(x,y);
function RandomPoint: Point := Pnt(RandomReal(0,10),RandomReal(0,10));
function ClosestPair(points: array of Point): (Point,Point);
begin
var pairs := points.Combinations(2);
var pair := pairs.MinBy(pair -> pair[0].Distance(pair[1]));
Result := (pair[0],pair[1]);
end;
begin
var points := ArrGen(10,i -> RandomPoint);
points.Println;
var ClPair := ClosestPair(points);
Println(ClPair,ClPair[0].Distance(ClPair[1]));
end.
https://rosettacode.org/wiki/Closest-pair_problem#PascalABC.NETКак вывести дату в различных форматах
https://rosettacode.org/wiki/Date_format#PascalABC.NET
begin
var today := DateTime.Now.Date;
Println(today.ToString('yyyy-MM-dd'));
Println($'{today:D}');
end.
Вывод:
2024-06-01 Saturday, June 1, 2024#RosettaCode
Как найти размер файла в байтах?
Очень просто:
uses System.IO;
begin
FileInfo.Create('input.txt').Length.Println;
end.
https://rosettacode.org/wiki/File_size#PascalABC.NET
В Rosetta Code PascalABC.NET уже на 470 месте!
#RosettaCodeОднострочники для КЕГЭ - часть 5
Продолжаем решать задачи ЕГЭ, используя регулярные выражения.
(25. 6789) (ЕГЭ-2023)
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300425.
Найдите все числа, меньшие 108, соответствующие маске 12*34?5 и делящиеся без остатка на 2025. В качестве ответа приведите все найденные числа в порядке возрастания, справа от каждого числа выведите результат его деления на 2025.
##
(0..100000000)
.AsParallel
.Where(t->t.Divs(2025))
.Where(t->Regex.IsMatch(t.Tostring,'^12\d*34\d{1}5$'))
.Sorted
.printlines(t->$'{t} {t div 2025}');
Автор: Ипатов ЮрийChatGPT - реши мне задачу по программированию!
Основной вывод статьи: "полагаться на ИИ в написании программ пока рано".
https://3dnews.ru/1105416/issledovanie-52-otvetov-chatgpt-na-voprosi-po-programmirovaniyu-neverni
Задача на контейнеры без использования методов
Интересен сорт задач, в которых можно пользоваться любыми контейнерами данных, но в них запрещается использование любых нетривиальных методов - например, вычисляющих минимум или вовсе вызывающих LINQ-запросы.
Задача. Дан массив N чисел. Оставить в нем только те числа, которые не повторяются дважды.
Указание. Можно использовать словари, множества, списки, но запрещается в них использовать какие угодно нетривиальные методы (кроме добавления и в словаре - проверки ключа).
Указание 2. Предложить по возможности понятный и компактный алгоритм.
В комментариях приветствуются различные решения.
Однострочники для КЕГЭ - часть 4
Продолжаем решать задачи ЕГЭ, используя регулярные выражения.
(24.6676) (ЕГЭ-2023)
Текстовый файл 24-264.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. Определите максимальную длину подстроки, которая может являться записью числа в шестнадцатеричной системе счисления.
##
ReadAllText('24-264.txt').MatchValues('[0-9A-F]+')
.Select(w -> w.Length).Max.Print
Автор: Ипатов ЮрийParallel Foreach
В какой последовательности выведутся слова?
##
uses System.Threading.Tasks;
Parallel.ForEach(|'каждый','охотник','желает','знать','где','сидит','фазан'|, s -> Println(s));Однострочники для КЕГЭ - часть 3
Продолжаем решать задачи ЕГЭ, используя регулярные выражения.
(08.7174) (А. Носкин)
Маша составляет семибуквенные слова перестановкой букв слова ГЛУБИНА. Сколько существует слов, в которых буква «Г» расположена после букв «А» и «И»?
##
'ГЛУБИНА'.Permutations.Count(s -> not s.IsMatch('[АИ].*Г')).Print
Автор: Ипатов ЮрийRosettaCode - сравнение длин строк в PascalABC.NET
https://rosettacode.org/wiki/Compare_length_of_two_strings#PascalABC.NET
begin
var (s1,s2) := ('Bye','Hello');
if s1.Length > s2.Length then
Swap(s1,s2);
Println(s1,s1.Length);
Println(s2,s2.Length);
Println;
var strArr := |'wolf','cat','crocodile','tiger'|;
strArr.OrderByDescending(s -> s.Length).PrintLines(s -> $'{s,9} - {s.Length}');
end.Экзамен в компьютерной школе мехмата ЮФУ
Сегодня в детской компьютерной школе мехмата ЮФУ юные программисты сдают годовой экзамен.
Основной язык программирования на первой ступени - PascalABC.NET.
Напомним, что основной причиной разработки PascalABC.NET была необходимость легковесной и мощной средой программирования с современным языком и библиотеками, позволяющими начинающим эффективно осваивать современное программирование.
Все экзаменационные задания проверяются автоматически с помощью электронного задачника Programming Taskbook, и результаты тут же отображаются на сайте проверяющей системы, формируя рейтинг каждого ученика.
На снимке - группа 24 в полном составе. Тот самый момент, когда все задания решены и экзамен сдан.
Однострочники для КЕГЭ - часть 2
Продолжаем решать задачи ЕГЭ, используя регулярные выражения.
(08.6919) (Е. Джобс)
Сколько существует натуральных чисел, запись которых в семеричной системе содержит 5 разрядов?
##
'0123456'.Cartesian(5).Where(s -> s.IsMatch('[1-6]{1}[0-6]{4}')).Count.Print;
Или
##
'0123456'.Cartesian(5).Count(s -> s.IsMatch('^[^0]')).PrintRepost from PLComp
Возможно вы знакомы с алгоритмами сборки мусора, которые используются в языках программирования. Американский программист Кен Фокс (Ken Fox) написал программу с использованием разных алгоритмов сборки мусора и вариант программы без освобождения памяти, собрал данные для каждого варианта запуска программы и сгенерировал анимированные изображения для них. В репозитории представлены визуализации четырех основных алгоритмов сборки мусора:
- Mark-sweep
- Mark-compact
- Copying
- Reference counting
Каждому из этих алгоритмов посвящена отдельная глава в основополагающем учебнике The Garbage Collection Handbook. Рекомендуем обратиться к этому учебнику для полного погружения в тему.
Каждое анимированное изображение - это пространство памяти, выделенное процессу. Чёрным цветом изображена неиспользуемая память, по мере использования память начинает подсвечиваться жёлтым (операции записи) и зелёным (операции чтения) цветами. Цвет фрагментов памяти, которые используются дольше, начинает тускнеть, чтобы визуализировать развитие процесса во времени. По ходу выполнения программа перестаёт использовать отдельные участки памяти. Они и считаются "мусором".
Первая анимация демонстирует отсутствие всякой сборки мусора -
NO_GC, в этом случае память освобождается только при завершении процесса. Механизм NO_GC прост в реализации, он удобен, когда есть способ разбить задачу на отдельные подпроцессы. Так, например, работает веб-сервер Apache.
Вторая анимация демонстрирует работу сборщика мусора с использованием техники подсчёта ссылок. Суть алгоритма заключается в подсчёте количества ссылок на объекты в памяти, если количество ссылок становится равным нулю, то объект удаляется. Подсчёт ссылок - единственный алгоритм, хорошо совместимый с разными менеджерами ресурсов. По сравнению с первой анимацией появились красные пиксели, они соответствуют операциям подсчёта ссылок. Можно оценить и эффективность сборщика, если сразу после красной вспышки область памяти освобождается.
Третья анимация демонстрирует работу алгоритма "mark-and-sweep". Все объекты делятся на достижимые и недостижимые. Определённое множество объектов считается достижимым изначально - так называемые корневые объекты. Объект, на который есть ссылка из достижимого объекта, тоже считается достижимым. При запуске сборщик мусора выполняет следующие шаги:
- Фаза Mark: отмечает все достижимые объекты
- Фаза Sweep: проходит рекурсивно по объектам в куче, удаляет недостижимые объекты и возвращает их в пул свободной памяти.
Визуализации остальных алгоритмов приведены в репозитории. Помимо описанных визуализаций алгоритмов сборки мусора есть и другие, например интерактивная визуализация алгоритма tricolor mark-sweep, используемого в реализации языка Go.Однострочники для КЕГЭ - часть 1
Тяжело ли сдавать компьютерный ЕГЭ по информатике? Вопрос не однозначный, и здесь нет единого ответа для всех. Однако, если вы готовитесь и тренируетесь, то результат будет. Существуют разные стратегии и подходы. При этом следует отметить: чтобы гарантированно набирать баллы, надо решать надежно и продумывать варианты самопроверки.
Одна из технологий, которая поможет не только на ЕГЭ, но и в ИТ карьере – это регулярные выражения. Для каких задач она подходит: №8 (комбинаторика), №24 (строки), №25 (делители).
Итак, приступим.
(08.5336) (ЕГЭ-2022)
Определите количество пятизначных чисел, записанных в девятеричной системе счисления, которые не начинаются с нечётных цифр, не оканчиваются цифрами 1 или 8, а также содержат в своей записи не более одной цифры 3.
## uses School;
'012345678'.Cartesian(5)
.Where(s -> s.IsMatch('[^01357].{3}[^18]'))
.Where(s -> s.CountOf('3') <= 1)
.Count
.Print
Автор: Ипатов ЮрийПопулярность языков программирования в RosettaCode
В RosettaCode есть замечательная задача - написать программу, которая выводит рейтинг популярности языков программирования в RosettaCode
https://rosettacode.org/wiki/Rosetta_Code/Rank_languages_by_popularity
На PascalABC.NET программа заняла всего 14 строк.
https://gist.github.com/miks1965/fcea25d924e90811b760abee91185ea6
Иллюстрация использования Parallel.For
Данный код иллюстрирует применение Parallel.For для подсчета количества простых чисел. На шестиядерном процессоре ускорение - в 6 раз.
Следует обратить внимание на использование оператора lock, который защищает следующий оператор от выполнения в нескольких потоках одновременно. Если его убрать, то результат будет отличаться от нераспараллеленного случая, что будет свидетельствовать об ошибке.
#параллельность
https://gist.github.com/miks1965/bac11e12e3ba82c2a33935110992183a
PascalABC.NET в проекте Rosetta Code
Rosetta Code - замечательный проект, содержащий решение большого количества задач на различных языках программирования. Его целью является сравнение языков программирования по выразительности и мощности средств.
Более 1200 задач представлено здесь. С удивлением можно обнаружить, что PascalABC.NET также тут представлен как отдельный язык, что не может не радовать.
Однако PascalABC.NET здесь - на 500-том месте по количеству решенных задач.
Предлагаем желающим подключиться к проекту и поднять рейтинг PascalABC.NET. Для примера - на скриншоте - решенная вчера задача об отображении древовидных структур.
