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(str(net1.netmask).split('.')[2]) #3-й байт

Ответ: 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(str(net1.netmask).split('.')[2]) #3-й байт

Ответ: 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 = bin(int(ip))[2:] #получили IP-адрес в виде десятичного целого числа и перевели это число в двоичный код

        if len(s)<32: s = (32-len(s)) * '0' + s #доводим разрядность до 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. Какое наибольшее возможное количество нулей в разрядах маски?

from ipaddress import *

for a in range(0,33):

    net = ip_network(f'244.55.229.28/{a}',False)

    s = str(net).split('/')

    if s[0]=='244.0.0.0':

        print(net.netmask)

"""больше 0 в той маске, в которой больше байтов, равных 0, 

и чем меньше старший(ие) байт(ы), в выводе это первая маска, 

252 = 11111100 (2 нуля) + 3*8 в младших байтах, всего 26)"""

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

Маски сети


Ответ: 26

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

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

24.02.2024

Как найти слова с цифрами. Программа на языке Паскаль, Python (применение множеств)

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

Разберем следующие способы решения:

  1. подсчитаем количество символов-цифр в слове ("в лоб", пройдя вдоль слова циклом),
  2. найдем длину множества, равного пересечению множества символов слова и множества символов-цифр.

Способ 1

  • Введем строку
  • Получим список слов, разделив строку по пробелу методом split()
  • Пройдем циклом по списку слов
    • подсчитаем количество символов-цифр методом countof()
    • если количество символов-цифр больше 0, выведем слово

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

var s:string;

begin

  readln(s);

  var a:=s.Split();

  foreach var d in a do

  begin

    var t:=d.countof('0') + d.countof('1') + d.countof('2') + d.countof('3') + d.countof('4') + d.countof('5') + d.countof('6') + d.countof('7') + d.countof('8') + d.countof('9');

    if t>0 then println(d);

  end;

end.

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

слова с цифрами

Способ 2

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

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

var s:string;

begin

  readln(s);

  var a:=s.Split();

  foreach var d in a do

  begin

    var t:=0;

    foreach var h in d do

    begin

      if h in ['0'..'9'] then t+=1;

    end;

    if t>0 then println(d);

  end;

end.

Способ 3

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

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

var s:string;

begin

  readln(s);

  var a:=s.Split();

  foreach var d in a do

  begin

    var m: set of char;

    m:=[];

    foreach var h in d do include(m,h);

    m:=m * ['0'..'9'];

    if m.count>0 then println(d);

  end;

end.

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

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

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

s = input()

a = s.split()

for d in a:

    m = set(d) & set('0123456789')

    if len(m)>0:

        print(d)




Как получить все возможные подстроки из заданной строки на Питоне (Python)

Читать

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

Читать

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

Читать

08.02.2024

Строки в Python. Split. Задачи. Перевертыш (палиндром)

 Задача. Дана строка слов, разделенных пробелами. Вывести слова в столбец.

Воспользуемся методом split(), который делит строку по заданному разделителю и возвращает список подстрок.

s = 'привет мир как дела'

a = s.split() #по умолчанию разделителем считается пробел

print(a)

Вывод:

['привет','мир','как','дела']

Для того, чтобы вывести слова в столбец воспользуемся циклом.

for k in a:

    print(k)

Вывод:

привет

мир

как

дела

Задача. Дана строка слов, разделенных пробелами. Найти количество слов перевертышей.

Проверим слово, является ли оно перевертышем (палиндромом), взяв срез от начала до конца строки с шагом -1.

s = 'шалаш1'

x = s[::-1]

print(x)

Вывод:

1шалаш

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

s = 'как тот кок готовил плов'

a = s.split()

k = 0

for t in a:

    x = t[::-1]

    if x == t:

        #print(x)

        k+=1

print(k)

Вывод:

3


Как получить все возможные подстроки из заданной строки на Питоне (Python)

Читать

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

Читать

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

Читать

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 задания ЕГЭ по информатике