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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
🤭
🥰3
🧑‍💻 Наконец, алгоритмы! Поговорим про алгоритм сортировки выбором. Будем честны, не самый эффективный алгоритм, но разобрать его стоит.

‼️ Итак, суть алгоритма в последовательном нахождении минимального или максимального элемента и перемещении его в конец или начало списка.

Давайте на примере:

🟰 Есть у нас неотсортированный список [16, 24, 20, 8, 2] и если вкратце, то берем наименьший элемент [2] и кидаем его в начало → [2, 16, 24, 20, 8] → дальше повторяем те же действия с другими числами, пока вся неотсортированная часть не будет отсортирована.

🐍 Тут все просто, теперь разберем код на Python, чтобы закрепить тему:

0️⃣ Для начала, создаем список listt:

listt = [16, 24, 20, 8, 2]


1️⃣ Создаем цикл for для перебора по индексам всех элементов нашего списка от 1 до 5 (не включительно):

for i in range(len(listt)):


2️⃣ Создаем новую переменную внутри внешнего цикла 🟰min_index🟰 Туда мы будем сохранять текущий элемент i (Кароч, цикл будет предполагать, что текущая переменная цикла i — это минимальный элемент в неотсортированном списке.

⚙️ Переменная 🟰
min_index🟰 хранит индекс минимального элемента в оставшейся неотсортированной части списка.

min_index = i


3️⃣ Создаем внешний цикл for, который будет проходиться по всем оставшимся элементам массива (после текущего элемента 𝑖, то есть, цикл будет проходить по неотсортированному списку) и искать элемент, который меньше того, который будет сохранен в переменную 🟰min_index🟰

 for j in range(i + 1, len(listt)):


4️⃣ Создаем условие для внутреннего цикла: будет проверяться, меньше ли текущий элемент списка 🟰listt[j]🟰 чем элемент переменной 🟰min_index🟰

⭕️ Если это так, то обновляется значение 🟰min_index🟰 и оно будет указывать на индекс этого нового минимального элемента.

 if listt[j] < listt[min_index]:
min_index = j


5️⃣ На пятом этапе, после кайфового завершения внутреннего цикла, когда найден минимальный элемент в неотсортированной части списка, происходит обмен местами этого минимального элемента с текущим элементом на позиции i

6️⃣ Выводим отсортированный список:

print("Отсортированный массив:", listt)


🔗 И сам код:

listt = [16, 24, 20, 8, 2]


for i in range(len(listt)):

min_index = i
for j in range(i + 1, len(listt)):
if listt[j] < listt[min_index]:
min_index = j


listt[i], listt[min_index] = listt[min_index], listt[i]

print("Отсортированный массив:", listt)
5🤯3🥰1
🔗 Так, еще раз по циклу, чтобы было совсем понятно:

⚙️ Интересует нас именно эта часть кода:

listt = [16, 24, 20, 8, 2]


for i in range(len(listt)):

min_index = i
for j in range(i + 1, len(listt)):
if listt[j] < listt[min_index]:
min_index = j


🔗 Первая итерация:

0️⃣ i = 0

1️⃣ min_index = 0

2️⃣⭕️ Создаем внутренний цикл for от 1 до 5 (не включительно): на первой итерации j = 1

3️⃣ Теперь, условный оператор if:

🟰 Это условие нужно для поиска минимального элемента в неотсортированной части списка.

🟰 Дак вот, наш этот if будет проверять, меньше ли текущий элемент внутреннего цикла 🟰listt[j]🟰, чем текущий минимальный элемент 🟰listt[min_index]🟰

if listt[j] < listt[min_index]:


4️⃣ Если текущий элемент j меньше, чем элемент 🟰min_index🟰 → новый минимальный элемент сохраняется в j (Это нужно для сравнения оставшихся элементов с новым минимальным элементом)

‼️ Каждая новая итерация будет способствовать тому, что будет меняться минимальный элемент с текущим элементом i
2👍2🥰1🤯1
🧑‍💻 Йоу гайс воссап, сегодня разберем код на 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