Правильний мій трикутник?


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

Правила

  • Введення та вихід можуть бути задані у будь-якому зручному форматі .
  • У поданні, будь ласка, вкажіть справжні та хибні значення.
  • Не потрібно обробляти негативні значення або недійсне потрійне ребро
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

1
Чи повинні ми обробляти негативні значення чи невірне потрійне ребро?
користувач202729

2
Дуже пов'язані . Я залишу це на решті громади, щоб вирішити, чи є його копія.
Цифрова травма

2
Я думаю, що використання координат замість довжин суттєво змінює виклик
Луїс Мендо

8
Трикутника з довжинами немає 21, 38, 5, тому що 21 + 5 <38 . Це навмисний патологічний випадок, з яким нам доводиться займатися?
Кевін

1
@Kevin ні, вам не доведеться займатися цією справою. Користувач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², тому програма просто перевіряє це.



1
Просто технічна примітка: символи ²та µвартість по два байти в UTF-8, тож ваш код фактично має 7 байт, а не 5
Чарлі

2
@Charlie Відповідь відредаговано для уточнення.
користувач202729

20

Python 2 , 37 байт

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

Спробуйте в Інтернеті!

-2 завдяки FlipTack .
-1 завдяки Крейгу Гідні .

Виводи за допомогою коду виходу ( 0= false, 1= true).


Ба. Придумав таку саму відповідь. Ви можете змінити набір тестів, щоб дозволити будь-яку кількість тестових випадків: дивіться тут
mbomb007

@ mbomb007 exec(code)hmmm, чому exec (code)замість exec code? : D ;-p
Erik the Outgolfer

Ха-ха, як ця відповідь удвічі перевищує кількість коротших за xnor? Можливо, людям просто подобається її солодка
простота

1
@FlipTack ¯_ (ツ) _ / ¯ (також xnor не в Python 2)
Erik the 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

Тестові справи


Схоже , ми прийшли з точно такою ж відповідь (за винятком тієї, =>і ->різниця між 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" своп з першим.
    • фальшиво p Не робити нічого.
  • $:* Квадрат третього вводу.
  • P":USg! Перевірте, чи є третє значення більше, ніж найбільше попереднє.
    • справжній p+U- підсумок поточного стека та забирає збережене третє значення
    • помилкова p"U+- сума найменша і зберігається третя і віднімається від найбільшої
  • 0=% рівність тесту до нуля та результат виходу.

6

Haskell ( 33 32 31 байт)

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

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

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

Анонімна функція. Приймає список у формі [a, b, c]. Виводи точні чи помилкові.

Перша версія перевіряється, чи сума квадратів була вдвічі більшою від площі максимальної.

По-друге, трохи краща версія перевіряє, чи половина суми квадратів є елементом у списку квадратів.

Редагувати: Випадково порахував новий рядок, дякую H.PWiz


1
Ласкаво просимо на сайт! Ця відповідь становить лише 32 байти, можливо, ви порахували додатковий новий рядок?
H.PWiz

3
Ви можете скористатися функцією Monad, щоб зберегти ще кілька байтів тут
H.PWiz

також круглі дужки навколо sumможуть бути викинуті. приємне рішення!
гордий haskeller

6

Perl 6 , 24 байти

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

Спробуйте в Інтернеті!

*²+*²==*²- анонімна функція, яка повертає істину, якщо сума квадратів двох її перших аргументів дорівнює квадрату третього аргументу. Ми передаємо відсортований вхідний список цій функції, вирівнюючи його в список аргументів |.


6

R , 31 26 30 байт

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

Мені такий не подобається, але він коротший. Підсумовує квадрати і ділиться на найбільший квадрат. Truthy якщо 2.

Попередня версія (модифікована за допомогою кота та підказкою @ Guiseppe)

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

Зробіть суму відсортованого вводу з останнім елементом запереченням і поверніть !не.

Спробуйте в Інтернеті!


Для попередньої версії !sort(scan())^2%*%c(1,1,-1)- 27 байт. але я думаю, що вам все одно потрібно cat.
Джузеппе

Привіт @Guiseppe, забув про кота. Правила навколо REPL мене дратують, але вони є такими, якими вони є.
MickyT

@Giuseppe Також приємно крутити матричне множення. Я б ніколи цього не придумав.
MickyT

6

Мозок-Флак , 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

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 coinheringaahing

Чи завжди це працює, якщо ви використовуєте побітові операції?
l4м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))

Спробуйте в Інтернеті!


Виклик було оновлено, щоб обмежити введення на цілі числа.
Мартін Ендер


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;}

Спробуйте в Інтернеті!


Виходи 1для параметрів, 1, 1, 1які неправильні ...
Ніл

@Neil Це виправлено зараз.
Steadybox

Питання було оновлено, щоб використовувати ints, можливо, зберегти кілька байтів.
corsiKa

f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Крістоф


4

J, 10 байт

-6 байт завдяки FrownyFrog

=`+/@\:~*:

оригінальна відповідь

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

/:сортуйте квадрати *:, потім перевірте, чи сума перших двох +/@}:дорівнює останній{:

Спробуйте в Інтернеті!


це жахливо розумно розумний
Йона

4

Трикутність ,  49  31 байт

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

Спробуйте в Інтернеті!

Пояснення

Кожна програма з трикутності повинна мати трикутну підкладку (вибачте за каламбур). Тобто i- й рядок, що рахується знизу програми, повинен бути прошитий i - 1 крапкою ( .) з кожної сторони. Для того, щоб трикутники були симетричними та естетично приємними, кожен рядок повинен складатися з 2 л - 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).

Перевірка, чи трикутник прямокутний у трикутнику ...


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.


3

34 байти JavaScript (без 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)


У мене була аналогічна відповідь у 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?

Спробуйте в Інтернеті!


Навіщо дублювати список?
mdahmoune

@mdahmoune RProgN2 не зберігає оригінальний список у стеку, коли вискакує елемент з нього, але стеки є посиланням, тому, щоб стек був виконаний сумою його частини, його потрібно спершу дублювати.
Атако

Thanx 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))якщо ви хочете.)
Міша Лавров

(Але це одне з моїх перших заявок на Ракетку, тому мені не дуже зрозуміло, які існують конкретні ракетні конвенції, якщо такі є. Деякі минулі рішення, що використовують Ракет, включені #lang racketдо коду; деякі - ні.)
Міша Лавров

1
Ракетка настільки багатослівна, що повторювати коротше, (max a b c)ніж робити letобов'язковість, так? Я не думаю, що це було б коротше, як аргумент до λ? Або не існує вбудованої експоненції?
xnor

2
@MishaLavrov Тоді як щодо цього (*(expt(max a b c)2)2)?
xnor

3

Перший приклад не вдається виявити [1,1,1] не є коректним вкладом (поширена проблема в деяких інших спробах), але другий працює добре.
Нік Лофлін

@NickLoughlin На жаль, видалено перший приклад
Okx

Ви можете зробити, n{RÆ_щоб зберегти байт.
Емінья

3

Рубін, 31 байт

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

Вводиться як список із 3 цілих чисел. Використовує деякі ідеї з інших рішень.


Я щойно зрозумів, що відповідь, яку я тільки що опублікував, майже ідентична вашій. Я обіцяю, що не скопіював ваш (я фактично певний час сидів у полі "Опублікувати відповідь"), але оскільки ваш був поданий першим, якщо ви вважаєте, що моя занадто близька, я її видалю.
iamnotmaynard

@iamnotmaynard Це майже те саме. це було дивне збіг хаха. Дякуємо, що повідомили мені
dkudriavtsev

Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
mdahmoune

3

Джулія 0,6 , 16 байт

!x=xx2x.*x

Спробуйте в Інтернеті!

Як це працює

Нехай x = [a, b, c] .

x⋅x- крапковий добуток x і сам по собі, тому він дає a² + b² + c² .

2x.*xє елементним продуктом 2x та x , тому він дає [2a², 2b², 2c²] .

Нарешті, тестуємо, чи ціле число a² + b² + c² належить вектору [2a², 2b², 2c²] , що відповідає дійсності iff
a² + b² + c² = 2a² або a² + b² + c² = 2b² або a² + b² + c² = 2c² , що само по собі є правдою iff
b² + c² = a² або a² + c² = b² або a² + b² = c² .



3

TI-Basic, 13 11 10 байт

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

Тепер працює для входів у будь-якому порядку і також є коротшим. Ще -1 спасибі @MishaLavrov


Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
mdahmoune

Це тільки детектирует відсортований правильні трикутники: введення A=5, B=4, C=3ще не були правильно оброблений.
Міша Лавров

@MishaLavrov Дякую за те, що вказує, що це фактично коротше обробка як список. Тепер він працює для входів у будь-якому порядку.
Timtech

Якщо ми залишимо одинарний ), то max(Ans=R►Pr(min(Ans),median(Ansвін також дійсний (хоча обчислення, які ми робимо тут, відрізняється) і на один байт коротший.
Міша Лавров

@MishaLavrov Це цікаво, я бачу, що ти маєш на увазі. Я думаю, що вирази рівноцінні для всіх невід’ємних даних.
Тімтех

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

Деякі пояснення;)?
mdahmoune

@mdahmoune ось ти йдеш
aditsu

Співав. Ти не написав цю мову? Це не здається справедливим. (жарт)
kaine

3

Парі / GP , 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 на місцевому рівні.
Jeppe Stig Nielsen

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.