Определить есть ли в массиве из 30 элементов хотя бы одна тройка соседних чисел, в которой средний элемент больше своих "соседей"

school

Новичок
Пользователь
Апр 23, 2020
4
0
1
Определить есть ли в массиве из 30 элементов хотя бы одна тройка соседних чисел, в которой средний элемент больше своих "соседей", т. е. предшествующего и последующего. В случае положительного ответа определить номера элементов первой из таких троек. Результат вывести на экран.

Просьба решить на Python максимально подробно и просто. Я пока слабо разбираюсь в этой теме
 

ValeraSafin

Новичок
Пользователь
Апр 23, 2020
5
3
3
Python:
array = [4, 1, 63, 23, 52, 76, 74, 400, 82, 100, 232, 543, 61, 754, -21, -234, 0, 234, 324, 234, 654, 77,52, 52, 3, 7, 23, 46, 43, 63]


# создаём цикл, в котором i будет принимать значения 0, 3, 6, 9 ...
for i in range(0, len(array), 3):
  # в условии складываем 1 и 3 число тройки чисел
  # и сравниваем результат этого сложения со 2 числом в тройке
  if array[i] + array[i+2] < array[i+1]:
    print(i, i+1, i+2)
    break

Вроде бы написано просто. Конечно же если количество элементов в списке будет не кратно 3, то будет ошибка с индексами

UPD: видимо не совсем правильно понял условия задачи, так как тут тройки рассматриваются как позиции (1, 2, 3), (4, 5, 6,), а не не (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)
 
Последнее редактирование:
  • Мне нравится
Реакции: Student и Vlad_SD

borntohack

змееуст
Команда форума
Модератор
Апр 22, 2020
78
62
18
39
Москва, РФ
Допустим у нас есть массив:
Код:
[34, 19, 28, 57, 76, 2, 12, 53, 85, 52, 77, 2, 70, 93, 17, 91, 86, 65, 76, 34, 69, 71, 49, 97, 98, 93, 76, 61, 54, 6]
Нам поможет функция enumerate, которая возвращает как индекс элемента, так и сам элемент
Python:
arr = [34, 19, 28, 57, 76, 2, 12, 53, 85, 52, 77, 2, 70, 93, 17, 91, 86, 65, 76, 34, 69, 71, 49, 97, 98, 93, 76, 61, 54, 6]
for i, e in enumerate(arr):
    if i == 0 or i == 29: # Здесь это может быть len(arr). Нам не интересно работать с крайними элементами
        continue
    rows_of_three = arr[i-1:i+1] #готовим срез массива от i-1 элемента до i+1. Это i-1,i и i+1
    if rows_of_three[1] > rows_of_three[0] and rows_of_three[1] > rows_of_three[2]:
        print(i-1,i,i+1) #средний элемент тройки (с индексом 1) сравнивается с "соседями". Если он больше - выводим индексы всех троих на экран и останавливаемся
        break

Либо в однострочном виде:
Python:
print(", ".join([n for n in [(i-1,i,i+1) if arr[i] > max(arr[i-1],arr[i+1]) else None for i,e in enumerate(arr) if i and i<29] if n][0]))
 
  • Мне нравится
Реакции: Student и Vlad_SD

Yanichar

Новичок
Пользователь
Апр 23, 2020
1
1
3
Python:
def check(data: []):
    for i in range(0, len(data) - 2):
        # берем 3 числа
        chunk = data[i:i+3:]

        # проверяем кусок на соответсвие
        if chunk[0] < chunk[1] and chunk[2] < chunk[1]:
            return i, i+1, i+2

    return None

# длина может быть любой от 3х элементов
test = [1, 2, 3, 4, 5, 6, 7, 8]
print(check(test))
 
  • Мне нравится
Реакции: Student

Vlad_SD

Активный пользователь
Пользователь
Апр 7, 2020
91
45
18
Python:
from random import randint
# создали список из рандомных чисел
_list = [(randint(1, 100)) for _ in range(31)]
print(_list)

# i учитывает индекс элемнта в списке
i = 1
# цикл переберает все значения списка начиная с элемента с индексом 1 и до конца (превый элемент имеет индекс = 0)
for num in _list[1::]:
    # условие, которое проверяет, соседние элементы
    if _list[i - 1] < num and _list[i + 1] < num:
        print(_list[i - 1], _list[i], _list[i + 1])
        # при нахождении выходим из цикла
        break
    else:
        # иначе прибавляем к индексу 1 и снова сравниваем
        i += 1

 
  • Я влюблен!
Реакции: Student

Vlad_SD

Активный пользователь
Пользователь
Апр 7, 2020
91
45
18
мне кажется такое решение не подходит для решения егэшного задания
Нужно написать подобно, а я плохо пока разбираюсь в оформлении и могу выполнить решение только на паскале
1)const
N = 100500;
var
a: array[1..N] of integer;
i,index: integer;
begin
for i :=1 to N do
read(a);
index := -1;
for i := 2 to (N─1) do
if ((a > a[i─1]) and (a > a[i+1]) and (index=-1)) then index := i;
if (index = -1) then
write('Нет таких чисел')
else
write(inde
Отредактируйте сообщение и вставьте код правильно, для этого ознакомьтесь с темой:

Как правильно составить вопрос и не получить бан?
 

Hacker666)

Новичок
Пользователь
Апр 23, 2020
1
1
3
  1. Python:
    array = [82, 2, 40, 1, 64, 20, 77, 9, 13]  # И так далее
    
    # Определяют индексы чисел
    num1 = 0
    num2 = 1
    num3 = 2
    for i in range(2,  len(array) ):
        # Идёт сравнение суммы двух крайних чисел и числа посередине
        f = int(array[num2]) > int(array[num1]) + int(array[num3])
        # Если обнаруживается такое трио, то оно выводится на экран(например: 3;100;5)
        if f:
            print(str(array[num1]) + ";" + str(array[num2]) + ";" + str(array[num3]))
            break
        # Если  не обнаружил нужного трио, то передвигается на шаг вперед
        num1 += 1
        num2 += 1
        num3 += 1
 
  • Мне нравится
Реакции: Student

school

Новичок
Пользователь
Апр 23, 2020
4
0
1
мне кажется такое решение не подходит для решения егэшного задания
Нужно написать подобно, а я плохо пока разбираюсь в оформлении и могу выполнить решение только на паскале
1)const
N = 100500;
var
a: array[1..N] of integer;
i,index: integer;
begin
for i :=1 to N do
read(a);
index := -1;
for i := 2 to (N─1) do
if ((a > a[i─1]) and (a > a[i+1]) and (index=-1)) then index := i;
if (index = -1) then
write('Нет таких чисел')
else
write(inde
 

Форум IT Специалистов