Как найти все возможные значения переменной

На вход подаются данные в таком формате:

generate_json_loads = [{'idzad': 7175912, 'type': 'answer/single', 'quesh': [{'ID': 'h27238', 'txt': 'да'}, {'ID': '2hrsm7', 'txt': 'нет'}]}, {'idzad': 7175915, 'type': 'answer/single', 'quesh': [{'ID': '2qtj2u', 'txt': 'да'}, {'ID': 'f3ahq9', 'txt': 'нет'}]}, {'idzad': 7175914, 'type': 'answer/single', 'quesh': [{'ID': 'maduqk', 'txt': 'нет'}, {'ID': '3hoqim', 'txt': 'да'}]}, {'idzad': 7175913, 'type': 'answer/single', 'quesh': [{'ID': 'vj1a2k', 'txt': 'нет'}, {'ID': '4cd2ic', 'txt': 'да'}]}]

Я, используя форму подстановки:

generate = []
anc = {'answers':{}}
for task in generate_json_loads:
	print(anc)
	for var in task['quesh']:
		print(var)
		i = task['idzad']
		anc['answers'][i] = {'id':var['ID'],"@answer_type":task['type']} 
	generate.append(anc)

Получаю на выходе:

{'answers': {7175912: {'id': '2hrsm7', '@answer_type': 'answer/single'}, 7175915: {'id': 'f3ahq9', '@answer_type': 'answer/single'}, 7175914: {'id': '3hoqim', '@answer_type': 'answer/single'}}}

Но всевозможных комбинаций по формуле 2**i = 16, где 2 это максимальное количество вариантов ответа, а i — количество заданий.
Как мне получить все возможные комбинации в форме выше?

Привет! Работаю над большим проектом. Но свой вопрос объясню на другом
примере…

Допустим мне нужно создать программу которая только умеет выходить из себя)

Но пользователь может написать по разному слово «выход», например, «ВЫХОД», «VYHOD», «Выход», «выход» или «ds[jl»(на раскладке ‘латиница’)и т.д.

Тогда код бы выглядел примерно так

vyhod = input('Введите слово "выход" для выхода из программы:')
if vyhod == 'выход':
    exit(0)
if vyhod == 'Выход':
    exit(0)
if vyhod == 'ВЫХОД':
    exit(0)

и так далее…

Так вот, как можно это всё дело сократить.
Например, я пробовал сделать так:

if vyhod == "выход", "Выход", "ВЫХОД":
    exit(0)

и так

if vyhod == "выход"; "Выход"; "ВЫХОД":
        exit(0)

но это invalid syntax)

1 / 1 / 1

Регистрация: 23.12.2010

Сообщений: 136

1

Найти все возможные значения чисел

13.01.2012, 14:58. Показов 3089. Ответов 16


Студворк — интернет-сервис помощи студентам

задано количество разрядов числа диапазона unsigned long, имеющих значение L. Найти все возможные значения чисел.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

13.01.2012, 14:58

16

829 / 352 / 64

Регистрация: 30.01.2009

Сообщений: 1,204

13.01.2012, 16:05

2

Кол-во разрядов 10-го числа или 2-го?
Для 2-го — 2^L, для 10-го — 10^L



0



1 / 1 / 1

Регистрация: 23.12.2010

Сообщений: 136

13.01.2012, 17:47

 [ТС]

3

вводим разряд и получаем все числа с таким количеством разрядов



0



Арсенал

145 / 67 / 14

Регистрация: 30.12.2011

Сообщений: 137

13.01.2012, 18:57

4

adelok

Насколько я тебя понял, именно так хотел?

C++
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
void print(unsigned long i)
{
    unsigned long bit;
    for (int j = pow(2,i)-1; j>=0; j--)
    {
        for (int k=(i-1); k>=0;k--)
        {
            bit = ((j>>k) & 1);
            cout<<bit<<' ';
        }
        cout<<endl;
    }
}
 
int main()
{
    unsigned long i;
    cout<<"Enter exp:n";
    cin>>i;
 
    print(i);
 
    return 0;
}

Результат
https://www.cyberforum.ru/atta… 1326466501

Вводим разряд и выводим результат. Учти, это степень двойки

Миниатюры

Найти все возможные значения чисел
 



2



go

Эксперт С++

3646 / 1378 / 243

Регистрация: 16.04.2009

Сообщений: 4,526

13.01.2012, 19:18

5

Все гораздо проще

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
 
int main ()
{
    unsigned long max, val = 0;
    size_t cnt;
    
    std::cin >> cnt;
 
    for ( max = static_cast<int> (pow (2., cnt)); val != max ; ++val )
        std::cout << val << " ";
        
    std::cout << std::endl; 
    return 0;
}

Добавлено через 41 секунду
http://liveworkspace.org/code/… fc4706d6f5

Добавлено через 1 минуту
Ну еще можно добавить банальную проверку

C++
1
2
if ( cnt > (sizeof (unsigned long) * 8 )  )
    exit (1);



2



-=ЮрА=-

Заблокирован

Автор FAQ

14.01.2012, 01:16

6

Цитата
Сообщение от adelok
Посмотреть сообщение

задано количество разрядов числа диапазона unsigned long, имеющих значение L. Найти все возможные значения чисел.

— если я правильно понял есть число разрядов, нужно перебрать на экране все числа укладывающиеся в их кол-во, предлагаю реализацию без math.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    unsigned long L;
    //если не изменяет память ULONG_MAX = 0xffffffff т.е   имеет 8 разрядов
    while(8 < L)
    {
        system("cls");
        cout<<"Enter value L : ";
        cin>>L;
    }
    //находим максимальное значение числа
    unsigned long limit = 1;
    unsigned long i;
    for(i = 0; i < L; i++)
        limit *= 10;
    for(i = 0; i < limit; i++)
        cout<<i<<endl;
    system("pause");
    return 0;
}



0



alkagolik

Заблокирован

14.01.2012, 01:59

7

ну… какой вопрос, такие и ответы. Каждый как понял так и ответил и все по своему)))

C
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
#include <stdio.h>
#include <stdlib.h>
 
size_t my_pow ( size_t base, size_t power ) {
   size_t t = base;
 
   if ( power == 0 && base != 0 )
      return 1;
   else if ( power == 0 ) {
      printf("лепишь горбатого!!!");
      exit ( -1 );
   }
   else
      while ( power-- > 1 )
         t *= base;
   return t;
}
 
int main ()
{
   size_t L = 9;
   size_t cnt = my_pow ( 10, L );
 
   while ( cnt != ( size_t ) 1 )
      printf( "%un", cnt++ );
 
   return 0;
}



1



1 / 1 / 1

Регистрация: 23.12.2010

Сообщений: 136

14.01.2012, 10:36

 [ТС]

8

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



0



-=ЮрА=-

Заблокирован

Автор FAQ

14.01.2012, 11:20

9

Цитата
Сообщение от adelok
Посмотреть сообщение

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

— запиши мой код так

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    unsigned long L;
    //если не изменяет память ULONG_MAX = 0xffffffff т.е   имеет 8 разрядов
    while(8 < L)
    {
        system("cls");
        printf("Enter value L : ");
        scanf("%u",&L);
    }
    //находим максимальное значение числа
    unsigned long limit = 1;
    unsigned long i;
    for(i = 0; i < L; i++)
        limit *= 10;
    for(i = 0; i < limit; i++)
        printf("%un",i);
    system("pause");
    return 0;
}

Добавлено через 3 минуты
Код выше печатает всё числа от нуля до числа с разрядностью L если же нужно вывести только L-разрядные числа то этот цикл

Цитата
Сообщение от -=ЮрА=-
Посмотреть сообщение

for(i = 0; i < limit; i++)
* * * * * * * * printf(«%un»,i);

необходимо записать вот так

C
1
2
for(i = limit/10; i < limit; i++)
        printf("%un",i);

Добавлено через 1 минуту
PS:adelok, укажи в какой среде пишешь



1



1 / 1 / 1

Регистрация: 23.12.2010

Сообщений: 136

14.01.2012, 11:21

 [ТС]

10

среда Си



0



go

Эксперт С++

3646 / 1378 / 243

Регистрация: 16.04.2009

Сообщений: 4,526

14.01.2012, 11:21

11

Вот вариант на Си

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <math.h>
 
int main (void)
{
        long max, val = 0;
        size_t cnt;
        
        scanf ("%ld", &cnt);
 
        for ( max = (long) pow (2., cnt) ; val != max ; ++val )
                printf ("%ld ", val);
                
        printf ("n"); 
        return 0;
}

http://codepad.org/X86QG9eT



1



-=ЮрА=-

Заблокирован

Автор FAQ

14.01.2012, 11:50

12

Цитата
Сообщение от adelok
Посмотреть сообщение

среда Си

— код с поста 9 пробовал?



0



1 / 1 / 1

Регистрация: 23.12.2010

Сообщений: 136

14.01.2012, 14:10

 [ТС]

13

alkagolik, при смене L те же числа выдаёт.

мне же вроде нада чтобы с руки вводили разряд L и на выход шли числа с таким количеством разрядов.
Т.е. если L=1, то на выходе 0 1 2 3 4 5 6 7 8 9; L=2, то 10…99. или я что то не пойму…

Добавлено через 23 минуты

Цитата
Сообщение от -=ЮрА=-
Посмотреть сообщение

там 14,15 синтаксис нарушен, i и limit неопознаёт

unsigned long 0..4 294 967 295

Добавлено через 28 минут
вот в посте 11 как убрать числа с меньшим разрядом?например когда задаём разряд 3, то тут нам выводит числа 1о 2ух 3ёх разрядные.



1



alkagolik

Заблокирован

14.01.2012, 15:08

14

Цитата
Сообщение от adelok
Посмотреть сообщение

мне же вроде нада чтобы с руки вводили разряд L и на выход шли числа с таким количеством разрядов.
Т.е. если L=1, то на выходе 0 1 2 3 4 5 6 7 8 9; L=2, то 10…99. или я что то не пойму…

ну тогда я правильно понял вашу задачу. Вам надо только несколько изменить исходник (ввод L, условие выхода из цикла) и всё пойдет как по маслу.



1



-=ЮрА=-

Заблокирован

Автор FAQ

14.01.2012, 18:17

15

Цитата
Сообщение от adelok
Посмотреть сообщение

вот в посте 11 как убрать числа с меньшим разрядом?например когда задаём разряд 3, то тут нам выводит числа 1о 2ух 3ёх разрядные.

— я и писал об этом

Цитата
Сообщение от -=ЮрА=-
Посмотреть сообщение

Код выше печатает всё числа от нуля до числа с разрядностью L если же нужно вывести только L-разрядные числа то этот цикл
Сообщение от -=ЮрА=-
for(i = 0; i < limit; i++)
* * * * * * * * printf(«%un»,i);
необходимо записать вот так
Код C
1
2
for(i = limit/10; i < limit; i++)
* * * * * * * * printf(«%un»,i);

Цитата
Сообщение от adelok
Посмотреть сообщение

ам 14,15 синтаксис нарушен, i и limit неопознаёт

— на скобку цикла компилятор ругается
Единственное что можно сделать в алгоритме так это начальный инит L

C
1
unsigned long L = 0;



0



-=ЮрА=-

Заблокирован

Автор FAQ

14.01.2012, 21:58

16

adelok, вот нормальный рабочий и проверенный код на С который перебирает числа с L разрядами

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main()
{
    unsigned long L = 0;
    while(L < 1 || 10 < L)
    {
        printf("Enter value L : ");
        scanf("%u",&L);
    }
    //находим максимальное значение числа
    unsigned long limit = 1;
    unsigned long i;
    for(i = 0; i < L; i++)
        limit *= 10;
    for(i = limit/10; i < limit; i++)
        printf("%un",i);
    return 0;
}

Стоп-точку вконце не делал раз у вас компилятор system не воспринимает, придумайе стоп сами, вводом переменной с помощью Sleep или как вам будет угодно
PS:Тем кто любит кодпад.орг сюда http://codepad.org/cXotO6jO

Миниатюры

Найти все возможные значения чисел
 



0



-=ЮрА=-

14.01.2012, 22:05


    Найти все возможные значения чисел

Не по теме:

Цитата
Сообщение от -=ЮрА=-
Посмотреть сообщение

while(L < 1 || 10 < L)
* * * * {
* * * * * * * * printf(«Enter value L : «);
* * * * scanf(«%u»,&L);
* * * * }

— если мы введём больше 10-ти разрядов то выскочим за пределы ULONG_MAX, вы сами его даже написали

Цитата
Сообщение от adelok
Посмотреть сообщение

4 294 967 295

— это раз, два, три…10-ть разрядов…



1



Продолжаем наш видеокурс по подготовке к ЕГЭ по информатике 2022. Сегодня разоблачим второе задание!

Кто незнаком с основными логическими операциями, можете посмотреть прошлогоднюю статью по заданию 2 из ЕГЭ по информатике.

В этой статье будут раскрыты методики решения 2 задания через язык программирования Питон.

Будем перебирать для каждой логической переменной все возможные варианты в программе. А логическая переменная всего два значения может принимать: 1 или 0 (истину или ложь). Таким образом, если к примеру у нас 4 переменные, мы получим 24=16 различных комбинаций.

Кто знаком с мощнейшим методом для 2 задания из ЕГЭ по информатике, о котором я рассказывал в прошлогодней статье, тот поймёт, что мы будем применять тот же самый мощнейший метод, но автоматизированный с помощью питона.

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

Логическая операция Представление в Питоне
Отрицание ¬ not()
Логическое умножение ∧ and
Логическое сложение ∨ or
Следование A ⟶ B not(A) or B
Равносильность ≡ ==

Перейдём к практике решения задач задания 2 с помощью языка программирования Python.

Задача (Классическая)

Миша заполнял таблицу истинности логической функции F

(w → z) ∧ ((y → x) ≡ (z → y)),

но успел заполнить лишь фрагмент из трёх различных её строк, даже
не указав, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.

ЕГЭ по информатике 2022 - задание 2 (классическая задача)

Определите, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.

В ответе напишите буквы w, x, y, z в том порядке, в котором идут
соответствующие им столбцы (сначала буква, соответствующая первому
столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
в ответе пишите подряд, никаких разделителей между буквами ставить
не нужно.

Пример. Функция F задана выражением ¬x / y, зависящим от двух
переменных, а фрагмент таблицы имеет следующий вид.

ЕГЭ по информатике 2022 - задание 2 (пример)

В этом случае первому столбцу соответствует переменная y, а второму
столбцу – переменная x. В ответе следует написать: yx.

Решение:

Решать задачу будем с помощью шаблона на языке Python (Питон).

print('x y z w')
for x in range(0, 2):
    for y in range(0, 2):
        for w in range(0, 2):
            for z in range(0, 2):
                if (not(w) or z) and ((not(y) or x) == (not(z) or y)):
                    print(x, y, z, w)

В задаче у нас 4 переменные, значит, формируем 4 вложенных цикла. В каждом цикле перебираем все возможные значения для конкретной переменной. Мы перебираем значения 0 и 1.

Функция должна выдавать всегда 1 (единицу, истину). Внутри всех циклов прописываем условие, которое срабатывает как раз на истину. В этом условии прописываем нашу функцию. Если наша функция будет выдавать истину, то мы распечатаем значения переменных, при которых это произошло. Если функция будет выдавать ложь, значит, ничего распечатано не будет.

Четыре вложенных цикла проверяют все возможные варианты (24 = 16 вариантов), и мы получим таблицу истинности, почти такую же, как нам и дали в условии задачи.

Так же вверху печатаем названия переменных, чтобы знать, какие значения каким переменным принадлежат.

Запустим программу, и на экране распечатается табличка:

ЕГЭ по информатике 2022 - задание 2 (таблица истинности)

В получившийся табличке может быть больше строчек, чем в условии. Так же при поиске переменных нельзя опираться на порядок, в котором идут нули и единицы в нашей табличке. А можно опираться лишь на количество нулей и единиц в строчках или столбцах.

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

ЕГЭ по информатике 2022 - задание 2 (классическая задача решение)

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

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

У нас остались две пустые клеточки в самой таблице. Нам нужно где-то поставить единицу, а где-то ноль, потому что у нас остались столбцы с двумя единицами и одним нулём, а так же с двумя нулями и одной единицей. Если мы в третий столбец поставим единицу, а в четвёртый ноль, то первая строчка и вторая будут совпадать.

А в условии сказано, что строки не должны повторяться. Поэтому нужно ноль и единицу расставить наоборот.

Получается, что в третий столбец идёт z, а в четвёртый y

Ответ: xwzy

Посмотрим, как решать задачи второго задания из ЕГЭ по информатике, когда функция выдаёт нули в таблице истинности.

Задача (Классическая, закрепление)

Миша заполнял таблицу истинности функции (x ≡ ¬y) → ((x ∧ w) ≡ z), но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

ЕГЭ по информатике 2022 - задание 2 (классическая задача 2)

Определите, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.

В ответе напишите буквы w, x, y, z в том порядке, в котором идут
соответствующие им столбцы (сначала буква, соответствующая первому
столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
в ответе пишите подряд, никаких разделителей между буквами ставить
не нужно.

Пример. Функция F задана выражением ¬x / y, зависящим от двух
переменных, а фрагмент таблицы имеет следующий вид.

ЕГЭ по информатике 2022 - задание 2 (пример)

В этом случае первому столбцу соответствует переменная y, а второму
столбцу – переменная x. В ответе следует написать: yx.

Решение:

Воспользуемся программой на языке Python.

print('x y z w')
for x in range(0, 2):
    for y in range(0, 2):
        for w in range(0, 2):
            for z in range(0, 2):
                if not( not(( x == (not(y)) )) or ((x and w) == z) ):
                    print(x, y, z, w)

От прошлой программы эта программа отличается только функцией!

В таблице видим, что функция должна выдавать ноль. Поэтому в условии мы функцию «оборачиваем» в not().

После == операцию not() мы заключили в скобки, чтобы не было синтаксической ошибки.

Получаем следующую таблицу истинности:

ЕГЭ по информатике 2022 - задание 2 (таблица истинности 2)

Разгадаем, где какая переменная находится.

ЕГЭ по информатике 2022 - задание 2 (классическая задача решение)

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

Получается, что второй столбец достаётся переменной z.

В первом столбце должно быть две единицы. На эту роль подходит переменная y.

В нашей таблице нет строчки, где все единицы, значит, во второй строчке в пустом окошке выставляем ноль. И в этой строчке нулём обладает переменная x. Следовательно, в третьем столбце будет находится x.

А в последний столбец идёт переменная w по остаточному принципу.

Ответ: yzxw

А как Питон справится с более сложной функцией из примерного варианта ЕГЭ по информатике?

Задача (Сложная функция)
Логическая функция F задаётся выражением ((x → y ) ∧ (y → w)) ∨ (z ≡ ( x ∨ y)).
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

ЕГЭ по информатике - задание 2 мощнейший метод

В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.

Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности:

ЕГЭ по информатике - задание 2 (лёгкая задача) пример

Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.

Источник задачи сайт решу ЕГЭ: https://inf-ege.sdamgia.ru/

Решение:

Запрограммируем функцию на языке Python.

print('x y z w')
for x in range(0, 2):
    for y in range(0, 2):
        for w in range(0, 2):
            for z in range(0, 2):
                if not( ((not(x) or y) and (not(y) or w)) or (z == (x or y)) ):
                    print(x, y, z, w)

Запустим программу и расставим переменные по своим местам.

ЕГЭ по информатике 2022 - задание 2 (сложная функция, решение)

Переменная z может быть только в третьем столбце.

Во второй столбец идёт переменная w, только этот столбец может иметь одну единицу.

Посмотрим на строчку, где у w стоит единица. В этой же строчке и у x единица. Значит, x идёт в последний столбец, а y в первый столбец.

Ответ: ywzx

Тот же шаблон работает, когда у нас во втором задании три переменные.

Задача (Три переменные)

(№ 1608) Логическая функция F задаётся выражением (¬x ∧ z) ∨ (¬x ∧ ¬y ∧ ¬z)

ЕГЭ по информатике 2022 - задание 2 (три переменных)

На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F истинна. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.

Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/

Решение:

Для трёх переменных шаблон на Питоне отлично работает.

print('x y z')
for x in range(0, 2):
    for y in range(0, 2):
        for z in range(0, 2):
               if (not(x) and z) or (not(x) and not(y) and not(z)):
                    print(x, y, z)

Здесь и так понятно, куда какая переменная идёт.

ЕГЭ по информатике 2022 - задание 2 (с тремя переменными, решение)

Ответ: yxz

Посмотрим, как решать задачи из второго задания ЕГЭ по информатике, когда в таблице истинности разные значения у функции F.

Задача (Разные значения функции)

Логическая функция F задаётся выражением (¬a ∨ b ∨ ¬c) ∧ (b ∨ ¬c). Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.

ЕГЭ по информатике 2022 - задание 2 (разные значения функции)

В ответе напишите буквы a, b, c в том порядке, в котором идут соответствующие им столбцы (без разделителей).

Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/

Решение:

Когда такая ситуация, что функция имеет различные значения в таблице, мы можем проверить, какие значения переменных дают единицу у всей функции. А потом проверить, какие значения выдают ноль у всей функции, если это потребуется.

print('a b c')
for a in range(0, 2):
    for b in range(0, 2):
        for c in range(0, 2):
               if (not(a) or b or not(c)) and (b or not(c)):
                    print(a, b, c)

ЕГЭ по информатике 2022 - задание 2 (разные значения функции, решение)

В таблице 6 строчек, в которых главная функция превращается в единицу. Далее эти строчки и будем рассматривать. У нас тоже получилось 6 строчек.

Переменная a имеет три единицы. Это второй столбец, потому что там три единицы.

Переменная b имеет четыре единицы, значит, она расположена в первом столбце.

Переменной c достаётся последний столбец.

Ответ: bac

Ещё одна интересная задача для подготовки к ЕГЭ по информатике 2022.

Задача(С подвохом)

Логическая функция F задаётся выражением a ≡ b ∨ b → c.

ЕГЭ по информатике 2022 - задание 2 (задача с подвохом)

На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.

Источник задачи группа Евгения Джобса: https://vk.com/inform_web

Решение:

Подвох заключается в том, что если мы переведём бездумно функцию на язык Питон, то получится a==b or not(b) or c. Но у нас существуют приоритеты для логических операций, которые описаны в прошлогодней статье по подготовке к ЕГЭ по информатике.

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

Операцию b ∨ b можно представить, как просто b. Ведь, если b принимает значение 0, тогда будет 0 ∨ 0 = 0. Если значение будет 1, то 1 ∨ 1 = 1. Поэтому формулу можно переписать следующим образом:

a ≡ b → c

a == (not(b) or c)

В предыдущих задачах нам не приходилось думать над приоритетами, потому что везде были расставлены скобки. И в основном они уже расставлены в задачах второго задания из ЕГЭ по информатике.

Дальше решаем как обычно.

print('a b c')
for a in range(0, 2):
    for b in range(0, 2):
        for c in range(0, 2):
               if a == (not(b) or c):
                    print(a, b, c)

Последнюю строчку можно вычеркнуть из нашей таблицы, т.к. у нас в каждой строчке есть хотя бы один ноль.

ЕГЭ по информатике 2022 - задание 2 (задача с подвохом, решение)

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

В строчке, где у a ноль, так же ноль и у переменной c. Значит, во второй столбец идёт переменная c. Если мы ноль поставим в первой строчке в первом столбце, то получится первый столбец из всех нулей. А такого у нас в таблице истинности нет.

Тогда переменная b в первом столбце.

Ответ: bca

слишком много лишних скобок ни к чему. Код очень грязный

А есть какой-нибудь простой код, который смог бы помочь с таким заданием: «Сколькими способами можно поставить в соответствие переменные w, x, y, z столбцам таблицы истинности функции F, опираясь на информацию из данного фрагмента?», или же в данном случае нужно самому подбирать комбинации?

Доброго времени суток, есть вопрос про операции в последней задаче. Вот там написано что b ∨ b можно представить как b. А если будет b ∧ b, то это можно будет представить как b? И можете объяснить почему?

Как в циклах идут переменные, это не важно. Это просто перебор всех возможных вариантов.

Володя, b ∧ b = b, эти формулы приведены в материале, на который я даю ссылку в начале статьи.

Вы находитесь в правильном направлении. Однако в коде отсутствуют два важных случая: бит-векторы и конечные типы данных, которые не являются типами перечисления (например, пара конечных типов). Вот код, который рассматривает эти два дополнительных случая. Функция universe(s) возвращает элементы во вселенной сортировки s.

Кстати, возможным улучшением является использование итераторов вместо списков. Таким образом, мы могли бы даже поддерживать бесконечные виды, такие как целые и рекурсивные типы данных (например, списки), и генерировать элементы по требованию.

from z3 import *
import itertools

def universe(vsort):
found = set()
def rec(vsort):
id = Z3_get_ast_id(vsort.ctx_ref(), vsort.as_ast())
if id in found:
raise AssertionError('recursive sorts are not supported')
found.add(id)
ctx = vsort.ctx
if vsort.kind() == Z3_BOOL_SORT:
return [ BoolVal(False, ctx), BoolVal(True, ctx) ]
elif vsort.kind() == Z3_BV_SORT:
sz = vsort.size()
return [ BitVecVal(i, vsort) for i in range(2**sz) ]
elif vsort.kind() == Z3_DATATYPE_SORT:
r = []
for i in range(vsort.num_constructors()):
c = vsort.constructor(i)
if c.arity() == 0:
r.append(c())
else:
domain_universe = []
for j in range(c.arity()):
domain_universe.append(rec(c.domain(j)))
r = r + [ c(*args) for args in itertools.product(*domain_universe) ]
return r
else:
raise AssertionError('dont know how to deal with this sort')
return rec(vsort)

Вот некоторые примеры:

print universe(BoolSort())
>> [False, True]
print universe(BitVecSort(4))
>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
S, elems = EnumSort('S', ['a', 'b', 'c', 'd'])
print universe(S)
>> [a, b, c, d]

# Create a Pair (Bool, S)
d = Datatype('Pair')
d.declare('mkpair', ('bval', BoolSort()), ('sval', S))
D = d.create()
print universe(D)
>> [mkpair(False, a), mkpair(False, b), mkpair(False, c), mkpair(False, d), mkpair(True, a), mkpair(True, b), mkpair(True, c), mkpair(True, d)]

# Create a Choice sort where each element is a Pair or a BitVector of size 4.
c = Datatype('Choice')
c.declare('aspair', ('pval', D))
c.declare('asbv', ('bval', BitVecSort(4)))
C = c.create()
print universe(C)
>> [aspair(mkpair(False, a)), aspair(mkpair(False, b)), aspair(mkpair(False, c)), aspair(mkpair(False, d)), aspair(mkpair(True, a)), aspair(mkpair(True, b)), aspair(mkpair(True, c)), aspair(mkpair(True, d)), asbv(0), asbv(1), asbv(2), asbv(3), asbv(4), asbv(5), asbv(6), asbv(7), asbv(8), asbv(9), asbv(10), asbv(11), asbv(12), asbv(13), asbv(14), asbv(15)]

l = Datatype('List')
l.declare('cons', ('car', BoolSort()), ('cdr', l))
l.declare('nil')
List = l.create()
print universe(List)
>> Traceback (most recent call last):
>> ...
>> AssertionError: recursive sorts are not supported

Понравилась статья? Поделить с друзьями:
  • Failed to create direct3d 9ex device как исправить
  • Как составить платежное поручение самозанятому
  • Как найти экранное время на xiaomi
  • Как найти разницу между чисел в процентах
  • Найти как делать медведя