ML28. Объём тетраэдра

Cсылка на первоначальное решение тут

Задача

Найти объём тетраэдра три стороны которого образованы векторами
$\vec {a} = \left( x_a, y_a, z_a \right)$
$\vec {b} = \left( x_b, y_b, z_x \right)$
$\vec {c} = \left( x_c, y_c, z_c \right).$

Пояснительный рисунок

Пояснительный рисунок к ML28

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

Координаты векторов $\vec {a}$,$\vec {b}$, $\vec {c}$
Выходные данные
Объём тетраэдра

Входные данные Выходные данные
$x_a$ $y_a$ $z_a$ $x_b$ $y_b$ $z_b$ $x_c$ $y_c$ $z_c$ V
0 0 1 0 1 0 1 0 0 0.166667
3 6 3 1 3 -2 2 2 2 3
0 0 0 1 3 -2 2 2 2 0

Код программы

Решение задачи
Так как тетраэдр построен на векторах $\vec {a} = \left( x_a, y_a, z_a \right)$ $\vec {b} = \left( x_b, y_b, z_x \right)$ $\vec {c} = \left( x_c, y_c, z_c \right)$ для данной задачи оптимальным решением будет использовать следующие формулы:
$V=|Δ|/6$ где $V$ обьем тетраэдра а $Δ$ определитель матрицы.

Δ = \begin{vmatrix} x_a & y_a & z_a \\ -x_b & y_b & z_b \\ x_c & y_c & z_c
\end{vmatrix}
= $x_a \left(y_b z_c-z_b y_c \right)-x_b \left( y_a z_c-z_a y_c \right)+x_c \left( y_a z_b-z_a y_b \right)$

      Итоги:
  • если значение определителя матрицы равно нулю, то либо некоторые из заданных векторов коллинеарны, либо нулевые, либо все они лежат в одной плоскости. Во всех этих случаях тетраэдр не может существовать, и программа выведет 0;
  • если значение определителя не равно нулю, то программа вычислит объём тетраэдра. В случае, если определитель примет отрицательное значение, программа домножит значение объёма на −1, в результате чего оно станет положительным.

Решение на Try Haxe!

ML25. Расстояние между двумя точками

Задача

Вычислить расстояние между двумя точками [latex]A(x_a,y_a,z_a)[/latex] и [latex] B(x_b,y_b,z_b)[/latex] по известным координатам.

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

Координаты: [latex]x_a,y_a,z_a,x_b,y_b,z_b.[/latex]

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

[latex]|AB|[/latex]— расстояние между точками [latex]A[/latex] и [latex]B[/latex]

Тесты

[latex]x_a[/latex] [latex]y_a[/latex] [latex]z_a[/latex] [latex]x_b[/latex] [latex]y_b[/latex] [latex]z_b[/latex] [latex]|AB|[/latex]
0 1 0 1 0 1 1.73205
0 0 0 0 0 0 0
6 6 4 4 2 8 6

Код программы

Решение задачи

Вычисляем [latex]|AB|[/latex] между точками [latex]A(x_a,y_a,z_a)[/latex] и [latex] B(x_b,y_b,z_b)[/latex] по такой формуле : [latex]|AB|[/latex]=[latex]\sqrt{(x_b-x_a)^2+(y_b-y_a)^2+(z_b-z_a)^2}[/latex] и получаем результаты.

ссылка на try.haxe.org

e-olymp 57. Butterfly-orderly

Задача взята с сайта e-olymp.com.

Условие

Школьники, идя из дому в школу или наоборот – со школы домой, любят кушать конфеты. Но, как всегда, это приятное дело иногда имеет неприятные последствия – детки часто выбрасывают обертки на школьном дворе.

Мурзик всегда следил за чистотой школьного двора и ему в этом с радостью помогали бабочки, благодарные за прекрасные фотографии, сделанные им. Бабочки могли использовать собственные крылышки как линзы, причем они могли изменять их фокусное расстояние. Заметив обертку от конфетки, лежавшую на школьном дворе в точке с координатами X_1, Y_1, бабочка перелетала в точку с координатами X_2, Y_2, Z_2, расположенную на пути солнечных лучей к обертке и, изменяя фокусное расстояние своих крылышек-линз, сжигали обертку от конфеты.

Какую оптическую силу D имели крылышки-линзы бабочки в этот момент?

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

В первой строке 2 числа: координаты X_1, Y_1, обертки от конфетки. Во второй – 3 числа: координаты X_2, Y_2, Z_2 бабочки в момент сжигания обертки.

Все входные данные — целые числа, не превышающие по модулю 1000.

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

Единственное число – оптическая сила крылышек-линз D, вычисленная с точностью до 3-х знаков после запятой по правилам математических округлений.

Тесты:

X_1 Y_1 X_2 Y_2 Z_2 D
10 20 10 20 100 0.010
10 30 10 30 50 0.020
10 30 20 40 110 0.009

Код на Haxe:

Ход решения:

Вычисляем оптическую силу линзы D по формуле D = \frac{1}{f}, где f – расстояние между бабочкой и обёрткой. вычисляем его по формуле: f = \sqrt{(X_2-X_1)^2+(Y_2-Y_1)^2+Z_2^2}. Вычисление в одну строку:

Далее выводим на экран:

Примечание: Входные данные для тестирования были заданы программно из-за определенных затруднений при использовании стандартного ввода.

Ссылки:

Рабочий код для тестирования на try.haxe.org: Try Haxe !

e-olymp 935. Разложение трицифрового числа

Задача

Разложить заданное трицифровое число на цифры.

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

В единственной строке задано целое трицифровое число.

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

Вывести каждую цифру в новой строке. Порядок вывода приведён в примере.

Код:

  1. Для получения первой цифры числа, делим входное число на 100, результат преобразуем из  Float  в Int  с  помощью  Std.int(x: Float): Int
  2. Для получения второй цифры делим входное число на 10, преобразуем из  Float  в Int (см. пункт 1), находим от полученного двузначного целого числа остаток от деления на 10 с помощью оператора % , что и будет второй цифрой числа.
  3. 3-й цифрой будет остаток от деления всего входного числа на 10 (см. пункт 2).

Ссылка на решение задачи.

Cсылка на условие задачи.

ML30. Объём параллелепипеда

Задача взята отсюда
Условие
Найти объём параллелепипеда три стороны которого образованы векторами:
$$\overrightarrow{a}=(a_x,a_y,a_z), \overrightarrow{b}=(b_x,b_y,b_z), \overrightarrow{c}=(c_x,c_y,c_z).$$
Входные данные: Координаты векторов $\overrightarrow{a}, \overrightarrow{b}, \overrightarrow{c}.$
Выходные данные: Объём параллелепипеда.

Тесты

Входные данные Выходные данные
0 0 1 0 1 0 1 0 0 1
0 0 0 1 0 0 0 0 1 0
1 0 0 0 0 1 0 0 1 0
2 5 3 4 1 0 -2 7 6 18
3 5 1 0 -7 2 6 -4 5 21

Код программы

Решение

Для решения данной задачи можно составить матрицу и вывести из неё формулу для нахождения определителя:
$$\triangle = \begin{vmatrix}a_{x} & a_{y} & a_{z}\\b_{x} & b_{y} & b_{z}\\c_{x} & c_{y} & c_{z}\end{vmatrix} = $$ $$= a_{x} \times ((b_{y} \times c_{z}) + (c_{y} \times b_{z}))-a_{y} \times ((b_{x} \times c_{z})+ $$ $$+(c_{x} \times b_{z})) + a_{z} \times ((b_{x} \times c_{y})+(c_{x} \times b_{y}).$$
Модуль определителя матрицы равен объёму параллелепипеда.
Ссылка на запуск программы.

ML 22. Площадь равнобедренной трапеции

Условие

Задача взята тут

Найти площадь равнобедренной трапеции с основаниями $a$ и $b$ и углом $\alpha$ при большем основании $a$.

Тесты

a   b $\alpha$   Square
15 10 0,785398 31.25
20 5 1.0472 162.38
30 20 0.523599 72.1687

Решение

Для нахождения площади трапеции используется формула: $hm$, где $m$ средняя линия, $h$ высота. $h$ находится как $\tan \alpha \cdot \frac {(a-b)}{2}$ , $m$ находится как $\frac{(a-b)}{2}$.

Код

Решение на 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!

ML6. Поиск гипотенузы и площади по катетам

Условие
Даны два катета прямоугольного треугольника. Найти гипотенузу и площадь данного треугольника.

Входные данные
Два числа — соответственно $a$ и $b$ катеты прямоугольного треугольника.

Выходные данные
Два числа — гипотенуза и площадь треугольника с двумя знаками после запятой.

Тесты

Входные данные Выходные данные
3 4 Hypotenuse: 5
Square: 6
9.04 4.2 Hypotenuse: 9.97
Square: 18.98
8.46 16.89 Hypotenuse: 18.89
Square: 71.44

Решение
Для поиска гипотенузы используем теорему Пифагора: $c^{2}=a^{2}+b^{2}$ → $c=\sqrt{a^{2}+b^{2}}$
Для поиска площади воспользуемся формулой: $S=\frac{a*b}{2}$

Решение на Try Haxe !