Русский
Русский
English
Статистика
Реклама

Scratch

Перевод Декораторы в JavaScript с нуля

07.12.2020 16:06:42 | Автор: admin

Будущих студентов курса "JavaScript Developer. Professional" приглашаем записаться на открытый урок по теме "Делаем интерактивного telegram бота на Node.js".

А сейчас делимся традиционным переводом полезного материала.


Разбираемся с функциями-декораторами

Что такое декоратор?

Декоратор это средство, которое позволяет обернуть одну функцию другой и расширить ее возможности. Вы декорируете существующий код, обернув его другим кодом. Этот прием известен всем, кто знаком с композицией функций или функциями высшего порядка.

Декораторы явление не новое. Они используются и в других языках, например в Python, и даже в функциональном программировании на JavaScript. Но об этом мы поговорим позже.

Зачем нужны декораторы?

Они позволяют писать более чистый код, придерживаясь концепции композиции, и распространять единожды разработанную возможность на несколько функций и классов. Используя декораторы, вы сможете писать код, который проще отлаживать и сопровождать.

С декораторами код основной функции становится компактным, поскольку весь код, предназначенный для расширения ее возможностей, пишется за ее пределами. За счет декораторов можно добавлять в код новые возможности, не усложняя его.

Сейчас предложение к стандарту о декораторах классов находится на 2-м этапе рассмотрения, и к этому предложению еще может добавиться множество полезных дополнений.

Совет. Делитесь компонентами многоразового использования для разных проектов на платформе Bit(Github). Это простой способ документировать и систематизировать независимые компоненты из любых проектов и делиться ими.

Платформа открывает широкие возможности повторного использования кода, совместной работы над независимыми компонентами и разработки масштабируемых приложений.

Bitподдерживает Node, TypeScript, React, Vue, Angular и другие фреймворки JS.

Примеры React-компонентов многоразового использования на Bit.devПримеры React-компонентов многоразового использования на Bit.dev

Декораторы функций

Что такое декораторы функций?

Декораторы функций это такие же функции. Они принимают функцию в качестве аргумента и возвращают другую функцию, которая расширяет поведение функции-аргумента. Новая функция не изменяет функцию-аргумент, но использует ее в своем теле. Как я уже говорил, это во многом напоминает функции высшего порядка.

Как работают декораторы функций?

Рассмотрим пример.

Проверка аргументов обычная практика в программировании. В таких языках, как Java, если функция ожидает два аргумента, а получает три, генерируется исключение. Но в JavaScript ошибки не будет, поскольку лишние параметры попросту игнорируются. Такое поведение функций иногда раздражает, но может быть и полезным.

Для того чтобы убедиться в допустимости аргументов, нужно проверить их на входе. Это простая операция, в которой проверяется, что у каждого параметра надлежащий тип данных, а их количество не превышает ожидаемого функцией.

Однако повторение одной и той же операции для нескольких функций может привести к повторению кода, поэтому для проверки аргументов лучше написать декоратор, который затем можно будет многократно использовать с любыми функциями.

//decorator functionconst allArgsValid = function(fn) {  return function(...args) {  if (args.length != fn.length) {      throw new Error('Only submit required number of params');    }    const validArgs = args.filter(arg => Number.isInteger(arg));    if (validArgs.length < fn.length) {      throw new TypeError('Argument cannot be a non-integer');    }    return fn(...args);  }}//ordinary multiply functionlet multiply = function(a,b){return a*b;}//decorated multiply function that only accepts the required number of params and only integersmultiply = allArgsValid(multiply);multiply(6, 8);//48multiply(6, 8, 7);//Error: Only submit required number of paramsmultiply(3, null);//TypeError: Argument cannot be a non-integermultiply('',4);//TypeError: Argument cannot be a non-integer

В этом примере мы используем функцию-декоратор allArgsValid, которая принимает в качестве аргумента функцию. Декоратор возвращает другую функцию, которая обертывает функцию-аргумент. При этом функция-аргумент вызывается только в том случае, когда передаваемые в нее аргументы являются целыми числами. Иначе генерируется ошибка. Декоратор также проверяет количество передаваемых параметров: оно должно строго совпадать с количеством, которое ожидает функция.

Затем мы объявляем переменную multiply и в качестве значения присваиваем ей функцию, которая перемножает два числа. Мы передаем эту функцию умножения в функцию-декоратор allArgsValid, которая, как мы уже знаем, возвращает другую функцию. Возвращаемая функция снова присваивается переменной multiply. Таким образом, разработанный функционал можно будет без труда использовать повторно.

//ordinary add functionlet add = function(a,b){return a+b;}//decorated add function that only accepts the required number of params and only integersadd = allArgsValid(add);add(6, 8);//14add(3, null);//TypeError: Argument cannot be a non-integeradd('',4);//TypeError: Argument cannot be a non-integer

Декораторы классов: предложение к стандарту, рассматриваемое комитетом TC39

В функциональном программировании на JavaScript декораторы функций используются уже давно. Предложение о декораторах классов находится на 2-м этапе рассмотрения.

Классы в JavaScript на самом деле не классы. Синтаксис классов это всего лишь синтаксический сахар для прототипов, который упрощает работу с ними.

Напрашивается вывод, что классы это просто функции. Тогда почему бы нам не использовать декораторы функций в классах? Давайте попробуем.

Рассмотрим на примере, как можно реализовать этот подход.

function log(fn) {  return function() {    console.log("Execution of " + fn.name);    console.time("fn");    let val = fn();    console.timeEnd("fn");    return val;  }}class Book {  constructor(name, ISBN) {    this.name = name;    this.ISBN = ISBN;  }  getBook() {    return `[${this.name}][${this.ISBN}]`;  }}let obj = new Book("HP", "1245-533552");let getBook = log(obj.getBook);console.log(getBook());//TypeError: Cannot read property 'name' of undefined

Ошибка возникает потому, что при вызове метода getBook фактически вызывается анонимная функция, возвращаемая функцией-декоратором log. Внутри анонимной функции вызывается метод obj.getBook. Но ключевое слово this внутри анонимной функции ссылается на глобальный объект, а не на объект Book. Возникает ошибка TypeError.

Это можно исправить, передав экземпляр объекта Book в метод getBook.

function log(classObj, fn) {  return function() {    console.log("Execution of " + fn.name);    console.time("fn");    let val = fn.call(classObj);    console.timeEnd("fn");    return val;  }}class Book {  constructor(name, ISBN) {    this.name = name;    this.ISBN = ISBN;  }  getBook() {    return `[${this.name}][${this.ISBN}]`;  }}let obj = new Book("HP", "1245-533552");let getBook = log(obj, obj.getBook);console.log(getBook());//[HP][1245-533552]

Нам также нужно передать объект Book в функцию-декоратор log, чтобы затем можно было передать его в метод obj.getBook, используя this.

Это решение прекрасно работает, но нам пришлось идти обходными путями. В новом предложении синтаксис оптимизирован, что упрощает реализацию подобных решений.

Примечание. Для выполнения кода из приведенных ниже примеров можно использовать Babel. JSFiddle более простая альтернатива, которая позволяет опробовать эти примеры в браузере. Предложения еще не дошли до последнего этапа рассмотрения, поэтому использовать их в продакшене не рекомендуется: их функционирование пока не идеально и в синтаксис могут внести изменения.

Декораторы классов

В новых декораторах используется специальный синтаксис с префиксом @. Для вызова функции-декоратора log будем использовать такой синтаксис:

@log

В предложении в функции-декораторы внесли некоторые изменения по сравнению со стандартом. Когда функция-декоратор применяется к классу, она получает только один аргумент. Это аргумент target, который по сути является объектом декорируемого класса.

Имея доступ к аргументу target, вы можете внести в класс необходимые изменения. Можно изменить конструктор класса, добавить новые прототипы и т.д.

Рассмотрим пример, в котором используется класс Book, мы с ним уже знакомы.

function log(target) {  return function(...args) {    console.log("Constructor called");    return new target(...args);  };}@logclass Book {  constructor(name, ISBN) {    this.name = name;    this.ISBN = ISBN;  }  getBook() {    return `[${this.name}][${this.ISBN}]`;  }}let obj = new Book("HP", "1245-533552");//Constructor Calledconsole.log(obj.getBook());//HP][1245-533552]

Как видите, декоратор logполучает аргумент targetи возвращает анонимную функцию. Она выполняет инструкцию log, а затем создает и возвращает новый экземпляр target, который является классом Book. Можно добавить к target прототипы с помощью target.prototype.property.

Более того, с классом могут использоваться несколько функций-декораторов, как показано в этом примере:

function logWithParams(...params) {  return function(target) {    return function(...args) {      console.table(params);      return new target(...args);    }  }}@log@logWithParams('param1', 'param2')class Book {//Class implementation as before}let obj = new Book("HP", "1245-533552");//Constructor called//Params will be consoled as a tableconsole.log(obj.getBook());//[HP][1245-533552]

Декораторы свойств класса

В их синтаксисе, как и в синтаксисе декораторов классов, используется префикс @. В декораторы свойств класса можно передавать параметры точно так же, как в другие декораторы, которые мы рассмотрели на примерах.

Декораторы методов класса

Аргументы, которые передаются в декоратор метода класса, будут отличаться от аргументов декоратора класса. Декоратор метода класса получает не один, а три параметра:

  • target объект, в котором содержатся конструктор и методы, объявленные внутри класса;

  • name имя метода, для которого вызывается декоратор;

  • descriptor объект дескриптора, соответствующий методу, для которого вызывается декоратор. Одескрипторах свойств можно подробнее почитать здесь.

Большинство манипуляций будет выполняться с аргументом descriptor. При использовании с методом класса объект дескриптора имеет 4 атрибута:

  • configurable логическое значение, которое определяет, можно ли изменять свойства дескриптора;

  • enumerable логическое значение, которое определяет, будет ли свойство видимым при перечислении свойств объекта;

  • value значение свойства. В нашем случае это функция;

  • writable логическое значение, которое определяет, возможна ли перезапись свойства.

Рассмотрим пример с классом Book.

//readonly decorator functionfunction readOnly(target, name, descriptor) {  descriptor.writable = false;  return descriptor;}class Book {  //Implementation here  @readOnly  getBook() {    return `[${this.name}][${this.ISBN}]`;  }}let obj = new Book("HP", "1245-533552");obj.getBook = "Hello";console.log(obj.getBook());//[HP][1245-533552]

В нем используется функция-декоратор readOnly, которая делает метод getBook в классе Bookдоступным только для чтения. С этой целью для свойства дескриптора writable устанавливается значение false. По умолчанию для него установлено значение true.

Если значение writable не изменить, свойство getBook можно будет перезаписать, например, так:

obj.getBook = "Hello";console.log(obj.getBook);//Hello

Декораторы поля класса

Декораторы могут использоваться и с полями классов. Хотя TypeScript поддерживает поля классов, предложение добавить их в JavaScript пока находится на 3-м этапе рассмотрения.

В функцию-декоратор, используемую с полем класса, передаются те же аргументы, которые передаются при использовании декоратора с методом класса. Разница заключается лишь в объекте дескриптора. В отличие от использования декораторов с методами классов, при использовании с полями классов объект дескриптора не содержит атрибута value. Вместо него в качестве атрибута используется функция initializer. Поскольку предложение по добавлению полей классов пока находится на стадии рассмотрения, о функции initializer можно почитать в документации. Функция initializer вернет начальное значение переменной поля класса.

Если полю значение не присвоено (undefined), атрибут writable объекта дескриптора использоваться не будет.

Рассмотрим пример. Будем работать с уже знакомым нам классом Book.

function upperCase(target, name, descriptor) {  if (descriptor.initializer && descriptor.initializer()) {    let val = descriptor.initializer();    descriptor.initializer = function() {      return val.toUpperCase();    }  }}class Book {    @upperCase  id = "az092b";  getId() {    return `${this.id}`;  }  //other implementation here}let obj = new Book("HP", "1245-533552");console.log(obj.getId());//AZ092B

В этом примере значение свойства id переводится в верхний регистр. Функция-декоратор upperCase проверяет наличие функции initializer, чтобы гарантировать, что значению поля присвоено значение (тоесть значение не является undefined). Затем она проверяет, является ли присвоенное значение условно истинным (прим. пер.: англ. truthy значение, превращающееся в true при приведении к типу Boolean), и затем переводит его в верхний регистр. При вызове метода getId значение будет выведено в верхнем регистре. При использовании декораторов с полями классов можно передавать параметры точно так же, как и в других случаях.

Варианты использования

Вариантов использования декораторов бесконечно много. Посмотрим, как программисты реализуют их в реальных приложениях.

Декораторы в Angular

Если вы знакомы с TypeScript и Angular, вы наверняка сталкивались с использованием декораторов в классах Angular, например @Component, @NgModule, @Injectable, @Pipe и т.д. Это встроенные декораторы классов.

MobX

Декораторы в MobX широко использовались вплоть до 6-й версии. Среди них @observable, @computed и @action. Но сейчас в MobX использование декораторов не приветствуется, поскольку предложение к стандарту еще не принято. В документации говорится:

В настоящее время декораторы не являются стандартом ES, а процесс стандартизации длится долго. Скорее всего, предусмотренное стандартом использование декораторов будет отличаться от текущего.

Библиотека Core Decorators

Это библиотека JavaScript, в которой собраны готовые к использованию декораторы. Хотя она основана на предложении о декораторах этапа 0, ее автор планирует обновление, когда предложение перейдет на 3-й этап.

В библиотеке есть такие декораторы, как @readonly, @time, @deprecate и др. С другими декораторами можно ознакомиться здесь.

Библиотека Redux для React

В библиотеке Redux для React есть метод connect, с помощью которого можно подключить компонент React к хранилищу Redux. Библиотека позволяет использовать метод connectтакже в качестве декоратора.

//Before decoratorclass MyApp extends React.Component {  // ...define your main app here}export default connect(mapStateToProps, mapDispatchToProps)(MyApp);//After decorator@connect(mapStateToProps, mapDispatchToProps)export default class MyApp extends React.Component {  // ...define your main app here}

В ответе пользователя Felix Kling на Stack Overflow можно найти некоторые пояснения.

Хотя connectподдерживает синтаксис декоратора, в настоящее время команда Redux не приветствует его использование. Связано это в основном с тем, что предложение о декораторах находится на 2-м этапе рассмотрения, а значит, в него могут быть внесены изменения.

Декораторы это мощный инструмент, который позволяет писать очень гибкий код. Наверняка вы будете часто сталкиваться с ними уже в ближайшем будущем.

Спасибо, что прочитали, и чистого вам кода!


Узнать подробнее о курсе "JavaScript Developer. Professional".

Записаться на открытый урок по теме "Делаем интерактивного telegram бота на Node.js".

Подробнее..

Recovery mode Опыт проведения городской школьной олимпиады по программированию

19.09.2020 18:15:27 | Автор: admin

В этой статье я расскажу про опыт проведения городской школьной олимпиады по программированию.

Идея организовать местную олимпиаду возникла ещё на стадии запуска детской школы программирования. За два года работы стало ещё более очевидно, что счёт идёт на единицы различных соревнований в этом направлении, а значит мало возможностей для проверки учеников, вовлечения вне занятий, дополнительной мотивации результатами. Скажу даже так: в Иркутске нет соревновательных мероприятий для учеников по программированию на scratch, и только одна олимпиада в которой могут участвовать питонисты - Играем в программистов.

Казалось, что организовать олимпиаду нужно много ресурсов: найти большое помещение, например договориться с крупной библиотекой, обеспечить техникой, найти преподавателей-волонтёров, обеспечить безопасность и море других мелочей. И это было некоторым камнем преткновения для частного небольшого учебного заведения в части ресурсов. Решение пришло неожиданно - дистанционная олимпиада! В феврале 2020 года пошли слухи про скорую удалёнку, что очные мероприятия запретят и для меня всё стало на свои места.

Теперь про организацию олимпиады:

Задания мы выложили в вконтакте в своей группе 20 марта 2020 года. Время для решения задач дали чуть больше недели - с 20 марта 2020 года по 29 марта 2020 года. Оценку работ планировали провести до 12 апреля 2020 года, даже сомневались не мало ли, но справились всего за 4 дня. При этом участников было чуть больше 100, проверка была ручная(но об этом попозже).

Участников поделили на три категории:

  • младшая ступень (до 7 класса общеобразовательных учреждений включительно, задачи решены на визуальном языке программирования scratch/snap)

  • средняя ступень (до 7 класса общеобразовательных учреждений включительно, задачи решены на любом разрешённом олимпиадой языке программирования)

  • старшая ступень (8-11 классы общеобразовательных учреждений, задачи решены на любом разрешённом олимпиадой языке программирования).

Что же это за такие разрешённые языки. Мы посоветовались с муниципальными коллегами, которые проводят уже больше 15 лет олимпиаду Играем в программистов и допустили следующий список:

Язык

Редактор

Компилятор

C++

Code: Blocks, VisualStudio

VisualStudio 2019

C#

Code: VisualStudio

VisualStudio 2019

Pascal

FreePascal 2.6.2

FreePascal 2.6.2

Basic

FreeBasic 0.90.1

FreeBasic 0.90.1

Java

NetBeans, Eclipse

JDK 1.7.0

Python

IDLE

Python 3.6

Учащимся предлагались задания с указанием максимального количества баллов за каждую задачу и примерными тестами к ней. Решения заданий олимпиады должны были предоставить в виде исходного кода на языке программирования. Ничего необычного. Главное - обозначить как правильно называть имена файлов, по опыту преподавания - дети любят творческие названия проектов. Мы прописали в положении к олимпиаде такое правило: Имя файла даётся по следующему принципу: до 5 символов название учебного заведения с указанием территории, 2 символа инициалы участника и последний символ номер задачи. В имени файла можно использовать только латинские буквы и цифры, первый символ буква. В основном все следовали указаниям. Когда проверяешь сотни работ, у каждого одни задачи решены, другие нет - соблюдение данного пункта очень экономит время на проверке.

На каждую задачу делали по 5 тестов, за каждый пройденный тест начисляли по 2 балла. Разрешили предоставление дополнительных решений задач. За каждое дополнительное решение начисляли 5 баллов при условии, что и основное решение и дополнительное успешно прошли все тесты. Дополнительное решение должно существенно отличается по методу решения задачи. Сделали это для подстраховки, если будут ученики, решившие все задачи и набравшие максимальные баллы. Спойлер - такого не случилось. Отчасти потому что задачи были составлены не одного уровня, а от совсем простых до очень-очень сложных.

Теперь приведём сами задачки и наши варианты решений, которые мы публиковали для учеников своей школы в рамках их образовательной программы вместе с разбором решений.

Разборы решений, ниже под спойлерами сами задачи и код на python

Задача 1

Через ввод с клавиатуры задаётся количество чисел. Затем сами числа передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список. Составить программу, подсчитывающую среднее арифметическое. Результат записывается в переменную. Визуально(scratch/snap) на экране отображается результат любым способом (например, функция говорить/думать). Текстовое (python) результат выводится в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

5

1 2 3 4 5

3

Решение 1
a = int(input("Количество чисел:"))y = 0for i in range(a):    x = float(input("Число:"))    y += xy = y / aprint("Среднее арифметическое: " + str(y))
Задача 2

У Кота, Пса и Птицы имеется по некоторому количеству грибов (у всех по разному количеству). Данные по количеству передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список, где первый элемент - грибы Кота, второй элемент - грибы Пса, третий элемент - грибы Птицы.

Составить программу, определяющую, у кого из них наибольшее количество. Результат записывается в переменную. Визуально (scratch/snap) на экране появляется персонаж с наибольшим количеством грибов и говорит (функция говорить/думать)) количество грибов. Текстовое (python) имя персонажа выводится в консоль на экран.

Примерный тест:

Входные данные

10 30 20

20 10 30

Выходные данные

Пёс

Птица

Решение 2
s = []for i in range(3):    griby = int(input())    s.append(griby)if s[0]>s[1] and s[0]>s[2]:    print("Кот")elif s[1]>s[2]:    print("Пёс")else:    print("Птица")
Задача 3

Через ввод с клавиатуры задаётся количество девочек, у которых было по некоторому количеству яблок. Данные по количеству передаются в готовый пустой список. Каждая девочка съела по стольку яблок, каков её порядковый номер.

Составить программу для определения у кого сколько осталось яблок. Результат записывается в список. Визуально (scratch/snap) на экране отображаются пять девочек (обязательно использование клонов) и говорят (функция говорить/думать) количество яблок. Текстовое (python) количество яблок выводятся в консоль на экран. По каждой девочке? По порядку отдельной строкой.

Примерный тест:

Входные данные:

Выходные данные:

5

10 20 30 40 50

9

18

27

36

45

Решение 3
girls = int(input())apple = []for numgirl in range(1, girls + 1):    a = int(input())    a = a - numgirl    apple.append(a)for numgirl in range(girls):    print(apple[numgirl])
Задача 4

День недели задаётся через ввод пользователя с клавиатуры числом от 1 до 7. Составить программу, в которой визуально (scratch/snap) на экране отображается название этого дня любым способом (например, функция говорить/думать). Текстовое (python) название дня выводится в консоль на экран.

Примерный тест:

Входные данные

1

3

Выходные данные

Понедельник

Среда

Решение 4
days = ['Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье']day = int(input())print(days[day - 1])
Задача 5

Через ввод с клавиатуры задаётся количество чисел. Затем сами числа передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список. Сделать программу, изменяющую элементы списка, числа кратные 5 заменять на 2 (умноженную на кратность заменяемого числа), а числа кратные 2 заменять на 5 (умноженную на кратность заменяемого числа). Числа передаются в готовый пустой список. Результат записывается в список. Визуально (scratch/snap) на экране отображаются все элементы списка любым способом (например, функция говорить/думать). Текстовое (python) элементы списка выводится в консоль на экран в одну строку.

Примерный тест:

Входные данные:

Выходные данные:

6

10 2 6 20 4 5

4 5 15 8 10 2

Решение 5
nums = int(input())listnums = []for i in range(nums):    listnums.append(int(input()))for i in range(nums):    if listnums[i] % 5 == 0:        listnums[i] = listnums[i] // 5 * 2    elif listnums[i] % 2 == 0:        listnums[i] = listnums[i] // 2 * 5    print(listnums[i])
Задача 6

Условие этой задачи очень простое: вам всего лишь надо определить, сколько клеток находится под боем шахматного коня, одиноко стоящего на шахматной доске. На всякий случай напомним, что конь ходит буквой Г на две клетки по горизонтали или вертикали в любом направлении, и потом на одну клетку в направлении, перпендикулярном первоначальному. Программа получает на вход через вводы пользователя с клавиатуры два числа от 1 до 8 каждое, задающие номер столбца и номер строки, обозначающие позицию коня на шахматной доске. Визуально (scratch/snap) на экране отображаются любым способом (например, функция говорить/думать) количество клеток шахматной доски, находящихся под боем коня. Текстовое (python) количество клеток шахматной доски, находящихся под боем коня выводится в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

1 5

4

8 1

2

Решение 6
vozmojnost = 0stolb = int(input())stroka = int(input())# Конь ходит вправоif stolb + 2 < 9:    if stroka + 1 < 9: # и вверх        vozmojnost += 1     if stroka - 1 > 0: # и вниз        vozmojnost += 1 # Конь ходит влево        if stolb - 2 > 0:    if stroka + 1 < 9: # и вверх        vozmojnost += 1     if stroka - 1 > 0: # и вниз        vozmojnost += 1 # Конь ходит вверх        if stroka + 2 < 9:    if stolb + 1 < 9: # и вправо        vozmojnost += 1    if stolb - 1 > 0:# и влево        vozmojnost += 1# Конь ходит вниз        if stroka - 2 > 0:    if stolb + 1 < 9:# и вправо        vozmojnost += 1    if stolb - 1 > 0:# и влево        vozmojnost += 1        print(vozmojnost)
Задача 7

Заданы две клетки шахматной доски. Если они покрашены в один цвет, то выведите слово YES, а если в разные цвета то NO. Программа получает на вход через вводы пользователя с клавиатуры четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Визуально (scratch/snap) на экране отображаются любым способом (например, функция говорить/думать) YES или NO. Текстовое (python) выведите YES или NO в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

1 1 2 6

YES

Решение 7
summ = 0for i in range(4):    summ += int(input())if summ % 2 ==0:    print('YES')else:    print('NO')
Задача 8

На ипподроме наметилось городское соревнование. Но никто не знает сколько будет участников. Места всем хватит, но есть проблема с расширением стартового загона. Представьте загон в виде квадратной таблицы. Участника номер один необходимо ставить в правом верхнем (переднем) углу, далее участников ставят по диагоналям сверху вниз, последний участник стоит в левом нижнем углу. Чтобы быстро сделать расстановку необходимо вывести на табло данную таблицу. Организатор в последний момент сообщит Вам только количество участников (программа получает на вход через ввод пользователя с клавиатуры одно число).

Визуально (scratch/snap) на экране рисуется таблица, в каждой ячейке вместо обычных чисел используйте точки, какое число столько сгруппированных точек в ячейке. Текстовое (python) вывести в консоль на экран таблицу с числовой расстановкой.

Примерный тест:

Входные данные:

Выходные данные текстовое:

9

4 2 1

7 5 3

9 8 6

Решение 8
vvod = int(input())num = vvod ** 0.5if int(num) != num:    num = int(num) + 1else:    num = int(num)table = [[0] * num for i in range(num)]numb = 0ivert = numfor i in range(num):    if ivert > 0:        igoriz = 0        for i in range(num - ivert + 1):            if igoriz <= num - ivert:                numb += 1                if numb <= vvod:                    table[igoriz][ivert + igoriz - 1] = numb                else:                    table[igoriz][ivert + igoriz - 1] = 0            igoriz += 1    ivert -= 1  ivert = 1            for i in range(num - 1):    if ivert < num:        igoriz = 0        for i in range(num - ivert):            if igoriz < num - ivert:                numb += 1                if numb <= vvod:                    table[ivert + igoriz][igoriz] = numb                else:                    table[ivert + igoriz][igoriz] = 0            igoriz += 1    ivert += 1for row in table:    for elem in row:        print(elem, end=' ')    print()
Задача 9

В наш город приехал чудо-зоопарк с множеством зверей. Одних только пингвинов 3 вида, 4 вида черепах, 5 видов акул и т.д. Вы весь день записывали названия животных в блокнот, а вечером решили подсчитать каких животных (не разделяя на виды) было больше всего. Сколько в блокноте всего животных неизвестно, но точно понятно, что каких-то животных больше и что сначала записано животное, а затем его вид, например, Penguin Emperor. В каждой из следующих строк блокнота записано по одному виду животного. На вход подаётся файл input.txt с данными. Для scratch/snap в программе необходим пустой список для ручного импорта в него файла. Визуально (scratch/snap) на экране отображаются любым способом (например, функция говорить/думать) название животного и их количество. Текстовое (python) в консоль на экран в одну строку выводится название животного и их количество.

Примерный тест:

Входные данные:

Выходные данные:

Penguin Emperor

Shark zebra

Turtle Caiman

Shark white

Shark 2

Решение 9
file = open("input.txt")animal=[]kolvo=[]for stroka in file:    data = stroka.split()    animal.append(data[0])for i in animal:    kolvo.append(animal.count(i))maxi = 0pos = 0for i in range(len(kolvo)):    if kolvo[i] > maxi:        maxi = kolvo[i]        pos = iprint(animal[i], maxi, end=" ")
Задача 10

Поговаривают, что сейчас самая популярная игра у школьников - brawl stars. Ты наверняка чемпион и прокачал множество персонажей. Близится соревнование и поэтому надо разбить персонажей на две равные команды. У вас есть несколько персонажей известного уровня w1, , wn. Напишите программу, которая распределит персонажей в две команды так, что разность суммы уровней этих двух команд будет минимальной. Ввод содержит уровни персонажей w1, , wn (1 wi 100) через пробел с именами персонажей. На вход подаётся файл input.txt с данными. Для scratch/snap в программе необходим пустой список для ручного импорта в него файла

Ваша программа должна вывести имена персонажей первой команды, затем одно число минимальную разность уровней двух команд. Затем имена персонажей второй команды.

Визуально (scratch/snap) вывод последовательно заносится в список. Текстовое (python) ответ выводится в консоль на экран отдельными строками.

Примерный тест:

Входные данные:

Выходные данные

4 Shelly

7 Bull

10 Bo

12 8-bit

15 ElPrimo

20 Tick

Tick

Bo

Shelly

0

ElPrimo

8-bit

Bull

Решение 10
file = open("input.txt")pers_dict = []for pers in file:    data = pers.split()    pers_dict.append((data[1], int(data[0])))pers_dict.sort(key = lambda elem: elem[1], reverse = True)               command1 = []command2 = []summa1=0summa2=0for elem in pers_dict:    if summa1 <= summa2:        command1.append(elem)        summa1 += elem[1]    else:        command2.append(elem)        summa2 += elem[1]for key in command1:    print(key[0])     if summa1> summa2:    print(summa1-summa2)else:    print(summa2-summa1)for key in command2:    print(key[0])

Какими выводами хотелось бы поделиться по итогам:

  • Организовать городскую олимпиаду просто, сделайте её дистанционной, не переживайте за гугление участниками, разработайте свои задачи и тогда нагуглить решение будет в разы сложнее, чем решить.

  • Финансирование олимпиады - дело минимальное, берите пример с Роббо, они Российскую олимпиаду по scratch проводят мега бюджетно - электронные дипломы и сертификаты участника с факсимиле организатора, но сути это не меняет - красивая электронная "бумажка" в наличии.

  • Не нужно придумывать автоматизированную проверку, не так страшно ручное тестирование решений. Главное заранее подготовьте тесты.

  • Думаете будет мало участников? Разошлите электронные письма в школы города. Всегда найдётся педагоги, которые очень заинтересованы в таких мероприятиях.

  • Наша олимпиада оказалась очень сложной для школьников всех возрастов, хотя я переживал об обратном. Реально полезной оказалась градация задач по сложности. Задачи 8-10 можно смело забыть, вместо них мы решили в будущем добавить 6 простых задач, схожих по уровню с 4 задачей.

Я очень надеюсь, что статья будет полезной руководителям кружков программирования и педагогам. Смело проводите местные олимпиады, смотрите решения ваших учеников, делайте выводы для улучшения своей образовательной программы.

Подробнее..

Признайтесь вы в этом не ориентируетесь

17.04.2021 14:23:59 | Автор: admin

Спросите: играют ли ваши дети в Роблокс-игры? - Ответ будет положительным!А как ваши дети-подростки выбирают компьютерную игру? Знаете? - Давайте попробуем сами: "Карантин", "Граница", "Белый Дом", "Пигги" и еще куча разных названий... Даже встроенный в некоторые игры 30-секундный трейлер ничего не проясняет! Нужно просто начать игру!

И тут оказывается, что игры имеющие самые разные названия похожи друг на друга, как братья-близнецы. Большинство представляют собой "симуляторы убийств" - не важно, чем и по какому поводу! Бей битой! Стреляй! Бей ножом! Не нужно особенно разбираться! Здесь почти каждый - враг! А раз так, то просто бей каждого - чтобы выжить! Хочешь получить автомат, а не пистолет, монтажку или нож? - Плати и стреляй хоть ракетами!

Становится страшно, когда видишь мальчишек и девчонок регулярно "заливающих кровью" экраны своих компьютерных мониторов и смартфонов. Это не может не сказаться на их психике и мировосприятии. Но, что вы можете предложить им взамен? Признайтесь: вы в этом не ориентируетесь!

А что, если научить детей делать "хорошие" игры, чтобы они могли и играть, и удивлять своих друзей? Сделать их Творцами и Повелителями своих собственных Миров! Сегодня вряд-ли кого-либо нужно убеждать, что навыки программирования - дело полезное. Без "цифры" уже нельзя обойтись и сегодня. Завтра - тем более! Более того, программирование - важнейший из навыков, которым могут овладеть современные дети, ведь оно развивает другие (самые полезные) "4К-навыки". Вопрос лишь в доступности обучения программированию и в мотивации самих детей.

Возможно даже, что ваш ребенок уже (в той или иной мере) освоил программирование в среде "Scratch". А вот до признания среди сверстников, уверен, дело не дошло, а это сильно демотивирует! Спросите: "Почему?" Ответ прост - все хорошо, но в среде "Scratch" нет простой возможности для работы с 3D-моделями, да и разрешение изображений очень низкое ("пиксельное"). То есть, все, что ни сделает ваш ребенок в среде "Scratch" будет сильно проигрывать в качестве картинки современным игровым платформам типа "Roblox". Такими достижениями трудно похвастать перед сверстниками! Многие не оценят!

Точно такая же ситуация возникла и у одного из наших курсантов. Достаточно преуспев в "Scratch" (дважды заняв 2-е места в Международной Scratch-Олимпиаде и дважды став дипломантом конкурса "Мастер_ИТ"), он с головой погрузился в самостоятельное изучение Роблокс. Оказалось, во встроенной библиотеке ("тулбоксе") Роблокс лежит в свободном доступе такое огромное количество всяких 3D-моделей, картинок и звуковых файлов, что Scratch и не снилось! И с разрешением в Роблокс все в порядке!

И, как говорится: "Терпение и труд все перетрут!" Стало получаться! За плечами нашего курсанта разработка уже нескольких Роблокс-игр. И если первые две игры были созданы из уже готовых моделей и без самостоятельного кодирования, то последующие строились с использованием своих кодов, что сделало игры классными и сразу отразилось на их посещаемости другими игроками. Более того, мальчишке захотелось поделиться знаниям, полученными из изучения (англоязычных) инструкций Роблокса, и собственными лайфхаками - он освоил видеоредактор Movavi. После серии видеороликов, созданных в помощь фанатам популярных Роблокс-игр, он решил начать публиковать уроки по программированию в Роблокс на своем youtube-канале и приглашает всех желающих стать его подписчиками-учениками. Понятно, что нельзя было не пригласить в читатели журнала и программистов-скрэтчеров. На его "профиле" сайта "Scratch" появились соответствующие мультики-приглашения.

В сравнении со многими имеющимися в youtube роликами, уроки юного преподавателя имеют несомненные достоинства: они компактны и очень качественны - с ними разберется даже первоклашка! А уж тем, кто освоил Scratch - тем более! Особое достоинство скриптов, описываемых юным учителем - наличие комментариев к каждой строке кода. Его устные объяснения коротки, но очень продуманны и потому его уроки воспринимаются очень легко. Важно, что автор сразу же демонстрирует и варианты модификации своих программ. Применив эти модификации, каждый сможет запрограммировать именно то, что ему нужно. Приглашайте ваших детей поучиться! Это легко и интересно!

И еще, говорят: "Привычка - вторая натура!" Дети могут начать множить то, к чему привыкли. Но, им вовсе не обязательно создавать свои "симуляторы-убийства". Помогите им придумать сюжет своей "доброй" игры. А в качестве примера покажите им игру "Космос", созданную тем же юным преподавателем! В ней каждый сможет стать космонавтом-исследователем, открыть для себя планеты и спутники Солнечной системы, побывать на МКС, полетать на летающих тарелках и даже поискать клады космических пиратов. Посмотрите захватывающий ролик об этой игре! Уверен, вы сами (ктов нашем с вами детстве не мечтал стать космонавтом?) захотите сыграть в эту игру. Возьмите и поиграйте! Это - просто круто!

Или вот еще одна его относительно "мирная" Роблокс-игра - "Полигон". Здесь начинающий игрок-роблоксер научится ловко управлять своим игровым аватаром и боевой техникой - танками и БТРами. Это - ролевая игра, в которой можно, начав призывником, стать крутым бойцом спецназа военной разведки, научиться метко стрелять и преодолевать сложные препятствия на танках "Армата" и "Т-70".

Думаете это просто? - Ошибаетесь! Модели танков, БТР и автомобилей в Роблокс не всегда имеют низко расположенный центр тяжести. Поэтому иногда даже наезд гусениц танка на самый обыкновенный бордюр дороги может приводить к опрокидыванию модели, в которой сидит ваш аватар. Метко стрелять из танка по подвижным мишеням - тоже не просто! А когда вы станете "профи", вы сможете примерить на себя роль врага-диверсанта, попробовать разыскать секретный центр управления и запустить ядерную ракету или телепортироваться в игру "Зона боевых действий", чтобы помочь "нашим" и, победив врага, под звуки российского гимна поднять флаг Родины...

Что же, давайте пожелаем всем нашим детям успеха! Ведь им придется жить в мире куда более сложном и конкурентном, чем мир сегодняшний (роботы и искусственный интеллект наступают ).

Подробнее..

Recovery mode Признайтесь вы в этом не ориентируетесь

17.04.2021 16:06:40 | Автор: admin

Спросите: играют ли ваши дети в Роблокс-игры? - Ответ будет положительным!А как ваши дети-подростки выбирают компьютерную игру? Знаете? - Давайте попробуем сами: "Карантин", "Граница", "Белый Дом", "Пигги" и еще куча разных названий... Даже встроенный в некоторые игры 30-секундный трейлер ничего не проясняет! Нужно просто начать игру!

И тут оказывается, что игры имеющие самые разные названия похожи друг на друга, как братья-близнецы. Большинство представляют собой "симуляторы убийств" - не важно, чем и по какому поводу! Бей битой! Стреляй! Бей ножом! Не нужно особенно разбираться! Здесь почти каждый - враг! А раз так, то просто бей каждого - чтобы выжить! Хочешь получить автомат, а не пистолет, монтажку или нож? - Плати и стреляй хоть ракетами!

Становится страшно, когда видишь мальчишек и девчонок регулярно "заливающих кровью" экраны своих компьютерных мониторов и смартфонов. Это не может не сказаться на их психике и мировосприятии. Но, что вы можете предложить им взамен? Признайтесь: вы в этом не ориентируетесь!

А что, если научить детей делать "хорошие" игры, чтобы они могли и играть, и удивлять своих друзей? Сделать их Творцами и Повелителями своих собственных Миров! Сегодня вряд-ли кого-либо нужно убеждать, что навыки программирования - дело полезное. Без "цифры" уже нельзя обойтись и сегодня. Завтра - тем более! Более того, программирование - важнейший из навыков, которым могут овладеть современные дети, ведь оно развивает другие (самые полезные) "4К-навыки". Вопрос лишь в доступности обучения программированию и в мотивации самих детей.

Возможно даже, что ваш ребенок уже (в той или иной мере) освоил программирование в среде "Scratch". А вот до признания среди сверстников, уверен, дело не дошло, а это сильно демотивирует! Спросите: "Почему?" Ответ прост - все хорошо, но в среде "Scratch" нет простой возможности для работы с 3D-моделями, да и разрешение изображений очень низкое ("пиксельное"). То есть, все, что ни сделает ваш ребенок в среде "Scratch" будет сильно проигрывать в качестве картинки современным игровым платформам типа "Roblox". Такими достижениями трудно похвастать перед сверстниками! Многие не оценят!

Точно такая же ситуация возникла и у одного из наших курсантов. Достаточно преуспев в "Scratch" (дважды заняв 2-е места в Международной Scratch-Олимпиаде и дважды став дипломантом конкурса "Мастер_ИТ"), он с головой погрузился в самостоятельное изучение Роблокс. Оказалось, во встроенной библиотеке ("тулбоксе") Роблокс лежит в свободном доступе такое огромное количество всяких 3D-моделей, картинок и звуковых файлов, что Scratch и не снилось! И с разрешением в Роблокс все в порядке!

И, как говорится: "Терпение и труд все перетрут!" Стало получаться! За плечами нашего курсанта разработка уже нескольких Роблокс-игр. И если первые две игры были созданы из уже готовых моделей и без самостоятельного кодирования, то последующие строились с использованием своих кодов, что сделало игры классными и сразу отразилось на их посещаемости другими игроками. Более того, мальчишке захотелось поделиться знаниям, полученными из изучения (англоязычных) инструкций Роблокса, и собственными лайфхаками - он освоил видеоредактор Movavi. После серии видеороликов, созданных в помощь фанатам популярных Роблокс-игр, он решил начать публиковать уроки по программированию в Роблокс на своем youtube-канале и приглашает всех желающих стать его подписчиками-учениками. Понятно, что нельзя было не пригласить в читатели журнала и программистов-скрэтчеров. На его "профиле" сайта "Scratch" появились соответствующие мультики-приглашения.

В сравнении со многими имеющимися в youtube роликами, уроки юного преподавателя имеют несомненные достоинства: они компактны и очень качественны - с ними разберется даже первоклашка! А уж тем, кто освоил Scratch - тем более! Особое достоинство скриптов, описываемых юным учителем - наличие комментариев к каждой строке кода. Его устные объяснения коротки, но очень продуманны и потому его уроки воспринимаются очень легко. Важно, что автор сразу же демонстрирует и варианты модификации своих программ. Применив эти модификации, каждый сможет запрограммировать именно то, что ему нужно. Приглашайте ваших детей поучиться! Это легко и интересно!

И еще, говорят: "Привычка - вторая натура!" Дети могут начать множить то, к чему привыкли. Но, им вовсе не обязательно создавать свои "симуляторы-убийства". Помогите им придумать сюжет своей "доброй" игры. А в качестве примера покажите им игру "Космос", созданную тем же юным преподавателем! В ней каждый сможет стать космонавтом-исследователем, открыть для себя планеты и спутники Солнечной системы, побывать на МКС, полетать на летающих тарелках и даже поискать клады космических пиратов. Посмотрите захватывающий ролик об этой игре! Уверен, вы сами (ктов нашем с вами детстве не мечтал стать космонавтом?) захотите сыграть в эту игру. Возьмите и поиграйте! Это - просто круто!

Или вот еще одна его относительно "мирная" Роблокс-игра - "Полигон". Здесь начинающий игрок-роблоксер научится ловко управлять своим игровым аватаром и боевой техникой - танками и БТРами. Это - ролевая игра, в которой можно, начав призывником, стать крутым бойцом спецназа военной разведки, научиться метко стрелять и преодолевать сложные препятствия на танках "Армата" и "Т-70".

Думаете это просто? - Ошибаетесь! Модели танков, БТР и автомобилей в Роблокс не всегда имеют низко расположенный центр тяжести. Поэтому иногда даже наезд гусениц танка на самый обыкновенный бордюр дороги может приводить к опрокидыванию модели, в которой сидит ваш аватар. Метко стрелять из танка по подвижным мишеням - тоже не просто! А когда вы станете "профи", вы сможете примерить на себя роль врага-диверсанта, попробовать разыскать секретный центр управления и запустить ядерную ракету или телепортироваться в игру "Зона боевых действий", чтобы помочь "нашим" и, победив врага, под звуки российского гимна поднять флаг Родины...

Что же, давайте пожелаем всем нашим детям успеха! Ведь им придется жить в мире куда более сложном и конкурентном, чем мир сегодняшний (роботы и искусственный интеллект наступают ).

Подробнее..

Про обучение программированию и предновогодние хлопоты деда-роблоксера

29.12.2020 14:10:26 | Автор: admin
Недавно прочитал, что многие знаменитые и богатые люди в конце своего жизненного пути жалели только об одном что не уделяли достаточного времени и внимания своим детям. Издание Коммерсант приводит цитату: Ничто не приносит большего удовлетворения, чем участие в процессах, превосходящих длительность твоей собственной жизни. Все верно! Мне почти 70. И я счастливый дед! У меня есть внук единственный и такой замечательный! Мне доставляет огромное удовольствие быть с ним рядом и хоть чем-то помогать ему. Расскажу, если интересно, про обучение внука программированию и о своих предновогодних хлопотах. Будет, что посмотреть, будут и любопытные ссылки.



Первый планшет у внука появился в 3 года одновременно с наборами конструктора Лего. С планшетом появились Angry Birds, затем игра, в которой свин-механик должен был изобретать разнообразные самодвижущиеся повозки, чтобы суметь пройти одну за другой сложные трассы и собрать все тортики и сокровища. В свои пять лет внук удивил наличием архитектурных талантов строил в Minecraft дома и железные дороги, где самодвижущиеся тележки, проехав по горам по долам, неожиданно спрыгивали с высоченной горы, но вновь попадали на проложенные внизу рельсы и могли продолжить свой путь. А прилетев из отпуска в Турции, построил в Minecraft самолет, в котором все было, как в жизни: можно было прогуляться по такому же, как у настоящего самолета, салону, войти в кабину пилотов и даже выйти на крыло. При этом самолет висел в воздухе летел! Конечно же, добрался он в Minecraft и до режима выживания. Но, я убеждал и убедил его (приводя самые разные аргументы), что это оглупляющий режим игры ничему не обучающий, не дающий никаких дополнительных знаний и навыков. Строил внук и танки, и шагоходных роботов из Звездных войн. Но, двигаться они не умели! Строил квесты, где игрок должен был собрать все (заранее спрятанные) звездочки. Но и это со временем приелось. Нужно было что-то другое! И вот за месяц до 2017г его папа поставил на ноутбук внука Scratch (ver.1.4).

До этого мое участие в занятиях внука с компьютером было лишь зрительское. Scratch превратил меня в активного помощника в обучении программированию. Опыт программирования у меня был. С 1974 по 1988 я работал в КБ оборонного завода, где участвовал в разработке ЗРК Тунгуска и в решении многочисленных вопросов (сопровождении) серийного производства электроники ЗРК Бук и Купол. Разрабатывал (на Электронике-60), а затем переводил в код отечественных микропроцессорных комплектов программу дальномера Тунгуски и отлаживал ее работу на макетах. Далее опытные образцы аппаратуры, типовые испытания и поездки на полигоны на стрельбы. Затем серийное производство. В 1988 ушел с завода и стал руководителем одной из лабораторий НИИ Комплексной Миниатюризации Аппаратуры Управления Ульяновского Центра Микроэлектроники. К 1993г мы разработали и изготовили партию встраиваемых в IBM-PC 11-разрядных АЦП/ЦАП. Пытались начать реализацию этих модулей в комплекте с большим пакетом прикладных программ с открытым кодом (на Turbo Pascal). Но, в перестройку, ни у кого не оказалось денег на такие приобретения, хотя наша разработка была на уровне очень хороших зарубежных и имела 10кратно меньшую стоимость.

Короче, с Новым 2017 годом внук поздравил своих родителей своей первой программой. Спрайты героев программы (Деда-мороза, оленей и др.) пришлось, конечно же, создавать мне (в 7 лет еще не до Photoshop). Но коды движений спрайтов и коды нот новогодней песни Jingle bells внук сделал сам. Понравилось ему делать и озвучку, имитируя низкий голос Деда-мороза (использовали программу Audacity).

До этого у меня и мыслей никаких не было о том, чтобы учить внука программированию. Но прочитав интервью разработчика Scratch Митча Резника, я буквально прозрел: На дворе 4-я технологическая революция! При этом, оказалось, в России самое малое число детей-программистов. А во всех (ну хорошо, в 30-ти) развитых странах уже обучают программированию с первых классов школы (при том, что в Англии дети начинают учиться с 5 лет, а в Китае учат программированию с 3-х лет и с 5-го класса изучают искусственный интеллект и не только в теории, но и на лабораторных занятиях). Стал всячески поддерживать мотивацию внука к разработке программ.



Следующей была программа-сказка про его домашнего питомца кота английской породы Чосера. И понеслось: внук один за другим придумывал сценарии, я ваял картинки спрайтов, когда случались затруднения подсказывал, как лучше написать код. Внук писал программу за программой Поздравления: с днем варенья мамы, с 8Марта, с Днем Защитника Отечества. Затем (как же без этого!) простенький, но свой World of tanks! Потом еще один. Потом вместе разобрались, как работает их домашний пылесос iRobot и пассажирский лифт. Потом (на летних каникулах после 1-го класса) появилась обучалка по таблице умножения и (простенький всего на несколько букв) симулятор широко известного клавиатурного тренажера Baby Type. Смастерил свой собственный Minecraft, в котором можно строить все, что угодно, а затем и Minecraft-робот способный автоматически построить средневековый замок после нажатия всего одной кнопки. Завел себе студию на сайте Scratch (см. @JV_D).



Больше, чем робототехника внука привлекали истории хотелось продолжить рассказ про Чосера. Появилась Зона-51, где Чосер лицом к лицу встречается с пришельцами. Затем Чосер примерил на себя роль детектива и принял участие в расследовании сенсационной пропажи любимого слона английской королевы. Это был 3-серийный мультик Месть Иностранца с табуреткой по мотивам знаменитого советского мультика Следствие ведут Колобки и зарубежного мультика Финис и Ферб. Кстати, в 2019-м Месть иностранца с табуреткой заняла 2-е место в международной Scratch-Олимпиаде в своей возрастной категории. Незадолго перед конкурсом я показал внуку программу-симулятор советского аттракциона Морской бой, в который любила играть его мама. Программа понравилась и была реализована внуком в Scratch-версии. Но, до него аналогичные программы заявили на конкурс еще несколько юных программистов, и решено было заявить на Олимпиаду Месть иностранца.


Потом мотивация к Scratch-программированию немножко снизилась. Хотелось трехмерности! Еще в 2017-м изобретательский опыт подсказал простое решение: можно создавать квази-3D программы! Берем любую трехмерную модель, например, лего-солдатика или танк Т-34 из шоколадного яйца. Ставим его под фотоаппарат на поворотную платформу. Поворачиваем и делаем 30 фотографий через каждые 12 градусов. Все! Можно писать код, и ваш трехмерный танк будет ходить по экрану компьютера, поворачивать в любую сторону и стрелять. Внук стал создавать в своих программах и квази-трехмерные здания. Танк мог проезжать за ними временно становясь невидимым. Мог наезжать и ломать эти строения, превращая их в груды обломков.

Но, с главным случился облом! Танк мог лишь ездить, громыхать и демонстрировать дульные вспышки при выстреле. А внуку, естественно, хотелось большего: должны летать снаряды и они должны уметь поражать цели! Казалось бы, нет проблем? Но внук учился всего лишь в 3 классе, и тригонометрические функции они еще не проходили. Объяснить про синусы и косинусы получилось далеко не с первого раза уже в 4 классе. Как говорится: не боги горшки обжигают разобрался. Снаряды полетели! И на очередной конкурс Scratch-Олимпиады 2020 года внук подал заявку уже не в своей, а в более старшей возрастной категории Игры. Это была игра Дуэль танков. По полю боя ходят два 3D-танка: советский Т-34 и немецкий Тигр-2. Круто! Но и это не все! Если танком Т-34 управляет геймер, то (вы не поверите!) Тигром управляет бот -искусственный интеллект! И выиграть у Тигра довольно сложно! У меня, сколько я ни пробовал, не получается! Тигр лихо маневрирует на поле боя и стреляет очень метко. Очень быстро его перевес в очках превышает 5 баллов, и игра заканчивается. Но внук, как правило, одерживает победу! Проект вновь занял почетное 2-е место в Олимпиаде. А в Курской битве которая появилась следом за Дуэлью могут сражаться друг с другом два геймера.


К 75-летию Великой Победы внук разработал документальный проект Фронтовые сестрички. Идея была моя использовать рассказы о войне ветеранов из книги У войны не женское лицо. Внуку идея понравилась. Оценили проекты и на областном конкурсе школьных программистов Мастер-ИТ 2020г.


В российской начальной школе с программированием пока никак. В национальной программе цифровизации места ученикам начальной школы не нашлось. Можно только позавидовать первоклашкам английским, каждому из которых правительство безвозмездно, то есть, даром, выдает миниатюрный контроллер Micro:bit. В состав этого маленького приборчика размером со спичечный коробок входят миниатюрный дисплей, акселерометр (3-осевой датчик положения в пространстве и шок-сенсор), компас, измеритель освещенности и вполне серьезное (до спич-процессора) ПО. Подключаешь к USB-порту компьютера и, вуаля! изучай хоть Python, хоть Java Script. А можешь программировать его в среде Scratch. Можно также докупить комплектующие и конструируй роботов. Активным родителям флаг в руки! Ваш ребенок запросто сможет превратить Micro:bit в калькулятор, музыкальную шкатулку, компас, наручные часы, охранное устройство и др. На нем можно запрограммировать интересные компьютерные игры, включая, Тетрис. До Тетриса внук не дошел, но краткий курс Python был пройден: разработаны-отлажены многие скрипты подпрограмм различного назначения, 20-минутная напоминалка о том, что пора сделать перерыв в работе с компьютером, и две компьютерных игры.


Незаметно, проклюнулось увлечение играми Роблокс. Роблокс-Студию папа поставил на компьютер еще в начале 2019г. Но, ни я, ни внук не восприняли ее серьезно. Это же, как набор Лего! Но, согласитесь, отсутствие трехмерности и очень низкое разрешение изображений в Scratch это не то, чем современный 11-летний подросток может блеснуть перед сверстниками. И внук начал изменять Scratch, почти подпольно занимаясь разработкой игр в Роблокс-Студии. Когда я увидел его первую игру, стало понятно, чем взял Роблокс. Естественно, это был всего лишь, workplace, наполненный моделями из toolbox. Но это был НАСТОЯЩИЙ трехмерный мир! И в этом мире его аватар делал все, что хотел! Почти полная свобода! Плюс исходно включенные законы физики! Кто может устоять перед этим? Опять таки, архитектурные таланты не желали пропадать в туне с увлечением строились Ньюка-тауны и бункеры с лабораториями по исследованию SCP-нечисти. Очень быстро была освоена технология создания и модификации ландшафтов. Внук умеет манипулировать погодой и создавать местности с какими-то особыми свойствами и настроением как на полотнах великих импрессионистов.

Что же? Нужно помогать! Начал сам изучать Роблокс. Надо сказать это не для подростка. Вроде бы есть англоязычный туториал переведи и все! С переводом-то проблем нет! Но в нем, что называется отрывки из обрывков, и получается как в песне: Нет, все понятно, но, что конкретно? Посмотрел на ЛитРес содержание нескольких книг по Роблокс не то! А у внука проблема! Прорыскал англоязычный Интернет нашел, как можно менять карты с разными terrain в ходе игры. Одной проблемой меньше! Внук моментально внедрил скрипт и создал военную игру, в которой Буря в пустыне меняется на Бой спецназа с пиратами, а затем на Разведку боем с вертолета. Идем дальше Внук строит паркур. Выглядит красиво, но мало спецэффектов! Учусь сам и подсказываю, как используя понятия Position и CFrame можно использовать уже известные из Scratch и Python циклы if и while true, чтобы площадки, по которым прыгают игроки, начали вращаться или совершать поступательные движения. Паркур стал эффектней. Радует, что внук действует по принципу: Научился сам научи других!. Видеоролики по программированию в Scratch, подсказки по разработке программ для Micro:bit и уроки программирования в Роблокс регулярно выкладываются на Youtube-канал внука.


Следом, внук построил в Роблокс-Студии космодром и почти всю Солнечную систему. Впечатляет! Есть готовые летающие тарелки и космолеты. Правда, многоступенчатые ракеты могут летать лишь в некотором исходно заданном направлении то есть, в никуда! Но, зато радар на космической станции уже вращается, и передвигаться по космодрому можно на автоматических вагончиках. Двери открываются автоматически при подходе космонавта (пригодились знания, полученные при строительстве паркура). Надо помогать! Начинаем вместе изучать скрипты, управляющие ракетами и разбираемся с координатами посадочных площадок. Готово! Ракеты стартуют и летят, приземляясь куда нужно! Но в каждой игре должна быть какая-то цель! Устраиваем мозговой штурм. Придумали! Космический пират Дрейк похитил некие важные артефакты у жителей могущественной Системы Трех Солнц и они грозятся уничтожить всю Землю. Космическая полиция гонится за Дрейком, но его космолет разбивается и Дрейк гибнет. И артефактов в космолете пирата нет! Правительство Земли объявляет, что заплатит огромную сумму тем, кто найдет артефакты Срочно ищем, как начислять баллы за найденные в игре артефакты, и игра готова! Посмотрите рекламный трейлер, отснятый внуком в Bandicam и отредактированный им же в Movavi. Согласитесь для 11 лет круто! Это радует, потому, что дает надежды на то, что с подобного рода знаниями и навыками внуку может быть будет чуть легче и интереснее жить в том новом мире, который складывается в ходе 4-й технологической революции.


Я уже упомянул нашу общеобразовательную школу. Отмечу еще один, на мой взгляд, вопиющий факт приснопамятную для многих родителей школьную проектную деятельность. Как ни странно, отечественные академики-педагоги с увлечением пишут статьи, в которых констатируют, что школьные педагоги сами не понимают сути проектной деятельности, но дальше этого дело не идет. Кто же интересно должен, наконец, научить учителей? Как ни верти, рулят этим чиновники от образования. И результат примерно такой, как с развитием в стране предпринимательства. И в лицее, где внук учился до пандемии, и в (иногородней) школе дистанционного обучения, где он учится сейчас, преподаватели подавляют малейшие попытки создания школьных проектов методом программирования и иными информационными технологиями. В каждом из классов стоят компьютеры, но ученику не дозволяют вывести на экран школьного монитора (или в Skype-чат) свою программу. Даже на уроках изо нельзя пользоваться Photoshop! Такая вот цифровизация

Новая игра новые проблемы! Ролевая игра, а именно такие сейчас довольно популярны среди сверстников внука, означает, что нужно уметь присваивать игрокам различные теги. Нужно, чтобы солдаты-боты стреляли только в игроков-диверсантов. Читаем туториал: казалось бы простейший скрипт ставь и получишь искомый результат! Но, оказывается не факт. Скрипт не работает!

Еще проблема: игра внука Полигон это тренировочная площадка, где из неопытных призывников делают настоящих профессионалов спецназа и офицеров, и, казалось бы, логично иметь возможность командировать (телепортировать) обученных в игре профи в ранее созданную Зону боевых действий. Есть в туториале раздел и про телепортацию. Но, вы уже догадались приведенный там скрипт также не работает! Есть у Роблокса и чат, где люди обсуждают свои проблемы. Сообщения в чате о том, что телепорт не хочет работать нашел, а вот подсказок, как решить проблему нет. Попытки телепортации приводят к выдаче кода ошибки, но, понять причину из расшифровки кодов ошибок не получается. Обращение в службу технической поддержки тоже не помогло прислали формальную отписку на тему абсолютно не связанную с вопросом.

В Полигоне внук создал отличную полосу препятствий, на которой можно и нужно тренировать навыки вождения техники Роблокс. Оказывается, это не так просто. Например, при наезде на обычный дорожный бордюр ваш танк или бронетранспортер могут перевернуться (в моделях трудно правильно выставить центры тяжести). Проблемой может оказаться и выезд танка из мелкого водоема. Но ведь, все мы видим, как лихо танки проходят такие препятствия на танковых биатлонах! Полоса препятствий отличный способ обучить геймера вождению боевой техники. Так-то оно так! И с этим все хорошо. Но, какой танковый биатлон без стрельбы? И хотелось бы, чтобы меткая стрельба отличалась от пальбы в молоко. То есть, нужно научить танки присваивать баллы их командирам за каждое меткое попадание в (подвижную) мишень. Изучаю скрипт танка. Вроде бы все понятно: как только (специально формируемый для этого) луч упирается в какую-нибудь Part, нужно понять не мишень ли это и присвоить игроку баллы точно также как их присваивали в игре про пирата Дрейка. Пишу один вариант кода за другим фиг вам = индейская хижина А на носу Новый год и очень хочется, помочь внуку добить игру к празднику!

Ба! Да я совсем забыл, что существует фриланс! Регистрируюсь в заказчики Хабр-Фриланса.
Результат никакой: за три дня 28 просмотров моей заявки, а откликов ноль! Хорошо, может быть, это не совсем подпадает под специфику основного контингента посетителей Хабра? Ищу фриланс в других местах. Нашел еще: Kwork. Вбиваю в поиск Lua, и сразу же нахожу предложение по взлому Роблокс-игр. Достаточно лишь указать исполнителю какую! Мне этого не нужно, но уж если человек может взломать любую игру, то уж три простых скрипта явно не проблема! Пишу в чате исполнителю ответа нет! Специалист находится в оффлайне 3 суток. Потом появляется, но ответа не дает. Но моя заявка по-прежнему вывешена в общий доступ. Через день уже 128 просмотров. Но, отклик ВСЕГО ОДИН! Человек пишет, что готов решить проблемы, но в данный момент занят. Через день, заботясь о Заказчиках, Kwork пишет мне, что можно самому поискать специалистов, исходя из размещенных ими профессиональных резюме. Ищу, нахожу тех, кто занимается разработкой игр, пишу и получаю отказы один за другим. Наконец, через три дня освобождается тот, кто был готов, но был занят. И, ура! Он решает наши с внуком проблемы одну за другой! Успели! Игру можно завершить до Нового года! Не так просто, но деду-программисту все-таки удалось поздравить внука-роблоксера с Новым годом. Ну, что же, век живи век учись дед!
Подробнее..

Scratch JR развитие логики и знакомство с основами программирования для дошкольников

06.04.2021 22:08:34 | Автор: admin

Еще совсем недавно, в семидесятых годах прошлого века, программисты были бородатыми мудрецами и почти ни у кого не возникала мысль подпускать школьников к такой крутой дорогостоящей технике. Но с повсеместным распространением компьютеров в конце восьмидесятых, появились и первые школьные компьютеры, писать программы на которых могли только самые продвинутые старшеклассники. Большинство родителей и в наше время считают что программирование удел избранных, и даже не подозревают о том, что их малыш 5-6 летнего возраста уже может составлять алгоритмы для исполнителей и создавать первые программы. Это настолько красочный, интересный и увлекательный процесс, что дети думают что они играют, а на самом деле в этот момент они получают цифровые навыки 21 века.

Один из лучших инструментов для знакомствадетей с программированием Scratch JR графическая среда для создания первых проектов в цифровом мире.

Интерфейс Scratch JR на планшете

Работает Scratch JR на большинстве популярных планшетов, на iPad, на Android и даже на Kindle. Также можноустановить Scratch JR на ноутбукна Macина PC).

Интерфейс Scratch JR на компьютере

Единственное отличие компьютерной версии главный персонаж не котенок, а смешной инопланетянин Тик. Главное дать ребенку для работы ноутбук с тачпадом, так-как с мышкой дошколята еще не справляются.

Учить детей программированию на Scratch JR совсем не сложно. Просто перетаскивайте разноцветные блоки вниз и соединяйте. Первым всегда идет желтый блок с условием выполнения. Посмотрите как запрограммировать персонажа чтобы он подпрыгивал, когда мы нажимаем на него (пальчиком на планшете, и мышкой на ноутбуке).

Соединение блоков

А вот так юный программист может запрограммировать перемещение персонажа на 10 клеточек вправо (клеточки включаются кнопкой вверху).

Включение сетки

Обратите внимание! Тик стоял на клеточке 4, а после перемещения вправо оказался на клеточке 14, таким образом, включая клеточки, мы превратили Scratch JR в идеальный математический тренажер для подготовки к школе!

Создавая свои первые цифровые проекты дошкольники научатся не только программировать, но и хорошо считать, ведь для перемещения персонажа вправо надо будет складывать числа, а для перемещения влево вычитать.

Вот, посмотрите, чтобы взять яблоко, Тику надо сделать 10 шагов направо. А как мы это поняли? Мы от 15 (где лежит яблоко), отняли 5 (где стоит Тик), и получилось 10.

Устный счет

А на этой картинке Тику надо подпрыгнуть вверх на 8 клеточек, чтобы слопать персик. А как же мы это посчитали? Надо из 12 (высоты персика над полом), отнять 4 (высоту Тика над полом), и получится 8.

Изучение арифметики

Персик запрограммирован вот так, поэтому при касании Тика он уменьшится в 2 раза.

Скрипт персика

Добавлять новых персонажей и предметы очень легко надо нажать на плюсик и выбрать любого персонажа из библиотеки. Кроме фантастических персонажей есть и люди, и домашние животные, и техника и постройки.

Добавление персонажа

Изменить фон тоже совсем не сложно. В библиотеке фонов есть и природа, и времена года, и космос и сцены внутри помещения.

Изменение фона

Таким образом программирование на Scratch JR позволяет ребенку не только прокачать математические способности и алгоритмическое мышление, но и важнейшее качество 21 века креативность, способность сочинять свои собственные истории и рассказывать их в цифровом мире.

Ведь не секрет, что скоро многие профессии заменит искусственный интеллект, и только творческие, креативные профессии останутся с нами надолго. Поэтому наша задача помочь нашим детям максимально развивать креативность и умение создавать цифровые проекты чтобы они нашли для себя хорошее место в современном мире.

Обязательно установите Scratch JR, и покажите его детям, я уверен, что они быстро освоятся и начнут креативить, а чтобы вам было немного проще, можете использовать мою книгу, в которой есть идеи 16 проектов для юных программистов.

Бестселлер про создание проектов на Scratch JR

Также можете использовать уроки по программированию на Scratch JR по ссылкеhttps://codim.online/ScratchJR

Подробнее..

Новости из мира детского программирования на Scratch

29.04.2021 12:05:53 | Автор: admin

В конце статьи ссылка на интереснейшие проекты на Scratch, а пока расскажу про прекрасные новости о новых возможностях этого языка программирования.

Разработчики Scratch создали онлайн-лабораторию для испытаний новых функций Scratch. Сейчас доступны два экспериментальных расширения Scratch.

Первое для создания красивого текста, а второе для работы с использованием видеокамеры для перемещения спрайтов в определенную часть вашей головы.

Давайте протестируем расширение для создания анимированного текста.

Перейдите по ссылке для запуска этого расширенияhttps://lab.scratch.mit.edu/text/

Как видите это не совсем обычный Scratch, внизу добавлено новое расширение с блоками зеленого цвета. Соберите скрипт для надписи текста. Обратите внимание, теперь не просто спрайт произносит текст в облачке, теперь сам спрайт исчезает и вместо него появляется красивый текст.

Мне очень понравилось это расширение! С ним можно сделать очень красивые поздравительные открытки! Скорее бы его добавили в продакт. Давайте протестируем все возможности нового расширения.

Русский язык поддерживает, но слишком близко прилепило восклицательный знак.

Оставим feedback.

Не ленитесь тоже оставлять отзывы, так разработчики быстрее исправят все недостатки и добавят это расширение в Scratch.

Следующий блок позволяет добавить эффекты к тексту, например эффект радуги.

Или эффект печатающегося текста.

Или эффект увеличивающегося текста.

Следующий блок позволяет скрывать текст и показывать спрайт.

Также есть блоки для изменения цвета текста и шрифта.

И последний блок позволяет задавать ширину области вывода текста и выравнивание.

Очень полезное расширение!

А теперь давайте протестируем второе расширение, для работы которого нужна видеокамера.

Перейдите по ссылкеhttps://lab.scratch.mit.edu/face/и нажмите на синюю кнопкуTry it out

Разрешите браузеру использовать видеокамеру на этом сайте.

Соберите следующий скрипт, который поместит спрайт на нос.

Это расширение использует искусственный интеллект для распознавания вашей головы, думаю скоро его научат распознавать и другие объекты!

Кроме носа спрайт можно поместить в любое место головы? например между глаз это идеальное место для очков!

Следующий блок позволяет автоматически изменять размер спрайта в соответствии с размером головы это важно когда вы приближаетесь и удаляетесь от камеры.

Еще один блок поможет наклонять спрайт одновременно с наклоном головы.

Кроме очков можно добавить и шляпу? задав ей положение в верхней части головы.

Еще есть несколько блоков для использования в заголовке скрипта и несколько логических блоков. Протестируйте их работу самостоятельно и не забудьте отправить обратную связь разработчикам в случае обнаружения ошибок.

Интересные проекты

Посмотрите пожалуйста проект про Сказку Морозко и затем сравните ее с ремиксом, который автор проекта создавал целых 4 часа. Звуковое сопровождение и текст остались без изменений, но автор ремикса переделал все фоны и спрайты.

оригинальный проект

https://scratch.mit.edu/projects/195516032/

Сказка Морозко - ремикс.

https://scratch.mit.edu/projects/504660898/

И, конечно, не забывайте о моих детских онлайн курсах по программированию на Scratchhttps://codim.online/Scratch

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru