EDEXADE, Inc
42 subscribers
8 photos
15 videos
2 files
10 links
Блог игр и оных разработок
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Посвящается всем отчаянным, кто решает 4 блок задач
Сегодня-завтра представлю решения для блока 3, а также для нескольких задач из блока 4: A, B, C, D, E, G
Какие задачи стоит рассмотреть из 4 блока?
Anonymous Poll
14%
А
43%
B
43%
C
57%
D
43%
E
86%
G
Задача 3F. Замена слов.
Первый взгляд:
Вначале приходит в голову перебрать каждое слово из текста, затем перебрать каждое слово из словаря и если слово из текста начинается со слова из словаря - то выводим его, иначе - нет.
Но тогда мы пробегаем очень долго N*M, если все слова в словаре различные.
Решение:
Создаём дерево или структуру словарь в словаре, где ключом словаря является первый символ, а значением - другой словарь, с символами, которые могут стоять после него.
Например, для словаря
aa aaa aab aac aba abc

Получим что-то такое:
a: {
a: {
a: {},
b: {},
c: {},
},
b: {
a: {},
c: {},
},
}

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

В коде представлен самый простой наверное вариант префиксного дерева)
Код к задаче 3F:
'''
С целью экономии чернил в картридже принтера было принято решение
укоротить некоторые слова в тексте. Для этого был составлен словарь слов,
до которых можно сокращать более длинные слова. Слово из текста можно
сократить, если в словаре найдется слово, являющееся началом слова из
текста. Например, если в списке есть слово "лом", то слова из текста
"ломбард", "ломоносов" и другие слова, начинающиеся на "лом", можно
сократить до "лом".

Если слово из текста можно сократить до нескольких слов из словаря, то следует сокращать его до самого короткого слова.
'''

class TrieNode:
'''
Класс узла префиксного дерева
'''
def __init__(self):
# Словарь дочерних элементов (последующие буквы слова)
# Например, для слов "a", "ab", "abc", "abd"
# у узла "a" будет один дочерний узел "b",
# у "b" - два дочерних узла "c" и "d".
self.children = {}
# Флаг, обозначающий конец слова
self.is_end_of_word = False


class Trie:
'''
Класс префиксного дерева
'''
def __init__(self):
# Корень дерева (элемент, с которого начинается поиск)
self.root = TrieNode()

def add_abbreviation_to_dict(self, abbreviation):
'''
Добавление аббревиатуры в словарь
'''
# Начинаем с корня
node = self.root

# Для каждой буквы аббревиатуры, если буква является
# дочерним узлом, переходим к узлу, иначе создаем новый узел
for char in abbreviation:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
# После добавления всех букв аббревиатуры,
# устанавливаем флаг конца слова
node.is_end_of_word = True

def find_abbreviation(self, word):
'''
Поиск аббревиатуры для слова
'''
# Начинаем с корня
node = self.root

# Для каждой буквы слова, проходимся по дочерним узлам
# и добавляем букву в префикс, пока не найдем конец слова

# Если буквы нет в дочерних узлах, возвращаем исходное слово
prefix = ""
for char in word:
if char not in node.children:
break
node = node.children[char]
prefix += char
if node.is_end_of_word:
return prefix
return word

def _str_helper(self, node, depth=0):
'''
Вспомогательный метод для вывода дерева в виде строки
'''
result = ""
indent = " " * depth
for char, child_node in node.children.items():
result += f"{indent}{char}\n"
result += self._str_helper(child_node, depth + 1)
return result

def __str__(self):
return self._str_helper(self.root)


# Алгоритм:
def abbreviate_words(dictionary, text):
'''
Функция сокращения слов в тексте
'''
trie = Trie()
for word in dictionary:
trie.add_abbreviation_to_dict(word)
print(*trie.root.children)

result = []
for word in text:
result.append(trie.find_abbreviation(word))

return result

# Входные данные:
dictionary = input().split()
text = input().split()

# Вызов функции и вывод результата:
print(abbreviate_words(dictionary, text))
Задача 3G. Построить квадрат
Суть решения:
Перебираем все точки парами и ищем возможные расположения для других двух точек. При поиске учитываем, что текущие две точки могут быть соседними, а могут лежать по диагонали, т.е.
2X
1X

или
Х2

В случае 2, когда по диагонали, точки есть не всегда в целых координатах, это нужно учесть.
Собственно и всё) Остальное дописываете сами. Например, если есть одна точка, добавляете её в возможный результат ответов)
Код к задаче 3G:
class Rectangle:
'''
Класс для работы с прямоугольником
'''
def __init__(self, p1, p2):
self.point1 = p1
self.point2 = p2

def get_possible_points(self):
'''
Получение возможных точек прямоугольника
'''
diff_x = self.point2[0] - self.point1[0]
diff_y = self.point2[1] - self.point1[1]

possible_points = [
# прямоугольник по стороне 1 (по часовой стрелке)
(self.point2[0] + diff_y, self.point2[1] - diff_x),
(self.point1[0] + diff_y, self.point1[1] - diff_x),

# прямоугольник по стороне 2 (против часовой стрелке)
(self.point2[0] - diff_y, self.point2[1] + diff_x),
(self.point1[0] - diff_y, self.point1[1] + diff_x),
]

# прямоугольник по диагонали
diff_x1 = diff_x + diff_y
diff_y1 = diff_x - diff_y
if diff_x1 % 2 == 0 and diff_y1 % 2 == 0:
possible_points.append(
(self.point1[0] + diff_y1 // 2, self.point1[1] + diff_x1 // 2)
)
possible_points.append(
(self.point1[0] + diff_x1 // 2, self.point1[1] - diff_y1 // 2)
)

return possible_points

# Входные данные:
# Количество точек
N = int(input())

points = set()

# Множество точек
for i in range(N):
X, Y = map(int, input().split())
points.add((X, Y))

# Алгоритм:
# Если в множестве всего одна точка, то добавляем 3 точки
# вверх, вправо и по диагонали
if N == 1:
print(3)
point = points.pop()
print(f"{point[0] + 1} {point[1]}")
print(f"{point[0]} {point[1] + 1}")
print(f"{point[0] + 1} {point[1] + 1}")

# Если в множестве две точки, то добавляем две точки как минимум
else:
# Минимальное количество точек, которое нужно добавить
min_points_count = 2

# Точка, которую нужно добавить, если есть три точки
min_points = []

# Перебираем все точки
for point1 in points:
for point2 in points:
if point1 == point2:
continue
rectangle = Rectangle(point1, point2)

# Получаем возможные точки прямоугольника
possible_points = rectangle.get_possible_points()

# Проверяем, есть ли эти точки в множестве
r11 = possible_points[0] in points
r12 = possible_points[1] in points

r21 = possible_points[2] in points
r22 = possible_points[3] in points

# Если есть 6 точек, то проверяем еще две точки (по диагонали)
if len(possible_points) == 6:
r31 = possible_points[4] in points
r32 = possible_points[5] in points
else:
r31 = False
r32 = False


# Если есть 2 точки, то выходим из цикла
if r11 and r12:
min_points_count = 0
break

if r21 and r22:
min_points_count = 0
break
if r31 and r32:
min_points_count = 0
break

# Иначе, если есть одна точка, то добавляем ее
if min_points_count == 2:
if r11 or r12:
min_points_count = 1
min_points = [possible_points[0] if r12 else possible_points[1]]

elif r21 or r22:
min_points_count = 1
min_points = [possible_points[2] if r22 else possible_points[3]]

elif r31 or r32:
min_points_count = 1
min_points = [possible_points[4] if r32 else possible_points[5]]

# Если нашли две точки, то выходим из цикла
if min_points_count == 0:
min_points = []
break

# Выводим результат
print(min_points_count)
if min_points_count == 2:
rectangle = Rectangle(points.pop(), points.pop())
min_points = rectangle.get_possible_points()[:2]
for point in min_points:
print(f"{point[0]} {point[1]}")
Задача 3H. Спички детям не игрушка!
Первые мысли:
1. Перебирать все возможные параллельные переносы для каждой пары спичек из разных изображения. Затем проходиться по возможным сдвигам и считать кол-во совпадений. В худшем случае, это O(N^3) поиск сдвигов - квадрат, и ещё добавить смещение, сравнив множества. Если делать не умело, то получим даже O(N^4)
2. Проверяем параллельность спичек по углу, и центру, и смещению, и...
Суть решения:
1. Перебираем всевозможные сдвиги (параллельные переносы) и считаем их количество! То есть создаём словарь и получив сдвиг, увеличиваем значение по ключу сдвига на 1.
2. Проверяем спички на параллельность не по каким-то избыточным расчетом, угла центра и длины, а вспоминаем математику! И задаём вторую точку спички относительно первой точки спички через вектор! А именно
            vec1 = (match1[0] - match1[2], match1[1] - match1[3])
vec2 = (match2[0] - match2[2], match2[1] - match2[3])

И чтобы проверить параллельность ПРОСТО ПРОВЕРЯЕМ ВЕКТОРА на равенство... не просто правда ли?

Вот и все)
Код к задаче 3H:
'''
Головоломки, которые решает Вася, всегда имеют решение. Это значит, что
набор спичек, используемый в изображении A, совпадает с набором спичек,
используемым в изображении B. Кроме того, в одном изображении никогда не
встречаются две спички, у которых есть общий участок ненулевой длины (то
есть спички могут пересекаться, но не могут накладываться друг на друга).

Вася устал решать головоломки вручную, и теперь он просит вас написать,
программу, которая будет решать головоломки за него. Программа будет
получать описания изображений A и B и должна найти минимальное
количество спичек, которые надо переложить в изображении A, чтобы
полученная картинка получалась из B параллельным переносом.
'''

# Входные данные:
# N - количество спичек в изображении
N = int(input())

matches1 = set()
matches2 = set()

# Считываем спички и сразу сортируем их, так чтобы
# спичка смотрела в направлении от севера до востока
for i in range(N):
X1, Y1, X2, Y2 = map(int, input().split())
if X1 > X2 or (X1 == X2 and Y1 > Y2):
X1, Y1, X2, Y2 = X2, Y2, X1, Y1
matches1.add(((X1, Y1, X2, Y2)))

for i in range(N):
X1, Y1, X2, Y2 = map(int, input().split())
if X1 > X2 or (X1 == X2 and Y1 > Y2):
X1, Y1, X2, Y2 = X2, Y2, X1, Y1
matches2.add((X1, Y1, X2, Y2))

# Алгоритм:
# Количество совпадающих спичек
matches_count = 0
# Словарь для хранения совпадений
dict_matches = {}

# Если изображения совпадают, то ничего не нужно делать
if matches1 == matches2:
print(0)
else:
for match1 in matches1:
for match2 in matches2:
vec1 = (match1[0] - match1[2], match1[1] - match1[3])
vec2 = (match2[0] - match2[2], match2[1] - match2[3])
if vec1 == vec2:
diff = (match1[0] - match2[0], match1[1] - match2[1])
dict_matches[diff] = dict_matches.get(diff, 0) + 1

if not dict_matches:
print(N)
else:
good_diff = max(dict_matches, key=dict_matches.get)
new_mathes = set(
(
(
match2[0] + good_diff[0],
match2[1] + good_diff[1],
match2[2] + good_diff[0],
match2[3] + good_diff[1],
)
for match2 in matches2
)
)
print(new_mathes)
matches_count = len(matches1 & new_mathes)

print(N - matches_count)
Остальные задачки, можете глянуть тут) (код не помещается в 1 смс)
3I
Играйте в футбол! https://github.com/issamansur/YandexPractice/blob/main/Contest5/part3/task9.py
3J P2P обновление
https://github.com/issamansur/YandexPractice/blob/main/Contest5/part3/task10.py

Все задачи:
https://github.com/issamansur/YandexPractice/tree/main/Contest5/part3

Если есть вопросы по задачкам - пишите)
Сладких снов/Доброе утро)
Оххх, всем привет, кто ещё тут... случайно или специально... удачно или к несчастью...
В любом случае всем рад!)

В последние полгода много всего произошло:
1. Некоторые события на работе (от раздумий до выборов)
2. Различные проекты от рабочих до заказных (не могу разглашать, что и как)
3. Выгорание (от стадии "берсерка" до "иссохшего")
4. Более глубокое погружение в свою специальность (основную из основных)
5. Сдача ответственных "тестов" (необходимые для этапов жизни)

В данный момент у меня что-то типа полутора месяца отдыха, высыпания и написания нескольких проектов в спокойной темпе, без особых сроков. И то не факт) В общем посмотрим)

Чтобы Вы не сидели без дела и не винили меня в отсутствии постов, скину Вам недавний пост одного из сотрудников моей неофициальной OpenSource организации. Это ни в коем случае не реклама!
Итак, проект в данном случае представляет собой .NET приложение (бэкенд) для игры в шахматы между игроками.
Вишенкой на торте является слоистая архитектура и использование модели акторов для реализации шахматных игр.
Приятного прочтения!)

https://www.linkedin.com/pulse/building-scalable-chess-application-net-using-actors-model-mansur-yl7mc/?trackingId=aY8k433WTPKf4UaEdA5GDw%3D%3D

P.S. пост на английском, но доступен машинный перевод)
Всем приветик)

Начиная через пару дней лайтовый, но не менее интересный (как минимум в процессе) проект, хотел бы получить от всех вас какой-то фидбек)
Дело в том, что проект будет использовать AI/ИИ сразу нескольких видов (с разными функционалом), что будет пробоваться практически впервые.
Так вот ребятки, если кто-то работал с AI или хотел бы поработать с ним, какие у вас были идеи, для чего бы вы их использовали? Может поделитесь каким-то полезным опытом для разработки?
(Можно не погружаться в конкретику, если это секрет, и просто обобщить :) )

P S. Спасибо за большой актив, учитывая, что долгое время не было постов) ❤️
Всем Охайо, Нихао, Хола или просто привет)

Планы хоть и медленно, но продвигаются. Желаний и целей много, но времени как обычно нет 🤡. Нет, выгорание кстати пока не ловлю, но чувствую себя довольно уставше и как обычно ХОЧУ НА ПЕНСИЮ, играть в гольф и писать собственные проекты не заботясь ни о чем...

Как-то так, а как ваши дела? Беседовать с умным человеком наедине конечно интересно, но все же, поделитесь в комментариях своими достижениями, прогресса или просто чем-то хорошим) (мне это интересно!)
Есть в планах один проект!

Наверное, много слышали про ноткоин 💎, хомяк🐹(🤡) и все такое прочее. Тапалки, где деньги берутся из воздуха, сбора или инвестиций. В половине из них происходит какой рандом, в результате которого, кто-то зарабатывает, кто-то же тратит время напрасно, просто тыкая на лого на экранчике телефона.

Есть идея и желания написать РПГ-игрушку с НФТ-системой, маркетом обмена на системе тон, прокачкой, классами, расами и интересным геймплеем.
Не надо ждать каких-то листингов и прочего, награды за прохождение и достижения позволят заработать без вложений. Однако как и везде, где есть рыночная система, прокачиваться и лутать бонусы можно раньше остальных.
Да и деньги деньгами, но можно будет играть, получая удовольствие от процесса.

Как Вам идея?
Есть ли среди участников люди, которые хорошо разбираются в мини приложениях ТГ?
Есть ли дизайнеры? (Все таки НФТшки надо будет рисовать)
Может есть какие-то идеи и предложения? Или же наоборот причины, не начинать все это дело?

[-3 участника после постов, кто даст больше?)]
Please open Telegram to view this post
VIEW IN TELEGRAM
Доброго времени суток)

Как многие уже знают, начались тренировки по алгоритмам 6.0* от Яндекса, да ещё и Яндекс Cup в придачу. Кто-то уже смотрел первый этап? Может, решил? Легко или сложно?
Напишите в комментариях)

У меня всё отлично, кажется начинаю выгорать🙂🫠, но жить можно. 24 часа в сутках? Работаем, ребят!

Чё там по статусам?
- Работа: справляюсь
- Проект с телегой: как видите, жру ресурсы не по дням, а по часам
(Скрин 1)
- Проект на стороне под вопросом из-за нехватки сил, но больше да, чем нет
- Яндекс Cup: 200 баллов => полуфинал, но не особо доволен собой
(Скрин 2)
- Яндекс Алгоритмы: в процессе)
- Собственное развитие бизнеса: медленно, но верно...
(Скрин 3)
- Нервная система: вышла покурить

А как там у вас?)

* - https://yandex.ru/yaintern/training/algorithm-training?utm_medium=main&utm_source=contest
This media is not supported in your browser
VIEW IN TELEGRAM
#повседневность
Видимо сегодня моё лицо выглядело ещё хлеще, чем обычно. Причем настолько, что подруга несколько мгновений смотрела на меня, затем спросила, спал ли я, а после и вообще предложила крем для лица. Спустя несколько минут уговоров я всё-таки согласился...

В итоге почувствовал себя Дином Винчестером из сверхъестественного..

[Ни в коем случае не пытаюсь задеть кого-либо, кто использует косметику, пост и видео выражает только самоиронию]