27.08.2024

Задачи на циклы (Питон, Паскаль)

Приведем решения задач на языках программирования Паскаль и Питон с применением операторов цикла.

Задача 1. Дана непустая последовательность целых чисел оканчивающаяся нулем. Найти сумму всех чисел.

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

Количество чисел в последовательности не известно, но известно, что последнее вводимое число это 0.

  1. Примем сумму за 0 (переменная s).
  2. Введем первое число из последовательности (переменная x).
  3. Запустим цикл с условием продолжения: число x не равно 0.
  4. В теле цикла будем копить сумму чисел s и вводить число x.
  5. За циклом выведем сумму чисел на экран.

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

s = 0

x = int(input())

while x!=0:

    s+=x

    x = int(input())

print('сумма чисел',s)

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

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

var x,s:integer;

begin

  readln(x);

  s:=0;

  while x<>0 do

  begin

    s+=x;

    readln(x);

  end;

  print('сумма чисел',s);

end.

Задача 2. Найти сумму всех трехзначных четных чисел.

Пусть числа натуральные.

Будем решать задачу "в лоб".

  1. Примем сумму трехзначных четных чисел за 0.
  2. Запустим цикл с счетчиком n по промежутку трехзначных чисел (от 100 до 999)
  3. Проверим, кратно ли значение счетчика цикла n числу 2 (то есть, четно ли оно), если да, то будем копить сумму s.
  4. За циклом выведем искомую сумму чисел на экран.

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

s = 0

for n in range(100,1000):

    if n % 2 == 0:

        s+=n

print('сумма трехзначных четных чисел',s)

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

сумма трехзначных четных чисел 247050

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

var n,s:integer;

begin

  s:=0;

  for n:=100 to 999 do

  begin

    if n mod 2 = 0 then s+=n;

  end;

  print('сумма трехзначных четных чисел',s);

end.

Как можно решить задачу быстрее?

Запустим цикл по заведомо четным числам, то есть от 100 до 999 с шагом 2 (100, 102, 104...), проверка четности числа не нужна.

В языке Питон

for n in range(100,1000,2):

    s+=n

В языке Паскаль

for n:=100 to 999 step 2 do

  begin

     s+=n;

  end;

Задачи на цикл в другой публикации.

19.05.2024

Задание 6. ОГЭ по информатике. 9 класс. Решение с помощью программы

 Задание 6. ОГЭ по информатике. 9 класс.

Ниже приведена программа, записанная на пяти языках программирования.

Алгоритмический язык

Паскаль

алг
нач
цел s, t
ввод s
ввод t
ввод А
если mod(s, t) = A
    то вывод ′YES′
    иначе вывод ′NO′
все
кон

var s, t: integer;
begin
readln(s);
readln(t);
readln(A);
if (s mod t = Athen
    writeln(′YES′)
else
    writeln(′NO′)
end.

Бейсик

Python

DIM s, t AS INTEGER
INPUT s
INPUT t
INPUT A
IF s MOD t = A THEN
    PRINT ′YES′
ELSE
    PRINT ′NO′
ENDIF

s = int(input())
t = int(input())
A = int(input())
if (s % t == A):
    print(′YES′)
else:
    print(′NO′)

C++

#include <iostream>
using namespace std;
int main(){
    int s, t;
    cin >> s;
    cin >> t;
    
cin >> A;
    
if (s % t == A)
        
cout << ′YES′ << endl;
    
else
        
cout << ′NO′ << endl;
return 0;
}

Было проведено 9 запусков программы, при которых в качестве значений переменных вводились следующие пары чисел (s, t):

(15, 4), (11, 5), (1, 10), (11, 3), (7, 4), (11, 5), (12, 7), (17, 10), (27, 10).

Укажите наибольшее значение параметра А, при котором программа вывела «YES» 2 раза.

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

  1. Сохраним пары чисел s и t в списках.
  2. Запустим внешний цикл по предполагаемому значению параметра A (промежуток можно выбрать экспериментально, но в данной задаче понятно, что параметр A  - это остаток от деления числа s на число t, и исходя из чисел s и t, параметр A может быть числом из промежутка [0, 9]).
  3. Во внешнем цикле по параметру A обнулим счетчик выводов YES (переменная p) и запустим внутренний цикл по 9 запускам (по сути по длине списка s (или t)).
    • Обратимся к запуску как s[i], t[i].
    • Если условие s[i] % t[i] == A выполняется, то увеличим счетчик выводов YES на 1, в противном случае не будем изменять значение счетчика p.
  4. Во внешнем цикле проверим условие p = 2, если оно выполняется, выведем число A.

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

y = [(15, 4), (11, 5), (1, 10), (11, 3), (7, 4), (11, 5), (12, 7), (17, 10), (27, 10)]

s, t = map(list,zip(*y))

#print(s,t)

#эту часть кода можно было бы записать вручную

# s = [15, 11, 1, 11, 7, 11, 12, 17, 27]

# t = [4, 5, 10, 3, 4, 5, 7, 10, 10]

for A in range(0,10):

    p = 0

    for i in range(9):

        if (s[i] % t[i] == A):

            p = p + 1

        else:

            p = p

    if p==2:

        print(A)

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

3

7

Ответ: наибольшее число A = 7

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

04.03.2024

Эксперимент. Решаем 5 задач за час (нестандартные задачи на питон)

Про интерес. Задала гуглу такой запрос:

нестандартная задача питон

И нашла такую статью: "Пять задач, которые хорошо бы уметь решать за час"

запрос гуглу

Автор предлагает решить 5 задач за 1 час.

Конечно захотелось проверить свои силы ))))

Вот эти задачи:

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число. Например:

 [61, 228, 9] -> 961228

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

Постарайтесь решить эти задачи за час.

Итак!

Решения

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

def sum_for(a):

    s = 0

    for k in a:

        s+=k

    return s

def sum_while(a):

    s = 0

    k = 0

    while k<len(a):

        s+=a[k]

        k+=1 

    return s

def sum_rec(a):

    if len(a)==1: return a[0] 

    else: return sum_rec(a[:-1])+a[-1]

x = [100,200,-300,100,-400,10000]

print(sum_for(x))

print(sum_while(x))

print(sum_rec(x))

вывод

9700

9700

9700

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

def f(a,b):

    r = []

    for k in range(min(len(a),len(b))):

        r.append(a[k])

        r.append(b[k])

    return r 

x = [1,2,3,4,5,6]

y = [11,22,33,44,55]

print(f(x,y))

вывод

[1,11,2,22,3,33,4,44,5,55]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

x = [0]*100

x[0] = 0 

x[1] = 1 

for k in range(2,len(x)):

    x[k] = x[k-1] + x[k-2]

print(x)

вывод

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026]

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число.

Например: [61, 228, 9] -> 961228

from itertools import *

a = [9,10,10,345,11,9]

m = 0

for x in permutations(a):

    s = int(''.join(map(str,x)))

    m = max(m,s)

print(m) 

вывод

99345111010

К слову, абсолютно неэффективная программа.

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

m = set()

for k1 in range(1,10):

    for t1 in ' +-':

        for k2 in range(k1+1,10):

            for t2 in ' +-':

                for k3 in range(k2+1,10):

                    for t3 in ' +-':

                        for k4 in range(k3+1,10):

                            for t4 in ' +-':

                                for k5 in range(k4+1,10):

                                    for t5 in ' +-':

                                        for k6 in range(k5+1,10):

                                            for t6 in ' +-':

                                                for k7 in range(k6+1,10):

                                                    for t7 in ' +-':

                                                        for k8 in range(k7+1,10):

                                                            for t8 in ' +-':

                                                                for k9 in range(k8+1,10):

                                                                    for t9 in ' +-':

                                                                        s= str(k1)+str(t1)

                                                                        s+=str(k2)+str(t2)

                                                                        s+=str(k3)+str(t3)

                                                                        s+=str(k4)+str(t4)

                                                                        s+=str(k5)+str(t5)

                                                                        s+=str(k6)+str(t6)

                                                                        s+=str(k7)+str(t7)

                                                                        s+=str(k8)+str(t8)

                                                                        s+=str(k9)+str(t9)

                                                                        w=''

                                                                        for y in s:

                                                                            if y!=' ':

                                                                                w+=y

                                                                        if w[-1] in '+-': w = w[:-1]

                                                                        r = w[0]

                                                                        for q in range(1,len(w)):

                                                                            if w[q] in '+-':

                                                                                r=r+'s'+w[q]

                                                                            else:

                                                                                r=r+w[q]

                                                                        summ = sum(list(map(int,r.split('s'))))  

                                                                        if summ==100:

                                                                            m.add(w)

print(len(m),m)   

вывод

11 {'1+2+3-4+5+6+78+9', '12+3+4+5-6-7+89', '1+2+34-5+67-8+9', '12+3-4+5+67+8+9', '123+45-67+8-9', '123-4-5-6-7+8-9', '1+23-4+56+7+8+9', '1+23-4+5+6+78-9', '12-3-4+5-6+7+89', '123+4-5+67-89', '123-45-67+89'}

Итого

Начало: 19:49

Конец: 20:58

Потрачено: 1 час 9 мин

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

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