Показаны сообщения с ярлыком ЕГЭ по информатике. Показать все сообщения
Показаны сообщения с ярлыком ЕГЭ по информатике. Показать все сообщения

21.10.2024

Задание 14. ЕГЭ по информатике. Найти наименьшее значение x, при котором троичная запись значения выражения содержит 2000 цифр "2"

Задание 14 (ЕГЭ по информатике). Значение арифметического выражения 3^2000 + 3^10 - x, где х – натуральное число, записали в троичной системе счисления. Определите наименьшее значение x, при котором троичная запись значения данного выражения содержит 2000 цифр "2".

Источник: kompege.ru

Как будем решать задачу

  • Запустим цикл по переменной x в диапазоне от 3^10 до 2*3^10
    (такой диапазон выбираем потому, что если вычтем 3**10, то получим 3**2000, а это число в 3 с.с. записывается, как 1 и 2000 нулей, а нам нужно получить число, в котором ровно 2000 двоек, а это число меньше на 1 разряд, значит, как минимум, нужно вычитать 3^10, так как ищем наименьшее, значит запускать можно не так далеко (), по сути, можно и теоретически решать эту задачу, в общем, кто понял, тот уже решил). Ну, в общем далее.
    спасибо за комментарий: правая граница подбираемая, но можно запустить и бесконечный цикл, брейковать, когда число x найдено.
  • В цикле формируем число n = 3^2000 + 3^10 - x
  • Переводим число n в троичную с.с. и считаем количество цифр "2"
  • Во внешнем цикле проверяем, если количество цифр "2" равно 2000, выводим число x на экран

Программа решения задачи на языке Python

for x in range(3**10,2*3**10):

    n = 3**2000 + 3**10 - x

    p = 0

    while n!=0:

        d = n % 3

        n//=3

        if d==2:

            p+=1

    if p==2000:

        print(x)

        break

Ответ: 59050

Если не очень понятно, почему запускаем цикл по такому диапазону, то можно запускать цикл сначала от 1 до 1000 (не получим никакого ответа), затем от 1000 до 10000 (тоже не получим ответа), затем от 10000 до 50000 (тоже не получим ответа), затем от 50000 до 10000, получим ответ. То есть, экспериментально подбираем диапазон. Поскольку ищем минимальное число x, то после успешной проверки, можно его вывести и выполнить оператор break (выйти из цикла и не гнать его дальше).

Другие задания 14 из ЕГЭ по информатике в разделе Разбор задач ЕГЭ.

17.04.2024

Задание 14. ЕГЭ по информатике. Значение арифметического выражения записали в системе счисления с основанием 3

Задача. Значение арифметического выражения: 911 * 320 – 39 – 27 записали в системе счисления с основанием 3. Сколько цифр 2 содержится в этой записи?

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

Пока число не равно 0, будем вычислять 3-ю цифру (d = n % 3) и уменьшать число в 3 раза (n = n // 3).

Если цифра числа равна 2, то будем увеличивать счетчик цифр k.

Программа решения задачи на языке Python

n = 9**11 * 3**20 - 3**9 - 27

k = 0

while n!=0:

    d = n % 3

    n = n // 3

    if d == 2:

        k+=1

print(k)

Ответ: 38


Задание 14. ЕГЭ по информатике. Операнды арифметического выражения записаны в системах счисления с основанием 17

 Задача. Операнды арифметического выражения записаны в системах счисления с основанием 17:

10x017 + F0xF017

В записи чисел переменной x обозначена неизвестная цифра из алфавита 17-ричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 13. Для найденного значения x вычислите частное от деления значения арифметического выражения на 13 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.

Как будем решать задачу

  1. Запустим цикл по числу x в диапазоне цифр 17-ой системы счисления (от 0 до G)
  2. Выполним перевод чисел в 10-ю систему счисления функцией int()
  3. Вычислим значение арифметического выражения
  4. Выведем число  x  и частное от деления значения арифметического выражения на 13, если значение выражения кратно числу 13
Программа решения задачи на языке Python

for x in '0123456789ABCDEFG':

    a1 = int('10'+x+'0',17)

    a2 = int('F0'+x+'F0',17)

    s = a1 + a2

    if s % 13 == 0:

        print(x, s//13)

Результат запуска программы

Наименьшее x = 2, а частное от деления значения выражения на число 13 равно 96815

Ответ: 96815

Ограничение данной программы состоит в использовании функции int(): максимальное основание, для которого допустим перевод числа, это 36, минимальное допустимое основание это 2.




16.04.2024

Задание 5. ЕГЭ по информатике. На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R

Задача. На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.

1.    Строится двоичная запись числа N.

2.    Далее эта запись обрабатывается по следующему правилу:

а) если число N чётно, то справа приписывается «01»;

б) если число N нечётно, то к этой записи слева приписывается 1 и справа приписывается «01».

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

3.    Результат переводится в десятичную систему и выводится на экран.

Укажите минимальное число R, большее 150, которое может быть получено в результате обработки натурального числа N.  В ответе запишите это число в десятичной системе счисления.

Приведем решение задачи на языках Паскаль и Python. В программе на языке Паскаль будем использовать функции модуля school для перевода чисел в двоичную/десятичную системы счисления (подобная задача ранее разбиралась в данном блоге).

Как будем решать задачу

  1. Запустим цикл по натуральному числу N от 1 до 100 (правая граница промежутка изменяемая, будем проводить эксперимент).
  2. Число N переведем в двоичную систему счисления.
  3. Обработаем двоичную запись числа в соответствие с алгоритмом.
  4. Полученную двоичную запись переведем в десятичную систему счисления R.
  5. Если R>150, выведем таблицу значений N и R на экран.

Далее проанализируем полученные результаты, нам необходимо найти наименьший результат, больший 150, для какого-либо N.

Программа решения задачи на языке Паскаль

uses school;

var n,r:integer; b:string;

begin

  for n:=1 to 100 do

  begin

    b:=bin(n);

    if n mod 2 = 0 then b:=b + '01'

    else b:='1'+b+'01';

    r:=dec(b, 2);

    if r>150 then println(n,r);

  end;

end.

Запустим программу для промежутка чисел N от 1 до 100. Обратим внимание, что по мере возрастания числа N, результаты R ведут себя произвольно, первое по счету R, очевидно, не является ответом. Необходимо выполнить эксперимент и запускать цикл по числу N до 200, 300, наблюдать, как ведут себя результаты (>150). Ответом является число 153.


Ответ: 153

В программу на языке Python внесем изменения: запустим цикл до 1000 и сохраним результаты, большие 150, в список, в качестве ответа возьмем минимум. Можно увеличивать правую границу и видеть, что минимум не меняется.

Программа решения задачи на языке Python

a = []

for n in range(1,1001):

    b = bin(n)[2:]

    if n % 2 == 0:

        b = b + '01'

    else:

        b = '1' + b + '01'

    r = int(b, 2)

    if r>150:

        a.append(r)

        #print(n, r)

print(min(a))

Ответ: 150

01.03.2024

Задание 12. ЕГЭ по информатике. Replace. Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки (программа на языке Python)

 Задача.     Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

заменить (v, w) заменяет подстроку v на w (первое слева вхождение)

нашлось (v) проверяет, нашлась ли подстрока v

Дана программа для исполнителя Редактор:

ПОКА нашлось (555) ИЛИ нашлось (333)

  ЕСЛИ нашлось (555)

    ТО заменить (555, 3)

    ИНАЧЕ заменить (333, 5)

  КОНЕЦ ЕСЛИ 

КОНЕЦ ПОКА 

Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки по этой программе?

Это пример задачи из ЕГЭ по информатике - задание № 12.

Как будем решать задачу?

Будем использовать метод replace(v,w, x) для замены подстроки v на w, параметр x указывает на количество замен,  в нашем случае x = 1. Если параметр x не указывать, будут выполнены все возможные замены.

Чтобы вычислить количество удаленных '5' за время обработки строки, найдем ту команду, которая заменяет '5' на другие символы - это команда: заменить (555, 3), за счет этой команды удаляются три '5'. В этом месте алгоритма будем увеличивать счетчик удаленных пятерок на 3.

Программа решения задачи на языке Python

s = '5' * 400

k = 0

while '555' in s or '333' in s:

    if '555' in s:

        s = s.replace('555','3',1)

        k+=3

    else:

       s = s.replace('333','5',1)

print('k =',k)

Вывод результата:




28.02.2024

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

Задача. Дана строка символов. Найти подстроку максимальной длины, содержащую не более двух цифр 0. Вывести найденную подстроку и ее дину (если таких подстрок несколько, вывести любую из них).

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

for k in range(len(s)): 

    for j in range(k,len(s)):        

        print(s[k:j+1])

Как будем решать задачу

  1. Запустим внешний цикл по счетчику k по длине строки.
  2. Обнулим счетчик p символов-цифр 0.
  3. Запустим внутренний цикл по счетчику j в диапазоне от значения внешнего счетчика цикла до конца строки.
    • Если символ строки это цифра 0, то увеличим счетчик цифр 0.
    • Если счетчик цифр 0 более 2, то прекратим обработку текущей подстроки командой break, в противном случае найдем максимум длины текущей подстроки.

Программа решения задачи на языке Python

s = "0a0bc00d04efgrt0habc0"

m = 0

for k in range(len(s)):

    p = 0 

    for j in range(k,len(s)):

        if s[j]=='0':

            p+=1 

        if p>2:

            break 

        else:

            if len(s[k:j+1])>=m: #найдем последнюю такую подстроку

                m = len(s[k:j+1])

                x = s[k:j+1]

print(x, len(x))

Результат запуска программы

Подстрока наибольшей длины

Проведем эксперимент с нейросетью. Сможет ли нейросеть написать код, решающий данную задачу?

Будем использовать нейросеть chatinfo.ru

Запрос. Дана строка символов. Найти подстроку максимальной длины, содержащую не более двух цифр 0. Вывести найденную подстроку и ее дину (если таких подстрок несколько, вывести последнюю из них).

Код от нейросети chatinfo.ru

def find_max_substring(string):

    max_length = 0  # Переменная для хранения длины максимальной подстроки

    max_substring = ""  # Переменная для хранения максимальной подстроки

    current_length = 0  # Переменная для хранения длины текущей подстроки

    current_substring = ""  # Переменная для хранения текущей подстроки

    zero_count = 0  # Переменная для отслеживания количества найденных нулей

    for char in string:

        if char == "0":

            zero_count += 1

            # Если найдено более двух нулей, обновляем текущую подстроку

            if zero_count > 2:

                current_length = 0

                current_substring = ""

                zero_count = 1

        current_length += 1

        current_substring += char

        # Если длина текущей подстроки больше длины максимальной подстроки,

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

        if current_length > max_length:

            max_length = current_length

            max_substring = current_substring

    return max_substring, max_length

# Пример использования

string = "0a0bc00d04efgrt0habc0"

max_substring, length = find_max_substring(string)

print("Максимальная подстрока:", max_substring)

print("Длина подстроки:", length)

Подстрока максимальной длины

Нейросеть не учла символ d в искомой подстроке, а значит и все символы (не равные 0), которые были бы в этом месте. Но попытка хорошая 👌 (тем более, что в один цикл).

26.02.2024

Задание № 13. ЕГЭ по информатике. IP-адреса и маски. Программа решения задачи на языке Python

 Задание № 13. ЕГЭ по информатике. IP-адреса и маски

Приведем решения некоторых задач на IP-адреса и маски на языке Python.

Задача 1

В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает,  какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой  сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.

Узлы с IP-адресами 84.77.95.123 и 84.77.96.123 находятся в одной сети. Укажите наибольшее возможное значение третьего слева байта маски этой сети. Ответ запишите в виде десятичного числа.

from ipaddress import *

for mask in range(0,33): #кол-во единиц в маске

    net1 = ip_network(f'84.77.95.123/{mask}',0)

    net2 = ip_network(f'84.77.96.123/{mask}',0)

    if net1==net2:

        print(net1.netmask) #маска

Ответ: 192

Задача 2

Для узла с IP-адресами 84.77.95.123 третий слева байт маски равен 224. Чему равен адрес сети для этого узла. Ответ запишите в виде IP-адреса (четыре десятичных числа, разделенных точками)

from ipaddress import *

b3 = 224

mask = 16+bin(b3)[2:].count('1') #количество единиц в маске

net = ip_network(f'84.77.95.123/{mask}',0)

print(net)

Ответ: 84.77.64.0

Задача 3

Узлы с IP-адресами 84.77.95.123 и 84.77.96.123 находятся в разных сетях, маски которых одинаковы. Укажите наименьшее возможное значение третьего слева байта этой маски. Ответ запишите в виде десятичного числа.

from ipaddress import *

for mask in range(0,33): #кол-во единиц в маске

    net1 = ip_network(f'84.77.95.123/{mask}',0)

    net2 = ip_network(f'84.77.96.123/{mask}',0)

    if net1!=net2:

        print(net1.netmask) #маска

Ответ: 224

Задача 4

Сеть задана IP-адресом 199.59.129.3 и маской сети 255.255.А.0, где А - некоторое допустимое для записи маски число.

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

from ipaddress import *

for a in range(0,9): #количество единиц в третьем байте

    net = ip_network(f'199.59.129.3/{16+a}',False)

    k = 0

    j = 0

    m = net.netmask

    for ip in net:

        j+=1

        s = f'{ip:b}' #получили IP-адрес в виде 32-битного кода

        L = s[0:16].count('1')

        R = s[16:33].count('1')

        if L>=R:

            k+=1

    if j == k:

        print(m)

Ответ: 254

Маска

Задача 5

Для узла с IP-адресом 244.55.229.28 адрес сети равен 244.0.0.0. Какое наибольшее возможное количество нулей в разрядах маски?

for m in range(33):

    net = ip_network(f'244.55.229.28/{m}',0)

    if net.network_address == ip_address('244.0.0.0'):

        print(32-m) #количество нулей в маске

Результат запуска программы

26
25
24
23
22

Ответ: 26

Еще одна задача, подобная пятой задаче, разобрана ранее в блоге автора Методическая копилка (Учителю информатики).

Адрес сети равен 183.192.A.0, где А — некоторое допустимое для записи адреса сети число, а маска сети 255.255.252.0. Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в правых двух байтах больше трёх.



05.02.2024

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

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

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

Определим приоритет выполнения логических операций в данном логическом выражении.

  1. дизъюнкция 
  2. импликация → (следование)
  3. эквиваленция 

Приоритет выполнения логических операций (для справки), обозначение в алгебре логики и запись в языке Python:

  1. Выражение в скобках
  2. Отрицание (¬, not)
  3. Конъюнкция (∧, and)
  4. Дизъюнкция (∨, or)
  5. Импликация (→, <=)
  6. Эквиваленция (≡, ==)

Чтобы решить данное задание, сначала определим, при каких a, b, c выражение f = 1, то есть решим логическое уравнение. А затем в соответствие с данной таблицей в условии и полученным решением уравнения, определим, какому столбцу соответствуют переменные.

Переберем значения логических переменных a, b, c от значения False до True, вычислим для каждого набора значений a, b, c значение выражения, если оно равно True, то выведем значения a, b, c на экран (не будем упрощать выражение намеренно).

Программа решения логического уравнения на языке Python

for a in [0,1]:

    for b in [0,1]:

        for c in [0,1]:

            f = a == ((b or b) <= c)

            if f:

                print(a,b,c)

Вывод:

0 1 0

1 0 0

1 0 1

1 1 1

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

Рассмотрим оставшиеся три строки таблицы. Выполним рассуждения.

Таблица, полученная нами

0 1 0

1 0 0

1 0 1

Таблица, данная в условии задачи

Имеется одна строка с одним 0 и две строки с двумя 0. Строка с одним 0, это 3-я строка из условия и нами полученная 3-я строка, и 0 в ней стоит во 2-ом столбце в полученном решении и в 1-ом столбце в условии задачи, а это переменная b, значит переменная b стоит на 1 месте.

Далее нетрудно заметить, что переменная с должна стоять в таблице во 2-ом столбце, так как в 1-ой строке полученной таблицы a = 0 и c = 0, а это 1-ая строка в таблице с условием, переменная с имеет два 0.

Ответ: bca

Программа решения логического уравнения на языке Паскаль (читать)

Разбор 2 задания ЕГЭ по информатике


30.01.2024

Текстовый файл состоит из символов, обозначающих заглавные буквы латинского алфавита и цифры от 0 до 9 включительно. Определите в прилагаемом файле максимальное количество идущих подряд символов, которые могут представлять запись числа в шестнадцатеричной системе счисления. Программа на Питоне (Python). ЕГЭ по информатике

Текстовый файл состоит из символов, обозначающих заглавные буквы латинского алфавита и цифры от 0 до 9 включительно. Определите в прилагаемом файле максимальное количество идущих подряд символов, которые могут представлять запись числа в шестнадцатеричной системе счисления.

Для выполнения этого задания следует написать программу. Числа с незначащими нулями в ответ брать не следует.

Как будем решать задачу

Задачу на обработку строки, сохраненной в файле, решали ранее в этом блоге. (Задача. Последовательность максимальной длины, которая содержит буквы строго в алфавитном порядке, т.е. ABCD. Читать)

  • Считаем строку из файла
  • Получим все возможные подстроки конструкцией вложенных циклов (публикация Как получить все возможные подстроки из заданной строки)
  • В текущей подстроке проверим символ на принадлежность алфавиту 16-ой с.с. Если это так, будем копить счетчик 16-ых цифр.
  • Если счетчик 16-ых цифр равен длине подстроки, это значит, что в ней нет посторонних символов (также добавим условие, что первый символ подстроки это не цифра 0), найдем максимум длины подстроки, иначе прервем обработку подстроки break.

Программа решения задачи на языке Python

f = open('24_10724.txt')

s = f.readline()

m = 0

alf = '0123456789ABCDEF'

for i in range(len(s)):

    k = 0

    for j in range(i,len(s)):

        if s[j] in alf:

            k+=1

        if k==len(s[i:j+1]) and s[i:j+1][0]!='0':

            m = max(m,len(s[i:j+1]))

        else:

            break

print(m)

Ответ: 21

23.01.2024

У исполнителя Кузнечик две команды Прибавь 3 Вычти 2. Сколько различных чисел можно получить из числа 1 с помощью программы, которая содержит ровно 68 команд? Программа решения задачи на языке Python

Задача. У исполнителя Кузнечик две команды:

  1. Прибавь 3
  2. Вычти 2

Программа для Кузнечика – это последовательность команд. Первая из них увеличивает число на экране на 3, вторая – уменьшает его на 2 (отрицательные числа допускаются). Сколько различных чисел можно получить из числа 1 с помощью программы, которая содержит ровно 68 команд?

Как будем решать задачу

Создадим пользовательскую функцию f(x, k), которая будет получать следующее число (+3 или -2) и уменьшать количество команд.

Пример:

Дерево

Вызов f(x+3, k-1) будет получать число за счет команды x+3, количество команд уменьшится на 1. Возникнет рекурсия. Функция будет вызывать саму себя. Чтобы остановить вызовы функций воспользуемся условием k == 0, то есть команд для выполнения не осталось, в этом случае выведем число x.

if k == 0:

    print(x)

else:

    f(x+3, k-1)

    f(x-2, k-1)

Для вызова функции в основной программе запишем f(1, 68), это будет означать исходное число 1, количество выполняемых команд 68.

Если вызовем функцию f(1, 2), получим числа за 2 команды (как на рисунке выше).

def f(x,k):

    if k==0:

        print(x,end = ' ')

    else:

        f(x+3,k-1)

        f(x-2,k-1)

f(1,2)

Вывод: 7 2 2 -3

Чтобы сохранить различные числа воспользуемся множеством m. В качестве ответа выведем длину множества len(m).

def f(x,k):

    if k==0:

        m.add(x)

        print(x,end = ' ')

    else:

        f(x+3,k-1)

        f(x-2,k-1)

m = set()

f(1,2)

print('Длина множества ',len(m))

Вывод: 7 2 2 -3 Длина множества 3

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

Модуль functools включает набор функций высокого уровня, взаимодействующих с другими функциями или возвращающие другие функции.

Декоратор @lru_cache() модуля functools оборачивает функцию с переданными в нее аргументами и запоминает возвращаемый результат, соответствующий этим аргументам. Такое поведение может сэкономить время и ресурсы, когда "дорогая" или связанная с вводом/выводом функция периодически вызывается с одинаковыми аргументами.

Аргумент maxsize позволяет сохранить результаты последних вызовов @lru_cache(maxsize = 128).

Программа решения на языке Python

from functools import *

@lru_cache(maxsize = 64)

def f(x,k):

    if k==0:

        m.add(x)

        #print(x,end = ' ')

    else:

        f(x+3,k-1)

        f(x-2,k-1)

m = set()

f(1,68)

print(len(m))

Ответ: 69

Для эксперимента можно изменять значение аргумента maxsize и замечать время выполнения программы.

16.01.2024

Последовательность максимальной длины, которая содержит буквы строго в алфавитном порядке, т.е. ABCD. ЕГЭ по информатике. Задание № 24. Решение на языке Python

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

Для выполнения этого задания следует написать программу. Воспользуйтесь файлом abcd.txt. В ответе запишите длину искомой последовательности.

Как будем решать задачу

Воспользуемся алгоритмом, рассмотренном в публикации Найти наибольшую длину возрастающей последовательности.

Запустим цикл по длине строки  и будем сравнивать два соседних символа, если это действительно две соседние буквы алфавита, то будем увеличивать счётчик длины, в противном случае счетчик длины примем за 1. Затем найдем максимум среди значений счетчика длины. 

Как проверить, что два символа это соседние символы алфавита? 

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

Для вычисления кода символа будем использовать функцию ord().

Программа решения задачи на языке Python

f = open('abcd.txt')

s = f.readline()

k = 1

m = 1

for x in range(len(s)-1):

    if ord(s[x+1])-ord(s[x]) == 1:

        k+=1

    else:

        k = 1

    m = max(m,k)

print(m)

Ответ: 5

07.07.2023

ЕГЭ по информатике. Задание 8. Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом? Решение на языке Python

Задача. Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом?

Приведем решение задачи на языке Python

Как будем решать задачу

Получим все возможные трехзначные шестнадцатеричные числа функцией product - кортеж цифр x:

abc = '0123456789ABCDEF'

for x in product(abc, repeat = 3):

Функция product аналогична функции cartesian в PascalABC.NET.

Выполним проверку

  • первая цифра числа не равна 0 (число должно быть трехзначным): x[0]!='0'
  • все цифры числа различны (длина множества цифр равна количеству цифр в числе): len(set(x)) == len(x)
  • четность у соседних цифр различна: int(x[0],16) % 2 != int(x[1],16) % 2 and int(x[1],16) % 2 != int(x[2],16) % 2

Если все условия выполняются, будем копить счетчик k

Программа решения задачи на языке Python

from itertools import *

abc = '0123456789ABCDEF'

k = 0

for x in product(abc, repeat = 3):

    if x[0]!='0':

        if len(set(x)) == len(x):

            if int(x[0],16) % 2 != int(x[1],16) % 2 and int(x[1],16) % 2 != int(x[2],16) % 2:

                k+=1

print(k)

Ответ: 840


Как решить комбинаторную задачу про слова. Валя составляет шестибуквенные слова из букв слова ГРОЗА

Читать

Лера составляет 5-буквенные слова из букв слова ЛОГАРИФМ (перестановки)

Читать

Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы (декартово произведение)

Читать

04.07.2023

Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы. Комбинаторная задача. ЕГЭ по информатике. Решение на Python

Задача. Все шестибуквенные слова, составленные из букв МАНГУСТ, записаны в алфавитном порядке и пронумерованы.

Вот начало списка:

1. АААААА

2. АААААГ

3. АААААМ

4. АААААН

5. АААААС

6. АААААТ

7. АААААУ

...

Под каким номером в списке стоит последнее слово, которое не начинается с буквы У, содержит только две буквы М и не более одной буквы Г?

 Приведем решение данной задачи на языке Python.

Из букв алфавита МАНГУСТ составляются шестибуквенные слова. На каждом месте может встретиться любая буква. Получим все возможные слова функцией product (декартово произведение). 

Заведем счетчик - порядковый номер слова t. И если слово подходит под условие, то в переменную k сохраним значение порядкового номера слова. Таким образом значение переменной k будет обновляться и в итоге сохранит необходимый номер последнего подходящего слова.

Программа решения задачи на языке Python

from itertools import *

s = 'АГМНСТУ'

k = t = 0

for x in product(s, repeat = 6):

    t+=1 #порядковый номер слова

    if x[0]!='У' and x.count('М')==2 and x.count('Г')<=1:

        k = t #номер подходящего слова

print(k)

Ответ: 100810

Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом

Читать

Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя

Читать

Алексей составляет 5-буквенные слова из букв М, А, Г, И, С, Т, Р. Каждую букву можно использовать не более одного раза, при этом в слове нельзя использовать более одной гласной. Сколько различных кодов может составить Алексей

Читать

20.01.2023

N-ая декартова степень множества элементов, заданного массивом (Cartesian). PascalABC.NET

Применим функцию Cartesian к решению задачи на комбинаторику.

Перевод Cartesian (англ.) декартовский.

Задача. Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя? 

Для составления слов длины 7 Настя использует 5 различных букв. Количество таких слов будет равно:

5*5*5*5*5*5*5 = 57

Для вычисления такого произведения в PascalABC.NET используется функция Cartesian.

Зададим символьный массив c:

c:=Arr('Н','А','С','Т','Я')

Вычислим 7-ю декартову степень множества элементов, заданного массивом с:

c.Cartesian(7)

Циклом foreach x in c.Cartesian(7) do получим все символьные последовательности в виде массивов x. Склеим символы массива x  в строку s:=x.JoinToString.

Выполним проверку условий и подсчитаем количество искомых слов.

Программа решения задачи на языке Паскаль

var c,x:array of char;  

    s:string;

    k:integer;

begin

  c:=Arr('Н','А','С','Т','Я');

  k:=0;

  foreach x in c.Cartesian(7) do

  begin

    s:=x.JoinToString;

    if (s.CountOf('Н')=2) and (s.CountOf('А')>=1) then k+=1;

  end;

  print(k);

end.

Ответ: 16401 

Демонстрация работы функции Cartesian

var c,x:array of char;  

    s:string;

begin

  c:=Arr('Т','О','К');

  foreach x in c.Cartesian(4) do

  begin

    s:=x.JoinToString;

    print(s,',');

  end;

end.

Вывод:

ТТТТ , ТТТО , ТТТК , ТТОТ , ТТОО , ТТОК , ТТКТ , ТТКО , ТТКК , ТОТТ , ТОТО , ТОТК , ТООТ , ТООО , ТООК , ТОКТ , ТОКО , ТОКК , ТКТТ , ТКТО , ТКТК , ТКОТ , ТКОО , ТКОК , ТККТ , ТККО , ТККК , ОТТТ , ОТТО , ОТТК , ОТОТ , ОТОО , ОТОК , ОТКТ , ОТКО , ОТКК , ООТТ , ООТО , ООТК , ОООТ , ОООО , ОООК , ООКТ , ООКО , ООКК , ОКТТ , ОКТО , ОКТК , ОКОТ , ОКОО , ОКОК , ОККТ , ОККО , ОККК , КТТТ , КТТО , КТТК , КТОТ , КТОО , КТОК , КТКТ , КТКО , КТКК , КОТТ , КОТО , КОТК , КООТ , КООО , КООК , КОКТ , КОКО , КОКК , ККТТ , ККТО , ККТК , ККОТ , ККОО , ККОК , КККТ , КККО , КККК 

Всего таких слов: 34 = 81

16.12.2022

Задание 12. ЕГЭ по информатике. Редактор. Статград 25.10.22

Дана программа для редактора:

НАЧАЛО

ПОКА НЕ нашлось (00)

заменить (011, 20)

заменить (022, 10)

заменить (01, 220)

заменить (02, 110)

КОНЕЦ ПОКА

КОНЕЦ

Известно, что исходная строка A содержала ровно два нуля – на первом и на последнем месте, а также поровну единиц и двоек. После выполнения данной программы получилась строка B, содержащая 40 единиц и больше 50 двоек. Какое наименьшее количество двоек может быть в строке B?

! Ошибка. Решение перебором ищем! Нужно проанализировать, как меняются подстроки в соответствии с алгоритмом. Например, подстрока 1112 меняется на 22211. Остается только подобрать количество 1 и 2. 

Решение подбором (Phyton)

Решение системой уравнений (Phyton)


13.11.2022

Язык Паскаль. Автомат обрабатывает натуральное число N > 1. Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

 Задача. Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:

1. Строится двоичная запись числа N.

2. В конец записи (справа) дописывается вторая справа цифра двоичной записи.

3. В конец записи (справа) дописывается вторая слева цифра двоичной записи.

4. Результат переводится в десятичную систему.

Пример. Дано число N = 11. Алгоритм работает следующим образом:

1. Двоичная запись числа N: 1011.

2. Вторая справа цифра 1, новая запись 10111.

3. Вторая слева цифра 0, новая запись 101110.

4. Результат работы алгоритма R = 46.

Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

Как будем решать задачу?

Будем искать число N, для которого результат работы алгоритма будет принадлежать отрезку [150; 200].

Обнулим искомый счетчик чисел r:=0.

Запустим цикл по подбираемым числам (по условию задачи это числа, больше 1, правую границу возьмем за 100, эту границу можно подбирать): 

for k:=2 to 100 do

За число N возьмем значение k.

Выполним перевод числа N в двоичную систему счисления: для этого пока число не равно 0, вычислим остаток от деления на 2 (это двоичная цифра), число уменьшим нацело в 2 раза. Чтобы получить двоичный код, превратим цифру n mod 2 в строку d процедурой str(n mod 2, d), и накопим строку s - это и будет двоичный код числа N, причем будем к вновь полученной цифре добавлять строку, тогда цифры двоичного кода будут получены в правильном порядке:

s:=d + s;

Далее по алгоритму, описанному в условии задачи, добавим к полученному коду предпоследний символ и второй символ, это и есть результат работы алгоритма:

s:=s+s[length(s)-1]+s[2];

Далее проверим, принадлежит ли полученный двоичный код результата диапазону чисел [150, 200].

Мы знаем, что числа из данного промежутка имеют длину 8 в двоичной коде, поэтому сравним принадлежность отрезку условием:

(length(s)=8) and (s>='10010110') and (s<='11001000')

Двоичный код числа 150 - это 10010110, а двоичный код числа 200 - это 11001000.

Если условие ИСТИНА, накопим искомый счетчик чисел r, также можно вывести само подходящее число N (это значение счетчика k, значение самой переменной N равно 0 из-за выполненного перевода).

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

Программа решения на языке Паскаль

var s,d:stringn,k,r:integer;

  begin

    r:=0;

    for k:=2 to 100 do

    begin

      n:=k; s:='';

      while n<>0 do

      begin

        str(n mod 2,d);

        s:=d+s;

        n:=n div 2;

      end;

      s:=s+s[length(s)-1]+s[2];

      if (length(s)=8)and(s>='10010110')and(s<='11001000')

          then begin print(k); r:=r+1; end;

    end;

    println('Количество чисел:',r);

  end.

Результат запуска программы

Результат запуска

Ответ к задаче: 12 чисел

Способ 2 (используем модуль School и функции bin и dec)

Будем использовать функцию bin из модуля School для перевода числа в двоичную систему счисления, результатом будет строка двоичных цифр.

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

Программа решения задачи на языке Паскаль

uses School;

var N,R,Kol:integer; B:string; 

  begin

    for N:=2 to 100 do

    begin

      B:=bin(N);

      B:=B+B[length(B)-1]+B[2];

      R:=dec(B,2);

      if R in [150..200] then Kol+=1;

    end;

    println(Kol);

  end.



20.06.2022

Язык Паскаль. Лера составляет 5-буквенные слова из букв ЛОГАРИФМ

 Задача. Лера составляет 5-буквенные слова из букв Л, О, Г, А, Р, И, Ф, М, причём никакие две гласные или две согласные не должны стоять рядом. Буквы в слове не должны повторяться. Сколько слов может составить Лера?

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

Как будем решать задачу

Заведем три символьных массива: массив гласных букв bg, массив согласных букв bs и массив всех букв c (его мы получим суммой гласных и согласных букв).

Получим 5-буквенное слово s перестановками букв массива c.

foreach x in c.Permutations(5) do 

   s := x.JoinToString; 

Заведем переменную f (флаг, тип boolean) и сохраним в ней значение true (истина) - это будет означать, что никаких рядом стоящих двух согласных или двух гласных букв в слове нет. Получим все перестановки из двух гласных букв (переменная y). Если сочетание двух гласных букв в слове s есть, присвоим флагу значение false (ложь). Так же поступим с согласными буквами. Если переменная f в итоге хранит значение true, значит слово s получено верно, счетчик искомых слов t увеличим на 1:  if f then t+=1;

Программа решения задачи на языке Паскаль

var

  c, x, y, bg, bs: array of char;

  s,d: string; t: integer; f:boolean;

begin

  c:= new char[8]; bg:= new char[3]; bs:= new char[5]; 

  bg[0]:='О'; bg[1]:='А'; bg[2]:='И';

  bs[0]:= 'Л'; bs[1]:= 'Г'; bs[2]:= 'Р'; bs[3]:= 'Ф'; bs[4]:= 'М';

  c:=bg+bs; //все буквы

  t := 0; 

  foreach x in c.Permutations(5) do 

    begin 

      s := x.JoinToString; 

      f:=true; //нет двух гласных или двух согласных рядом

      foreach y in bg.Permutations(2) do

      begin

        d:=y.JoinToString; 

        if d in s then f:=false;

      end;

     foreach y in bs.Permutations(2) do

      begin

        d:=y.JoinToString; 

        if d in s then f:=false;

      end;

      if f then t+=1;

    end;

  println('Количество слов, которые составит Лера: ',t); 

end.

Ответ: 480

Результат выполнения программы

Результат запуска

Другие задачи на перестановки

Сколько существует шестнадцатеричных трехзначных чисел, в которых все цифры различны и никакие две четные или две нечетные цифры не стоят рядом

Читать

Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя

Читать

Алексей составляет 5-буквенные слова из букв М, А, Г, И, С, Т, Р. Каждую букву можно использовать не более одного раза, при этом в слове нельзя использовать более одной гласной. Сколько различных кодов может составить Алексей

Читать

27.05.2022

Задача на перестановки (Паскаль, Permutations(N))

Задача. Алексей составляет 5-буквенные слова из букв М, А, Г, И, С, Т, Р. Каждую букву можно использовать не более одного раза, при этом в слове нельзя использовать более одной гласной. Сколько различных кодов может составить Алексей?

Задачу на перестановки букв слова АВРОРА мы решили с использованием метода Permutations и множеств. 

В данной же задаче проблема заключается в том, что длина слова меньше, чем используемый алфавит. Будем использовать метод Permutations с аргументом N, позволяющий брать N символов из набора.

Пример:

Получим все слова из двух букв перестановками букв слова КОТ.

В массиве с сохраним буквы слова КОТ. Получим массивы перестановок функцией c.Permutations(2).

Программа на языке Паскаль

var c,x:array of char; s:string; 

begin   

    c:=new char[3];  

    c[0]:='К'; c[1]:='О'; c[2]:='Т'; 

    foreach x in c.Permutations(2) do   

     begin     

      s:=x.JoinToString;

      println(s);

     end; 

end.

Результат запуска программы

Слова по 2 из КОТ

Решим задачу про "МАГИСТРА"

Сохраним буквы М, А, Г, И, С, Т, Р в массиве c. Получим все перестановки по 5 символов циклом  foreach x in c.Permutations(5) do. Получим строку оператором s:=x.JoinToString

Если суммарное количество гласных букв ('А' и 'И') меньше или равно 1, то увеличим счетчик искомых слов t на 1.

Программа решения задачи на языке Паскаль

var c,x:array of char; s:string; 

    t:integer;

begin   

    c:=new char[7];  

    c[0]:='М'; c[1]:='А'; c[2]:='Г'; 

    c[3]:='И'; c[4]:='С'; c[5]:='Т';

    c[6]:='Р';

    t:=0;

    foreach x in c.Permutations(5) do   

     begin     

      s:=x.JoinToString;

      if (s.CountOf('А')+s.CountOf('И'))<=1 then t+=1;

     end; 

    println(t);

end.

Ответ: 1320