04.11.2024

Срезы строк в Питоне

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

Строка в Питоне

Последовательность символов, заключенная в апострофы 'HELLO'

s = 'HELLO'

Нумерация символов в строке ведется с 0.

Обращение к символу строки

s = 'HELLO'

s[0] # символ 'H'

s[1] # символ 'E'

s[-1] #последний символ 'O'

s[-2] #предпоследний символ 'L'

Срезы строк (части строки) 

строка[нач_поз: кон_поз: шаг] # конечная позиция не включается

s = '0123456789'

a = s[0:9] # a = '012345678'

a = s[1:] # a =  '123456789'  если конечную позицию опускаем, то берется срез до конца строки

a = s[:7] # a = '0123456'  если начальную позицию опускаем, то берется срез от начала строки

a = s[1:8:2] # a = '1357'

a = [::-1] # a = '9876543210' берем всю строку с шагом -1, переворачиваем строку

Задача. Вводится натуральное число. Записать это число в двоичной системе счисления, перевернуть и отбросить ведущие нули.

Пример:

N = 4410 = 1011002

Перевернутая двоичная запись: 001101

Двоичная запись без ведущих нулей: 1101

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

  1. Введем число n
  2. Переведем число n  в двоичную систему функцией bin(), получим строку s
    s = bin(n)
    для n = 44 получим s = '0b101100'
  3. Возьмем срез s[2:], избавимся от первых двух знаков '0b' 
    s = s[2:]
  4. Перевернем запись срезом s[::-1]
  5. Найдем в перевернутой строке позицию первой единицы методом s.find('1')
    pos = s.find('1')
  6. Возьмем срез с найденной позиции до конца строки
    s = s[pos:]

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

n = int(input('Введи натуральное число: '))

s = bin(n)

s = s[2:]

s = s[::-1]

pos = s.find('1')

s = s[pos:]

print(s)

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

Введи натуральное число: 100

10011

Покороче

s = bin(n)[2:][::-1]

s = s[s.find('1'):]

25.10.2024

Программа Калькулятор на Паскале

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

*

 / 

^  (возведение в степень)

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

var a, b, r: real;

    p,mes,s1,s2:string;

begin

  mes:='1';  s1:='';  s2:='';

  print('==Программа калькулятор=='+NewLine+' Допустимые операции:'+NewLine+' +'+NewLine+' -'+NewLine+' *'+NewLine+' /'+NewLine+' ^'+NewLine);

  print('Введите первое число:');

  readln(a);

  print(' Введите операцию:');

  readln(p);

  print(' Введите второе число:');

  readln(b);

  if p.length=1 then

  case p of

  '+': r:=a+b;

  '-': r:=a-b;

  '*': r:=a*b;

  '/': r:=a/b;

  '^': r:=a**b;

  else mes:='Введена незнакомая операция';

  end

  else mes:='Введена незнакомая операция';

  if b<0 then begin s1:='('; s2:=')';end;

  if mes='1' then print(' ',a,p,s1,b,s2,'=',r)

             else print(mes);

end.

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



В этой программе применили оператор NewLine для многострочного вывода, также применили оператор выбора case и приемы работы со строками (склеивание операцией + и функцию length для вычисления длины строки).

23.10.2024

Задание 5. ЕГЭ по информатике. Минимальное значение R, которое превышает 999, при условии, что N не может быть нечётным

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

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

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

   а) если число кратно 3, то к двоичной записи числа слева дописывается 1, а затем два правых разряда заменяются на 11;

  б) если число не кратно 3, то к двоичной записи числа слева дописывается 10 и справа дописывается 0.

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

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

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

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

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

  1. Запустим цикл по подбираемому числу n в диапазоне от 2 до 2000 с шагом 2 (нам нужны натуральные четные числа, граница 2000 подбираемая, но это прям "с запасом")
  2. В цикле реализуем описанный алгоритм:
    • переведем число в двоичную строку функцией bin(), возьмем срез со второго символа строки до конца (первые два символа '0b' в полученной двоичной строке нам не нужны, это не цифры двоичного числа)  s = bin(n)[2:]
    • выполним проверку числа n на кратность 3, если число кратно 3, то слева к двоичной строке припишем '1', в середину строки положим строку без последних двух символов, а справа допишем '11' (таким образом заменим два последних символа на символы '11's = '1' + s[:-2] + '11'
    • переведем полученную новую двоичную строку в десятичную систему счисления функцией int(s, 2)
    • найдем минимальный результат. который больше 999 (выполним проверку полученного результата, если число больше 999 и меньше некого минимума, то минимум перезапишем на это число)
    • За циклом выведем минимальный результат

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

m = 10000 #начальное значение искомого минимума

for n in range(2,2000,2):

    s = bin(n)[2:]

    if n % 3 == 0:

        s = '1' + s[:-2] + '11'

    else:

        s = '10' + s +'0'

    r = int(s, 2)

    if r>999 and r<m:

        m = r

print(m)

Ответ: 1007

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 из ЕГЭ по информатике в разделе Разбор задач ЕГЭ.

20.10.2024

Программа "Угадай число" на языке Питон

Программа "Угадай число" – это интерактивная игра, в которой пользователю необходимо угадать случайно сгенерированное число. Основная идея заключается в том, чтобы предложить игроку ряд подсказок, основываясь на его попытках. 

Ход игры:

  1. Генерируем число в заданном диапазоне, например, от 1 до 100. 
  2. Обнуляем счетчик попыток a.
  3. Запускаем цикл while True
  4. Вводим предполагаемое число x
  5. Увеличиваем счетчик попыток на 1
  6. Осуществляем проверку

(если x строго меньше, сообщаем "Слишком мало! Попробуйте еще раз", иначе если x строго больше, то сообщаем "Слишком много! Попробуйте еще раз", в противном случае сообщаем "Поздравляем! Вы угадали число n за a попыток" и прерываем цикл оператором break.

Программа игры "Угадай число" на языке Python

import random

n = random.randint(1, 100) #сгенерировали случайное число в промежутке от 1 до 100.

a = 0 #попытки

print("Добро пожаловать в игру 'Угадай число'!")

print("Я загадал число от 1 до 100. Попробуй угадать его!")

while True:

    x = int(input("Введите ваше предположение: "))

    a += 1

    if x < n:

        print("Слишком мало! Попробуйте еще раз.")

    elif x > n:

        print("Слишком много! Попробуйте еще раз.")

    else:

        print(f"Поздравляю! Вы угадали число {n} за {a} попыток.") #форматированная f-строка

        break

Поиграем

Вот это повезло))

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

Попробуйте угадать число за минимальное количество попыток. И каково это количество?

О примененной в программе f-строке

Метод f"{}" в питоне, известный как f-строка, представляет собой мощный инструмент для форматирования строк, который был введён в языке программирования с версии Python 3.6. Он позволяет разработчикам интуитивно вставлять выражения в строковые литералы, что значительно упрощает код и делает его более читаемым.

Синтаксис f-строк включает префикс "f" перед открывающей кавычкой и фигурные скобки {}, в которые можно помещать выражения. Например, можно легко объединять текст с переменными: name = "Барсик" и строка f"Привет, {name}!" выведет "Привет, Барсик!".

Кроме того, f-строки поддерживают выражения и функции, что позволяет динамически вычислять значения прямо внутри строки. Например, f"Сумма: {a + b}" может выводить сумму двух переменных, не прибегая к дополнительным строкам кода. Метод f"{}" является не только элегантным, но и эффективным способом работы со строками в Python.

09.10.2024

Методы и функции строк в Python

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

Введение в методы и функции строк в Python

Строки играют важную роль в программировании, и в Python они представлены как неизменяемые последовательности символов. Для работы с строками в Python существует множество методов и функций, которые облегчают их обработку и манипуляции. Некоторые из основных методов строк в Python включают строка.upper() для преобразования в верхний регистр, строка.lower() для преобразования в нижний регистр, строка.strip() для удаления пробелов в начале и конце строки и строка.split() для разделения строки на подстроки. Функции, такие как len(строка), позволяют определить длину строки, а str() - преобразовать другие типы данных (числа, логические значения, списки и др.) в строку.

Основные операции с текстовыми данными

В Python существует множество полезных методов и функций для работы со строками, которые позволяют производить различные операции с текстовыми данными. Одной из основных операций является конкатенация, то есть объединение нескольких строк в одну. Это можно сделать с помощью оператора "+".

s = 'cat' + 'Barsik' 

получим 'catBarsik' 

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

s = 'cat'*3 

получим 'catcatcat'

Другой важной операцией является разделение строки на подстроки. Для этого используют метод split(), который разделяет строку на части по указанному разделителю и возвращает список подстрок.

a = 'A+B=C'.split('+') 

получим a = ['A','B=C']

Также можно объединять подстроки в одну строку с помощью метода .join().

a = ['hello','my','world']

s = ''.join(a)

получим s = 'hellomyworld'

В Python есть возможность замены подстрок в строке с использованием метода replace(). Этот метод позволяет заменить вхождения (все или указанное количество) одной подстроки на другую в заданной строке.

Пример 1

s = '1a1b11cd11'

s = s.replace('1','2')

print(s)

#2a2b22cd22 

#все символы 1 поменялись на символы 2

Пример 2

s = '1a1b11cd11'

s = s.replace('1','2',1) 

print(s)

#2a1b11cd11

# только первый символ 1 поменялся на 2

Пример 3

s = '1a1b11cd11'

s = s.replace('1','2',2)

print(s)

#2a2b11cd11

#первые два символа 1 поменялись на 2

Важно помнить, что строки в Python неизменяемы, поэтому большинство методов возвращают новую строку, а не изменяют исходную. Это позволяет обеспечить безопасность и предотвратить неожиданные изменения данных.

Поиск и замена подстрок в строках с помощью методов

Python предоставляет мощные методы для поиска и замены подстрок в строках. Один из таких методов - find(), который возвращает индекс первого вхождения подстроки в строку или -1, если подстрока не найдена. 

k = 'BBBASSA'.find('A')

print(k) #3

Для замены подстрок используется метод replace(), который заменяет вхождения (все или указанное количество) одной подстроки на другую (рассмотрели выше). 

Метод count() возвращает количество вхождений подстроки в строку. Он помогает быстро оценить, сколько раз повторяется определенная последовательность символов в строке.

k = 'BAOBAB BAOBAB'.count('AB')

print(k) #2

Работа с регистром символов и разделением строк

В Python есть множество методов для работы с регистром символов и разделением строк. Методы upper() и lower() позволяют преобразовать все символы строки в верхний и нижний регистр соответственно. Метод capitalize() делает первую букву строки заглавной, а метод title() делает каждое слово с большой буквы.

s = 'hello'.upper()

print(s) #HELLO

s = 'HeLLo'.lower()

print(s) #hello

s = 'hello'.capitalize()

print(s) #Hello

s = 'hey, my friend'.title()

print(s) #Hey, My Friend

Срезы строк

Срез (часть) строки можно взять следующим образом.

Пример 1

s = 'HELLO'

print(s[2:4]) #с символа с номером 2 до 4 (4 не включая).

#LL

Пример 2

s = 'HELLO'

print(s[:])

#HELLO

Пример 3

s = 'HELLO'

print(s[3:])

#LO

Пример 4

s = 'HELLOMYWORLD'

print(s[1:8:2]) # c символа с номером 1 до 8 (8 не включая) с шагом 2

#ELMW

Пример 5

s = 'HELLOMYWORLD'

print(s[::-1]) #реверс строки

#DLROWYMOLLEH

Решения конкретных задач с использованием строк вы сможете найти в разделе Разбор задач ЕГЭ.

24.09.2024

Как ввести с клавиатуры число (Pascal, Python)

 В данной статье рассмотрим способы ввода чисел с клавиатуры на языках Паскаль и Python.

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

read(t);

или 

readln(t);

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

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

var t:integer; //integer целый тип данных

begin

   readln(t);

end.

Запуски программы

Успешный запуск (введено целое число)

Запуск с ошибкой (введено нецелое число)

Чтобы ввести нецелое число используется вещественный тип данных, например, real.

var t:real;

begin

   readln(t);

end.

Как ввести число в языке Python?

Функция  input() вводит строку.

Пример программы (и ее запуска) на языке Python, которая демонстрирует оператор ввода.

t = input()

print(t + ' Барсик')

Запуск программы

Как работала программа

Функция input() позволила ввести строку. В операторе print() склеили введенную строку и строку 'Барсик' и вывели полученную строку на экран.

Что если ввести число при помощи данной программы?


Получаем склеенную строку! 

Функция input() вводит строку.

Как ввести число?

Необходимо преобразовать строку к числу, например, целому числу. Такое преобразование выполняет функция int().

t = int(input())

print(t*10) #Чтобы проверить, что введено число, увеличим его при выводе в 10 раз

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

   34

   340

>>>

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

t = float(input())

print(t*100) #увеличим число в 100 раз

Функция float() преобразует строку к вещественному числу.

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

   2.003

   200.3

>>>

Что можно еще прочитать? 

Статья "Ввести список в одну строку Питон (Python)"

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), которые были бы в этом месте. Но попытка хорошая 👌 (тем более, что в один цикл).