В 2020 році обласна олімпіада Житомирської області проходила під прапором змін. Змінився університет проведення — аудиторії Житомирського Державного Університету змінили аудиторії університету «Житомирська Політехніка». Змінилась платформа проведення — цього року це був не e-olymp.com, розроблений в ЖДУ, змагання проводились на платформі Ejudge, яку дуже швидко розгорнули і настроїли. Змінилось і журі олімпіади.
Приємно, що не змінився гарний дух змагання. Ті самі лідери-програмісти так само показали шикарні результати. Топ-список найкращих вчителів з програмування залишився практично таким самим. Технічно і організаційно ні у мене ні у моїх учнів претензій не було, як все добре працювало всі попередні роки, так все добре працювало і цього року. В сюжеті «Суспільного телебачення» можна побачити учасників, аудиторії, організаторів:
Пропоную розглянути гарний, як на мене, розв’язок однієї з задач. Це найпростіша задача, організатори, мабуть, вирішили таким чином підняти дух всіх учасників. Задачу розв’язали майже всі учні, отже немає чого мені хвалитися, питання лише стильності розв’язку.
Задача «Змішана послідовність»
https://www.e-olymp.com/uk/problems/9610
Задано послідовність символів, розділених пробілами. Кожний символ послідовності представляє собою велику або маленьку літеру латинського алфавіту або цифру від 0 до 9.
Знайдіть суму цифр, які входять до цієї послідовності. Кількість символів, які входять до послідовності – не більше 10 000.
Вхідні дані.
Послідовність символів, розділених пробілами.
Вихідні дані.
Сума цифр, які входять до послідовності або значення 0, якщо у послідовності немає цифр.
Ліміт часу 1 секунда
Ліміт використання пам'яті 64 MiB
Вхідні дані #1
A 1 2 B C D A B C 1 9 B 3
Вихідні дані #1
16
Вхідні дані #2
A B C
Вихідні дані #2
0
В Python існує величезна купа зручних інструментів, знання яких значно спрощує життя програмісту. Звичайно, Python-програмісти, що працюють з текстом, знають, що для розв’язку можна не порівнювати кожний по циклу вирізаний символ на предмет відповідності його числу, а скористатися функцією isdigit(), що відповідає на запитання «Чи складається рядок з цифр».
Відповідно, використавши цю функцію, задача здається в один рядок:
print(sum([int(x) for x in input().split() if x.isdigit()]))
Хочу звернути увагу програмістів-початківців на величезну купу вже існуючих в Python функцій для роботи з текстом:
Таблиця: «Функції і методи рядків»
x = 'Микола'
y = 'Оленка'
Функція чи метод |
Призначення |
Приклад |
Результат |
result = x + y |
Конкатенація (склеювання рядків) |
result = x + y |
'МиколаОленка' |
result = x * 3 |
Повтор рядка |
result = x * 2 |
'МиколаМикола' |
result = x[i] |
Звернення по індексу |
result = x[0] |
'М' |
result = x[[start]:[end]:[step]] |
Отримання зрізу |
result = x[1:3] |
'ик' |
result = len(x) |
Визначення довжини рядка |
result = len(x) |
6 |
x.lstrip([chars]) |
Видалення символів пропуску (або символів chars) на початку рядка |
' Коля'.lstrip() |
'Коля' |
x.rstrip([chars]) |
Видалення символів пропуску (або символів chars) в кінці рядка |
'Коля '.lstrip() |
'Коля' |
x.strip([chars]) |
Видалення символів пропуску (або символів chars) на початку і в кінці рядка |
' Коля '.lstrip() |
'Коля' |
x.find(str, [start],[end]) |
Пошук підрядка в рядку. Повертає номер першого входження або -1 |
result = x.find('я') |
-1 |
x.rfind(str, [start],[end]) |
Пошук підрядка в рядку. Повертає номер останнього входження або -1 |
result = x.find('л') |
4 |
x.replace(шаблон, заміна) |
Заміна шаблону |
result = x.replace('икол', 'урк') |
'Мурка' |
x.isdigit() |
Чи складається рядок з цифр |
result = x.isdigit() |
False |
x.isalpha() |
Чи складається рядок з букв |
result = x.isalpha() |
True |
x.isalnum() |
Чи складається рядок з букв або цифр |
result = x.isalnum() |
True |
x.islower() |
Чи складається рядок виключно |
result = x.islower() |
False |
x.isupper() |
Чи складається рядок виключно |
result = x.isupper() |
False |
x.isspace() |
Чи включає рядок символи, що |
result = x.isspace() |
False |
x.istitle() |
Чи починаються слова в рядку |
result = x.istitle() |
True |
x.upper() |
Перетворення рядка до верхнього |
result = x.upper() |
'СТЕПАН' |
x.lower() |
Перетворення рядка до нижнього |
result = x.lower() |
'степан' |
x.startswith(шаблон) |
Чи починається рядок з шаблону |
result = x.startswith('Ст') |
True |
x.endswith(шаблон) |
Чи закінчюється рядок шаблоном |
result = x.endswith('ан') |
True |
z.join(список) |
Збирання рядка зі списку |
result = '+'.join(x) |
'С+т+е+п+а+н' |
ord(символ) |
Символ в його код Unicode |
ord('Я') |
1071 |
chr(число) |
Код Unicode в символ |
chr(1071) |
'Я' |
x.capitalize() |
Переводить перший символ рядка |
result = |
'Вася' |
x.center(width, [fill]) |
Повертає відцентрований рядок, по краях якого стоїть символ fill (пробіл за замовчуванням) |
'Оленка'.center(10, '+') |
'++Оленка++' |
x.ljust(width, [fill]) |
Повертає рядок, довжиною не меншою width, в разі потреби заповнюючи останні символи символом fill (пробіл за замовчуванням) |
'Оленка'.ljust(10, '+') |
'Оленка++++' |
x.rjust(width, [fill]) |
Повертає рядок, довжиною не меншою width, в разі потреби заповнюючи перші символи символом fill (пробіл за замовчуванням) |
'Оленка'.rjust(10, '+') |
'++++Оленка' |
x.title() |
Першу букву кожного слова переводить в верхній регістр, |
'доБрИй дЕнь'.title() |
'Добрий День' |
x.swapcase() |
Переводить символи нижнього регістру |
x.swapcase() |
'сТЕПАН' |
І це ще не все :)
Скільки зручних інструментів є в Python. Якщо вам сподобалась саме моє табличне представлення функцій і методи рядків, то все це давно і вільно лежить і оновлюється на «Плетиві» в розділі «Довідники мови Python». Звичайно, більша частина матеріалів там для початківців, бо писав ці довідники для своїх учнів, для уроків. При цьому щось намагався включити і авторське, наприклад, казку «Два зоопарки», що пояснює роботу з даними у списку, придумав сам.
Хочу привітати всіх учасників обласних етапів олімпіади з програмування, – справжнього свята інтелекту. Успіхів вам в наступних змаганнях – учні і вчителі!