Однорядковий розв’язок задачі обласної олімпіади і оновлені Python-довідники

Надрукувати

В 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()

Чи включає рядок символи, що
не відображаються (пробіл, символи  '\f' '\n' '\r' '\t '\v')

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(список)

Збирання рядка зі списку
з розділювачем z

result = '+'.join(x)

'С+т+е+п+а+н'

ord(символ)

Символ в його код Unicode

ord('Я')

1071

chr(число)

Код Unicode в символ

chr(1071)

'Я'

x.capitalize()

Переводить перший символ рядка
в верхній регістр, а всі інші в нижній

result =
'вАсЯ'.capitalize()

'Вася'

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». Звичайно, більша частина матеріалів там для початківців, бо писав ці довідники для своїх учнів, для уроків. При цьому щось намагався включити і авторське, наприклад, казку «Два зоопарки», що пояснює роботу з даними у списку, придумав сам.

 

Хочу привітати всіх учасників обласних етапів олімпіади з програмування,  – справжнього свята інтелекту. Успіхів вам в наступних змаганнях – учні і вчителі!