


Любой язык легкая задача
Фермеру подарили трех кроликов интересной породы. Они должны жить все вместе в одном загоне, но у каждого должен быть при этом свой угол. У фермера есть 20 заборных секций по 1 метру каждая. Фермер хочет использовать их все, не резать и не изгибать. Таким образом должен получиться треугольный вольер с периметром 20 метров, каждая сторона которого составляет целое число метров.
Чтобы выбрать подходящий вольер, фермер хочет иметь список всех возможных различных таких треугольников с целыми сторонами и с суммой сторон равной 20.
Треугольник задаётся длинами своих сторон в порядке их обхода по часовой стрелке, начиная с любой стороны (из курса геометрии известно, что треугольники равны, если равны длины соответствующих сторон). То есть, например, тройки чисел
4 6 9
и
6 9 4
задают один и тот же треугольник, а тройки
4 6 9
и
6 4 9
задают разные треугольники, потому что их невозможно так совместить друг с другом, чтобы соответствующие стороны были равны.
В ответе необходимо вывести в отдельных строках тройки чисел - длины сторон треугольников (в метрах), удовлетворяющих условию. Стороны каждого треугольника выводятся в любом порядке. Сами треугольники также перечисляются в произвольном порядке. Все треугольники должны быть попарно различными (то есть не должно быть повторяющихся треугольников).
Например, ниже приведено описание некоторых трёх треугольников в описанном формате (не относящихся к условию задачи):
5 3 3
9 10 2
2 3 4
В зависимости от количества различных вариантов треугольников решения могут получить от 0 до 100 баллов. Если в решении присутствует тройка чисел, не являющаяся длинами последовательных сторон треугольника, решение оценивается в 0 баллов. Если в ответе присутствует треугольник, не отвечающий условию задачи, оно оценивается в 0 баллов. Если в решении какой-либо треугольник перечислен хотя бы дважды, балл за решение будет снижен.
for (int i = 1; i <= 20 / 3; ++i) {
for (int j = i; 2 * j <= 20 - i; ++j) {
cout << i << ' ' << j << ' ' << 20 - i - j << '\n';
}
}
Идея та же, что и в соседнем ответе, но проверка на существование треугольника не требуется: все перебираемые варианты уже являются заведомо существующими треугольниками.
for i in range(1, 20 // 3 + 1):
for j in range(i, (20 - i) // 2 + 1): print(i, j, 20 - i - j)
import Data.List
-- Функция для проверки, является ли тройка чисел сторонами треугольника
isTriangle :: Integral a => a -> a -> a -> Bool
isTriangle a b c = a + b > c && a + c > b && b + c > a
-- Функция для генерации всех возможных треугольников с суммой сторон равной total
generateTriangles :: Integral a => a -> [[a]]
generateTriangles total = nub [sort [a, b, total - a - b] | a <- [1..total `div` 3], b <- [a..(total - a) `div` 2], isTriangle a b (total - a - b)]
main :: IO ()
main = do
let triangles = generateTriangles 20
mapM_ print triangles