Задача 2097 — Трьохзначі числа

 https://www.e-olymp.com/uk/problems/2097

 

На заданому проміжку [AB] виведіть у зростаючому порядку всі трьохзначні числа, у яких усі цифри різні.

Вхідні дані

У єдиному рядку два натуральних числа з вказаного проміжку. 100 ≤ A ≤ B ≤ 999.

Вихідні дані

Кожне число виводьте на новому рядку.

 

Вхідні дані #1

100 105

Вихідні дані #1

102

103

104

105

 

Джерело: Китеня 2011 м. Ковров

 

 


Розв'язання.

Перебираємо всі числа проміжку. В тестовому прикладі це буде:

100

101

102

103

104

105

 

Але деякі числа нам не підходять, бо мають повтори цифр. Наприклад в числі 101 дві одиниці, тобто не всі цифри різні.

 

Давайте переберемо всі числа проміжку, кожне з них відконвертуємо в текст, використовуючи стандартну функцію str()

Далі скористаємося функцією створення множини  set()

Дана функція на основі відконвертованого в текст числа створить множину, в якій будуть елементи без повторів. Тобто дана функція створить нам множину, в якій не буде дублікатів. До речі, не гарантується, що  буде збережено порядок елементів, але для нашої задачі це неважливо.

 

Ось приклад, що ілюструє роботу функції set()

>>> a = [1,3,5,4,3,3]

>>> a

[1, 3, 5, 4, 3, 3]

>>> b = set(a)

>>> b

{1, 3, 4, 5}

 

Отже, якщо в тризначному числі всі цифри різні, то довжина множини, що утворена функцією set() буде дорівнювати трьом. Ось як просто це на python:

 

if len(set(str(i))) == 3

 

Ось так просто.  Зверніть увагу, що  писати перебір чисел таким чином: 

for i in range (a,b)

невірно, тому що останній елемент (b) в такому разі не буде перебиратися циклом.


 

Голосні

https://www.e-olymp.com/uk/problems/494

 

До голосних літер в латинському алфавіті відносяться літери AEIOU і Y. Інші літери вважаються приголосними. Напишіть програму, яка підраховує кількість голосних літер в тексті.

Вхідні дані

У вхідному файлі міститься один рядок тексту, який складається лише із заглавних латинських літер та проміжків. Довжина рядка не перевищує 100 символів.

Вихідні дані

У вихідний файл вивести одне ціле число – кількість голосних у вхідному тексті.

 

Вхідні дані

COBRA

Вихідні дані

2

 


 

Для розв’язання даної задачі можна скористатися функцією in

Загальна ідея така: Пробіл в тексті також вважаємо буквою (власне, так воно і є). Перебираємо по черзі всі букви тексту. Якщо вибрана буква є серед голосних, то загинаємо палець. Після перевірки всіх букв тексту виводимо кількість загнутих пальців.

В даному випадку доцільно текст і голосні ввести в текстові змінні:

golosni = 'AEIOUY'

 

Перебір букв тексту проводимо за допомогою циклу, функція in повертає True у випадку, коли буква тексту знайдена серед голосних:

 

for x in txt:

    if x in golosni:

     kilkist += 1  

 

Зверніть увагу на конструкцію kilkist+=1 Це і є загинання пальців. Тобто після виконання даної операції значення змінної kilkist збільшується на одиницю. Але якщо до виконання цієї операції змінна kilkist не використовувалась, то ми отримаємо помилку. Тому перед перебиранням букв тексту давайте зробимо так:

 

kilkist = 0

 

Так ми і заявимо, що у нас є така змінна (ініціалізуємо її) і встановимо цій змінній початкове значення.

 

ps. А чи багато, на вашу думку, треба змінити в програмі, щоб вона рахувала не кількість голосних, а кількість пробілів? І чи можна в такому випадку обійтися без функції in ? А яка, на вашу думку, програма буде працювати швидше на одному і тому тексті - та, що рахує кількість голосних чи та, що рахує кількість пробілів?

 


 

Середнє арифметичне додатних

https://www.e-olymp.com/uk/problems/910

 

Задано послідовність дійсних чисел. Визначити середнє арифметичне додатних чисел.

Вхідні дані

У першому рядку задано кількість дійсних чисел n (0 < n ≤ 100). У наступному рядку задано n чисел, значення яких не перевищують за модулем 100.

Вихідні дані

Вивести середнє арифметичне додатних чисел з 2 десятковими знаками. У випадку відсутності додатних чисел вивести повідомлення "Not Found" (без лапок).

 

Вхідні дані #1

3

5.2 -2 4

Вихідні дані #1

4.60

 


 

Використання list comprehension для розв’язання даної задачі допоможе нам ввести дані з одночасним їх фільтруванням. Розбираючи рядок введення, ми можемо вибрати лише додатні елементи. Наприклад, при введенні даних таким  чином:

lst = [float(x) for x in input().split()]

ми в списку lst отримаємо всі вхідні дані. А використання умови в list comprehension дозволить нам додати в список лише додатні елементи вхідних даних:

lst = [float(x) for x in input().split() if float(x)>0]

А отримав список додатних чисел ми можемо проаналізувати довжину цього списку за допомогою функції len(). Якщо довжина нульова, це означає що у вхідних даних немає жодного додатного числа. Якщо так сталося, виводимо відповідне повідомлення, інакше виводимо середнє арифметичне. Формати виведення реальних чисел можна знайти у нашому довіднику «input_print», а для обрахування середнього арифметичного, хто забув, треба суму елементів поділити на їх кількість, в python це просто sum(lst)/len(lst).

 

ps. Якщо ваші батьки збираються на батьківські збори і у вас є список всіх ваших оцінок, то що буде з даним списком після такого:

otsynky = [x for x in otsynky if 10 <= x <= 12]

Ну і додаткове питання – що буде, коли вас піймають?  :)

 


 

https://www.e-olymp.com/uk/problems/2400

Трикутники

Михайлик любив малювати трикутники, але він це робив у незвичний спосіб. Спочатку малював довільний трикутник, потім кожну сторону ділив на n рівних частин і проводив через точки поділу прямі, паралельні сторонам трикутника. У результаті виходить декілька рівних між собою трикутників. Допоможіть Михайлику знайти найбільшу кількість однакових трикутників у його фінальному рисунку.

Вхідні дані

Ціле число n (0 < n < 2 * 109).

Вихідні дані

Вивести найбільшу кількість рівних між собою трикутників.

Вхідні дані #1

2

Вихідні дані #1

4

 


 

Дану задачу пропоную розв’язувати з папером і олівцем. Це той випадок коли ми можемо намалювати декілька варіантів забави Михайлика.  Тобто спочатку намалюємо довільний трикутник і поділимо його сторони на 2 рівні частини, тобто n=2.

 

 

 

Потім намалюємо такий трикутник при n=3 і n=4:

 



Підрахував кількість отриманих маленьких однакових трикутників ми запишемо відповідність вхідних і вихідних даних.  При n=2 відповідь 4, давайте запишемо так:

 

 Вхідні дані   Вихідні дані 
2 4
3 9
4 16

 

 

Подивіться уважно відповідність. Якщо бачите логіку – здавайте задачу. Якщо не бачите, то беріть цю таблицю, топайте до вчителькі математики і скажіть їй: «Я більше не буду прогулювати матема-а-а-тику.  Яка тут відповідність?». Якщо вчителька кине в вас підручником математики за п’ятий клас, ухиляйтесь, але не дивуйтесь.

 

www.e-olymp.com/uk/problems/6278

Номери будинків

Вивести 1, якщо будинки з номерами N і M знаходяться на одній стороні вулиці, і 0 у протилежному випадку.

Вхідні дані

Значення N і M (1N, M100).

Вихідні дані

Відповідь до задачі.

Вхідні дані

1 2

Вихідні дані
 
0

 


 

Розбираємося з вхідними даними. Як правило, номери будинків – цілі числа, але бувають номери 14/1, або 101 корпус 4, або, як у Булгакова в «Майстері і Маргариті» номер будинку, де відбувається частина роману має номер 302-біс.  Тому було б непогано, якщо б в умові задачі було написано, що m і n – цілі числа в певному діапазоні. Для python навіть неважливо, в якому діапазоні.  Але в умові, як на мене, не дуже зрозуміло. Значення N і M (1N, M100). А може бути 9Б або 9/1 або 52-11? Якщо може, то тут є певні питання. Ну а ми  для початку ПРИПУСКАЄМО, що n і m – цілі числа.

 

В даній задачі, на мій погляд, ввести дані оптимально у змінні за допомогою функції map(). Хто забув як це робити - довідник "input-print". Використання списку в даному випадку є, на мій погляд, недоцільним, цей спосіб неоптимальний ні по часу, ні по використанню пам’яті ні по зручності.

 

Тепер  давайте розберемося з умовою при цілих вхідних даних. Як правило, при нумерації будинків, по одній стороні вулиці будинки мають парні номери, наприклад 10, 22, 86. Аналогічно по іншій стороні вулиці будинки мають непарні номери.  Відповідно, якщо два номери будинки парні, то будинки знаходяться на одній стороні вулиці. Так само якщо два номери будинки непарні, то будинки знаходяться також на одній стороні вулиці.

 

Парність і непарність можна легко перевірити аналізом залишку від ділення на 2 - (n % 2). Якщо залишок нульовий, то число парне.

 

Відповідно, дуже просте рішення виглядає так:

 

якщо (n є парним і m є парним) або (n є непарним і m є непарним):

    виводимо «1», інакше виводимо «0».

 

на python це може бути, наприклад, так:

 

if (n % 2 == 0 and  m % 2 == 0) or (n % 2 != 0 and  m % 2 != 0):

    print (1)

else:

    print (0)

 

Але це достатньо громіздке рішення. Давайте пошукаємо більш елегантне. Якщо нечасто прогулювати математику, то можна згадати про суми парних і непарних. Давайте просумуємо n і m. Якщо вони обидва парні, то і сума буде парна. Наприклад 12+20=32. Якщо обидва непарні, то сума також буде парна. Наприклад 11+15=26. Отже, якщо обидва числа парні або обидва непарні, то сума буде парна. Переформулюємо для нашої задачі: Якщо сума (n+m) парна, то будинки з номерами n і m знаходяться  на одній стороні вулиці.  Якщо ж сума (n+m) буде непарною, то номери будинків будуть знаходитися на різних сторонах вулиці.

 

Ця задача - той випадок, коли нескладний математичний аналіз задачі дає просте і елегантне рішення.

 

На e-olymp ця задача здається без проблем, але якщо ви будете розв’язувати дану проблему в реальних умовах, вимагайте точного описання вхідних даних і правил нумерування. В Японії, наприклад, номера будинків не мають ніякого зв'язку з їх місцем розташування - нумерація проводиться в порядку забудови. Тому ров'язати цю задачу по номерам будинків в Японії неможливо. В реальності вимагайте точний опис завдання, бо інакше ваша программа може працювати невірно, а хто тоді будет дурнем? Точніше – кого тоді замовник зробить дурнем? Правильно! tongue-out

 

 

Вхід для зареєстрованих відвідувачів