e-olymp 2166: Анаграммы

Ссылка на задачу на e-olymp.

Условие

Слово называется анаграммой другого слова, если оно может быть получено перестановкой его букв.

Входные данные.

Два слова заданы в отдельных строках. Слова состоят из строчных латинских букв и цифр. Длины слов не превышают $255$.

Выходные данные.

Следует вывести «$YES$», если введенные слова являются анаграммами друг друга и «$NO$» если нет.

Тесты

Входные данные Выходные данные
sharm
marsh
YES
ananas
nnaass
NO

Код.

Решение.

Создадим функцию, которая будет проверять являются ли данные, полученные из двух строк, анаграммами. Вначале проверим, совпадает ли количество символов в строках, так как не имеет смысла выполнять дальнейшие действия если строки имеют разную длину.Если длины равны, то букву каждого слова запишем как отдельный символ соответствующего массива. После чего отсортируем массивы. После этого посимвольно сравним получившиеся массивы. Если i-ые символы совпадают, то увеличиваем счетчик на 1. Если значение счетчика, после окончания цикла будет равно длине строки, то слова являются анаграммами.

Ссылка на решение задачи на сайте Try Haxe!

e-olymp 7365. Молоко и пирожок

Ссылка на задачу на e-olymp.

Условие

Ученикам первого класса дополнительно дают стакан молока и пирожок, если вес первоклассника менее $30$ кг. В первых классах школы учится $n$ учеников. Стакан молока имеет емкость $200$ мл, а упаковки молока – $0,9$ л. Определить количество дополнительных пакетов молока и пирожков, необходимых каждый день.

Входные данные.

В первой строке задано целое число $n$ ([latex]1 \leq n \leq 100[/latex]). В следующей строке идут $n$ положительных действительных чисел – массы первоклассников.

Выходные данные.

Два целых числа — количество дополнительных пакетов молока и пирожков, необходимых каждый день.

Тесты

Входные данные Выходные данные
20
30 37 31 25 32 29 35 40 28 25 30 34 26 23 20 22 21 30 38 33
2 9
3
30 29 30
1 1
5
25 41 56 20 20
1 3

Код.

Решение.

Заведем переменные для хранения количества дополнительных пирожков ($p$), стаканов молока ($m$), а также переменную в которой будет храниться вес текущего первоклассника ($w$). Если вес меньше 30, то увеличиваем количество дополнительных пирожков, и добавляем 200 к молоку (объем одного стакана). После того, как вес всех детей был учтен, делим значение хранящееся в переменной $m$ на 900 и округляем в большую сторону, для того, чтобы вычислить необходимое количество пакетов молока.
Ссылка на решение задачи на сайте Try Haxe!

A710

Ссылка на оригинальное задания: тут.

Условие

Дана матрица $A$ размера [latex]n \times m[/latex]. Получить транспонированную матрицу $A^*$ (ее размер [latex]m \times n[/latex]).

Входные данные.

Первая строка содержит параметры $n$ и $m$. В следующих $n$ строках содержится матрица $A$.

Выходные данные.

Матрица $A^*$.

Тесты

n m A A*
3 4 1 2 3 4
2 3 4 5
3 4 5 6
1 2 3
2 3 4
3 4 5
4 5 6
2 3 1 2 3
2 3 4
1 2
2 3
3 4

Код.

Решение.

Считываем матрицу [latex]n \times m[/latex], а затем создаем транспонированную матрицу, в которой строки исходной матрицы являются столбцами и наоборот. Выводим $A^*$.
Ссылка на решение задачи на сайте Try Haxe!

e-olymp 138. Банкомат

Ссылка на условие задания: e-olymp.

Условие

В банкомате имеются в достаточном количестве купюры номиналом $10$, $20$, $50$, $100$, $200$, $500$. Найти минимальное количество купюр, которое необходимо использовать, чтобы выдать сумму в $n$ гривен или вывести $-1$, если указанную сумму выдать нельзя.

Входные данные.

Одно число $n$ ([latex]1 \leq n \leq 1000000[/latex]).

Выходные данные.

Наименьшее количество купюр, которыми можно выдать $n$ гривен.

Тесты

Входные данные Выходные данные
Сумма Количество купюр
130 3
999 -1
7360 18
440 4
3 -1

Код.

Решение.

Для выполнения задания была написана функция, параметром для которой служит сумма, которую должен выдать автомат.
Сама функция является реализацией жадного алгоритма.Он заключается в том, чтобы взять купюру наибольшего достоинства, и найти, сколько раз она входит в данную сумму. То, что мы можем выдать только с помощью этой купюры, отнять от исходной суммы. Затем повторить операцию для оставшегося количества денег и самой большой из купюр меньшего достоинства. Перебрав таким образом все купюры, мы получим наименьшее их количество для получения данной суммы, что от нас, собственно, и требуется.

Такой алгоритм подходит не для всех валютных систем, а только для канонических — таких, в которых каждая купюра большего достоинства превышает меньшую более чем в два раза. В нашем случае это условие соблюдается.

Следует учесть, что сумма может быть и такой, что банкомат не сможет ее выдать. Это будет происходить тогда, когда сумма содержит некоторую часть, меньшую самой меньшей купюры. Для проверки этого условия, до начала выполнения жадного алгоритма, выполняется проверка. Если указанная сумма делится на 10 без остатка, то функция начинает выполнение алгоритма, если же нет, то возвращает $-1$.

Ссылка на решение задачи на сайте Try Haxe!

e-olymp 111. Часы

Ссылка на условие задания: e-olymp.

Условие

Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.

Входные данные.

Начальное и конечное время одних календарных суток в часах ($H$) и минутах ($M$) через пробел ([latex]0 \leq H \leq 23, 0 \leq M \leq 59[/latex]).

Выходные данные.

Ответ на задачу.

Тесты

Входные данные Выходные данные
Начальное и конечное время Количество ударов
13 30 15 10 7
0 00 23 59 180
12 30 12 30 1
22 22 22 25 0

Код.

Решение.

Заведем переменную, которая будет отвечать за количество пробитых ударов res. Если на часах 59 минут, то увеличиваем количество часов h1, и обнуляем значение минутной стрелки m1, для следующего круга. Если значение минутной стрелки равно 30 то увеличиваем переменную res на один. Если же минутная стрелка на 12, то есть 0 минут, то к res добавляем остаток от деления текущего количества часов на 12. Увеличиваем значение переменной m1 на 1. Повторяем, пока начальное время не будет совпадать с конечным.
Ссылка на решение задачи на сайте Try Haxe!

Альтернативное решение.

Также существует способ решения этой задачи без использования циклов. Для этого я использовала функцию FactTree, которая реализует арифметическую прогрессию. Эта функция считает сколько ударов совершили часы от 0 часов, до указанного в качестве параметра времени. Объясним принцип работы функции ProdTree.Пусть нам нужно найти сумму последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) + P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что слагаемые будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух слагаемых. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L + R, если L и R отличаются на единицу.

Ссылка на решение задачи на сайте Try Haxe!

e-olymp 126. Номер квартиры

Ссылка на условие задания: e-olymp.com

Условие

Многоквартирный дом имеет $N$ квартир, $P$ подъездов и $Q$ этажей, причем на каждом этаже каждого подъезда имеется одинаковое количество квартир. Определить в каком подъезде и на каком этаже находится квартира с заданным номером.

Входные данные.

Значения $N$, $P$, $Q$, $K$, причем [latex]1 \leq K \leq N \leq 1000[/latex], [latex]P \cdot Q \leq N[/latex].

Выходные данные.

Нужно вывести номер подъезда и этаж, на котором находится квартира с номером $K$.

Тесты

Входные данные Выходные данные
250 5 5 1 1 1
30 2 5 27 2 4
300 3 10 111 2 2
80 5 4 77 5 4

Код.

Try Haxe!

ML 35. Бильярдные шары

Ссылка на условие задания: cpp.mazurok.com

Условие

Для аккуратной расстановки шаров в «пирамидку» игроки в бильярд используют специальный равносторонний треугольник. Вычислите какое наибольшее количество шаров радиуса $r$ можно расставить на бильярдном столе при помощи треугольника со стороной $a$.

Изображение

Входные данные.

Длина стороны $a$, и радиус шаров $r$.

Выходные данные.

Число $n$, количество шаров.

Код.

Решение.

Для решения данной задачи нужно понимать что каждый шар занимает пространство вокруг себя которое равняется площади описанного вокруг данного шара треугольника. Чтобы посчитать количество шаров вмещаемых в треугольник надо воспользоваться формулой площади равностороннего треугольника через сторону для большого треугольника [latex]S = \frac{a^2\sqrt{3}}{4}[/latex] , и соответственно формулой площади треугольника в который вписан круг основываясь на радиус [latex]S1 = 3\sqrt{3}x^2[/latex] В результате деления данных формул получим количество шаров радиуса $r$ которые поместятся в Треугольника со стороной $a$.

Ссылка на решение задачи на сайте Try Haxe!

2.5. Анонимные структуры

Ссылка на источник.
Анонимные структуры — используются для объединения данных без явного создания типа. В примере, написанном ниже, создается структура с двумя полями x и name, которые получают значения «12» и «foo» соответственно:

Общие правила синтаксиса:

  1. Структура заключается в фигурные скобки {};
  2. Пары ключ-значение разделяются запятой;
  3. Между ключом и значением ставится двоеточие;
  4. Значением может быть любое выражение на языке Haxe.

Четвертое правило говорит о том, что структуры могут быть вложенными и сложными, например:

Поля структур могут быть получены, как и классы, используя точку (.), как в примере ниже:

Также для вывода всех полей анонимной структуры, может быть использовано Reflection:

Вот что будет выведено:
name => Butterfly version => 0.3

Стоит отметить, что использование анонимных структур не подрывает, существующую в Haxe, систему типизации. Компилятор гарантирует, что доступны только существующие поля. Это означает что следующая программа не будет скомпилирована.

Полученная ошибка свидетельствует о том, что компилятор знает как был объявлен тип point : это структура с полями x и y типа Float. Поскольку поля z не существует, то доступ будет запрещен. Тип point известен благодаря определению типов. Именно ему мы должны сказать спасибо за то, что у нас нет необходимости каждый раз явно определять типы. Однако, если   point является полем, то явное определение типов обязательно:

Что бы избежать лишнего декларирования типов, особенно для более сложных структур, советуют использовать typedef: