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

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

23.08.2021, 18:46. Показов 29215. Ответов 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
1191 / 767 / 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
1191 / 767 / 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
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru