Обмін думками про значність зв’язку програмування з математикою — річ відома. Сьогодні на розгляд пропонується задача, для розв’язання якої математика таки згодиться.
Задача «Контрольна робота»
https://www.eolymp.com/uk/problems/1690
Умова:
Паралель восьмих класів написала контрольну роботу. В результаті рівно A% учнів отримали 5, рівно B% - 4, рівно C% - 3, а інші D% написали її на 2. Яка мінімальна кількість школярів повинна бути у паралелі восьмих класів для того, щоб могли бути отримані такі результати?
Вхідні дані
Вводяться 4 цілих числа від 0 до 100 - A, B, C, D (A + B + C + D = 100).
Вихідні дані
Виведіть єдине ціле додатнє число - мінімальну можливу кількість учнів у паралелі.
Приклад
Вхідні дані
40 50 5 5
Вихідні дані
20
Пропоную проаналізувати не лише один тестовий приклад, а сформувати кілька таких прикладів і розв’язати задачу спочатку аналітично. Оформимо все в таблицю:
A
|
B
|
C
|
D
|
Розв’язок
|
40
|
50
|
5
|
5
|
20
|
25
|
25
|
25
|
25
|
4
|
10
|
10
|
10
|
70
|
10
|
23
|
27
|
20
|
30
|
100
|
Всі, хто відвідував або відвідує уроки математики, мабуть, відчувають, що тут є простий математичний розв’язок. Так і є. Якщо знайти найбільше число, на яке діляться всі чотири числа умови, то задача стає зовсім простою.
Давайте знайдемо найбільше число, на яке діляться ці чотири числа: 40 50 5 5. Звичайно, це число 5. В математиці це число зветься найбільшим спільним дільником (НСД). І тоді виходить, що вісім учнів отримали п’ятірку (40/5), десять учнів отримали четвірку (50/5), один учень отримав трійку (5/5) і один учень отримав двійку (5/5). Разом виходить 20 учнів. А через те, що нас не питають в задачі, скільки учнів яку оцінку отримали, а питають загальну мінімальну кількість учнів, то можна порахувати так: (40+50+5+5) / НСД.
Перевірити саме цей алгоритм розв'язку можна на додаткових прикладах. І задача стає зовсім простою, бо НСД можна знайти у тому числі і підбором.
Але в Python є готова функція, яка обчислює НСД. І робить код простим і лаконічним:
import math
a, b, c, d = map(int, input().split())
print((a + b + c + d) // math.gcd(a, b, c, d))
Але не все так просто. Річ у тому, що цей код не завжди працює. Звернемся до документації Python. Функція gcd() з’явилась у версії 3.5. При цьому можна було вказати лише два аргументи функції. А вказувати чотири аргументи стало можливо лише з версії 3.9:
А якщо учень програмує на Windows 7, то, як відомо, остання версія, яка встановиться на дану операційну систему – це 3.8.10, тому для gcd() треба буде вказувати лише два аргумента. Це не проблема, але код все ж таки буде інший. Наприклад, в Python 3.8.10 цю задачу можна здати таким кодом:
from math import gcd
a, b, c, d = map(int, input().split())
nsd = gcd(gcd(a, b), gcd(c, d))
print((a + b + c + d) // nsd)
Якщо учень програмує на Windows XP, то остання версія Python для цієї операційної системи — 3.4.4, а, відповідно, фунцією gcd() учень не зможе скористатися взагалі і йому доведеться шукати НСД іншим шляхом.
Можна, звичайно, користуватися онлайн-середовищами. На replit.com та еolymp.com встановлені останні версії Python і багато учнів взагалі не зіштовхнуться з проблемою. Але учням, що планують своє майбутнє в IT, на мою думку, треба розповідати про різноманіття версій та подібні ситуації. Мова не про надглибоку деталізацію, а про загальні факти і приклади. Ну і про відвідування уроків математики, звичайно. Задачу з інформатики «Контрольна робота», що була щойно розглянута без застосування НСД розв’язати буде, IMHO, не так просто і гарно.
Сайт «Плетиво» представляє авторську задачу і наступний алгоритм:
1. Кажемо відповідь
2. Ліземо в гаманець
3. Самооцінювання :)
26 січня 2024 року відбувся III (обласний) етап Всеукраїнської учнівської олімпіади з інформатики Житомирської області. Учні-програмісти змагалися в розв’язанні задач на платформі «Contest Management System», розгорнутій в університеті «Житомирська політехніка».
Учасникам олімпіади було запропоновано сім задач і чотири години часу для їх розв’язання. Для контролю на всіх робочих місцях учасників було встановлено вебкамери, що в режимі онлайн транслювали зображення і звук для журі. Крім того, учасники проводили відеозапис екранів своїх комп’ютерів і по завершенню олімпіади передали журі покликання на чотиригодинні відеозвіти.
Після завершення олімпіади задачі традиційно з’явилися на сайті eolymp.com, всі бажаючі можуть тепер спробувати свої сили в їх розв’язанні.
Розглянемо одну з задач олімпіади — «Балансуючі елементи» (https://www.eolymp.com/uk/problems/11658).
Умова:
Задано послідовність з N елементів, які є цілими числами. Назвемо «балансуючим елементом» такий, що сума всіх елементів перед ним дорівнює сумі елементів після нього. При цьому перший та останній елементи послідовності не можуть бути «балансуючими».
Знайдіть кількість «балансуючих елементів» у заданій послідовності.
Вхідні дані:
У першому рядку записане ціле число N. У другому рядку записано N цілих чисел, розділених пробілом. Всі числа не перевищують за модулем 100000.
Вихідні дані:
Виведіть одне число – кількість «балансуючих елементів».
Приклад
Вхідні дані:
3
1 2 1
Вихідні дані:
1
— Ліміт часу: 1 секунда
— Ліміт використання пам'яті: 256 Mb
Зрозуміле формулювання задачі та знання програмістами функції SUM() при роботі зі списками створює багатьом солодку ілюзію рівня «я зараз цю задачу як Тузик ганчірку». Але, згідно статистики олімпіади, лише 22% учасників обласної олімпіади зробили її на 100%. Чому так мало? Мабуть, за це варто подякувати авторам задачі і тим, хто складав для неї тести.
Нескладно представити, як працює функція SUM(). Звичайно, це повний перебір елементів з додаванням їх значень. І, незважаючи, що всередині мови програмування функція максимально оптимізована, на її виконання потрібен деякий час.
Давайте представимо варіант, коли зліва і справа від елементу, що перевіряється, стоїть по мільйону елементів. Відповідно, для перевірки «балансовості» поточного елемента треба виконати SUM(мільйон елементів) для елементів, що стоять лівіше його і SUM(мільйон елементів) для елементів, що стоять правіше. Тобто, два мільйони елементів перебираються задля перевірки одного поточного. Далі беремося перевіряти на балансовість наступний елемент — і знову перебираємо два мільйони елементів. Але ж у нас на всю задачу ліміт в 1 секунду.
Якщо б автори задачі сформували лише невеличкі по розміру масиви-списки для тестів, то задачу би здали більше програмістів. А на великих списках одної секунди для розв’язку таким алгоритмом очікувано не вистачало. При чому як на Python, так і на C# (дякую за перевірку Захару з i7).
Хоча певні питання до укладачів тестів у нас є. Наприклад, восьмикласник Андрій з i7 вважає, що за розв’язок
print(1)
зараховувати цій задачі 30% - то багато. Як на мене — дійсно багато.
Але давайте спробуємо знайти алгоритм розв’язку задачі «Балансуючи елементи», що розв’яже її на 100% за секунду навіть на повільному Python.
Якщо ви хочете спробувати самостійно, то не читайте далі, а пробуйте.
Удачі!
Для тих відвідувачів «Плетива», що не знайшли рішення, після натискання на покликання «Детальніше» я запропоную свою версію і код.
Буває програмування молоде і скоре, як олімпіада. Коли змінні можуть зватися як завгодно, на оптимізацію спагетті-коду нема часу, а годинник голосно підганяє секундною стрілкою. А буває програмування доросле, виважене. Смачне і терпке. Коли хочеться зробити гарно, щоб не соромно було показати собі та людям.
Саме так пропонується розв’язати задачу II етапу Всеукраїнської олімпіади 2010-2011 міста Бердичева. Задача зветься «Піраміда з символів» і розміщена на сайті eolymp.com (https://www.eolymp.com/uk/problems/1119).
Умова:
Вася хоче надрукувати на принтері піраміду з якогось символу висотою h. Напишіть програму, яка допоможе йому у цьому, не забуваючи, що програма повинна бути "економічно вигідною", тобто друкувати найменшу кількість символів.
Приклади пірамід наведено у прикладах вхідних та вихідних даних.
Вхідні дані:
У єдиному рядку задано спочатку символ, при допомозі якого повинна друкуватись піраміда, а потім через пропуск і натуральне число, яке задає висоту піраміди h (h ≤ 50).
Вихідні дані:
У першому рядку виведіть загальну кількість надрукованих "друкованих" символів а нижче саму піраміду.
Приклад 1.
Вхідні дані:
A 3
Вихідні дані:
12
A
AAA
AAAAA
Приклад 2.
Вхідні дані:
M 9
Вихідні дані:
117
M
MMM
MMMMM
MMMMMMM
MMMMMMMMM
MMMMMMMMMMM
MMMMMMMMMMMMM
MMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMM
Розв’язувати задачу ми будемо мовою Python. Звичайно, в 2010 році на міській шкільній олімпіаді міста Бердичева не програмували на Python. Більше того, ми будемо використовувати F-рядки, що з’явились в Python в грудні 2016 року.
Але цікава задача гарна ідеєю, а якою мовою з нею боротися – то деталі )
Для чого нам F-рядки? Тому ще це гарно і ефективно. Це чудовочитабельний спосіб форматування рядків у Python, що дає змогу вставляти значення змінних всередину рядкового літерала, використовувати вирази і навіть викликати методи об'єктів прямо всередині рядка. А ще за допомогою F-рядків легко центрується текст, що нам і потрібно.
Але в першу чергу визначимо кількість друкованих символів, включаючи пробіли на початку рядків. Намалюємо кілька пірамід, символом «O», а замість пробілів будемо писати плюси.
Піраміда з одного шару буде складатися з 1 символу:
O
Піраміда з трьох шарів буде складатися з 12 символів:
++O
+OOO
OOOOO
Піраміда з п’яти шарів буде складатися з 35 символів:
++++O
+++OOO
++OOOOO
+OOOOOOO
OOOOOOOOO
Піраміда з семи шарів буде складатися з 70 символів:
++++++O
+++++OOO
++++OOOOO
+++OOOOOOO
++OOOOOOOOO
+OOOOOOOOOOO
OOOOOOOOOOOOO
Згідно умови піраміда з дев’яти шарів буде складатися з 117 символів.
У нас є відповідність аргументу і результату, спробуємо вивести формулу:
1 >> 1
3 >> 12
5 >> 35
7 >> 70
9 >> 117
Це той випадок, коли можна не поспішати. Покрутити, спробувати, подумати. Щоб зробити гарно. І якщо у вас вийде, то можете себе перевірити традиційним для «Плетива» способом. Підставте аргументом в вашу формулу найбільший аргумент з умови. В результаті ви отримаєте кількість друкованих символів при h = 50. Допишіть це число в посилання і перевірте.
Наприклад, згідно вашої формули при h = 50 кількість друкованих символів — 915.
Тоді перейдіть за посиланням:
https://pletyvo.in.ua/answers/915
Якщо ваша формула вірна, то за посиланням вам про це скажуть )) Будь ласка, не треба DDoS-ити сайт перебором ))
А щодо коду з використанням F-рядків, то пропоную не обговорювати. Як на мене – це просто гарно і стильно:
data = input().split()
symbol, h = data[0], int(data[1])
print(тут буде ваша формула, в якій аргумент - h)
for x in range(1, h * 2, 2):
print(f'{symbol * x:^{h * 2 - 1}}')
Успіхів вивести формулу і здати задачу!
Кількість відвідувачів платформи Canva до 2023 року перевищує 100 млн користувачів у 190 країнах світу. В Canva є можливість генерації фото з тексту. Ми попросили штучний інтелект Canva намалювати собаку, наприклад, так: «dog in the style of Claude Monet».
Які вони чудові!
Вінсент Ван Гог
Рембрандт
Пабло Пікассо
Леонардо да Вінчі
Сальвадор Далі
Клод Моне
Свої знають, що інформатика — то не про комп’ютери. Певною мірою можна розвиватися в предметі за допомогою дуже різних інструментів.
З високою вірогідністю нас чекає непроста зима. Військові кажуть про накопичення противником ракет. Повітряні тривоги стають довшими. Що робити в укриттях вчителям з дітьми? Як можна продовжити розвиватися і в таких умовах?
Один із простих інструментів в таких умовах — паперова інформатика. І не лише тому, що комп’ютера в укритті немає. Паперова інформатика — самодостатній освітній інструмент.
І традиційно на «Плетиві» — практичний досвід
В кабінеті інформатики, де я працюю, є окремий стіл для «Паперової інформатики». Звичайно, там бувають чудові гості у вигляді книжки проєкту «Ukraїner», як на світлині. Але головними на столі «Паперової інформатики» є папірці, які можна після уроку або на перерві взяти собі назавжди. На папірцях — цікаві задачі різного типу.
Принцип підбору матеріалів: знайшлося мимоволі щось цікаве, або цілеспрямовано знайдене — друкую на невеликих листочках — і на стіл паперової інформатики. Певну кількість копій. Потім, коли трохи буде розтягнуто зацікавленими учнями — все що залишиться — в папку. А на стіл щось нове.
Таким чином на столі нові завдання, учні їх бачать і забирають з собою. Для самих допитливих — велика папка. Набирають собі завдань з неї. Приємно, коли діти набирають багато завдань і тягнуть додому: собі, батькам, друзям.
Які типи завдань гарно «забираються» учнями? Звичайно, це залежить від багатьох факторів, але можна спробувати схематично окреслити групи завдань та їх цільову аудиторію.
Знайти відмінності
Класичні завдання, коли на двох картинках поряд два схожих зображення і треба знайти відмінності. В інтернеті такого море. Раджу не обирати примітивні, пошукайте завдання, де чимало відмінностей. Такий тип завданя підходить і для молодшої школи.
Переваги: дуже гарно сприймається учнями всіх класів. Мінус: дуже багато доводиться друкувати, діти відмічають відмінності безпосередньо на папірцях.
Веселі задачки
Прості і безпосередні. Які не вимагають занадто багато думати і веселі. Молодші школярі можуть зробити краще за дорослих. Приклад:
Розумні задачі
Прості, але треба подумати. Приклад (зображення тут не просто так, це підказка):
Ще один приклад:
Складні
Як задача про лабіринт. Задача, що потребує терпіння. Кажуть, що таким чином в канадському барі було запропоновано диференціювати тверезих і усяких. Я трохи переробив цей лабіринт, зробив його чорно-білим для всіх принтерів і замінив половину кіл на трикутники. Ось що вийшло:
Ще одна цікава, як на мене, задача. Кажуть, з китайського підручника. Я розумію, що дорослі в більшості своїй не дотиснуть. Але я особисто бачив дітей, що розв’язували цю задачу за півгодини.
Поясню умову. В першому рядку — прибульці. Їх всіх щось об’єднує.
В другому рядку — неприбульці. Тобто, ні у кого з них немає того, що є у прибульців. Якщо ви зрозумієте, що відрізняє прибульців з першого рядка і неприбульців з другого рядка, то в третьому рядку точно зрозумієте, хто прибулець, а хто ні.
Сірникові задачки
Окрема група — сірникові задачі. В інтернеті їх багато, кілька коробок сірників вистачить отримати море задоволення.
Приклад:
Пам’ятаю, як я був вражений експериментом з шістьма сірниками.
Орігамі
Орігамі — ще один цікавий напрям. Можна складати квіти, іграшки. На жабках, складених в техніці орігамі, можна влаштовувати чудові «заскоки» — чия жабка до фінішу доскаче першою.
Ще чудова забава — Flextangles. Разом з шаблонами – кольоровим і творчим. Робиться з одного листа паперу:
Можна ще подивитися цікавого у нас на сайті в розділі «Handmade» і в тематичних пабліках.
Задачі на обговорення
Якось в спільноті вчителів інформатики показав свою задачу:
І отримав дуже цікавий коментар про підтекст. А дійсно, ця задача тягне за собою низку запитань для обговорення з учнями, наприклад:
— Дітей поставили в шеренгу ні їх, ні їх батьків не питаючи. З якого дива? Так можна? В яких випадках?
— Хто буде відповідати, якщо Марія Іванівна помилиться? І що з нею потім робити? Яка у неї відповідальність?
— Чому вирішення проблеми залежить від батьків Хуліганова, які не чують звичайних аргументів? Чому інші батьки не беруться до уваги, а цих слухають? А можна інакше?
— Де верифікація науковим апаратом такого способу пошуку істини?
— Хто ким і як маніпулює в даній історії?
— Чи допустимі такі методи пошуку істини?
— Чи не принижує Марія Іванівна дітей таким алгоритмом пошуку винуватих?
А хто запропонує інший алгоритм пошуку істини? А в межах законодавства?
Таке спілкування принесе користь. Це те саме критичне мислення, про яке пушать в івентних кейсах і розмовляють с дітьми на уроках.
Просте запитання в фіналі
При наявності інтернета, принтера і нелінивого вчителя зібрати свою папку паперової інформатики, погодьтесь, не так і складно.
Ви теж вважаєте, що воно того варто?
Анатолій Анатолійович,
листопад 2023 року
У 1970 році перестали існувати «The Beatles». Через 53 роки, 2 листопада 2023 року «The Beatles» випустив ще одну пісню — «Now And Then».
Джон Леннон, один з чотирьох музикантів гурту був застрелений в 1980 році, але його аудіозапис став основою «Now And Then». Для вирішення проблеми низької якості аудіо було використано штучний інтелект.
Джордж Гаррісон помер в 2001, але у фінальну версію останньої пісні увійшли партії ритм-гітари, що Джордж встиг записати у 1990-х.
Свої партії 83-річний Рінго Старр та 81-річний Пол Маккартні записали заново.
За перші п’ять годин після публікації на YouTube — більше як півтора мільйона прослуховувань.
The Beatles. Now And Then.
ps. На наступний день, 3 листопада вийшов кліп на цю пісню. Неймовірний кліп з 21 мільоном переглядів за перші три дні: