Мой треугольник прав?

47

Учитывая a, b, cдлину трех сторон треугольника, скажем, является ли треугольник прямоугольным (то есть имеет один угол, равный 90 градусам) или нет.

вход

Три положительных целых значения в любом порядке

Выход

Либо конкретный истинный выход ( true, 1, yes...) или выход конкретной лжи ( false, 0, no...)

пример

5, 3, 4        --> yes
3, 5, 4        --> yes
12, 37, 35     --> yes
21, 38, 50     --> no
210, 308, 250  --> no

правила

  • Ввод и вывод может быть дан в любом удобном формате .
  • В своем представлении, пожалуйста, укажите истинные и ложные значения.
  • Нет необходимости обрабатывать отрицательные значения или неверные тройные ребра
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
mdahmoune
источник
1
Должны ли мы обрабатывать отрицательные значения или неверную тройную границу?
user202729
2
Очень связано . Я оставлю это до остальной части сообщества, чтобы решить, является ли это дуплом.
Цифровая травма
2
Я думаю, что использование координат вместо длин существенно меняет задачу
Луис Мендо,
8
Там нет треугольника с длинами 21, 38, 5, потому что 21 + 5 <38 . Это преднамеренный патологический случай, который мы должны обработать?
Кевин
1
@ Кевин нет, ты не должен заниматься этим делом. Пользователь 202729 уже задал этот вопрос :)
mdahmoune

Ответы:

37

Желе , 5 байт

²µSHe

Попробуйте онлайн!

Техническое примечание: байты учитываются в кодовой странице Jelly.

Объяснение:

²µSHe  Main link.
²      Square each number.
 µ     With the new list,
  S    calculate its sum,
   H   and halve it.
    e  Check if the result exists in the new list (squared input)

Задача эквивалентна заданию трех чисел a, b, cи выяснению, существует ли такая перестановка a² + b² = c². Это эквивалентно тому, (a² + b² + c²) ÷ 2является ли оно одним из a², b² or c², поэтому программа просто проверяет это.

user202729
источник
хорошо ... я желе.
Феликс Ганьон-Гренье,
1
Просто техническое примечание: символы ²и µстоимость двух байтов каждый в UTF-8, так что ваш код на самом деле имеет 7 байтов, а не 5
Чарли
2
@Charlie Ответ отредактирован для уточнения.
user202729
20

Python 2 , 37 байт

a,b,c=sorted(input())
1/(a*a+b*b-c*c)

Попробуйте онлайн!

-2 благодаря FlipTack .
-1 спасибо Крейгу Гидни .

Выходы через код выхода ( 0= ложь, 1= истина).

Эрик Outgolfer
источник
Ба. Придумали точно такой же ответ. Вы можете изменить набор тестов, чтобы разрешить любое количество тестов: см. Здесь
mbomb007
@ mbomb007 хммм exec(code), почему exec (code)вместо exec code? : D ;-p
Эрик Outgolfer
Ха-ха, как в этом ответе удвоилось количество голосов у Ксора? Может быть, людям просто нравится сладкая простота этого
FlipTack
1
@FlipTack ¯_ (ツ) _ / ¯ (также xnor's нет в Python 2)
Эрик Outgolfer
@EriktheOutgolfer Потому что шаблон не та часть, которая должна быть в гольф. Я сделал так, чтобы он работал в Python 2 или 3.
mbomb007
17

Java 8, 44 байта

(a,b,c)->(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Объяснение:

Попробуй это здесь.

(a,b,c)->                // Method with three integer parameters and boolean return-type
  (a*=a)+(b*=b)==(c*=c)  //  Return if `a*a + b*b == c*c`
  |a+c==b                //  or `a*a + c*c == b*b`
  |b+c==a                //  or `b*b + c*c == a*a`
                         // End of method (implicit / single-line return-statement)
Кевин Круйссен
источник
Работает ли без скобок на (c*=c)? *=Может иметь precidence над ==и вы можете сохранить два байта.
CorsiKa
@corsiKa Боюсь, что все наоборот. ==имеет приоритет над *=. =, +=, *=, И подобные задания на самом деле имеют самый низкий приоритет в Java операторов .
Кевин Круйссен,
Не могу найти ничего короче ... Я пытался поменять местами переменные, чтобы им присвоили максимальное значение a(например), но безуспешно. Ну, я мог бы сделать это, но около 65 символов ...
Оливье Грегуар
12

JavaScript (ES6), 43 41 40 байт

Сохранено 1 байт и исправлена ​​ошибка благодаря @Neil

Принимает ввод как массив из 3 целых чисел. Возвращает trueдля прямоугольных и falseдругих.

a=>a.some(n=>Math.hypot(...a,...a)==n*2)


Оригинальная версия, 44 байта

Вводит как 3 целых числа. Возвращает 1для прямоугольных и 0других.

(a,b,c)=>(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Контрольные примеры

Arnauld
источник
Похоже , мы пришли с точно такой же ответ (за исключением той, =>и ->разница между JavaScript и Java 8). ;) Так что очевидно +1 от меня.
Кевин Круйссен,
>>1небезопасно, это возвращает истину для [1, 1, 1].
Нил
2
Как насчет Math.hypot(...a,...a)==n*2?
Нил
@Neil Очень хорошее исправление :)
Арно
2
@Neil Должен быть ~=оператор для «грубого равенства»;)
JollyJoker
7

Треугольный , 57 байтов

Я еще не видел ни одного на этом языке, и было бы уместно попробовать сделать это. Это заняло немного ... поскольку я должен был сначала обдумать это, и я полагаю, что это могло бы быть гольфом еще немного.

,$\:$:*/%*$"`=P:pp.0"*>/>-`:S!>/U+<U"g+..>p`S:U/U"p`!g<>/

Попробуйте онлайн!

Это расширяется до следующего треугольника.

          ,
         $ \
        : $ :
       * / % *
      $ " ` = P
     : p p . 0 "
    * > / > - ` :
   S ! > / U + < U
  " g + . . > p ` S
 : U / U " p ` ! g <
> /

Путь довольно запутанный, но я постараюсь объяснить, что я сделал. Я пропущу указатели направления. Большая часть кода - манипулирование стеком.

  • $:* Квадрат первого входа.
  • $:* Квадрат второй вход.
  • S":Ug! Проверьте, больше ли второе значение, чем первое.
    • Верно p" своп с первым.
    • false p Ничего не делай.
  • $:* Квадрат третий вход.
  • P":USg! Проверьте, не превышает ли третье значение наибольшее из предыдущих.
    • истинная p+U- сумма текущего стека и удаление сохраненного третьего значения
    • ложная p"U+- сумма наименьшего и хранится третье и вычитать из наибольшего
  • 0=% проверить равенство нулю и выходной результат.
MickyT
источник
6

Haskell ( 33 32 31 байт)

(\x->(sum x)/2`elem`x).map(^2)

Оригинальная версия:

(\x->2*maximum x==sum x).map(^2)

Анонимная функция. Принимает список в виде [a, b, c]. Выходы True или False.

Первая версия проверила, была ли сумма квадратов в два раза больше квадрата максимума.

Во-вторых, немного лучшая версия проверяет, является ли половина суммы квадратов элементом списка квадратов.

Редактировать: случайно пересчитал перевод строки, спасибо H.PWiz

butterdogs
источник
1
Добро пожаловать на сайт! Этот ответ составляет всего 32 байта, может быть, вы посчитали дополнительный перевод строки?
H.PWiz
3
Вы можете использовать функцию Monad, чтобы сохранить еще несколько байтов здесь
H.PWiz
Кроме того, круглые скобки sumмогут быть выброшены. отличное решение!
гордый haskeller
6

Perl 6 , 24 байта

{(*²+*²==*²)(|.sort)}

Попробуйте онлайн!

*²+*²==*²является анонимной функцией, которая возвращает true, если сумма квадратов первых двух аргументов равна квадрату третьего аргумента. Мы передаем отсортированный входной список этой функции, уплощая его в список аргументов с помощью |.

Шон
источник
6

R , 31 26 30 байт

cat(sum(a<-scan()^2)/max(a)==2)

Мне этот не очень нравится, но он короче. Суммирует квадраты и делит на самый большой квадрат. Правда если 2.

Предыдущая версия (модифицированная с помощью cat и с подсказкой @ Guiseppe)

cat(!sort(scan())^2%*%c(1,1,-1))

Сделайте сумму отсортированного ввода с последним отрицательным элементом и верните !not.

Попробуйте онлайн!

MickyT
источник
Для вашей предыдущей версии !sort(scan())^2%*%c(1,1,-1)это 27 байт. но я думаю тебе все еще нужна cat.
Джузеппе
Ура @Guiseppe, забыл про кота. Правила вокруг REPL меня раздражают, но они такие, какие есть.
MickyT
@Giuseppe Также приятный поворот с умножением матрицы. Я бы никогда не придумал это.
MickyT
6

Brain-Flak , 68 байт

({({({})({}[()])}{}<>)<>})<>({<(({}){}<>[({})])>(){[()](<{}>)}{}<>})

Попробуйте онлайн!

Использует наблюдение в ответе пользователя 202729.

 {                      }      for each input number
   {({})({}[()])}{}            compute the square
  (                <>)<>       push onto second stack
(                        )     push sum of squares onto first stack
                          <>   move to second stack

 {                                    }    for each square
   (({}){}<>[({})])                        compute 2 * this square - sum of squares
  <                >(){[()](<{}>)}{}<>     evaluate loop iteration as 1 iff equal
(                                      )   push 1 if any squares matched, 0 otherwise
Nitrodon
источник
5

C (gcc) , 49 байтов

n(a,b,c){return(a*=a)+(b*=b)-(c*=c)&a+c-b&b+c-a;}

Попробуйте онлайн!

Улучшает технику Кевина Круйссенса

Возвращает 0 для правильного треугольника и ненулевое значение в противном случае

Попеко
источник
3
Добро пожаловать в PPCG!
Caird Coneheringaahing
Всегда ли это работает, если вы используете побитовые операции?
14 м2
4

MATL , 7 байт

SU&0)s=

Попробуйте онлайн!

объяснение

Рассмотрим ввод [12, 37, 35].

S     % Implicit input. Sort
      % [12, 35, 37]
U     % Square each entry
      % [144, 1225, 1369]
&0)   % Push last entry and remaining entries
      % STACK: 1369, [144, 1225]
s     % Sum of array
      % STACK: 1369, 1369
=     % Isequal? Implicit display
      % STACK: 1
Луис Мендо
источник
4

Python 2 , 43 байта

lambda a,b,c:(a*a+b*b+c*c)/2in(a*a,b*b,c*c)

Попробуйте онлайн!

Python 2 , 79 70 68 62 байта

lambda*l:any(A*A+B*B==C*C for A,B,C in zip(l,l[1:]+l,l[2:]+l))

Попробуйте онлайн!

TFeld
источник
Задача была обновлена, чтобы ограничить входные данные целыми числами.
Мартин Эндер
14
A*Aкороче ...
Сократов Феникс
68 байтов tio.run/…
mdahmoune
@mdahmoune 67 байт ; переворачивая значения истинности значения и используя -вместо ==.
Джонатан Фрех
4

C  68  54 байта

Используя решение user202729 .

f(a,b,c){return!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}

Спасибо @Christoph за игру в гольф 14 байтов!

Попробуйте онлайн!

C 85 байт

#define C(a,b,c)if(a*a+b*b==c*c)return 1;
f(a,b,c){C(a,b,c)C(b,c,a)C(c,a,b)return 0;}

Попробуйте онлайн!

Steadybox
источник
Выходы 1по параметрам 1, 1, 1которых неверны ...
Нил
@Neil Сейчас все исправлено.
Steadybox
Вопрос был обновлен для использования целых чисел, может сэкономить несколько байтов.
CorsiKa
f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Кристоф
4

Japt , 8 байт

Принимает ввод в виде массива.

m²
ø½*Ux

Попробуй

мохнатый
источник
1
Мне нравятся квадратные символы в вашем решении;)
mdahmoune
4

J, 10 байт

-6 байт благодаря FrownyFrog

=`+/@\:~*:

оригинальный ответ

(+/@}:={:)@/:~*:

/:отсортировать квадраты *:, а затем проверить, +/@}:равна ли сумма первых двух последним{:

Попробуйте онлайн!

Ион
источник
это чертовски умно
Иона
4

Треугольность ,  49  31 байт

...)...
..IEO..
.M)2s^.
}Re+=..

Попробуйте онлайн!

объяснение

У каждой программы треугольности должно быть треугольное заполнение (извините за каламбур). То есть i- я строка, считая от нижней части программы, должна быть дополнена i - 1 точками ( .) с каждой стороны. Чтобы точки-треугольники оставались симметричными и эстетически приятными, каждая строка должна состоять из 2L - 1 символов, где L - количество строк в программе. Удаление символов, которые составляют необходимый отступ, вот как работает код:

)IEOM)2s^}Re+=     Full program. Input: STDIN, Output: STDOUT, either 1 or 0.
)                  Pushes a zero onto the stack.
 IE                Evaluates the input at that index.
   O               Sorts the ToS (Top of the Stack).
    M)2s^}         Runs the block )2s^ on a separate stack, thus squaring each.
          R        Reverse.
           e       Dump the contents separately onto the stack.
            +      Add the top two items.
             =     Check if their sum is equal to the other entry on the stack (c^2).

Проверка, является ли треугольник прямоугольным в Треугольности ...

Мистер Xcoder
источник
3

PowerShell , 39 байт

$a,$b,$c=$args|sort;$a*$a+$b*$b-eq$c*$c

Попробуйте онлайн!

Сортирует входные данные, сохраняет их в $a,$b,$cпеременных. Затем использует теорему Пифагора, чтобы проверить, является ли a*a + b*b = c*c. Вывод либо логический, Trueлибо False.

AdmBorkBork
источник
3

JavaScript 34 байта (без D =)

D=(d,[a,b,c]=d.sort())=>a*a+b*b==c*c

console.log(D([5, 3, 4       ])== true)
console.log(D([3, 5, 4       ])== true)
console.log(D([12, 37, 35    ])== true)
console.log(D([21, 38, 5     ])== false)
console.log(D([210, 308, 15  ])== false)

DanielIndie
источник
У меня был похожий ответ на 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2в ES6. Так что реквизит вам @DanielIndie
WallyWest
1
К сожалению, sort()использует лексикографический порядок, когда обратный вызов не предоставляется, что делает этот код неудачным, например, для [10,6,8].
Арно
3

RProgN 2 , 10 байт

§²2^r]‘\+e

Разъяснения

§²2^r]‘\+e
§           # Sort the input list
 ²2^r       # Square each element in the list.
     ]      # Duplicate it on the reg stack.
      ‘     # Pop the top (largest) element off it
       \+   # Swap it, sum the rest of the list.
         e  # Are they equal?

Попробуйте онлайн!

Ataco
источник
Зачем дублировать список?
mdahmoune
@mdahmoune RProgN2 не сохраняет исходный список в стеке при извлечении элемента из него, но стеки являются ссылочными, поэтому, чтобы сохранить стек для выполнения его суммарной части, его необходимо сначала продублировать.
ATaco
Спасибо upvote;)
mdahmoune
3

Ракетка , 64 60 байт

(λ(a b c)(=(+(* a a)(* b b)(* c c))(*(expt(max a b c)2)2)))

Попробуйте онлайн!

Как это устроено

Тесты , если a^2 + b^2 + c^2равно удвоенному самый большой из a^2, b^2и c^2.

Возвращает #tдля правильных треугольников и #fдля всех других входов.


  • -4 байта благодаря предложению @ xnor использовать expt.
Миша лавров
источник
Круто;) но я думаю, что (define funдолжно быть частью кода ...
mdahmoune
Спасибо! Я думаю, что принято говорить, что в качестве ответов допускаются чистые функции. (define fun ...)На TIO только для удобства: мы одинаково хорошо могли бы использовать эту функцию, (... 3 4 5)когда ...функция. (Таким образом, мы могли бы иметь верхний (print (и нижний колонтитулы, 3 4 5))если хотите).
Миша Лавров
(Но это одна из моих первых заявок на Racket, поэтому я не очень понимаю, какие существуют соглашения для Racket, если таковые имеются. Некоторые прошлые решения с использованием Racket были включены #lang racketв код; некоторые - нет.)
Миша Лавров
1
Ракетка настолько многословна, что повторять короче, (max a b c)чем делать letпереплет, да? Я не думаю, что это будет короче, чтобы связать в качестве аргумента λ? Или нет встроенного возведения в степень?
xnor
2
@MishaLavrov Тогда как насчет (*(expt(max a b c)2)2)?
xnor
3

05AB1E , 6 байтов

n{R`+Q

Попробуйте онлайн!

Okx
источник
Первый пример не может обнаружить [1,1,1] не является допустимым вводом (распространенная проблема при некоторых других попытках), но второй работает нормально.
Ник Лафлин
@NickLoughlin К сожалению, удален первый пример
Okx
Вы могли бы сделать, n{RÆ_чтобы сохранить байт.
Emigna
3

Рубин, 31 байт

->a{a,b,c=*a.sort;a*a+b*b==c*c}

Вводит в виде списка из 3 целых чисел. Использует некоторые идеи из других решений.

dkudriavtsev
источник
Я только что понял, что ответ, который я только что опубликовал, почти идентичен вашему. Я обещаю, что не копировал ваши (я фактически некоторое время сидел в поле «Опубликовать ответ»), но так как ваш был отправлен первым, если вы считаете, что мой находится слишком близко, я его удалю.
Восстановить Монику iamnotmaynard
@iamnotmaynard Это одно и то же. это было забавное совпадение, лол. Спасибо, что
сообщили
Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
mdahmoune
3

Юлия 0,6 , 16 байт

!x=xx2x.*x

Попробуйте онлайн!

Как это устроено

Пусть x = [a, b, c] .

x⋅xявляется точечным произведением x и самого себя, поэтому оно дает ² + b² + c² .

2x.*xявляется поэлементным произведением 2x и x , поэтому оно дает [2a², 2b², 2c²] .

Наконец, проверяется, принадлежит ли целое число a² + b² + c² к вектору [2a², 2b², 2c²] , что верно, если
a² + b² + c² = 2a² или a² + b² + c² = 2b² или a² + b² + c² = 2c² , что само по себе верно, если
b² + c² = a² или a² + c² = b² или a² + b² = c² .

Деннис
источник
3

Java (OpenJDK 8) , 68 байт

a->{java.util.Arrays.sort(a);return a[0]*a[0]+a[1]*a[1]==a[2]*a[2];}

Попробуйте онлайн!

Роберто Грэм
источник
Можете ли вы сохранить несколько байтов, используя каррирование, а не массив?
AdmBorkBork
1
@AdmBorkBork Нет, потому что sortпринимает массив.
Оливье Грегуар,
3

TI-Basic, 13 11 10 байт

max(Ans=R►Pr(min(Ans),median(Ans

Теперь работает для входов в любом порядке, а также короче. Еще -1 благодаря @MishaLavrov

Timtech
источник
Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
mdahmoune
Это только детектирует отсортирован правильные треугольники: ввод A=5, B=4, C=3не будет правильно обработан.
Миша Лавров
@MishaLavrov Спасибо за указание на то, что на самом деле это более короткая обработка в виде списка. Теперь он работает для входов в любом порядке.
Timtech
Если мы опускаем единичное значение ), max(Ans=R►Pr(min(Ans),median(Ansоно также допустимо (хотя вычисления, которые мы здесь делаем, отличается) и на один байт короче.
Миша Лавров
@MishaLavrov Это интересно, я понимаю, что вы имеете в виду. Я думаю, что выражения эквивалентны для всех неотрицательных входных данных.
Timtech
3

CJam, 9

q~$W%~mh=

Попробуйте онлайн

Объяснение:

q~      read and evaluate the input (given as an array)
$W%     sort and reverse the array
~       dump the array on the stack
mh      get the hypotenuse of a right triangle with the given 2 short sides
=       compare with the longer side
aditsu
источник
Некоторые объяснения;)?
mdahmoune
@mdahmoune здесь вы идете
aditsu
Черт возьми. Разве ты не писал на этом языке? Не кажется справедливым. (шутка)
Кейн
3

Пари / ГП , 29 24 байта

f(v)=v~==2*vecmax(v)^2

Попробуйте онлайн!

Сохранено пять байтов за счет очевидного изменения с norml2(v)на v*v~.

Вдохновлен другими ответами.

Здесь vдолжен быть вектор строки или вектор столбца с тремя координатами.

Пример использования: f([3,4,5])

Конечно, вы получаете рациональные длины сторон бесплатно, например f([29/6, 10/3, 7/2]).

Если я не считаю f(v)=часть, то это 19 байтов. Первая часть также может быть записана v->(всего 22 байта).

Объяснение: Если три координат vявляются x, yи z, тем произведение vи его транспозиция v~дает скаляр x^2+y^2+^z^2, и мы должны проверить, что равно удвоенный квадрат максимума координат x, y, z.

Дополнительно: те же fтесты для пифагорейской четверки, если ваш входной вектор имеет четыре координаты и так далее.

Джепп Стиг Нильсен
источник
Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
mdahmoune
@mdahmoune Вы можете использовать эту tio.runссылку . Однако гораздо приятнее просто установить PARI / GP локально.
Джеппе Стиг Нильсен
3

MS Excel, 49 байт

Функция анонимного рабочего листа, которая принимает входные данные из диапазона [A1: C1] и выводит их в вызывающую ячейку.

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)
Тейлор Скотт
источник