Для тех, кто к нам недавно присоединился, поясняю: HiAsm Contest - это соревнование по составлению схем, решающих поставленную задачу: этакая олимпиада по программированию, только на Hiasm-е.
Напомнинаю основные правила:
Правила
0. Цель сего мероприятия - развитие алгоритмического мышления у участников.
1. Решения принимаются в виде фрагмента схемы, заключённого в MultiElementEx заданного вида (для каждой задачи свой). В комментарии к элементу должен быть указано имя участника, номер задачи, лига (Старшая либо Младшая) и (по желанию) порядковый номер версии решения.
2. В решении разрешается использовать элементы следующих вкладок:
- Строки
- Логика
- Массивы
- Инструмены (кроме группы "Языки" и компонента FTCG_Tools)
- MT-потоки
- Помощники (кроме вкладки "Среда")
- Работа с типами
- Кабели
3. Призы: +4 в рейтинг за правильное решение; 50ћ, 30ћ и 10ћ за I, II и III место соответственно; дополнительные призы (5ћ) за оригинальность решения.
4. Сроков у конкурса нет: по мере нахождения интересных задач они будут выкладываться.
5. Решения принимаются через личные сообщения (ЛС). На каждую задачу будет приниматься неограниченное число решений.
6. Решения будут оцениваться по:
- Времени работы (основной приз)
- Элегантности решения / оформления (приз зрительских симпатий - в случае появления особо оригинального решения задачи)
Решения таких задач больше не принимаются.
Архив задач
Задача 5: Треугольная трилемма
== Треугольная трилемма ==
Постановка задачи
Вам поручено написание программы классификации треугольников. Одним из критериев являются их внутренние углы. Если один из внутренних углов равен 90 градусам, то такой треугольник называется "прямоугольным" ("right"). Если один из внутренних углов больше 90 градусов, то такой треугольник называется "тупоугольным" ("obtuse"). Если же все внутренние углы меньше 90 градусов, то треугольник называется "остроугольным" ("acute").
Ещё одним критерием является относительные длины их сторон. У "разностороннего" ("scalene") треугольника все три стороны имеют разную длину. В "равнобедренном" ("isosceles") треугольнике, две из трёх сторон имеют равную длину. (Если все три стороны имеют одинаковую длину, то треугольник называется "равносторонним", но вы можете игнорировать этот случай, поскольку во входных данных не будет равносторонних треугольников.)
Для каждого набора из трех точек программа должна определить, образуют ли эти точки образуют треугольник. Если все три точки не являются различными, или три точки лежат на одной прямой, то они не образуют треугольник. (Еще один способ заключается в вычислении площади треугольника). Если же эти точки образуют треугольник, то программа должна классифицировать его по вышеприведённым критериям.
Входные данные
На вход программы подаются 6 целых чисел - координат вершин (x1, y1), (x2, y2), (x3, y3). Эти числа заведомо удовлетворяют условиям -1000 < x1, y1, x2, y2, x3, y3 < 1000.
Выходные данные
В выходном потоке программа должна вернуть строку (регистр символов важен!), характеризующую набор точек.
Если три точки не образуют треугольник, то выходная строка должна быть "not a triangle". В противном случае - одной из следующих строк:
Оформление
Шаблон оформления решения:
Постановка задачи
Вам поручено написание программы классификации треугольников. Одним из критериев являются их внутренние углы. Если один из внутренних углов равен 90 градусам, то такой треугольник называется "прямоугольным" ("right"). Если один из внутренних углов больше 90 градусов, то такой треугольник называется "тупоугольным" ("obtuse"). Если же все внутренние углы меньше 90 градусов, то треугольник называется "остроугольным" ("acute").
Ещё одним критерием является относительные длины их сторон. У "разностороннего" ("scalene") треугольника все три стороны имеют разную длину. В "равнобедренном" ("isosceles") треугольнике, две из трёх сторон имеют равную длину. (Если все три стороны имеют одинаковую длину, то треугольник называется "равносторонним", но вы можете игнорировать этот случай, поскольку во входных данных не будет равносторонних треугольников.)
Для каждого набора из трех точек программа должна определить, образуют ли эти точки образуют треугольник. Если все три точки не являются различными, или три точки лежат на одной прямой, то они не образуют треугольник. (Еще один способ заключается в вычислении площади треугольника). Если же эти точки образуют треугольник, то программа должна классифицировать его по вышеприведённым критериям.
Входные данные
На вход программы подаются 6 целых чисел - координат вершин (x1, y1), (x2, y2), (x3, y3). Эти числа заведомо удовлетворяют условиям -1000 < x1, y1, x2, y2, x3, y3 < 1000.
Выходные данные
В выходном потоке программа должна вернуть строку (регистр символов важен!), характеризующую набор точек.
Если три точки не образуют треугольник, то выходная строка должна быть "not a triangle". В противном случае - одной из следующих строк:
- isosceles acute triangle
- isosceles obtuse triangle
- isosceles right triangle
- scalene acute triangle
- scalene obtuse triangle
- scalene right triangle
Оформление
Шаблон оформления решения:
Add(MultiElementEx,3557107,525,210)
{
@Hint=#8:задача 5|9:iarspider|12:Старшая Лига
}
BEGIN_SDK
Add(EditMultiEx,17032011,15,12)
{
WorkCount=#4:doTT|
EventCount=#4:onTT|
DataCount=#2:x1|2:y1|2:x2|2:y2|2:x3|2:y3|
}
END_SDK
Задача 6: Железнодорожная
== Железнодорожная ==
Постановка задачи
Важным параметром железной дороги является ширина колеи — расстояние между двумя рельсами, по которым едет поезд. Именно этот параметр определяет типы поездов и других машин, которые могут ездить по железной дороге.
Недавно космическая экспедиция на планету RCC-0805 выяснила, что железные дороги есть и на этой планете. Было даже найдено железнодорожное депо, однако определить ширину колеи пока не удалось. Дело в том, что железные дороги на этой планете укладывались без шпал, поэтому определить, какие рельсы друг другу соответствуют не всегда просто.
Задан план расположения рельсов на территории железнодорожного депо. Для простоты будем считать, что территория представляет собой бесконечную плоскость, а каждый рельс представлен в виде прямой. Необходимо найти минимальную ширину колеи d, при которой рельсы можно роразбить на пары так, что в каждой паре они параллельны и расстояние между ними равно d.
Входные данные
На вход программы подаются 4 массива целых чисел, элементы которых являющихся координатами двух различных точек --- (x1[i], y1[i]) и (x2[i], y2[i]) --- через которые проходят рельс под номером i. Эти числа заведомо удовлетворяют условиям -1000 < x1[i], y1[i], x2[i], y2[i] < 1000. Число элементов в массивах заведомо одинаковое и не превышает 2000.
Выходные данные
В выходном потоке программа должна вернуть вещественное (double) число --- минимальную возможную ширину колеи. Она должна быть определена с точностью не хуже 1E-6. Если ни при одной ширине колеи разбить рельсы на пары с выполнением требований задачи невозможно, верните число −1.
Примечания
а) никто не гарантирует, что для каждой прямой найдётся параллельная
б) "параллельность" будет достаточной для использования встроенных типов (т.е. без написания собственного класса произвольно-точного floating point)
в) ширины разных колей будут отличаться не меньше, чем на 1E-6
г) прямые, соответствующие различным рельсам, не совпадают.
д) число прямых заведомо чётное
Оформление
Шаблон оформления решения:
Add(MultiElementEx,3557107,525,210)
{
@Hint=#8:задача 6|9:iarspider|12:Старшая Лига
}
BEGIN_SDK
Add(EditMultiEx,25092011,11,07)
{
WorkCount=#4:doRR|
EventCount=#4:onRR|
DataCount=#2:x1|2:y1|2:x2|2:y2|
}
END_SDK
Задача 7: О птицах и свиньях
== О птицах и свиньях ==
Постановка задачи
В одной компьютерной игре цель состоит в том, чтобы, запуская из рогатки разноцветных птиц с разными параметрами полета, убить как можно больше зеленых свиней.
В этой задаче рассматривается птица со следующими параметрами полета: сразу после запуска она летит так, как летело бы тело, брошенное под углом к горизонту (по параболе), однако после нажатия игроком на экран или на кнопку мышки она ускоряется настолько, что дальше летит фактически по прямой. При этом прямая является касательной к параболе в той точке, в которой птица находилась в момент нажатия кнопки.
Представим экран как плоскость с координатной сеткой и началом координат в точке старта птицы. Заданы параметры запуска птицы: α — угол в градусах между вектором начальной скорости птицы и положительным направлением оси OX, скорость птицы в метрах в секунду V, ускорение свободного падения в метрах на секунду в квадрате g, и координаты свиньи X и Y в метрах. Вы должны определить, в какой момент игроку следует ускорить птицу так, чтобы она попала в свинью. Свинья и птица считаются точками, ускорение свободного падения направлено противоположно оси OY. Попаданием птицы в свинью считается ситуация, когда траектория полета птицы пересекает вертикальную прямую, проведенную через точку, в которой находится свинья, в точке, удаленной от свиньи не более чем на 0.0001 метров.
Входные данные
На вход программы подаются следующие целые числа:
- a - угол, под которым брошена птица (0 < a < 90)
- V - ее начальная скорость (1 < V < 100)
- g - ускорение свободного падения (1 < п < 100)
- X, Y - координаты точки, в которой находится свинья (0 < X, Y < 100). Свинья никогда не находится в начале координат.
Выходные данные
В случае, если возможности попасть в свинью нет, верните строку "Impossible".
В случае, если для попадания в свинью не требуется ускорять птицу, верните строку "Ok".
Иначе верните вещественное число t — количество времени в секундах, которое должно пройти с момента старта птицы до ее ускорения.
Если можно попасть в свинью как выполнив ускорение птицы, так и без него, можно вывести любой из этих вариантов.
При проверке ответа попаданием птицы в свинью считается ситуация, когда траектория полета птицы пересекает вертикальную прямую, проведенную через точку, в которой находится свинья, в точке, удаленной от свиньи не более чем на 0.0001 метров.
Оформление
Шаблон оформления решения:
Add(MultiElementEx,3557107,525,210)
{
@Hint=#8:задача 7|9:iarspider|12:Старшая Лига
}
BEGIN_SDK
Add(EditMultiEx,25092011,11,07)
{
WorkCount=#4:doBird|
EventCount=#4:onPig|
DataCount=#1:a|1:V|1:g|1:X|1:Y|
}
END_SDK
Задача 8: Кирпичная стена
== Кирпичная стена ==
Вводная
Возьмём обычные кирпичи, длина каждого из которых равна 2 ед., а ширина - 1 ед., и посторим из них стену высотой 2 ед. Если подойти к процессу творчески, то окажется, что для заданной длины стены существует несколько вариантов укладки кирпичей:
- для стены длины 1 есть только один способ - поставить киприч "на попа"
- для стены длины 2 есть два способа - либо два кирпича, поставленных "на попа", либо два кирпича, положенных друг на друга
- для стены длины 3 - три способа
Сколько способов существует для стены длины 4? А для длины 5?
Постановка задачи
Ваша задача - по заданной длине стены определить, сколько существует способов её постройки
Вход
Входом является натуральное число L - длина стены, причём L < 46
Выход
На выходе ожидается целое число N - число способов постройки стены
Примеры
Вход:
1
1
Вход:
2
2
Вход:
3
3
Оформление
Шаблон оформления решения:
Add(MultiElementEx,3557107,308,182)
{
@Hint=#8:задача 8|9:iarspider|12:Старшая Лига|
}
BEGIN_SDK
Add(EditMultiEx,7593973,21,21)
{
WorkCount=#5:doWall|
EventCount=#5:onWall|
DataCount=#1:L|
}
END_SDK
Задача 9: Тетраэдр
== Тетраэдр ==
Вводная
Вопреки известной поговорке «спички детям не игрушка», один мальчик все еще очень любит играть со спичками. Но он не балуется ими, не разжигает огонь, а решает различные головоломки. Например, он умеет приравнивать число девять к числу одиннадцать, переложив только одну спичку.
Недавно родители этого мальчика подарили ему несколько наборов, каждый из которых состоит из шести спичек. Мальчик начал собирать из них различные трехмерные геометрические фигуры. Он уже собрал много различных фигур, но теперь ему стало интересно: из каких наборов возможно склеить каркас тетраэдра ненулевого объема при помощи шести спичек из набора и клея? Ломать спички нельзя и ни одна из спичек не должна выступать за каркас.
Ваша задача состоит в том, чтобы по известным длинам спичек для каждого набора проверить, можно ли из них склеить каркас тетраэдра.
Вход
Шесть целых чисел, лежащих в диапозоне от 1 до 1000 — длины спичек в наборе.
Выход
Строка «Yes», если из заданного набора можно собрать тетраэдр не нулевого объема, или «No» — в противном случае.
Примеры
Задание | Ответ |
1 1 1 1 1 1 | Yes |
1 2 3 1 2 3 | No |
1 2 1 2 1 2 | Yes |
1 2 2 1 2 2 | Yes |
Оформление
Шаблон оформления решения:
Add(MultiElementEx,3557107,308,182)
{
@Hint=#8:задача 9|9:iarspider|12:Старшая Лига|
}
BEGIN_SDK
Add(EditMultiEx,7593973,21,21)
{
WorkCount=#5:doTetrahedron|
EventCount=#5:onTetrahedron|
DataCount=#1:a|#1:b|#1:c|#1:d|#1:e|#1:f|
}
END_SDK
Таблица результатов
Участник | Результат (#0), с | Результат (#1), мкс | Результат (#2), мкс | Результат (#3), мкс | Результат (#4), мкс | Результат (#5), мкс | Результат (#6), мкс | Результат (#7), мкс | Результат (#8), мкс | Результат (#9), мкс |
Assasin | 2.88 + 1.02 | Сдался | 1697.31 + 1013.27 | 40.40 + 15.11 | 52.97 + 12.29 | 64.63 | -- | -- | 36.13 + 51.59 | |
elm | -- | -- | -- | -- | -- | -- | -- | -- | ||
Ivann | Сдался | -- | -- | -- | -- | 130.05 | -- | -- | ||
nesco | 4.22 + 0.043 | 281.4 + 8.7 | -- | -- | 63.12 + 55.24 | -- | -- | -- | 607.50 + 412.87 | |
petrocan | Сдался | -- | -- | 22.08 + 21.37 | -- | -- | -- | -- | ||
Slim9009 | Самоотвод | -- | -- | -- | -- | -- | -- | -- | ||
miver | 3.18 + 5.66 | 173.85 + 10.78 | 450.2 + 710.0 | 34.46 + 65.87 | 72.73 + 98.12 | 127.00 | -- | 8.011 | 61.57 + 67.95 | |
Леонид | -- | -- | -- | 29.21 + 213.83 | 68.23 + 35.97 | 49.19 | 158503.45 | 60.203 | -- | 1140.956 |
Vlad.- | -- | -- | -- | 19.80 + 10.64 | -- | -- | -- | -- |
Для задачи №0 "время" определяется как среднее время для 20 итераций, в каждой из которых используется случайный набор из 20 элементов. Номер акционера X также выбирается случайно.
Для задачи №1 "время" определяется как среднее время для 20 итераций, в каждой из которых используется случайный элемент последовательности G20. Смещение m также выбирается случайно.
Для задачи №2 "время" определяется как среднее время для 100 итераций, в каждой из которых используется случайный рельеф из 80 символов.
Для задачи №3 "время" определяется на наборе из 1000 случайных заданий (набор одинаков для всех участников)
Для задачи №4 "время" определяется на наборе из 1000 случайных заданий (набор одинаков для всех участников)
Для задачи №5 "время" определяется на наборе из 100 случайных заданий (набор одинаков для всех участников)
Для задачи №6 "время" определяется как среднее время для 20 итераций, в каждой из которых используется фиксированное задание из 1999 пар рельс (задание одинаково для всех участников)
Задача | Дата окончания приёма решений |
0 | ЗАКРЫТА |
1 | ЗАКРЫТА |
2 | ЗАКРЫТА |
3 | ЗАКРЫТА |
4 | ЗАКРЫТА |
5 | ЗАКРЫТА |
6 | ЗАКРЫТА |
7 | ЗАКРЫТА |
8 | ЗАКРЫТА |
9 | ЗАКРЫТА |
Младшая лига HiAsm ConTest