Якщо вам сподобалась задача, ви з нею впорались і готові поділитися своїм кодом, можете прислати свій розв'язок на Ця електронна адреса захищена від спам-ботів. Вам необхідно увімкнути JavaScript, щоб побачити її.
Джерело задачі: Збірник завдань для державної підсумкової атестації з інформатики. Автори: Н.В. Морзе, В.П. Вембер, О.Г. Кузьмінська, М.О. Войцеховський, Т.Г. Проценко. Рекомендовано Міністерством освіти і науки України. 2011 рік. 11 клас.
Варіант 7. Завдання 16: запишіть програму відомою вам мовою програмування. Вхідні дані вводяться з клавіатури, а вихідні дані виводяться на екран монітора.
Умова:
Дано натуральне число N (8 ≤ N ≤ 1000000), яке визначає будь-яку цілочислову грошову суму ≤ 1000000. Відомо, що цілочислову грошову суму, більшу чи рівну 7 грошовим одиницям, можна видати лише купюрами номіналом у 2 та 5 грошових одиниць. Визначте, якою кількістю купюр у 2 та 5 грошових одиниць можна видати суму в N грошових одиниць, щоб їхня загальна кількість була найменшою.
Кожен бажаючий може зімітувати собі ДПА в 11 класі, для цього достатньо зайти за посиланням на сайт eolymp.com і в швидкому режимі спробувати здати цю задачу однією з наступних мов програмування: С, С++, С#, D, Dart, Go, Haskel, Java, Javascript, Cotlin, Lua, MySQL, Pascal, Perl, PHP, Python, Ruby, Rust. Для роботи на сайті необхідно зареєструватися і підтвердити email. Все безкоштовно.
Давайте спробуємо розв’язати, нехай, за тридцять хвилин, добре? Відмітьте час початку, старт!
Посилання: https://www.eolymp.com/uk/problems/2033
Спробували? Тоді ще більше десяти варіантів розв'язку )
Ми, програмісти, люди, в цілому, доволі нудні. Звикли жити поряд з компіляторами, тому в нас частенько є певний брак авантюризму. Якщо компілятор сказав, що в кінці рядка треба ставити крапку з комою, то можна скільки завгодно бубоніти: «Хто таку дурню придумав?!», але то лише перший тиждень знайомства з професією. Далі програмісти просто виконують правила, з часом все спокійніше сприймаючи дивні речі. Ну а що робити, світ не ідеальний. І це не лише в професії, спокійне розуміння того, що правила необхідно виконувати, переноситься і в реальне життя. А як же свята?!
Програмісти гарно сприймають дні народження, тому що іменинники в цей день відчувають додаткові емоції, в молодості, зазвичай, позитивні. Програмісти добре сприймають дурнуваті свята, як «день рівнодення», коли день дорівнює ночі. Вони розуміють, що в Антарктиці все не так просто, але свято ж прикольне. Програмісти навіть сприймають Новий рік, хоча в цей день ніхто не народився, а просто змінився лічильник показника року. Вони ж у курсі, що лічильник секунд міняється значно частіше, а тоді рандом-функція — взагалі пісня.
А які ще свята є у програмістів? Є класичний — 256 день року, день програміста. Але це свято якесь кривеньке, оскільки не має фіксованої дати. У звичайні роки це 13 вересня, а у високосні — 12. Відповідно, перед святкуванням треба ще дізнатися високосність року, що йде. Набагато простіше в такому випадку святкувати День народження Будди, який можна святкувати взагалі будь-коли. Ну, у частини програмістів саме такий компілятор. А є ще класні свята у програмістів? Є! )
Чудове свято — День Ади Лавлейс. Це міжнародне свято дівчат у науці, технологіях, інженерії і математиці. Ось, що пишуть в англомовних джерелах: «an international celebration day of the achievements of women in science, technology, engineering and maths (STEM)». Я саме так і сприймаю — свято розумних дівчат будь-якого віку.
День Ади Лавлейс святкується у другий вівторок жовтня. Це вже прикольно, бо народилась ця дівчина 10 грудня. За легендою, саме вона склала першу програму для аналітичної машини Чарльза Бебіджа, відповідно, Ада вважається однією з перших програмістів в історії. Заради справедливості варто згадати, що машина Бебіджа не була побудована в реальності, а тому Ада не стикалась с компілятором, ось тут їй пощастило.
Але ж свято буде ще яскравішим з подарунками. Що подарувати розумним дівчатам у такий день? Звичайно, усілякі листівки і шоколадки не підходять. Придумано! Якщо дівчата розумні, то вони генерують в тому числі розумні думки. І буде зовсім чудово допомогти їм ці думки зберегти. У будь-який час на будь-який поверхні. Ми в i7 будемо дарувати в цей день розумним дівчатам прості олівці. Простий і доречний подарунок. Ми таким чином будемо відзначати розумних дівчат-програмісток, своїх вчительок математики, фізики, інформатики та технологій. Простими олівцями. Вже підготувались:
І якщо хтось запитає, а чому, власне, вітати розумних дівчат? Хіба вони чимось відрізняються від програмістів-хлопців? Відрізняються! Дуже сильно! Знаєте чим?
Вони, зазвичай, не такі нудні! )
Гарного свята!
Представляю екзамен з логіки 2021 року для зарахування в i7 і i7.juniors. Цього року екзамен проводився одночасно і на однакових завданнях. Рейтинг «класна задача» очолила задача №5 «про мишеня». Молодші учасники екзамену казали, що «вона дуже складна, але класна», студент-випускник на основі рівнянь складав матрицю і розв’язував її універсальним методом Гауса. Цікавим вийшло те, що ця задача має єдиний розв’язок.
Кожного року учні, що бажають відвідувати безкоштовний гурток i7, мають успішно здати екзамен з логіки. Успіхи попередніх років: перемоги в олімпіадах та конкурсах — не враховуються. Новий навчальний рік — новий екзамен. Традиційно щорічний екзамен можуть здавати студенти, які навчались в i7 в попередні роки та всі учні, що бажають спробувати свої сили, навіть якщо гурток їх не цікавить.
Завдання екзамену традиційно розміщуються на двох сторонах одного листа A4, максимальний час на виконання завдань — 60 хвилин. Можна користуватися калькулятором. На початку всі учасники попереджаються щодо критичних санкцій за порушення правил самостійної роботи.
На даній сторінці зібрано бланки екзаменів — для тих хто любить логічні задачі і тих, хто готується відвідувати i7 (в деякі роки працює також i7.juniors).
Екзамен для i7.juniors (2019-2020)
Екзамен для i7.juniors (2020-2021)
Ця задача відкриває книгу «Олімпіадна інформатика» В.Л.Дідковського і С.В.Матвійчука 2010 року. Умова:
Нумерація
https://www.e-olymp.com/uk/problems/109
Для нумерації m сторінок в книжці використано n цифр. По заданому n вивести m або 0, якщо розв’язку не існує. Нумерація починається з першої сторінки.
Вхідні дані
Єдине число n. У книзі не більше 7000 сторінок.
Вихідні дані
Вивести кількість сторінок у книзі.
Приклад вхідних даних:
27
Приклад вихідних даних:
18
Ліміт часу 1 секунда
Ліміт використання пам'яті 128 MiB
Автор: Сергій Матвійчук
Джерело: ІІ етап Всеукраїнської олімпіади в Житомирській області (2003)
Олімпіадне програмування відбувається у вкрай обмеженому проміжку часу. Але у нас зараз не олімпіада, тому пропоную підходити до задачі не поспішаючи, намагаючись підготувати її розв’язок як для співбесіди щодо прийняття на роботу.
Розберемо умову задачі. Перша сторінка нумерується цифрою один. Нам навіть не принципово якою саме, нам важливо, що ця цифра одна. Отже, для книжки з 1 сторінки використовується одна цифра, для книжки з двох сторінок використовується дві цифри, якщо конкретно це 1 і 2. Для книжки з 10 сторінок використовується 11 цифр, а саме: 1 2 3 4 5 6 7 8 9 1 0. У нашому тестовому прикладі, для книги з 18 сторінок використовується 27 цифр: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8. Нашою задачею є визначити кількість сторінок по числу цифр.
Може бути ситуація, коли по числу цифр визначити кількість сторінок неможливо. Наприклад, якщо кількість цифр у нумерації сторінок – 26.
Очевидно, якщо номер сторінки однорозрядний (від 1 до 9), то і кількість цифр, що потрібні для нумерації кожної такої сторінки – одна. При нумерації дворозрядних номерів сторінок (від 10 до 99), для нумерації кожної сторінки потрібні дві цифри і т. д. Кількість цифр, необхідних для нумерації сторінки змінюється, коли номер сторінки змінює розрядність, стає 10, 100, 1000. Тобто, 10x.
Задачу можна розв’язати за допомогою циклу. Будемо збільшувати номер сторінки і зберігати кількість цифр для нумерації поточної сторінки і загальну кількість цифр для нумерації всіх сторінок книги. Завершуємо цикл, коли кількість цифр для нумерування книги дорівнює або перевищує ту, що ми отримали на початку програми у вигляді вхідних даних. При рівності цих змінних необхідно вивести кількість сторінок, інакше — розв’язків не існує і виводимо нуль.
Далі розглянемо класичну цитату Роберта Мартіна з його класичної книги «Чистий код»:
Ім'я змінної, функції або класу має відповідати на всі головні питання. Воно повинно повідомити, чому ця змінна (і т. д.) існує, що вона робить і як використовується. Якщо ім'я вимагає додаткових коментарів, то воно не передає намірів програміста.
int d; // Минулий час
Ім'я d не передає абсолютно нічого. Воно не асоціюється ні з часовими інтервалами, ні з днями. Його слід замінити іншим ім'ям, яке буде вказувати, що саме вимірюється і в яких одиницях:
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
Змістовні імена істотно спрощують розуміння і модифікацію коду (кінець цитати).
Якщо проходити співбесіду в місця з цікавими зарплатами, то існує висока вірогідність, що там книги Мартіна читали. Тим більше варто прислухатися.
Визначимо простір імен змінних у стилістиці Python:
input_sum_digits - (вхідна сума цифр) - кількість цифр, з яких складається книжка, вхідні дані
sum_digits (сума цифр) – змінна, в якій ми будемо накопичувати суму і порівнювати з input_sum_ digits для завершення роботи циклу
current_page_number (номер поточної сторінки) – в змінній зберігатиметься номер сторінки, що опрацьовується при поточній ітерації циклу
number_of_digits_on_current_page (кількість цифр на поточній сторінці) – очевидна величина.
Код з використанням змістовних імен достатньо зрозумілий:
input_sum_digits = int(input())
sum_digits = 0
current_page_number = 0
number_of_digits_on_current_page = 1
while sum_digits < input_sum_digits:
current_page_number += 1;
if current_page_number == (10 ** number_of_digits_on_current_page):
number_of_digits_on_current_page += 1
sum_digits += number_of_digits_on_current_page
if sum_digits == input_sum_digits:
print(current_page_number)
else:
print(0)
Ось усе це у стилістиці c#:
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
int sumDigits = 0;
int currentPageNumber = 0;
int numberOfDigitsOnCurrentPage = 1;
int inputSumDigits = int.Parse(Console.ReadLine());
while (sumDigits < inputSumDigits)
{
currentPageNumber++;
if (currentPageNumber == Math.Pow(10, numberOfDigitsOnCurrentPage))
{
numberOfDigitsOnCurrentPage++;
}
sumDigits += numberOfDigitsOnCurrentPage;
}
if (sumDigits == inputSumDigits)
{
Console.WriteLine(currentPageNumber);
}
else
{
Console.WriteLine(0);
}
}
}
}
Погодьтесь, використання змістовних імен значно спрошує розуміння коду і для самого себе. Уявіть, що ви повернетеся до вашого коду розміром з сотню рядків через рік. Вам спростить розуміння коду використання змістовних імен? А тепер уявіть іншу ситуацію, коли вам треба на фоні дедлайну модифікувати сотні рядків чужого спагетті-коду, створеного з використанням неочевидних імен змінних, класів, методів. Як вам? Нікому не подобається, тож і ви так не пишіть )