Задача: Учитывая площадь треугольника, найдите героновский треугольник с этой областью. Разрешен любой героновский треугольник с указанной площадью.
Героновский треугольник - это треугольник с целочисленными сторонами и целочисленной областью . По формуле Герона треугольник с длинами сторон a,b,c
имеет площадь
sqrt(s*(s-a)*(s-b)*(s-c))
где s=(a+b+c)/2
половина периметра треугольника. Это также можно записать как
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Если такого треугольника не существует, выведите с постоянным значением Фэлси.
Входные данные: единственное положительное целое число, представляющее площадь треугольника.
Вывод: любые три длины сторон для такого треугольника ИЛИ ложное значение.
Примеры:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Применяются стандартные лазейки
Это код гольф, самый короткий ответ в байтах выигрывает.
Ответы:
Желе ,
1716 байт-1 байт благодаря Эрику-аутголферу (воспользуйтесь быстрым,
¥
)Применение грубой силы формулы Герона.
Попробуйте онлайн! (истекает тайм-аут 60-х для 114 тестовых случаев. Локально занимает 3 м 30 с - проверяет 114 3 = 1 481 544 тройки)
Как?
Истинное решение для гольфа - с учетом области
a
он находит все кортежи из трех целых чисел между1
иa
(даже с повторяющимися треугольниками и без области), получает их площадь и фильтрует для тех с нужной областью (он даже не останавливается, как только один найден, он пропускает их все и выдает первый результат потом). Дает,0
если ничего не существует.источник
ç
сÇ⁼¥
и удалите вторую строку целиком.JavaScript (ES7),
10910210098 байтВозвращает либо массив из 3 целых чисел, либо
false
. Как и ответ Jelly , это грубое форсирование формулы Герона.Контрольные примеры
Показать фрагмент кода
Рекурсивная версия, 83 байта
Возвращает массив из 3 целых чисел или выдает ошибку рекурсии. К сожалению, это работает только для небольших входов.
демонстрация
Показать фрагмент кода
источник
Haskell , 69 байт
Попробуйте онлайн!
Выводит один список из трех сторон треугольника, например
[[3.0,4.0,5.0]]
. Невозможные входы дают[]
. Технически это толькоFalse
Falsey для Haskell, но поскольку Haskell требует, чтобы все возможные выходы были одного типа, его нельзя использовать. Если ошибка может быть использована как Falsey,[...]!!0
сэкономит 3 байтаtake 1[..]
.Пытается все тройки
t
возможных длин сторон, начиная от1
областиa
. Формула Герона используется, чтобы проверить, соответствует ли область через,(s-0)(s-x)(s-y)(s-z)==a*a
гдеs=(x+y+z)/2
естьsum t/2
. Продукт(s-0)(s-x)(s-y)(s-z)
выражается в видеproduct
элементов, взятых из0:t
, то есть тройной, а также 0.источник
F #,
170156152 байтаПопробуйте онлайн!
"Ungolfed"
Если результаты не найдены, программа выдаст ошибку. Если это нежелательно, я должен заменить
List.find
либоList.filter
(+2 байта), что приведет к созданию пустого списка в случае, если ничего не найдено, либоList.tryFind
(+3 байта), возвращая None, если треугольник не был найден.Я всегда нахожу, что версия F # в гольфе все еще разумно читаема.
источник
System.Math.Sqrt
и сравнить полученное значение сA * A
?1.0..A [...] 1.0..A [...] 1.0..A
на это1.0..A [...] a..A [..] b..A
позволит вам сэкономить пару байтов и немного ускорить работу (если это работает; у меня минимальный опыт работы с F #).Python 2 (PyPy) ,
131123118 байтПопробуйте онлайн!
Хотя это также работает на CPython, PyPy работает намного быстрее и способен вычислять треугольник для 114 за ограничение времени на TIO.
Сроки от моей машины:
источник
Pyth - 23 байта
Который печатает истинное / ложное значение, или
который печатает все возможные решения, и ужасно медленно для больших входов. Поставьте 'h' в начале, чтобы напечатать только один.
Объяснение:
Попытайся
источник
Perl 6 , 54 байта
Перебор всех возможных сторон на одну единицу меньше, чем
a
область ввода.^a
это диапазон чисел от 0 доa - 1
.[X] ^a xx 3
сокращает по кросс-продукту три копии этого диапазона, производя все тройки от(0, 0, 0)
до(a - 1, a - 1, a - 1)
.first
триплет так, чтобы площадь треугольника с этими сторонами была равнаa
, используя формулу Герона .Внутри блока кода, данного
first
:$_
это триплет Позвони(x, y, z)
здесь.(0,|$_)
одно и то же триплет , но с0
префиксом:(0, x, y, z)
..sum / 2
составляет половину периметра (количество, которое названоs
в обычном выражении формулы Герона)..sum / 2 «-« (0, |$_)
является гипераоператором вычитания сs
левой и(0, x, y, z)
правой стороны(s - 0, s - x, s - y, s - z)
.[*]
затем уменьшает эту четверку с умножением, давая квадрат площади.a * a ==
ищет площадь в квадрате, равную квадрату данной области.Если триплет не найден,
Nil
(который является ложным) возвращается.источник
Haskell , 76 байт
Это выводит список списков, содержащих все возможные интегральные размеры, которые генерируют правильную область с помощью грубой силы (выводит пустой список, если таковых нет). Предостережение состоит в том, что он выводит их как двойные из-за этого деления в середине, но их дробная часть всегда равна 0.
Если вы по какой-то причине не можете принять это,
Это выведет ответы в виде списка целочисленных списков для
89 всего77 байт или131 дополнительных байтов. (Спасибо Нейлу)Если вам нужно / нужно, чтобы только первый элемент, помещенный
!!0
в конец, даст вам только первый элемент, если есть числа, которые применяются, и ошибку, если ее нет для еще 3 байтов, иtake 1
в начале примет первый элемент без ошибок для Еще 6 байтов.Попробуйте онлайн!
источник
TI-Basic,
7069 байтОтображает три длины стороны, если есть треугольник, выдает синтаксическую ошибку, если ее нет (спасибо
/
в конце).-1 байт благодаря комментарию Шона к другому ответу
источник
Mathematica, 77 байтов
с Решением математики
Mathematica, 117 байт
грубая сила
источник
Area@SSSTriangle[a,b,c]
.На самом деле , 22 байта
Попробуйте онлайн!
Объяснение:
источник
Casio Basic, 123 байта
Стандартное решение для перебора. 122 байта для кода, 1 байт для указания
n
в качестве параметра.источник
Wolfram Language (Mathematica) , 59 байт
Попробуйте онлайн!
источник