Частина 1.
Згідно сучасної концепції української середньої базової освіти, програмування складає вагому частину курсу інформатики. Це імітаційні середовища на кшталт code.org (стаття на Плетиві) , це Scratch, в якому можна створювати цікаві речі. Це багато інших чудових систем і концепцій, що знаходять, пишуть, перекладають і використовують неспокійні душею вчителі. І незважаючи на очевидну революцію штучного інтелекту, в освіті залишаються актуальними ці самі неспокійні вчителі поряд з неспокійними учнями-ачомучками.
Програмування розумних пристроїв. Для чого це може бути корисним? Які проєкти можна реалізувати в даному напрямку?
Реальна задача: систематично вимірЯти вологість ґрунту в вазонах по школі. Не використовувати ж для цього цілий комп’ютер чи ноутбук. Це незручно, дорого. Крім того, треба якось подружити ноутбук і якісь датчик, що безпосередньо буде вставлятися в землю. І потрібно буде носити за собою датчик разом з ноутбуком, дротами і брудними від ґрунту руками.
А якщо купити контролер за 70 гривень, датчик вологості за 100 гривень, невеликий екран за 60 гривень. Все це вкласти в якийсь корпус а для живлення використати звичайний павербанк? Залишиться написати програму для роботи цього пристрою. Завдяки великій кількості бібліотек, програмування такого контролера виходить зовсім нескладним. Особисто у мене програма для такого пристрою вийшла менше 100 рядків коду, більша частина з яких про те, в якому місці екрану і як вивести текст. І більшу частину коду я знайшов в інтернеті, де безкоштовно пояснили деталі. Готовий пристрій був подарований вчительці біології, яка опікується шкільними рослинами.
Ще один приклад з реалізованих – система моніторингу якості повітря в приміщенні, де перебувають люди. Той самий контролер за 70 гривень, екран за 60 гривень, високоточний датчик температури і вологості (DHT22) – 150 гривень, датчик СО2 (MH-Z19B) – тисяча гривень. Останній датчик мені подарували. Програма для даного пристрою у мене вийшла також менше 100 рядків коду. Ось приклад, як воно працює, ще без корпусу:
В реальності екран так не мерехтить. А готовий пристрій моніторить повітря в кабінеті, де я працюю, він виручив нас і при регулюванні системи вентиляції в шкільному укритті.
На цьому самому контролері вже три роки працюють шкільні розумні годинники, що повідомляють про час уроків і перерв, виводять інформаційні повідомлення. Ось опис і відео роботи цього годинника на Плетиві.
Всі ці пристрої я будував на контролері NodeMCU. Він дешевий, в Китаї можна знайти такий за 70 гривен. Це набагато дешевше, ніж, припустимо micro:bit, що розроблений BBC для використання в комп’ютерній освіті Сполученого Королівства, що коштує в Україні біля тисячі гривень. NodeMCU – значно дешевший. Якщо більше немає грошей, то можна лише його купити і вже цього достатньо. Беремо кабель від зарядки телефону (micrоUSB) і підключаємо цей контролер до комп’ютера. На контролері є вбудований світлодіод і ми можемо їм керувати. Запалювати і виключати. Як це робити? Спитайте в інтернеті «NodeMCU blink». Для багатьох першою програмою для контролера і є керування вбудованим світлодіодом.
Якщо є можливість і хочеться трохи більше, то можна докупити ще щось цікаве. Для своїх експериментів я використовую окрім NodeMCU світлодіодну панель MAX7219. Ось так вона виглядає і коштує близько 160 грн.
Щоб з’єднати контролер і панель паяти нічого не треба. Проводи входять в комплект, а для наших експериментів додатковий роз’єм не потрібний.
В січні 2021 року я на своєму гуртку вперше спробував програмування контролерів. На комп’ютери заздалегідь поставив все необхідне програмне забезпечення. В папці-проекті був зразок коду, так званий скетч. Учні відкрили папку, переробили скетч, одним кліком мишки скомпілювали зі скетча бінарний файл та залили його в контролер.
Все відразу і запрацювало, тобто при невеличкій стартовій підготовці програмування контролеру може мати достатньо низький поріг входження.
Ось, результати першого уроку:
Автор – Олександр Соколов
Автор – Дмитро Маловатов
Звертаю увагу – це перший урок. Тобто, немає нічого складного, якщо заздалегідь поставити необхідне програмне забезпечення. Хочете засвітити світлодіод – вкажіть його координати.
Нескладно. Недорого. Цікаво?
В другій частині статті буде покрокова інструкція як зробити таке (тут відео в динаміці):
(продовження, частина друга)
Пропоную розглянути чудову задачу «Булочки» з сайту eolymp.com. Безумовним плюсом задачі, як на мене, є простота умови і чудова родзинка, яку психологи називають «розрив шаблону».
Булочки
https://www.eolymp.com/uk/problems/11379
Умова:
Хусейн дуже любить булочки, які продаються в університеті. Відомо, що
- можна купити одну булочку за a гяпиків;
- можна купити три булочки за b гяпиків;
Хусейн хоче придбати точно n булочок. Яку найменшу кількість гяпиків йому слід витратити?
Вхідні дані:
Три натуральні числа a, b і n, кожне з яких не більше 10^9.
Вихідні дані:
Виведіть найменшу кількість гяпиків, яку слід витратити Хусейну для покупки точно n булочок.
Приклад
Вхідні дані :
2 5 10
Вихідні дані:
17
Автор: Михаил Медведев
Розглянемо тестовий приклад. Одна булочка коштує два гяпіка. Але три булочки коштують не шість, а п’ять гапіків. Ми бачимо зрозумілу оптову ціну. Якщо купити відразу три, то кожна булочка буде трохи дешевше, а саме 5 / 3 = 1,67 гяпіка. Очевидно, що при оптових знижках нам варто купити якомога більше «трійок булочок», а вже далі доповнити нашу купівлю одиночними, більш дорогими булочками.
В тестовому прикладі нам треба купити 10 булочок. Давайте порахуємо максимальну кількість трійок, що ми можемо купити. 10 // 3 = 3. Тобто ми можемо купити три рази по три булочки і таким чином заплатимо 5 + 5 + 5 = 15 гяпіків. Це так ми купимо дев’ять булочок. Ну а десяту вже купимо подорожче, за два гяпіка.
В булочках у нас буде така купівля: три + три + три + одна.
В грошах у нас буде така купівля: 5 + 5 + 5 + 2 = 17.
Ці 17 гяпіків – це і є відповідь, яку ми бачимо в тестовому прикладі.
І якщо ми напишемо код, то здамо задачу… лише на 80%. А чого?
А тому що автор гарно підказав нам типовий приклад. І тому що ми всі звикли, що оптом – дешевше. Це – шаблон. Але… А хто нам обіцяв, що так завжди? А давайте знайдемо розв’язок, коли будуть такі умови:
2 (ціна однієї одиночної булочки)
7 (ціни трьої булочок, от такий дивний опт, а хто сказав, що не буває?)
10 (скільки Хусейну треба купити булочок)
Звичайно, що тоді Хусейну і дарма не треба такі оптові ціни, бо поштучно булочки дешевше.
Гарна задача, так?
То здавайте! )
Відома американська корпорація Autodesk в 2011 році запустила Tinkercad — безкоштовне 3D-моделювання в браузері.
Мета даної статті – короткий огляд можливостей Tinkercad для навчання учнів.
При безкоштовній реєстрації можна вказати, що ви – вчитель і отримати зручні можливості для роботи з учнями. Після реєстрації вчителю можна створити класи, які будуть ізольовані, тобто по замовчуванню проєкти учнів будуть мати статус приватних їх будуть бачити лише самі учні-автори і вчитель. Це дуже зручно для перевірки – вчитель заходить в клас на сайті Tinkercad і переглядає роботи учнів.
Так виглядає меню класів:
Дуже зручно на сайті реалізована система реєстрації учнів. При створенні кожного класу (або групи, якщо клас ділиться на групи) формується окреме посилання, яке передається учням. Особисто я використовую Google Workspace for Education, тому посилання на приєднання викладаю в Google Classroom. Учні групи з Google Classroom переходять за посиланням і можуть зайти в свою групу, використовуючі шкільний корпоративний акаунт:
Ніякої спеціальної реєстрації не потрібно, все просто.
Учні і вчитель можуть станом на 2023 рік створювати три типи проєктів (в системі вони звуться Designs): 3D, Circuits, Codeblocks
При створенні 3D проєкту можна обирати не лише куби та циліндри, можна малювати в редакторі свої об'єкти а також обирати інші елементи з бібліотеки:
Можна створити проєкт, назвати його і зберегти – для цього натиснути на логотип в лівому верхньому куті. Збережені проєкти можна редагувати.
При роботі доступні інструменти – вирівнювання, групування, зеркалювання. Є Undo, Ctrl+C, Ctrl+V також працюють.
Це – поганий приклад, примітивний, але свій )
Достатньо цікавим є створення проєктів в Circuits. Ми з учнями згадували фізику, паралельне і послідовне з’єднання. Міряли тестером струм, що тече через світлодіод, а потім проводили симуляцію цього в Circuits. Підбирали струмообмежуючий резистор для світлодіоду при використанні дев’ятивольтової батареї (тим, кому більше 40 років знають її з іменем «Крона»).
Ось приклад симуляції, обмеження струму світлодіоду підбором резистора:
Варто звернути увагу, в системі є можливість симуляції з використанням Arduino та Micro:bit
І третій тип проєктів – Codeblocks, який буде зрозумілим всім любителям блокового програмування. В даному типі проєктів можна з блоків складати програми. Ось приклад, танцюючий Мурчик )
Складаємо програму, запускаємо на виконання – працює.
Безумовно, Tinkercad – це не 3ds Max – топовий продукт корпорації Autodesk. З іншої сторони, чи багато шкіл можуть купити 3ds Max? Ось прайс з офіційного сайту:
А ще варто проаналізувати ефективність 3sd Max в звичайній школі. Безумовно, ніхто не зменшує чудові можливості безкоштовного Blender.
При цьому простий, зрозумілий, з низьким порогом входження Tinkercad, як на мене, вартий уваги.
Анатолій Анатолійович,
червень 2023
Особисто мені дуже подобаються задачі з кількома розв’язками. Вони навчають споглядати світ навколо з різних сторін.
Одну з таких задач і пропоную вашій увазі.
Я побачив одне рішення, моя учениця Анастасія – ще одне. А, можливо, їх ще більше – аргументованих рішень?
Спробуйте спочатку самостійно знайти кілька рішень, а лише потім переглянути вже знайдені, натиснувши "Детальніше"
Пропоную проаналізувати і розв’язати задачу «Садівник-художник»
https://www.eolymp.com/uk/problems/17
Умова:
Після посадки дерев садівнику потрібно їх пофарбувати. У його розпорядженні є фарба трьох кольорів: біла, синя і помаранчева. Скількома способами він може пофарбувати N дерев, якщо ніякі два однакові кольори не можуть бути поруч?
Вхідні дані:
Кількість дерев N (1 ≤ N ≤ 50).
Вихідні дані:
Кількість способів фарбування.
Приклад:
Вхідні дані:
3
Вихідні дані:
12
Пропоную не звертати увагу на сам факт необхідності фарбування щойно посаджених дерев, тим більше фарбами. Давайте спробуємо розглянути не біологічну дикість, а математичну суть задачі.
У людей, що вивчають комбінаторику є відповідні формули, використання яких робить розв’язок такого роду задач ефективним і елегантним. Але можна спробувати знайти рішення «хлопським розумом», або якщо сучасною мовою, «з використанням логіки і критичного мислення».
Припустим, що у нас одне дерево. Скількома способами його можна пофарбувати? Трьома. Тобто це одне дерево можна пофарбувати білою (Б) фарбою – це один варіант. Або синьою (С) – це другий варіант. Або помаранчевою (П) – третій варіант. Отже, при N = 1 відповідь на нашу задачу – три.
Далі припустим, що у нас два дерева. Скількома способами їх можна пофарбувати так, щоб два кольори не були поряд?
Розпишемо всі варіанти для двох дерев:
БС – це дерева пофарбовані білою і сильною фарбою.
Розписуємо:
1) БС
2) БП
3) CБ
4) СП
5) ПБ
6) ПС
Звернемо увагу, що варіанти БС і СБ ми зараховуємо як різні способи. І у нас виходить шість способів.
Для трьох дерев відповідь є в тестовому прикладі задачі.
Можна спробувати спіймати формулу залежності результату від початкового N:
1 >> 3
2 >> 6
3 >> 12
Бачимо очевидне подвоєння попереднього значення результату. Для олімпіадного програмування, коли на вивід формул часу небагато, багато хто просто скористається циклом, що певну кількість разів подвоїть попереднє значення змінною, наприклад, так:
n = int(input())
s = 3
for _ in range(1, n):
s *= 2
print(s)
До речі, цей код здає задачу на 100%, але для допитливого «хлопського розуму», незважаючи на стать його носія, було б класно вивести формулу, яка б розв'язала дану задачу не циклом, що довго і негарно, а за один раз – елегантно і «вау!». Ну, повинен же бути такий спосіб? Повинен і є.
Ще раз відношення вхідних і вихідних даних:
1 >> 3
2 >> 6
3 >> 12
Спробуйте зловити формулу. Вивести, написати, підібрати. Як вийде. Нехай на це піде година. Або день чи тиждень. Але спробуйте. Покрутіть. І не читайте обговорення цієї задачі на сайті eolymp.com – там один учасник цю формулу відкрито написав. Не підглядайте туди.
Для перевірки вашої формули можна просто здати задачу на сайті eolymp.com
Формулою - швидко і гарно, можна увесь розв’язок умістити в один рядок.
Виведіть формулу, здайте задачу, ну і вже потім, з задоволенням від себе, перегляньте цю саму формулу на екциклопедії цілочислових послідовностей, ось тут:
https://oeis.org/A007283
Успіхів!
Розв’яжемо задачу «Гарне число»
https://www.eolymp.com/uk/problems/7817
Умова:
«Гарним» будемо вважати число, що складається лише з непарних цифр. Наприклад число 157953 гарне, а число 2452117 ні. Необхідно з'ясувати, скільки існує n - значних гарних чисел.
Вхідні дані
Одне ціле невід'ємне число n (1 ≤ n ≤ 20).
Вихідні дані
Вивести кількість гарних чисел.
Приклад
Вхідні дані
4
Вихідні дані
625
Розпочнемо з аналітики.
Якщо числа одноцифрові, тобто n = 1, то таких чисел десять: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Серед них гарних буде п’ять: 1, 3, 5, 7, 9.
Якщо числа двоцифрові, тобто n = 2, то таких чисел всього дев’яносто, від 10 до 99. За допомогою листочка і ручки можна за незначний час порахувати кількість гарних чисел – їх буде 25.
При n = 3 можна також порахувати кількість гарних чисел за допомогою листочка, але то ліньки, бо тризначних чисел аж 900.
При n = 4 ми вже маємо відповідь з тестового прикладу задачі, тому можна спробувати зловити формулу залежності n і результату:
1 >> 5
2 >> 25
3 >> ?
4 >> 625
Якщо ви вже бачите тут формулу – чудово, здавайте задачу. Якщо не бачите, давайте спробуємо порахувати кількість гарних чисел для n = 3.
Уточнимо задачу.
Нам потрібно перебрати всі числа від 100 до 999 і в кожному числі визначити, чи складається число лише з непарних цифр. Звичайно, за допомогою циклу можна перебрати всі числа, за допомогою вкладеного циклу перебрати цифри кожного числа. Але якщо писати на Python, то повинно бути більш гарне і стильне рішення ніж перебір вкладеними циклами.
Пропоную скористатися множинами — структурами даних, що містять невпорядковані елементи, які не повторюються. Давайте кожне число з діапазону 100…999 переведемо в множину, таким чином позбавимося повторів цифр в числі. А далі порівняємо цю множину з множиною непарних чисел. Якщо множина конкретного числа менше або дорівнює множини непарних чисел, то це буде означати, що число складається лише з непарних чисел.
Для незнайомих з множинами, на «Плетиві» є відповідний довідник, побудований по принципу «менше тексту, більше прикладів».
За допомогою наступного коду з використанням множин ми зможемо визначити кількість гарних тризначних чисел:
count = 0
odd = {'1','3','5','7','9'}
for number in range(100,1000):
digits = set(str(number))
if digits <= odd:
count +=1
print(count)
Відповідно, зловити формулу тепер стає простіше:
1 >> 5
2 >> 25
3 >> 125
4 >> 625
Якщо так і не видно формули, то звертаємось до екциклопедії цілочислових послідовностей, де в перших рядках і бачимо шукану формулу:
https://oeis.org/A000351
Успіхів!
На гуртку i7, граємося математикою:
— Назвіть найбільший спільний дільник чисел 12 і 18?
— Шість.
— Добре, напишіть код що це визначить.
— print(math.gcd(12,18))
— Добре, назвіть найменше спільне кратне цих 12 і 18. Тобто НСК.
— Тридцять шість.
— Добре. Пишіть код, що це визначить.
— print(math.lcm(12,18))
— Ой, а ви де це взяли?
— ChatGPT підказав, у Python з версії 3.9
— Ну, тоді у нас сьогодні версія 3.8 і ChatGPT – гріх. Шукаємо НСК в нових умовах ))