Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33

Переключение между окнами. Нужна консультация насчет работоспособности программы

08.03.2024, 21:02. Показов 2856. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Условие задачи:
Когда пользователь работает в операционной системе Windows, у него часто запущено несколько приложений. Каждое из приложений работает в отдельном окне. Для переключения между окнами используется комбинация клавиш «Alt+Tab». Эта комбинация делает активным окно, в котором пользователь работал перед тем, как перейти в текущее активное окно.

Чтобы переключиться в другое окно, можно нажать клавишу «Alt» и затем, не отпуская ее, несколько раз нажать клавишу «Tab». Чтобы понять, какое окно станет активным после этого, воспользуемся следующей моделью. Пусть запущено n приложений. Приложения в операционной системе организованы в виде списка и упорядочены по убыванию времени последней активности. То есть приложение, окно которого является активным в настоящий момент – первое в списке, приложение, окно которого было активно перед этим – второе, и т. д.

Если нажать клавишу «Alt» и затем, не отпуская ее, нажать клавишу «Tab» k раз, то активным станет окно приложения, которое находится на (k mod n) + 1-м месте в списке. Здесь a mod b означает остаток от деления a на b. Иными словами, операционная система рассматривает список как циклический, переходя после последнего элемента списка к первому.

При запуске нового приложения оно добавляется в начало списка.

Задана последовательность действий пользователя, где каждое действие – либо запуск приложения, либо переключение между окнами. Выведите список имен приложений в том порядке, в котором с ними работал пользователь.

Входные данные
В первой строке вводится целое число n – количество действий пользователя ( 1 ≤ n ≤ 1000). Следующие n строк содержат описание действий пользователя.

Запуск приложения описывается строкой «Run <имя приложения»>. Здесь «<имя приложения»> – строка из не более чем 100 латинских букв, цифр и пробелов. Она отделена от слова «Run» ровно одним пробелом. Все имена приложений различны. Большие и маленькие буквы считаются различными.

Переключение между приложениями описывается строкой «Alt+Tab+...+Tab», здесь подстрока «+Tab» повторена в точности столько раз, сколько раз пользователь нажал клавишу «Tab», не отпуская клавишу «Alt». Это количество не превышает 100.

Первая команда во входных данных – всегда команда «Run».

Выходные данные
Выведите n строк – последовательность имен приложений, с которыми работал пользователь в порядке, в котором их окна становились активными.

Тесты
Вход:
6
Run Mozilla Firefox
Run Free Pascal
Alt+Tab
Run Miranda IM
Alt+Tab+Tab
Alt+Tab+Tab+Tab
Выход:
Mozilla Firefox
Free Pascal
Mozilla Firefox
Miranda IM
Free Pascal
Free Pascal
Написал следующий код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
from collections import deque
 
n = int(input())
programms = deque([])
for i in range(n):
    comma = input()
    if 'Run' in comma:
        programms.appendleft(comma[4:])
        print(comma[4:])
    elif 'Alt' in comma:
        programms[0], programms[comma.count('+Tab') % len(programms)] = programms[comma.count('+Tab') % len(programms)], programms[0]
        print(programms[0])
Проходит на 28% (тестов).
Есть ещё одно решение, "извращенное":
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import deque
 
n = int(input())
programms = deque([])
for i in range(n):
    comma = input()
    if 'Run' in comma:
        programms.appendleft(comma[4:])
        print(comma[4:])
    elif 'Alt' in comma:
        openProgramm = list(programms).pop(comma.count('+Tab') % len(programms))
        print(openProgramm)
        programms.appendleft(openProgramm)
Проходит на 12% (тестов).
Спасите-помогите, я уже без понятия, в чем накосячить мог тут...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2024, 21:02
Ответы с готовыми решениями:

Сделать так чтобы при выполнении программы происходило переключение между двумя окнами
Необходимо сделать так чтобы при выполнении программы происходило переключение между двумя окнами и обязательно чтобы эти окна находясь в...

нужна консультация насчет ошибок в программе

Переключение между окнами
Добрый вечер. Из основного окна открываю второстепенное и скрываю основное: private class PicActionListener implements MouseListener {...

28
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
09.03.2024, 00:08
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
arr = []
n = int(input('n = '))
pos = None
res = []
for _ in range(n):
    s = input('->')
    if s.startswith('R'):
        _,_,name = s.partition(' ')
        arr.insert(0, name)
        pos = 0
        res.append(arr[pos])
    elif s.startswith('A'):
        k = s.split('+')
        shift = len(k)-1
        pos = (pos + shift) % len(arr)
        first = arr.pop(pos)
        arr.insert(0, first)
        pos = 0
        res.append(arr[pos])
print(*res, sep='\n')
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
09.03.2024, 00:24  [ТС]
idealist, 32% тестов пройдено
0
0 / 0 / 0
Регистрация: 25.04.2021
Сообщений: 11
09.03.2024, 09:02
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arr = []
n = int(input('n = '))
for num in range(n):
    s = input('->')
    if s.startswith("Run "):
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        k = s.split('+')
        n_Tab = len(k)-1
        new_exe = arr[n_Tab]
        n_Tab = n_Tab % len(arr)
        arr.insert(0, arr[n_Tab])
        
arr.reverse()
for i in range(len(arr)):
    print(arr[i])
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
09.03.2024, 11:49
sidomarev, а, да, наверно не нужно дубликаты уничтожать, наверно здесь моя ошибка.
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
10.03.2024, 13:16  [ТС]
sidomarev, 8% тестов проходит + возвращает ошибку выполнения

Добавлено через 2 часа 1 минуту
sidomarev, подправил код, чтобы не получалось ошибки выполнения (вылет за пределы списка из-за n_Tab)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
arr = []
n = int(input())
for num in range(n):
    s = input()
    if s.startswith("Run "):
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        k = s.split('+')
        n_Tab = len(k)-1
        n_Tab = n_Tab % len(arr)
        new_exe = arr[n_Tab]
        arr.insert(0, arr[n_Tab])
arr.reverse()
for i in range(len(arr)):
    print(arr[i])
Добавлено через 15 секунд
Однако 12% выполненных тестов

Добавлено через 49 секунд
Цитата Сообщение от sidomarev Посмотреть сообщение
new_exe = arr[n_Tab]
не могу понять смысл переменной new_exe, поскольку она нигде не используется
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
10.03.2024, 15:36
Может так будет правильнее:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input('n = '))
arr = []
res = []
for _ in range(n):
    s = input('->')
    if s.startswith('R'):
        _,_,name = s.partition(' ')
        arr.insert(0, name)
    elif s.startswith('A'):
        shift = s.count('+')
        arr = arr[shift:] + arr[:shift]
    res.append(arr[0])
print(*res, sep='\n')
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
10.03.2024, 16:40  [ТС]
Цитата Сообщение от idealist Посмотреть сообщение
Может так будет правильнее
Только хуже стало(
20%
Парадоксальная задача...
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
10.03.2024, 17:48
Еще попытка:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
n = int(input('n = '))
arr = []
res = []
pos = 0
for _ in range(n):
    s = input('->')
    if s.startswith('R'):
        _,_,name = s.partition(' ')
        arr.insert(pos, name)
    elif s.startswith('A'):
        shift = s.count('+')
        pos = (pos + shift) % len(arr)
    res.append(arr[pos])
print(*res, sep='\n')
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
10.03.2024, 18:00  [ТС]
idealist, 24%...
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
10.03.2024, 18:07
Цитата Сообщение от aKrass Посмотреть сообщение
24%...
М-да, забавная задачка!
1
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
10.03.2024, 18:21  [ТС]
Цитата Сообщение от idealist Посмотреть сообщение
М-да, забавная задачка!
Согласен
Если сам найду ответ, то выложу в тему
0
0 / 0 / 0
Регистрация: 25.04.2021
Сообщений: 11
12.03.2024, 21:29
Так интересно, я думал, что тема давно закрыта, а тут жаркие дебаты,
а попробуйте вот так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
arr = []
n = int(input('n = '))
for num in range(n):
    s = input('->')
    if s.startswith("Run "):
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        k = s.split('+')
        n_Tab = len(k)-1
        new_exe = arr[n_Tab]
        arr.insert(0, new_exe)
        
arr.reverse()
for i in arr:
    print(i)
Добавлено через 22 минуты
Вернее так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arr = []
n = int(input('n = '))
for num in range(n):
    s = input('->')
    if s.startswith("Run "):
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        k = s.split('+')
        n_Tab = len(k)-1
        sdvig = n_Tab % len(arr)
        new_exe = arr[sdvig]
        arr.insert(0, new_exe)
        
arr.reverse()
for i in arr:
    print(i)
0
0 / 0 / 0
Регистрация: 25.04.2021
Сообщений: 11
13.03.2024, 07:44
Еще раз перечитал задание, и получилось вот что:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
arr = [] #список запущенных приложений
otvet = [] #список активных окон
 
n = int(input('n = '))
for num in range(n):
    s = input('->')
    if s.startswith("Run "):
        otvet.append(s[4:])
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        k = s.split('+')
        n_Tab = len(k)-1
        sdvig = n_Tab % len(arr)
        active_win = arr[sdvig]
        # помещаю active_win в ответ
        otvet.append(active_win)
        # перемещаю active_win в начало списка arr[]
        arr.pop(sdvig)
        arr.insert(0, active_win)
        
for i in otvet:
    print(i)
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
13.03.2024, 11:40
sidomarev, так, мы уже по кругу пошли В сообщении 2 у меня по-моему точно такое же решение...
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
13.03.2024, 12:06
Цитата Сообщение от aKrass Посмотреть сообщение
Выведите n строк – последовательность имен приложений, с которыми работал пользователь в порядке, в котором их окна становились активными.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
n = int(input())
arr,res = [],[]
for _ in range(n):
    s = input()
    d,*x = re.split(r'(?i)(?<=^run) |\+',s)
    if d == 'Run':
        arr.insert(0,x)
        res.append(x[0]) 
    else:
        v = arr.pop(len(x)%len(arr))
        arr.insert(0,v)
        res.append(v[0])
print(*res,sep='\n')
0
0 / 0 / 0
Регистрация: 25.04.2021
Сообщений: 11
14.03.2024, 07:43
Да, idealist, Вы правы, извините, заигрался.
Видимо, нужно искать где-то в других направлениях.
0
0 / 0 / 0
Регистрация: 25.04.2021
Сообщений: 11
14.03.2024, 20:44
А можно попробовать отфильтровать ввод:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def sito(new_win):
        if len(new_win) > 100:
                return False
        for i in new_win:
                if i >= "a" and i <= "z":
                        continue
                if i >= "A" and i <= "Z":
                        continue
                if i >= "0" and i <= "9":
                        continue
                if i == " ":
                        continue
                return False
        if new_win[0] == " ":
                return False
        for i in arr:
                if i == new_win:
                        return False
        return True
 
arr = [] #список запущенных приложений
otvet = [] #список активных окон
 
n = int(input('n = '))
if n > 1000:
    n = 1000
for num in range(n):
    s = input('->')
    if s.startswith("Run "):
        otvet.append(s[4:])
        if sito(s[4:]) == False:
            continue
        arr.insert(0, s[4:])
    elif s.startswith("Alt+"):
        if n == 0:
            continue
        k = s.split('+')
        n_Tab = len(k)-1
        sdvig = n_Tab % len(arr)
        active_win = arr[sdvig]
        # помещаю active_win в ответ
        otvet.append(active_win)
        # перемещаю active_win в начало списка arr[]
        arr.pop(sdvig)
        arr.insert(0, active_win)
        
for i in otvet:
    print(i)
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
15.03.2024, 08:09  [ТС]
sidomarev, YuS_2
У всех 32% тестов, не проходит одни и те же тесты
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
15.03.2024, 11:00
Цитата Сообщение от aKrass Посмотреть сообщение
У всех 32% тестов, не проходит одни и те же тесты
Либо условия задачи неполные, либо авторы тестов - гики...
Задайте вопрос им, что в коде работает неверно... относительно озвученных условий, естественно.

aKrass,
Если только учесть, что не гарантируется ввод верных строк, т.е. только "Run ..." и "Alt+..." и упоминание:
Цитата Сообщение от aKrass Посмотреть сообщение
Большие и маленькие буквы считаются различными.
то можно уточнить код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re
n = int(input())
arr,res = [],[]
for _ in range(n):
    s = input()
    d,*x = re.split(r'(?<=^Run) |\+',s)
    if any(y == 'Tab' for y in x):
        x = [y for y in x if y == 'Tab' ]
    if d == 'Run':
        arr.insert(0,x)
        res.append(x[0]) 
    elif d == 'Alt' and all(y == 'Tab' for y in x):
        v = arr.pop(len(x)%len(arr))
        arr.insert(0,v)
        res.append(v[0])
print(*res,sep='\n')
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2024, 11:00
Помогаю со студенческими работами здесь

Переключение между окнами
Как программе узнать что происходит переключение между окнами в windows? Нужно считать в каждом окне проведенное время.

Переключение между окнами
Привет всем! У меня возникла небольшая проблемка с окнами. Заранее извиняюсь, не знаю, как правильно сформулировать вопрос. Как запретить...

Переключение между окнами
Привожу пример: Есть 3 открытых вещи - гугл хром и 2 документа в либр офисе. По альт таб переключается только между хромом и одним из...

Переключение между окнами
Как в дизайнере сделать через tab переключение между окнами?

Переключение между окнами
Всем привет! Вопрос такой. Вот, например взять Tab Widget, в нем заранее можно в каждом табе разместить свои Layout, в которые уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru