Ця задача відкриває книгу «Олімпіадна інформатика» В.Л.Дідковського і С.В.Матвійчука 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);
}
}
}
}
Погодьтесь, використання змістовних імен значно спрошує розуміння коду і для самого себе. Уявіть, що ви повернетеся до вашого коду розміром з сотню рядків через рік. Вам спростить розуміння коду використання змістовних імен? А тепер уявіть іншу ситуацію, коли вам треба на фоні дедлайну модифікувати сотні рядків чужого спагетті-коду, створеного з використанням неочевидних імен змінних, класів, методів. Як вам? Нікому не подобається, тож і ви так не пишіть )

Весняно-літні грози в Україні досить традиційні, тому час пригадати певні правила поведінки під час грози.
Якщо ви вдома:
- Не виходьте без потреби з дому, зачиніть вікна й двері, потурбуйтеся, щоб у приміщенні не було протягу, який може привернути кулеподібну блискавку.
- Тримайтеся подалі від електропроводки, вікон, дверей і всього іншого, пов'язаного із зовнішнім середовищем, не знаходьтесь біля стіни, поряд з якою росте високе дерево.
- Максимально вимкніть З РОЗЕТКИ сучасну техніку. Наприклад, вимкнений з пульта телевізор продовжує працювати – він чекає сигналу від пульта на увімкнення. Гроза буває не так часто, тому варто дочекатися її завершення, ніж купляти нову техніку. Отже, все, що можна легко вимкнути – вимикаємо. Телевізори, блоки живлення ноутбуків, монітори, усілякі розумні кухонні пристрої (мультиварка, аеропіч) – все вимикаємо з розеток. Окремо звертаємо увагу на мережеві кабелі. Якщо до вашого ноутбуку або роутера приєднано мережевий кабель, то варто на час грози його від’єднати, тим більше це просто зробити – там роз’єм. Перегляньте перед грозою ваше житло, проаналізуйте, що варто вимкнути, щоб нічого не забути.
Якщо прогнози погоди обіцяють грозу, а вам треба йти з вашої оселі, вимкніть техніку перед тим як підете.
Якщо ви не вдома:
- Уникайте відкритих ділянок на височинах, намагайтеся сховатися в низьких місцях, таких як канави, яри, долини, каньйони або печери.
- Тримайтеся подалі від водойм. Не перебувайте під час грози у водоймі або на її березі. Відійдіть від берега, спустіться з високого місця в низину.
- Не намагайтеся сховатися під окремими високими деревами або невеликою групою дерев. Якщо є можливість, сховайтеся на щільній низькорослій ділянці лісу.
- Не намагайтеся сховатися в дуже маленьких приміщеннях або укриттях.
- Тримайтеся подалі від будь-яких матеріалів, які проводять електрику, наприклад: дротові огорожі і ворота, автомобілі, металеві труби, жердини, рейки і інструменти.
- У степу, полі або при відсутності укриття (будівлі), сядьте навпочіпки в яр, низину, або інше природне поглиблення, обхопивши ноги руками.
- Якщо грозовий фронт наздогнав вас під час катання на велосипеді або мотоциклі, зупиніться і відійдіть подалі від вашої техніки, але так, щоб ви її бачили, щоб не вкрали.
- Якщо гроза застала вас у автомобілі, не треба виходити з нього, просто зачиніть вікна.
- Не намагайтеся сховатися під автомобілями або важкою технікою.
- Якщо біля вас виникла кулеподібна блискавка, по можливості зберігайте спокій і не рухайтеся, не потрібно наближатися до неї, торкатися її чим-небудь, оскільки може відбутися вибух, не слід тікати від неї.
Використовуйте мобільний телефон лише в екстрених ситуаціях, а краще на час грози ВИМКНІТЬ ЙОГО.
Вважаєте ці правила вартими уваги? Відправте посилання на статтю вашим друзям.
Збережете їм гроші, нерви, а може і життя.

Що пише в фіналі філософська версія програми? І що за параметри в shapesize? Запустіть в Python і дізнаєтесь )
Код:
# Python-уроки на pletyvo.in.ua
# Тема: users shapesize, join, map, chr
# Гра "Любить — не любить" (філософська версія)
from turtle import *
penup()
speed(0)
color('black','orange')
setpos(-270,350)
write('Гра "Любить — не любить"', font = ('arial', 24, 'bold'))
setpos(0,-100)
shape('square')
resizemode("user")
shapesize(4, 1, 1)
color('black','orange')
for part in range(2):
for _ in range(36):
stamp()
back(34)
right(10)
color('white','white')
color('black','orange')
txt = [32,32,1051,1102,1073,1080,1090,1100,44,32,1074,
1110,1076,1095,1077,1087,1080,1089,1100,33,32,41]
write(''.join(map(chr, txt)), font = ('arial', 24, 'bold'))
Код:
from turtle import *
text = ["Ішов кіт",
"Через сто воріт,",
"До кінця дійшов,",
"Котеня знайшов -",
"Няв!"]
colors = ["red", "blue", "green", "indigo", "navy"]
size = [20, 22, 24, 28, 32]
penup()
for x in range(5):
setpos(-200, 200 - 100 * x)
color(colors[x])
write(text[x], font = ('arial', size[x], 'bold'))
В дитинстві час від часу він ходив до школи для бідняків — здобувати початкову освіту. Там викладали тільки Закон Божий, письмо і арифметику. Він не любив учитися: уроків майже не готував, учитель часто бив його по пальцях, аж ті розпухали. Він доволі пізно навчився читати і писати — лише до 10 років. Пізніше матері довелося перевести його в благодійну школу, де фізичні покарання не практикувалися.
Значно пізніше, в 17 років був зарахований до другого класу латинської гімназії. Він був старший інших учнів на 6 років, але до кінця життя так і писав з помилками.
Бідував: ходив у лахмітті, підошви підв'язував мотузками, щоб взуття трималося купи. Винаймав куточок у найбіднішому районі міста. Господиня з жалю щоранку наливала йому кави й давала шматок булки. На довгі місяці це було його їжею.
Прожив 70 років він ніколи не був одружений і не мав дітей. Характер у нього теж був вельми кепський і полохливий: він боявся пограбувань, собак, втрати паспорта, боявся загинути у вогні та отруєння. Він жахався найменшої подряпини, а назви хвороб викликали у нього тремтіння. Йому снилося, що його поховають заживо, тому щовечора клав біля ліжка записку: «Я живий».
За життя він написав 3381 літературний твір, з яких 158 казок, які прославили його на весь світ. Хто він?
Натисніть «детальніше» і дізнаєтесь...
Умова:
Уявіть собі, що ви берете участь у грі, в якій ви знаходитесь перед трьома дверима. Ведучий, про якого відомо, що він чесний, помістив за одними з дверей автомобіль, а за двома іншими — по козі. У вас немає ніякої інформації про те, за якими дверима що знаходиться. Ведучий каже вам: «Спочатку ви маєте обрати одні з дверей. Після цього я відкрию одні з дверей, які залишилися, за якими знаходиться коза. Потім я запропоную вам змінити свій початковий вибір і вибрати інші зачинені двері замість тих, що ви вибрали спочатку. Ви можете зробити як я раджу, або підтвердити свій початковий вибір. Після вашого остаточного рішення я відкрию двері, які ви вибрали, і ви виграєте те, що знаходиться за цими дверима.»
Наприклад, Ви обираєте двері номер 1.
Ведучий відчиняє двері номер 3 і показує, що за ними знаходиться коза.
Після цього ведучий пропонує вам змінити свій вібір і обрати двері номер 2.
Чи збільшаться ваші шанси виграти автомобіль, якщо ви послухаєте його?
Будь ласка, подумайте, а лише потім, дайте відповідь на запитання:
Чи варто для виграшу автомобіля послухати ведучого і змінити свій попередній вибір?
Варіанти відповіді:
— так, краще змінити вибір
— ні, не треба змінювати вибір
Обрали? А тепер можна переглянути правильну відповідь.