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.