Тема: Допоможіть з завданням будь ласка

A. Соцiальна дистанцiя
Обмеження: 1 сек., 256 МiБ
Люди стоять у черзi до магазину. Чергу можна уявити як координатну пряму. i-та людина
стоїть у координатi x.
Як вiдомо, в розпал пандемiї COVID-19 необхiдно дотримуватися соцiальної дистанцiї.
Вам потрiбно сказати, чи мiж кожною парою людей вiдстань є не меншою за 2 метри.
Вхiднi данi
Перший рядок мiстить одне цiле число n — кiлькiсть людей у черзi.
Другий рядок мiстить n цiлих чисел — координати людей у черзi в метрах, у порядку злiва
направо.

Вихiднi данi
Виведiть YES, якщо люди дотримуються дистанцiї, i NO в iншому випадку.
Обмеження
1 ≤ n ≤ 104
,
0 ≤ xi ≤ 109
,
xi ≤ xi+1.
Для 40% тестiв виконується додаткове обмеження n ≤ 100.
Приклади
Вхiднi данi (stdin):
4
4 7 44 47
Вихiднi данi (stdout):
YES

2

Re: Допоможіть з завданням будь ласка

Те, що получилось у мене:

n = int(input())
a = list(map(int, input().split()))
x = 1
answer = 0
while x != n:
    if answer == n:
        print('YES')
    elif int(a[x]) - int(a[x-1]) >= 2:
        answer += 1
    x += 1
print('NO')

3 Востаннє редагувалося koala (01.11.2020 11:58:19)

Re: Допоможіть з завданням будь ласка

Вітаю на форумі.
0. Бажано все ж дописувати, чим саме вас не влаштовує ваш розв'язок.
1. Вам треба зробити наперед визначену кількість операцій, для цього існує цикл for:

for x in range(1,n):

Одразу прибираються x=1 та x+=1.
2. Вам не обов'язково діставатися кінця циклу - якщо хоча б один раз зустріли неправильну відстань, треба переривати цикл оператором break.
3. Вам не треба підраховувати кількість "правильних" відстаней, достатньо лише однієї неправильності; значить, answer можна зробити не числом, а прапорцем булевого типу.
4. У самій умові if ви нащось зайвий раз перетворюєте елементи списку на int. Нащо?
Тобто виходить щось таке:

n = int(input())
a = list(map(float, input().split()))
answer = True
for x in range(1,n):
    if a[x]-a[x-1]<2:
        answer = False
        break
if answer:
    print('YES')
else:
    print('NO')

Але тут слід знати, що в Python є ідіоматичні вирази для таких конструкцій. По-перше, якщо нам треба йти в циклі по парах елементів, то це можна зробити за допомогою функції zip, що "зліплює" два набори парами:

for x,y in zip(a,a[1:]):
    if y-x<2:...

По-друге, перевірка, чи є в наборі елемент з потрібними властивостями, виконується функціями any та all, наприклад

answer = all(y-x>=2 for x,y in zip(a,a[1:]))

Ну і дрібничка - нам у Python не потрібне n, бо це розмір списку у другому рядку. Отже:

input()#читаємо перший рядок і "викидаємо" його
a = list(map(int, input().split()))
print('YES' if all(y-x>=2 for x,y in zip(a,a[1:])) else 'NO')
Подякували: Chemist-i, P.Y., hamster.ostap, leofun014

4

Re: Допоможіть з завданням будь ласка

koala написав:

Вітаю на форумі.
0. Бажано все ж дописувати, чим саме вас не влаштовує ваш розв'язок.
1. Вам треба зробити наперед визначену кількість операцій, для цього існує цикл for:

for x in range(1,n):

Одразу прибираються x=1 та x+=1.
2. Вам не обов'язково діставатися кінця циклу - якщо хоча б один раз зустріли неправильну відстань, треба переривати цикл оператором break.
3. Вам не треба підраховувати кількість "правильних" відстаней, достатньо лише однієї неправильності; значить, answer можна зробити не числом, а прапорцем булевого типу.
4. У самій умові if ви нащось зайвий раз перетворюєте елементи списку на int. Нащо?
Тобто виходить щось таке:

n = int(input())
a = list(map(float, input().split()))
answer = True
for x in range(1,n):
    if a[x]-a[x-1]<2:
        answer = False
        break
if answer:
    print('YES')
else:
    print('NO')

Але тут слід знати, що в Python є ідіоматичні вирази для таких конструкцій. По-перше, якщо нам треба йти в циклі по парах елементів, то це можна зробити за допомогою функції zip, що "зліплює" два набори парами:

for x,y in zip(a,a[1:]):
    if y-x<2:...

По-друге, перевірка, чи є в наборі елемент з потрібними властивостями, виконується функціями any та all, наприклад

answer = all(y-x>=2 for x,y in zip(a,a[1:]))

Ну і дрібничка - нам у Python не потрібне n, бо це розмір списку у другому рядку. Отже:

input()#читаємо перший рядок і "викидаємо" його
a = list(map(int, input().split()))
print('YES' if all(y-x>=2 for x,y in zip(a,a[1:]) else 'NO')

Дякую! Можете скинути якісь ресурси для вивчення Python, усе, що я найшов на російській мові або платні

5 Востаннє редагувалося koala (01.11.2020 11:21:37)

Re: Допоможіть з завданням будь ласка

У нас тут один форумчанин перекладав: https://uk.wikibooks.org/wiki/Пориньте_у_Python_3.
Але якщо хочете програмувати - вам доведеться вивчити англійську. Російською доступне далеко не все.

Подякували: leofun011

6 Востаннє редагувалося ur_naz (01.11.2020 11:27:46)

Re: Допоможіть з завданням будь ласка

по-перше, це не "компілюється", по-друге, це не працює коректно...

7

Re: Допоможіть з завданням будь ласка

ur_naz написав:

по-перше, це не "компілюється", по-друге, це не працює коректно...

Дякую, закрив дужку.
А ви могли б замість "не компілюється" писати детальніший опис, бо виглядає це як скарга десятикласника. Бо не зрозуміло навіть, чи встановили ви в себе на комп'ютері Python - а без цього точно не "скопмілюється".

8 Востаннє редагувалося ur_naz (01.11.2020 14:33:59)

Re: Допоможіть з завданням будь ласка

встановлювати  питон щоб запускати код в 2020? Ви з якої планети?

9

Re: Допоможіть з завданням будь ласка

Тоді перемкніть мову в своєму онлайн-компіляторі. Якщо ви використовуєте його, а не якийсь обмінник з підсвіткою коду. З вашого допису ніяк не можна зрозуміти, що це саме так.

10

Re: Допоможіть з завданням будь ласка

ваша іронія невлучна, а ваші трюки можуть призвести до падіння літака.

11

Re: Допоможіть з завданням будь ласка

Не можуть, бо я не раджу використовувати їх на літаку.
А от знати їх варто - зокрема для того, щоб літак не впав.

12

Re: Допоможіть з завданням будь ласка

тож поясніть, яка бага в цьому коді, чому це "працює" і чому так не треба робити ніколи

13

Re: Допоможіть з завданням будь ласка

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

14 Востаннє редагувалося ur_naz (01.11.2020 22:52:50)

Re: Допоможіть з завданням будь ласка

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

15

Re: Допоможіть з завданням будь ласка

ur_naz написав:

тому що операцїї з неіснуючим об'єктом призводять до невизначеної поведінки

ААААААААААААА
Невизначена поведінка.
В Python.
Підіть здайте диплом туди, де вам його видали. Якщо він у вас є, звісно.
Понавипускають неуків, що лише кілька розумних слів запам'ятали, а потім дивуються, чому нічого не працює.

Подякували: leofun011

16

Re: Допоможіть з завданням будь ласка

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

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

17

Re: Допоможіть з завданням будь ласка

ur_naz написав:

спроможність находити лише грубі помилки, не дає права копіювати мою поведінку, бо вона (поведінка) під копірайтом.

Поведінка не є об'єктом авторського права. Але якби навіть і була - право на пародію належить уже мені.

ur_naz написав:

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

Тобто ви сумніваєтеся, що 256*1024*1024 байтів не вистачить для додаткових 103 посилань на об'єкти типу int? Звісно, Python багато речей не гарантує, таких, як розмір int, але в цьому випадку, гадаю, у вас серйозні проблеми з математикою за третій клас.

ur_naz написав:

І звідки впевненість, що вони вчили зіп-ітератори? А ця функція зіп? як без паління мануалів розібратися?

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

ur_naz написав:

що вона ігнорує хвіст більшої послідовності?

Ви можете відкрити мануал, але якщо так цікаво - ігнорує. itertools.zip_longest додає None або вказане другим параметром значення в кінець коротшої послідовності.

ur_naz написав:

математично операції з послідовностями різного розміру є нонсенс, тому що викликають невизначеність. чи це не бага?

Математично деякі операції з послідовностями різного розміру не визначені, але це не той випадок.

ur_naz написав:

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

Знаєте, є така проблема - біти DRAM можуть самовільно змінюватися (найчастіше під впливом космічного випромінення). Саме тому на сервери ставлять пам'ять з ECC. Як часто ви у вимогах до середовища вказуєте пам'ять ECC? Як часто ви додаєте в код обробник подвійних помилок? У вас що, весь код забагований?

ur_naz написав:

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

Викладачеві у поганому настрої буває неможливо здати будь-який код; це проблема не коду, це проблема викладача. Але мій код повністю вкладається в умови й обмеження, а ви так і не написали в житті жодної програми, що обробляє особливі ситуації ECC.

Подякували: wander, leofun012

18

Re: Допоможіть з завданням будь ласка

будь ласка, зупиніть цей потік комічного випромінювання. Бо здається ведмедик захворів віталіком, не бачить меж, не розуміє що йому хочуть донести і відповідає жалюгідним кацапським манером.

По-перше, я не давав згоди на пародування мене. Й ліцензії на це в  вас немає. Тож ваші дії протизаконні. Треба було хоча б поцікавитися перед тим як починати... По-друге, "застав дурного Богу молитися — він і лоб розіб'є". Ви й того не знаєте і не вмієте. А вчити вас я не збираюсь? тож облиште.

Щодо умови і обмежень. по-перше, ця умова універсальна, для будь якої мови. Це треба розуміти перед тим, як вмикати розумника. По-друге, задача ця проста, тому обмеження формальні. Але це не дозволяє нехтувати принципами KISS. Бо рано чи пізно це призведе до великих проблем. чи невже потрібно пояснювати яких проблем? то чи це не бага? більш того. написання коду триває лише 5% всього часу розробки ПЗ, а читання - на порядок більше.

19

Re: Допоможіть з завданням будь ласка

Що саме вам не зрозуміло у виразі

Надрукувати ТАК якщо всі y-x>=2 для x,y серед пар з a,a[1:] інакше НІ

Будь-яка людина, що знає Python на середньому рівні, цей код прочитає саме так - і практично саме так код і записано. Ви не знаєте Python на середньому рівні? То чого вважаєте, що можете робити зауваження іншим?

Подякували: leofun01, Q-bart2

20

Re: Допоможіть з завданням будь ласка

як кажуть дивлюсь я на небо дивлюсь у книгу й бачу фігу. Синтаксис тут ні до чого. я вже втомився поясняти, чому так не треба робити. Є три види коду: гарний, поганий і потворний. оце є третій випадок