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

Вывести все возможные варианты результата и их вероятности

23.08.2021, 18:46. Показов 28637. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По пятницам мы часто играем в популярную ролевую игру "Релиз до выходных" с коллегами. Правила этой игры довольно сложны и предполагают хорошую стратегию и планирование. Чтобы иметь представление о последствиях тех или иных ходов, часто хочется понимать, насколько вероятен тот или иной исход ситуации, с учетом разных вариантов выпадения игральных костей.

Необходимо написать программу, которая сможет, приняв на вход последовательность операндов и операций, вывести все возможные варианты результата и их вероятности.

Выражение на входе может содержать скобки, и следующие операторы в порядке уменьшения их приоритета:

* – умножение
+ и - – сложение и вычитание
> - левый операнд больше, чем правый. Результат равен 1, если истинно, и 0 - если ложно

В качестве операндов могут выступать:

n - целые положительные числа, либо 0 (0≤n≤100 000)
dn - результат броска игральной кости, где n целое положительное число, количество граней (1≤n≤100 000). Результатом будет равномерное распределение вероятностей между всеми гранями (от 1 до n).

Входные данные (поступают в стандартный поток ввода)
Одна строка без пробелов, содержащая выражение для вычисления. Выражение гарантировано вычисляемое и не содержит синтаксических ошибок. Максимальная длина строки 200 символов.


Выходные данные (ожидаются в стандартном потоке вывода)
Одна или несколько строк, в каждой из которых есть два числа, разделенных пробелом:

1. целое – один из вариантов результата
2. вещественное - процент вероятности такого варианта с математическим округлением до 2 знаков и разделителем .
Строки на выходе должны быть отсортированы от меньшего результата к большему.

Примечание к округлению - в связи с округлением вероятностей - суммарная вероятность всех исходов может быть не равна 100%, это нормально, компенсировать это в решении не нужно.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2021, 18:46
Ответы с готовыми решениями:

Комбинаторика: вывести все возможные варианты
Вывести все возможные варианты слов, которые можно составить из первых 4-х букв английского алфавита(буквы не должны повторяться),...

Вывести все возможные варианты значений
Помогите решить следующую проблему: Имеется 14 столбцов; в ячейке каждого из столбцов может находиться одно из трех значений: 1, X или 2....

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

65
0 / 0 / 0
Регистрация: 02.09.2021
Сообщений: 1
02.09.2021, 21:56
Студворк — интернет-сервис помощи студентам
Добрый день. Есть у кого-нибудь продвижения в решении? Попробовал по совету FedorPup https://habr.com/ru/post/273253/ переопределить eval, предварительно дополнив операторами сравнения, но результат тот же.Я не программист, уже просто интересно решить эту задачку)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
word = input()
list_var = list(re.findall(r'd\d+', word))
pools = [range(1, int(n[1:])+1) for n in list_var]
result_tmp =  [[]]
result = {}
for pool in pools:
    result_tmp = [x+[y] for x in result_tmp for y in pool]
for i in result_tmp:
 
    tmp = list(zip(list_var, i))
 
    word_tmp = word
    for k,v in tmp:
        word_tmp = word_tmp.replace(str(k), str(v), 1)
 
    res_tmp = eval_(word_tmp)
    result[res_tmp] = result.get(res_tmp, 0)+1
summa = sum(result.values())
for k,v in sorted(result.items(), key=lambda x: x[0]):
    print('{0} {1:.2f}'.format(int(k), v*100/summa))
0
0 / 0 / 0
Регистрация: 29.01.2021
Сообщений: 2
02.09.2021, 23:52
Всем доброго времени суток, такое дело, что у меня тоже есть решение, которое проваливается на закрытых тестах, выдает, что ответ неверен, где прокололся в решении не получается найти.
Для данной строки, что подается на вход, тоже выдается неправильный ответ: 1 1.00, хотя должен быть
0 71.43
1 28.57
Буду благодарен, за совет)
Python
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import re
 
 
class D:
    def __init__(self, tup, f=0):
        if f:
            self.d = {tup[0]: tup[1]}
        else:
            self.d = dict(tup)
 
    def __add__(self, other):
        t = {}
        for k1, v1 in self.d.items():
            for k2, v2 in other.d.items():
                if k1 + k2 in t.keys():
                    t[k1 + k2] += v1 * v2
                else:
                    t[k1 + k2] = v1 * v2
        return D(t.items())
 
    def __sub__(self, other):
        t = {}
        for k1, v1 in self.d.items():
            for k2, v2 in other.d.items():
                if k1 - k2 in t.keys():
                    t[k1 - k2] += v1 * v2
                else:
                    t[k1 - k2] = v1 * v2
        return D(t.items())
 
    def __mul__(self, other):
        t = {}
        for k1, v1 in self.d.items():
            for k2, v2 in other.d.items():
                if k1 * k2 in t.keys():
                    t[k1 * k2] += v1 * v2
                else:
                    t[k1 * k2] = v1 * v2
        return D(t.items())
 
    def __gt__(self, other):
        t = {}
        for k1, v1 in self.d.items():
            for k2, v2 in other.d.items():
                if int(k1 > k2) in t.keys():
                    t[int(k1 > k2)] += v1 * v2
                else:
                    t[int(k1 > k2)] = v1 * v2
        return D(t.items())
 
 
inf, pattern = "999*2*(d5-d7)>3+d9>3*(4>d4)", re.compile(r"(?:d\d+)|\d+")
list_to_join = re.findall(r"(?:d\d+)|\d+|[-+*>()]", inf)
lenght = len(list_to_join)
 
for i in range(lenght):
    if list_to_join[i].isdigit():
        list_to_join[i] = f"D({(int(list_to_join[i]), 1)}, 1)"
    elif list_to_join[i] in ("*", ">", "+", "-", ")", "("):
        continue
    else:
        list_to_join[
            i] = f"D({tuple((x, 1/int(list_to_join[i].lstrip('d'))) for x in range(1, int(list_to_join[i].lstrip('d')) + 1))})"
 
inf = "".join(list_to_join)
 
result = eval(inf)
for k, v in sorted(result.d.items()):
    print(f"{k} {v:.2f}")
0
0 / 0 / 0
Регистрация: 29.01.2021
Сообщений: 2
03.09.2021, 13:00
Упс, случайно написал еще одно сообщение)
0
3 / 3 / 0
Регистрация: 02.09.2021
Сообщений: 7
04.09.2021, 06:09
Pupupu13, в вашем коде отрицательные числа некорректно обрабатываются. Попробуйте, к примеру, выражение "-1>0"
0
0 / 0 / 0
Регистрация: 04.09.2021
Сообщений: 2
04.09.2021, 17:57
Просмотрел коды всех участников. Некоторые довел до правильного результата, например вот этот:

Python
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
import re
import string
from itertools import product
 
new_var_bank = []
for i in string.ascii_lowercase[:10]:
    for j in string.ascii_lowercase[:10]:
        new_var_bank.append(i + j)
        if len(new_var_bank) == 100:
            break
 
expression = 'd100+d100+d100+d100'
 
variables = sorted(re.findall(r'd\d+', expression), key=lambda x: int(x[1:]))
combinations = list(product(*[range(1, int(v[1:]) + 1) for v in variables]))
while len(set(variables)) != len(variables):
    for i in range(len(variables) - 1):
        if variables[i] == variables[i + 1]:
            new_var_name = new_var_bank.pop()
            expression = expression.replace(variables[i], new_var_name, 1)
            variables[i] = new_var_name
res = {}
for interval in combinations:
    for x, y in zip(interval, variables):
        vars()[y] = x
    key = eval(expression)
    res[key] = res.get(key, 0) + 1
s = sum(res.values())
answer = sorted(res.items(), key=lambda f: f[0])
for k, v in answer:
    print(f'{k} {v / s * 100:.2f}')
Но все предложенные варианты не проходят валидацию по времени и сыпятся уже на вот такой последовательности:
'd100+d100+d100+d100'. Работаем дальше)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.09.2021, 19:21
iStorm, а что выдает? неправильный ответ или превышение лимита времени выполнения?
0
3 / 3 / 0
Регистрация: 02.09.2021
Сообщений: 7
04.09.2021, 20:49
Народ, у кого решение не принимает, проверьте выражение "4>3>2", правильный ответ 0 100.00
0
0 / 0 / 0
Регистрация: 04.09.2021
Сообщений: 2
04.09.2021, 21:56
eaa, мой компьютер падает, пытаясь это посчитать (то есть перегрузка по времени и по памяти).

Добавлено через 7 минут
Мне это говорит о том, что выбраны не правильные алгоритм. Думаю, что ответ нужно искать в этом направлении:
Например:
dx + dy + ... + dz, (последовательность, где n - элементов)
выдаст x+y+...+z - (n-1) результатов от n до x+y+...+z

Пока не понял, как в этом случае распределяются вероятности...
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.09.2021, 21:59
Не было умножения... А тут умножение есть.
0
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 1
05.09.2021, 08:36
Einsamkeit, После исправления прошло решение или нет?
0
3 / 3 / 0
Регистрация: 02.09.2021
Сообщений: 7
05.09.2021, 08:59
ydf, да, решение принято. Дело оказалось не в скорости работы, а в eval и его работе с операторами сравнения.
3
enx
 Аватар для enx
1189 / 765 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
05.09.2021, 16:26
Это отличное наблюдение, и да, тесты валяться именно из-за этого, но по какой логике? eval() работает именно так, как положено ЯП, первое выражение имеет приоритет, все остальные вычисляются справа - налево, в случае если отсутствует очевидный приоритет в виде отличного правила, называется скобки.

Синтаксически правильно оно пишется так, в зависимости от того, какой результат ожидается:

4>(3>2)
(4>3)>2

В кейсе я вижу следующее:

1. Выражение гарантировано вычисляемое и не содержит синтаксических ошибок

И не вижу:

2. В случае наличия более чем одного оператора сравнения, приоритет вычисления должен быть слева - направо.

Во всех остальных случаях мы имеем кота шредингера, который либо 1 либо 0 на выбор создателей кейса. Почему тогда вычисляем слева - направо, может я тут хочу начать с середины?


d50>4>3>2>1>0>1>2>3>4>d50

Добавлено через 33 минуты
Добавлю пруфов, без eval(), чтобы у новичков не было ощущения, что это поведение данной функции.

1. print(int(4 > 3 > 2), int((4 > 3) > 2), int(4 > (3 > 2)), sep='\n')

2. https://docs.python.org/3/refe... tion-order

Поэтому даже голый Py интерпретирует подобное выражение:

5 > 4 > 3 > 2 > 1

5 > (4 > (3 > (2 > 1)))

5 > (4 > (3 > 1))

5 > (4 > 1)

5 > 1

1

И так должно быть всегда, в случае если заказчиком прямо не заявлено обратное )))
0
4 / 4 / 0
Регистрация: 05.09.2021
Сообщений: 4
05.09.2021, 17:07
Питон интерпретирует цепочку сравнения как цепочку булевых операций объединенных логическим "и":
x < y <= z is equivalent to x < y and y <= z
REF

Такая вот подковырка, но структура задачи вербально предполагает DIY парсинг без eval плюшек, а в таком варианте нативна С-подобная интерпретация.
0
enx
 Аватар для enx
1189 / 765 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
05.09.2021, 17:15
Какая разница, что подразумевает задача, если она нарушает логику ЯП.
А так, да, можно самодельные 2 + 2 = 5 написать, и доказать что это фича такая.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
05.09.2021, 20:26
Цитата Сообщение от Einsamkeit Посмотреть сообщение
4>3>2
ну все понятно тогда.
0
1 / 1 / 0
Регистрация: 07.09.2021
Сообщений: 3
07.09.2021, 11:25
Всем доброго дня.
Разъясните пожалуйста условия задачи.
Как из d4+(d6>2)
получается это:

1 8.33
2 25.00
3 25.00
4 25.00
5 16.67
0
4 / 4 / 0
Регистрация: 05.09.2021
Сообщений: 4
07.09.2021, 13:44
вот так:
Code
1
2
3
4
5
6
7
8
d4+(d6>2)
total variations: 24
res | %     |Nv |v_list
1   8.33    2:  1+(1>2)=1  1+(2>2)=1
2   25.00   6:  1+(3>2)=2  1+(4>2)=2  1+(5>2)=2  1+(6>2)=2  2+(1>2)=2  2+(2>2)=2
3   25.00   6:  2+(3>2)=3  2+(4>2)=3  2+(5>2)=3  2+(6>2)=3  3+(1>2)=3  3+(2>2)=3
4   25.00   6:  3+(3>2)=4  3+(4>2)=4  3+(5>2)=4  3+(6>2)=4  4+(1>2)=4  4+(2>2)=4
5   16.67   4:  4+(3>2)=5  4+(4>2)=5  4+(5>2)=5  4+(6>2)=5
P.S. Кстати там чат есть, вопрос, имхо, критериям удовлетворяет
0
1 / 1 / 0
Регистрация: 07.09.2021
Сообщений: 3
07.09.2021, 14:11
Правильно ли понимаю, что
вместо d4 и d6 при вычислении подставляются значение от 1 до 4 и от 1 до 6 соответственно.
Далее перебрать все комбинации этих значений (d), подставить в формулу и вычислить выражение.
Далее посчитать сколько в процентах встречается каждый результат вычисления выражения?

Добавлено через 8 минут
Да, действительно есть чат, спасибо, не заметил.
Закинул вопрос туда, посмотрим что ответят.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
07.09.2021, 14:12
почитайте тему сначала тут все расписано уже.
0
1 / 1 / 0
Регистрация: 07.09.2021
Сообщений: 3
07.09.2021, 14:17
Конечно же прочитал. Но тут обсуждение решения, а вот разжевывания условий нет. А мне как раз условия и не понятны, что вообще нужно посчитать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2021, 14:17
Помогаю со студенческими работами здесь

Вывести все возможные варианты разреза трубы
Вводится длина трубы, количество заготовок (1, 2, 3, 4 ил 5), которые можно вырезать из трубы, и длина каждой заготовки. Вывести все...

Вывести все возможные варианты хода конем
можете решить задачу в GDB online Compiler на шахматную доску поставили коня,виведите все возможние варианти хода конем. например:программа...

Вывести на экран все возможные варианты покупок
Нужно вывести на экран все возможные варианты покупок на 100р, допустим bull=5 cow=2.5 calf=0.5. И надо чтобы было куплено как минимум по...

Заменить все вопросительные знаки цифрами (от 1 до 9), перевести строку в число, вывести все возможные варианты
Дана строка состоящая из цифр и вопросительных знаков. Длина строки от 1 до 9 символов. Цель: заменить все вопросительные знаки цифрами (от...

Структуры. Вывести все возможные варианты покупки товаров
может кто нибудь помочь составить прогу /* с++ */ 1) С клавиатуры вводятся записи вида: товар - стринг (название товара) цена -...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru