CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
🧑‍💻 Йоу гайс воссап, сегодня разберем код на C, чтобы вы особо не расслаблялись, вечерком надо разобрать код с ЕГЭ. Подписота у меня супер разная, поэтому надо угодить всем 🥰

🔗 Итак, задание Тайлера Дердена: Поработаем сегодня со строками в C. Допустим, нам нужно написать такой код, чтобы мы вводили строку, а этот самый код менял одни буквы на другие.


⭕️ Го делать:

🟰 Для начала, прикрепляю ссылку на навигацию по C (там другие разборы классных задач) НАВИГАЦИЯ ПО C

0️⃣ Итак, поехали, первое, это подключения библиотеки для ввода - вывода данных:

#include <stdio.h> 


1️⃣ Объявляем главную функцию:

main()
{


2️⃣ Объявляем массив символов для хранения строки (После фигурной скобки будет табуляция кст), также объявляем максимальную длину, пусть будет символов 50:

char s[50];


3️⃣ Объявим переменную-счетчик для индексов символов строки (С каждой итерацией наша i будет увеличиваться на 1):

int i;


4️⃣ Было бы хорошо, если бы выводилась строка по типу 'Введите строку', так и запишем:

printf("\n Введите строку \n");


5️⃣ Дальше, код должен считать строку и записать ее в наш массив s, который мы записали на шаге 🟰2🟰

‼️ На этот случай есть такая функция — gets() или fgets().

⭕️ "Она считывает строку ввода до момента, пока не встретит символ новой строки (\n) или конец файла EOF".

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


Зато, есть fgets(), которая быстро считывает нашу строку, при этом, мы указываем максимальное количество символов для чтения.

У этой функции три аргумента:

🔗 fgets(buffer, size, stdin); — 'синтаксис' нашей функции

🟰 buffer — это массив, в который записывается строка, у нас это s

🟰 Аргумент sizeэто максимальное количество символов, которые могут быть прочитаны (включая завершающий \0 — это тип конец строки в C, к примеру если мы введем строку длинной 7 символов, в массиве будет хранится ['C', 'o', 'd', 'e', ':L','a','b' '\0'])

🟰 Последний аргумент — это stdin (стандартный ввод), мы прописывали библиотеку

‼️ Кароч, как ИТОГ, fgets безопаснее работает, так как, мы указываем максимальный размер буфера, что предотвращает переполнение этого самого буфера.

🔗 Вводим такую строку:

fgets(s, 80, stdin);


6️⃣ Начнем с первого символа строки:

i = 0;


7️⃣ Пишем цикл while, который будет продолжаться до того момента, пока не встретит конец строки — '\0' (об этом уже поговорили)

while (s[i] != '\0')
{


8️⃣ Теперь условный оператор if, заменим, допустим, 'S' на 'K' (то есть, ввели строку, все S заменятся на K)

if (s[i] == 'S')
{
s[i] == 'K'
}
i ++; // Инкремент i++ увеличивает значение переменной на 1, при этом, сеачала возвращает текущее значение i, по сути, мы переходим к следующему символу


Допустим, чтобы было понятно, я обратился к GPT, он мне выдал такую интересную штуку:

// Это просто пример, к коду нашему это не относится
int i = 5;
int x = i++;


🔗 i сначала было равно 5.

🔗x получит значение 5 (так как сначала используется текущее значение переменной).

🔗Затем i станет равно 6 (после того, как операция инкремента выполнится).


9️⃣‼️ Выводим результат (Функция puts() используется для вывода строк на экран. ). Почему не printf? Потому что, как я сам лично понял, puts() немного попроще. Если нам нужно вывести просто строку без изменений, то лучше использовать puts(). А если нам нужно вывод переменных или другие 'действия над выводом', то используем printf().

puts("\nРезультат:\n");


🔟 И выводим нашу измененную строку:

    puts(s);

return 0;
}


🔗 Мы молодцы, теперь код:


#include <stdio.h>

int main()
{
char s[80]; // Массив для строки
int i; // Счётчик

printf("\n Введите строку \n");
fgets(s, 80, stdin);

i = 0;
while (s[i] != '\0') // Цикл по строке до конца
{
if (s[i] == 'S') // Если символ 'A', заменяем его на 'B'
{
s[i] = 'K';
}
i++; // Переходим к следующему символу
}

puts("\nРезультат:\n");
puts(s);

return 0; //завершение программы
}
1🤯3🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
🤯4
🧑‍💻 Всем доброе утро, пора бы взяться за степик. Задание — Факториал (7.3)

Подается натуральное число:

n = int(input())


⭕️ Если заглянуть в текстовые данные, то n <= 12, поэтому сначала сделаем решение по условию.

Затем, счетчик для произведения:

total = 1 # Счетчик равен 1 потому что это произведение, ну это так)


Теперь, условный оператор в зависимости от нашего условия:

 if n <= 12:


Основной цикл:

total = total * i — эту запись сократим (тут если че наш счетчик для произведения умножается на счетчик цикла, так и получим факториал)

    for i in range(1, n + 1):
total *= i


Ну, и последнее:

print(total)


🔗 Сам код:


n = int(input())

total = 1
if n <= 12:
for i in range(1, n + 1):
total *= i

print(total)
10🤯3🥰1👨‍💻1👀1
🧑‍💻❤️ Гайс привет, сильно устаю за эти дни, надеюсь, вы меня поймете. В любом случае, завтра выкачу хороший пост, мб о машинке, мб код с вами разберем, а может и задание с ЕГЭ, в общем, проголосуете.

🔗 Разберем быстренько задание 'Без нулей'

🟰 Программа считывает числа (отличные от нуля) и выводит их произведение, вроде ниче сложного🟰

0️⃣ Для начала, счетчик для произведения (будет хранить результат):

total = 1 


1️⃣ Было бы с кайфом, если бы на каждой итерации цикла мы вводили число, так и запишем:

for i in range(10):
num = int(input())


2️⃣ Ну и условие не забудем, нам как никак нули не нужны:

    if num != 0:
total *= num


3️⃣:

print(total)


🔗 Сам код:

total = 1
for i in range(10):
num = int(input())
if num != 0:
total *= num
print(total)
10🥰3🤯1👨‍💻1👀1
Разберем еще один код, выглядит очень уж интересно. (Задание 'Без нулей')

🔗 Тут используется вложенный генератор списка, 🟰for _ in range(10)🟰 — цикл выполняется 10 раз и каждый раз запрашивает число от пользователя (нас) с помощью 🟰input()🟰

🔗 Внешний генератор —
[i for i in [] if i != 0] — здесь цикл for проходит по всем элементам списка, созданного на предыдущем шаге.

🔗 i — это каждый элемент, который получается из внутреннего списка:
[int(input()) for _ in range(10)]

🔗 Внутренний список содержит 10 чисел, введённых пользователем через input()

🔗 Затем внешний генератор [i for i in [] if i != 0] проходит по каждому элементу списка, а переменная i представляет текущее значение из этого списка на каждой итерации.

🔗 Если условие if i != 0 выполняется (то есть i не равно 0), то это значение i добавляется в итоговый список nums[].

nums = [i for i in [int(input()) for _ in range(10)] if i != 0] 


🔗 Сам код:

nums = [i for i in [int(input()) for _ in range(10)] if i != 0]
result = 1
for item in nums:
result *= item
print(result)
20🥰3🤯1👨‍💻1👀1
🧑‍💻 Я вечером подробно постараюсь разобрать на примере, как работает данный генератор
1🤯4🥰2
🧑‍💻 Итак, тут внешний генератор и внутренний, что какой делает, ща быстро разберем и я пойду спать:

Внутренний: [int(input()) for _ in range(10)]: — здесь, цикл for на каждой итерации вызывает input(), который запрашивает ввод пользователя.

Если введем: 1, 1, 5, 3, 2, 4, 0, 2, 11, 0 → внутренний список будет: [1, 1, 5, 3, 2, 4, 0, 2, 11, 0 ]

Внешний генератор [i for i in [] if i != 0]: Цикл проходит по каждому элементу списка (который мы создали во внутреннем генераторе), переменная i последовательно будет принимать значения каждого элемента из этого списка.

nums = [i for i in [int(input()) for _ in range(10)] if i != 0]


По итогу, сначала создается временный список с помощью внутреннего генератора: 🟰[int(input()) for _ in range(10)]🟰 Затем, внешний генератор проходит по каждому элементу временного списка, отбирая только те элементы, которые не равны нулю: 🟰[i for i in ... if i != 0]🟰

Всем споки 💤
25🥰3🤯2👨‍💻1👀1
Всем доброе утро! 📈

👨🏼‍💻Расскажу вам про обучение с подкреплением — еще один тип машинного обучения, примеры таких моделей, вы, наверняка уже встречали (об этом дальше).

Итак, в этом типе машинного обучения никакие данные не передаются и мы «должны заставить компьютер выполнить задачу»

◽️Суть в том, что у нас есть какая-то окружающая среда, в этой среде агент (это программа или модель, которая принимает решение и потом выполняет действия на основе этих решений, агент взаимодействует со средой и на основе её откликов корректирует своё поведение).


◽️Состояние — это информация о текущем положении агента в среде. В каждый момент времени агент находится в каком-то состоянии.

◽️Также есть действия, которые агент выбирает на основе текущего состояния.

◽️Вознаграждение — это успешность действия агента (некая числовая оценка его действий)

◽️Политика — это стратегия, которую агент использует для достижения целей.

◽️Стоимость — награда, которая ожидается в долгосрочной перспективе.

⁉️ Эти некоторые термины ↑ нам нужно понимать для дальнейшего обучения;

‼️(ЕСЛИ ВЫ УЖЕ НА КРУТОМ УРОВНЕ, Я ПРИКРЕПЛЮ ПАРУ СТАТЕЙ ДЛЯ ЛИЧНОГО ОБУЧЕНИЯ)
‼️

🧑‍💻 "Основное отличие обучения с подкреплением от классического машинного обучения заключается в том, что искусственный интеллект обучается в процессе взаимодействия с окружающей средой, а не на исторических данных"

Ща рассмотрим пример:
1🥰3👨‍💻1
🔗 Гайс, нужен был пример, поэтому решил взять со статьи, потом все ссылочки вам скину, можете сами почекать...

📈 Функция вознаграждения:

R(No fruit) = -1
R(Pear) = +5
R(Apple) = +10
🥰3🤯1
🔗 Здесь мы можем рассмотреть две политики, их вы можете увидеть в левом верхнем углу.

⚙️ Вот этот синий бехелит из берсерка 🗡 — это наш агент кста.
👍2🥰1🤯1
🔗 Как итог, агент выбирает между двумя политиками, вычисляя функцию полезности.

👨‍💻 Оценка политик показывает нам, что полезность максимальна с помощью п2 которую затем агент выбирает в качестве своей политики для этой задачи.
🥰3🤯1
🧑‍💻 Полезные статьи:

https://www.baeldung.com/cs/ml-policy-reinforcement-learning — политика в обучении с подкреплением 📈

https://education.yandex.ru/handbook/ml/article/obuchenie-s-podkrepleniem — обучение с подкреплением 💲

https://habr.com/ru/companies/newprolab/articles/343834/ — Введение в обучение с подкреплением: от многорукого бандита до полноценного RL агента ⚙️

https://medium.com/machine-learning-for-humans/reinforcement-learning-6eacf258b265 — Machine Learning for Humans, Part 5: Reinforcement Learning 💻
👍2🥰1🤯1
🔗 Задание Сумма делителей (7.3)

🔗 Мы прекрасно знаем что нужно писать для начала:

n = int(input())
t = 0


Дальше цикл for для перебора всех чисел (включительно):

for i in range(1, n + 1):


⭕️ Теперь, самое сложное, вспомнить, че такое этот ваш делитель:

Делитель — число, на которое делят делимое. Делимое у нас 10, нам нужно найти сумму делителей.

📈 Если остаток от деления нашего числа на предполагаемый делитель i будет равен 0, значит делитель мы нашли верный и мы его добавляем к нашему счетчику суммы:

    if n % i == 0:
t += i


print(t)


🔗 Весь код:

n = int(input())
t = 0
for i in range(1, n + 1):
if n % i == 0:
t += i
print(t)
❤‍🔥2🥰1🤯1
Гайс, сегодня переносится на завтра, сделаю целых два поста, т.к я устал жестка, поэтому с первыми петухами начинаем прогать
👍4
👑
❤‍🔥4
Доброе утро всем! Ща разберем задание из егэ Тип 5 № 60247 🌶🌶🌶
❤‍🔥21
🔗 Попробуем разобрать самый обычный пример кода:

0️⃣ Первая строка кода — это создание множества:

a = set()


⁉️ Вопрос зач? Да затем, что "множества — это неупорядоченные коллекции уникальных элементов" — нам это говорит о том, что, даже если для разных чисел N получится одно и то же значение R, оно будет добавлено в множество только один раз. То есть, множество 🟰set()🟰 будет отсеивать дублирующиеся значения R.

1️⃣ Итак, теперь цикл для перебора всех чисел N от 1 до 149 (включительно). Для каждого N выполняется алгоритм преобразования в двоичное число и вычисления R (это мы еще разберем):

for n in range(1, 150):


2️⃣ Нам нужно преобразовать число n в двоичную строку:

    s = bin(n)[2:]


⭕️ Bin — это встроенная функция в Python, которая преобразует целое число в двоичную строку.

⭕️ [2:] — этот срез говорит нам о том, что выводится будут все элементы, начиная со 2, позже поймете почему.

🟰 Вот вам ПРИМЕР:

x = 17
y = bin(x)
print(y) #0b10001


🟰 Префикс 0b в Python используется для обозначения двоичного числа (основание 2), но нам этот префикс не нужен, поэтому используем срез:

x = 17
y = bin(x)[2:]
print(y) #10001


3️⃣   "Если число N делится на 3, то к этой записи дописываются три последние двоичные цифры" — так и запишем:

    if n % 3 == 0:
s += s[len(s) - 3:]


🟰 С первой строкой все понятно, рассмотрим вторую:

        s += s[len(s) - 3:]


‼️ Прежде всего, функция len() возвращает длину строки s, а затем, прибавляет к строке s последние 3 символа этой строки. То есть, если строка имеет длину строки 6, последние 3 символа начинаются с индекса [6 - 3] — эта запись эквивалентна просто индексу [3].

⁉️ Возможно, у вас появился вопрос, почему нельзя просто написать s[3:]? (Кстати, в этом случае сработает). Дак вот, если длина строки меньше 3, то 🟰s[3:]🟰 вернёт пустую строку, так как индекс 3 выходит за пределы длины строки. (Но это ладно, просто для понимания)

4️⃣ "Если число N на 3 не делится, то остаток от деления умножается на 3, переводится в двоичную запись и дописывается в конец числа" — так и пишем)

    if n % 3 != 0: 
k = (n % 3) * 3
s1 = bin(k)[2:]
s += s1


⭕️ С первой строкой все снова понятно, на второй строке, остаток от деления на 3 умножаем на 3. Третья строка: число k преобразуется в двоичную строку с помощью bin(k) (Это уже разбирали в начале). Строка s1, которая является двоичной записью k, добавляется к исходной строке s (двойничной записи числа N).

🧑‍💻 Гайс, возможно все это еще очень не понятно, особенно, если вы только начали это изучать, но порешаем так парочку примеров и все поймем)

5️⃣ Создаем переменную r. После всего, что мы проделали над строкой s, она является двоичной записью нового числа R. Поэтому, переводим строку обратно в десятичное число r:

    r = int(s, 2)


6️⃣ "Укажите минимальное число r, большее 151, которое может быть получено с помощью полученного алгоритма. В ответе запишите это число в десятичной системе счисления"

    if r > 151:
a.add(r)


7️⃣ И, пишем функцию 🟰print🟰 для нахождения минимального числа из всех добалвенных в наше множество:

print(min(a))


8️⃣ Сам код:
a = set()

for n in range(1, 150):
s = bin(n)[2:]

if n % 3 == 0:
s += s[len(s) - 3:]
if n % 3 != 0:
k = (n % 3) * 3
s1 = bin(k)[2:]
s += s1

r = int(s, 2)
if r > 151:
a.add(r)

print(min(a))


▫️Ща поймете, возьмем небольшое число, пусть будет n = 5.

▫️🟰s = bin(5)[2:]🟰 — s становится равной '101' (Желательно смотреть за кодом)

▫️Затем, первое условие 🟰if 5 % 3 == 0:🟰 (Условие не выполняется)

▫️Следующее условие:

if 5 % 3 != 0: 
k = (5 % 3) * 3 # Условие выполнится, k = 6


▫️ 🟰s1 = bin(6)[2:]🟰 — Строка s1 теперь преобразуется в двоичную строку и становится равной "110"

▫️🟰s += s1🟰 — Добавляем "101" к "110" и получаем "101110"

▫️ r = int(s, 2) → r = 46 (Преобразуем двоичную строку "101110" обратно в десятичное число)

▫️И, наконец, 🟰if r > 151:🟰→ проверка последнего условия (Условие не выполнится, значит в наше множество не добавляется)
2❤‍🔥2🥰1
Гайс, честно, это задание похлеще многих заданий с перчиком в курсе, я бы даже ему дал 🌶🌶🌶. Если вы мало что поняли с разбора решения, просьба самим написать код и построчно следить за моим разбором, чтобы наверняка закрепить знания. Мы обязательно разберем еще аналогичные задания 5 типа, поэтому все обязательно поймете...
❤‍🔥21🥰1