PascalABC.NET официальный канал
Open in Telegram
Официальный канал языка и системы программирования PascalABC.NET
Show more1 859
Subscribers
-124 hours
-117 days
-2630 days
Posts Archive
Преобразование в вещественное, имеющее другой разделитель целой и дробной части
Реализован ряд дополнительных параметров для преобразования строк в вещественные с другим разделителем целой и дробной части
Можно также вызвать глобальную процедуру SetDecimalSeparator(','), которая будет влиять на все последующие преобразования
#новое
Преобразование в вещественное, имеющее другой разделитель целой и дробной части
Реализован ряд дополнительных параметров для преобразования строк в вещественные с другим разделителем целой и дробной части
Можно также вызвать глобальную процедуру SetDecimalSeparator(','), которая будет влиять на все последующие преобразования
#новое
### Задача
Создать генератор случайных паролей на PascalABC.NET, используя интерполированные строки.
### Код программы
const
PasswordLength = 12; // Длина пароля
Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&\*()_+[]{}|;:,.<>?'; // Разрешенные символы
function GeneratePassword(Length: Integer): string;
begin
// Генерируем пароль одной строкой, используя ArrGen для создания массива
Result := ArrGen(Length, i -> Characters.RandomElement()).JoinToString('');
end;
begin
var Password := GeneratePassword(PasswordLength); // Генерация пароля
PrintLn($"Сгенерированный пароль: {Password}"); // Вывод пароля с интерполированной строкой
end.
### Нейросеть
Сгенерировано с помощью ChatGPT от OpenAI.Первый опубликованный на канале код, сгенерированный нейросетью. Постановка задачи также придумана нейросетью
Короткий текст про семантические ошибки в Python
Данная статья написана как часть учебного пособия для школьников по программированию на PascalABC.NET и Python.
В комментариях пишите про другие виды семантических ошибок в Python, проявляющихся при выполнении
https://teletype.in/@pascalabcnet/kr7IoIkQnCc
Функция SetOf
В PascalABC.NET появилась функция SetOf для создания множества.
Она возвращает множество HashSet, но это может измениться.
Функция SetOf введена для обучения начинающих.
На скриншоте - программа вычисления симметрический разности двух множеств.
#новое
Мы - в Top-100 языков Rosetta code!
Кривая Гильберта - одна из известнейших фрактальных кривых.
Ниже приводится алгоритм рисования кривой Гильберта с помощью новой Черепахи. Это - 334-я задача, решенная на Rosetta Code:
https://rosettacode.org/wiki/Hilbert_curve#PascalABC.NET
uses Turtle;
procedure Hilbert(level: integer; angle,step: real);
begin
if level = 0 then
exit;
TurnRight(angle);
Hilbert(level-1, -angle, step);
Forw(step);
TurnLeft(angle);
Hilbert(level-1, angle, step);
Forw(step);
Hilbert(level-1, angle, step);
TurnLeft(angle);
Forw(step);
Hilbert(level-1, -angle, step);
TurnRight(angle);
end;
begin
SetWidth(2);
ToPoint(-9,-9);
Down;
Hilbert(6,90,0.3);
end.
Красота!Обновлённый модуль Turtle
Обновлён школьный модуль Turtle для Исполнителя Черепаха.
uses Turtle;
begin
SetWidth(1.4);
SetColor(Colors.Blue);
//ToPoint(3,0);
Down;
loop 4000 do
begin
//Circle(0.1);
Forw(0.3);
Turn(Random(-120,120));
//Sleep(1);
end;
end.
Для знакомства с возможностями можно скачать новую версию и запустить указанную программу.
Обязательно понажимайте Пробел - меняется отображение координат.
Если программа будет тормозить при перерисовке, уменьшите количество итераций в цикле.
Принимаются предложения и сообщения о багах.
#новоеМожно потестировать координаты будущего модуля Turtle
При использовании колёсика мыши график масштабируется. Диапазон значений - достаточно большой
Необходимо проверить на предмет корректности отображения значений на осях при различном масштабе.
Файл для тестирования прилагается.
Ввод Y или N без нажатия клавиши Enter
begin
repeat
var q := console.ReadKey;
if q.Key in |System.ConsoleKey.Y,System.ConsoleKey.N| then
begin
Print($'{q.Key} pressed');
exit
end;
until False;
end.
https://rosettacode.org/wiki/Keyboard_input/Obtain_a_Y_or_N_response#PascalABC.NET
106 место!
Спасибо всем, кто активно помогает решать задачи!Последовательность, возвращающая функции
В данной задаче из Rosetta Code с помощью метода Zip возвращается последовательность функций.
Собственно ничего интересного в этой задаче нет кроме того, что мы в Rosetta Code вырвались на 107 место!
https://rosettacode.org/wiki/First-class_functions/Use_numbers_analogously#PascalABC.NET
Найти недостающую перестановку
Даны перестановки - все кроме одной. Найти недостающую
О, это совсем просто. Перебираем все перестановки и сравниваем их как множества, используя операцию разности.
Тут и многострочная строка, и метод ToLines. Ну и перестановки как множества - а как еще искать недостающую?
begin
var s := '''
ABCD
CABD
ACDB
DACB
BCDA
ACBD
ADCB
CDAB
DABC
BCAD
CADB
CDBA
CBAD
ABDC
ADBC
BDCA
DCBA
BACD
BADC
BDAC
CBDA
DBCA
DCAB
''';
var perms := s.ToLines;
Print(('ABCD'.Permutations.ToHashSet - perms.ToHashSet).First);
end.
https://rosettacode.org/wiki/Find_the_missing_permutation#PascalABC.NETТочка пересечения прямой и плоскости
Данная программа иллюстрирует, как найти точку пересечения прямой и плоскости
type Point = auto class
x,y,z: real;
static function operator-(p1,p2: Point): Point := new Point (p1.x-p2.x, p1.y-p2.y, p1.z-p2.z);
static function operator*(p1,p2: Point): real := p1.x*p2.x + p1.y*p2.y + p1.z*p2.z;
static function operator*(p: Point; r: real): Point := new Point (p.x*r, p.y*r, p.z*r);
end;
function IntersectionPoint(RayDir, RayPoint, PlaneNormal, PlanePoint: Point): Point
:= RayPoint - RayDir * (((RayPoint - PlanePoint) * PlaneNormal) / (RayDir * PlaneNormal));
begin
var RayDir := new Point(0.0, -1.0, -1.0);
var RayPoint := new Point(0.0, 0.0, 10.0);
var PlaneNormal := new Point(0.0, 0.0, 1.0);
var PlanePoint := new Point(0.0, 0.0, 5.0);
Print(IntersectionPoint(RayDir, RayPoint, PlaneNormal, PlanePoint));
end.
https://rosettacode.org/wiki/Find_the_intersection_of_a_line_with_a_plane#Perl#PascalABC.NETКак преобразовать значение одного обобщенного типа к другому обобщенному типу
На скриншоте показано, как это сделать. Используется класс Convert. ТипыTFrom и TTo не связаны наследованием. Возможно исключение времени выполнения.
Внимание! Изменения в библиотеке School! Начиная с версии 3.9.0.3522 от 02.08.2024 в библиотеку добавлены функции (и расширения к ним)
PrimeFactors(n) и PrineFactorsCount(n), соответственно возвращающие список всех простых факторов (делителей) числа n и количество всех простых факторов. Функции (и расширения к ним) PrimeDivisors(n) и PrimeDivisorsCount(n) возвращают соответственно список и количество уникальных простых делителей числа n. Функция (и ее расширение) Factorize(n) теперь является синонимом функции PrimeFactors(n).Внешние функции Zip и Cartesian
В стандартной библиотеке реализованы внешние функции Zip и Cartesian с количеством последовательностей от 2 до 5 и необязательной функцией проекции
#новое
Все простые числа с увеличивающимися цифрами
Функция AscendingSeq даёт последовательность всех чисел, у которых цифры упорядочены строго по возрастанию.
Обратите внимание на изящное применение yield sequence и рекурсии.
Отфильтровать среди них простые, упорядоченные по возрастанию, - совсем просто, используя модуль School.
##
uses School;
function AscendingSeq(n: integer): sequence of integer;
begin
for var x := n*10 + n mod 10 + 1 to n*10 + 9 do
yield sequence AscendingSeq(x) + x;
end;
AscendingSeq(0).Order.Where(n -> n.IsPrime).Print;
https://rosettacode.org/wiki/Ascending_primes#PascalABC.NET
Решайте задачи на Rosetta Code!Niven numbers
Необходимо вывести 20 первых чисел, обладающих свойством - число делится на сумму своих цифр.
В PascalABC.NET с использованием модуля school сделать это - проще простого!
##
uses School;
function IsHarshad(n: integer) := n.Divs(n.Digits.Sum);
1.Step.Where(IsHarshad).Take(20).Println;
1.Step.Where(i -> (i > 1000) and IsHarshad(i)).First.Println;
Последняя строка выводит первое Niven-число, большее 1000.
https://rosettacode.org/wiki/Harshad_or_Niven_series#PascalABC.NET
И - мы в Rosetta Code уже на 115 месте!Преобразование в римские числа
Составим функцию, преобразующую арабские числа в римские и применим её на списке чисел. Кто-нибудь напишет короче?
https://rosettacode.org/wiki/Roman_numerals#PascalABC.NET
var anums := |1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1|;
var rnums := 'M CM D CD C XC L XL X IX V IV I'.split;
function ToRoman(x: integer): string;
begin
Result := '';
foreach var (a,r) in anums.Zip(rnums) do
begin
var n := x div a;
x := x mod a;
Result += r * n;
end;
end;
begin
var test := |1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30, 40,
50, 60, 69, 70, 80, 90, 99, 100, 200, 300, 400, 500, 600, 666, 700, 800, 900, 1000,
1009, 1444, 1666, 1945, 1997, 1999, 2000, 2008, 2010, 2011, 2500, 3000, 3999|;
foreach var x in test do
Println($'{x} - {ToRoman(x)}')
end.Загрузка JSON-строки
С помощью стандартной библиотеки System.Web.Extensions.dll можно манипулировать JSON-объектами: сериализовать их в JSON-формат из строки и словаря, а также десериализовать их
{$reference System.Web.Extensions.dll}
uses System.Web.Script.Serialization;
begin
var serializer := new JavaScriptSerializer;
var people := new Dictionary<string, object>;
people.Add('1', 'John');
people.Add('2', 'Susan');
var json := serializer.Serialize(people);
Println(json);
var res := serializer.Deserialize&<Dictionary<string, object>>(json);
Println(TypeName(res));
Println(res);
var jsonObject := serializer.DeserializeObject('{ "foo": 1, "bar": [10, "apples"] }')
as Dictionary<string, object>;
Println(jsonObject);
var arr := jsonObject['bar'] as array of object;
arr.Println;
end.
Результат:
{"1":"John","2":"Susan"}
Dictionary<string, Object>
{(1,John),(2,Susan)}
{(foo,1),(bar,[10,apples])}
10 apples
https://rosettacode.org/wiki/JSON#PascalABC.NET