Оцініть співвідношення сторін трикутника


35

Давши три бічні довжини трикутника, оцініть його співвідношення сторін AR за такою формулою:

enter image description here

де

enter image description here

Чим ближче до рівнобічності трикутник, тим ближче до 1його співвідношення сторін. Співвідношення сторін більше або дорівнює 1для дійсних трикутників.

Вхідні дані

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

Ваша програма повинна виводити одне і те ж значення незалежно від того, в якому порядку вводяться три бічні довжини.

Ці три числа завжди будуть дійсними бічними довжинами трикутника (вироджені трикутники, як один із довжинами бічних сторін 1, 1і 2не подаватимуться як вхідні дані). Вам не потрібно хвилюватися з приводу неточностей з плаваючою комою, коли значення стають надзвичайно близькими до виродженого трикутника (наприклад, допустимо, що ваша програма помилиться division by 0при введенні [1, 1, 1.9999999999999999]).

Вхід може бути поданий через STDINаргумент функції або щось подібне.

Виходи

Вихід - це дійсне число, яке більше або рівне 1стандартній точності, прийнятній для вашої мови.

Вихід може бути надрукований на STDOUT , повернутий з функції або щось подібне.

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

Inputs                   Output

  1      1      1         1
  3      4      5         1.25
 42     42   3.14         ≈ 6.9476
 14      6     12         1.575
  6     12     14         1.575
0.5    0.6    0.7         ≈ 1.09375

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.


повинен бути s (a + b + c) / 3 ?
вартість

3
@costrom Ні, формула правильна. s - півперметр трикутника . ваша формула буде невизначена для рівностороннього трикутника.
Фаталізувати

Чи можу я просто отримати поплавці для введення чи мені також потрібно отримати цілі числа?
Ерік Аутгольфер

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー Допустимо вводити 42.0замість 42.
Фаталізувати

@ Фаталізувати Спасибі Також, чи всі входи можуть бути 0?
Erik the Outgolfer

Відповіді:


19

Желе , 6 байт

Ця відповідь заснована на відповіді Еміньї 05AB1E . Величезне спасибі Деннісу та Лінні за допомогу у з'ясуванні цієї відповіді. Пропозиції з гольфу вітаються! Спробуйте в Інтернеті!

S_Ḥ⁸÷P

Ungolfing

           Implicit argument [a, b, c].
S          Take the sum, a+b+c or 2*s
  Ḥ        Take the double, [2*a, 2*b, 2*c].
 _         Vectorized subtract, giving us [2*(s-a), 2*(s-b), 2*(s-c)].
   ⁸÷      Vectorized divide the initial left argument, the input [a, b, c],
             by [2*(s-a), 2*(s-b), 2*(s-c)].
     P     Take the product giving us the aspect ratio, abc/8(s-a)(s-b)(s-c).

4
6 байт, і ви все ще хочете запропонувати пропозиції з гольфу? :-D
Луїс Мендо

1
@LuisMendo Якщо це взагалі можливо, обов'язково: D
Sherlock9

1
"Push" не зовсім коректна термінологія; Желе не базується на стеках. Швидше, ⁸÷він вилучається з ланцюга як одиниця, і його слід читати як розділити початковий лівий аргумент на це чи щось.
Лінн

1
@Lynn Я вже кілька місяців займаюся гольфом. Термінологія на основі стека міцно закріплена в моєму мозку: D Слід виправити зараз.
Шерлок9

56

Желе , 7 байт

SH_÷@HP

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

Пояснення

enter image description here

Давайте прочитаємо цей ланцюжок:

  • Неявний аргумент - це список [a, b, c].

  • Спочатку ми читаємо S. Це бере суму: a + b + c.

  • Потім ми читаємо H. Це половини його: (a + b + c)/2. (Це s.)

  • Потім ми читаємо діаду _(віднімання), а потім ще одну діаду. Це гачок : йому не вистачає правильного аргументу, тому він отримує аргумент до цього ланцюга [a, b, c], передаючи нам [s-a, s-b, s-c]. (Це п’ятий шаблон ланцюга в таблиці тут .)

  • Потім ми читаємо пару діада-монада ÷@H. Це виделка : ÷@поділ з аргументами перевернуто і Hнаполовину, тому наше робоче значення отримує Hаргумент до цього ланцюжка ÷'d по ньому. Це векторизується; ми залишилися [(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]. (Це другий зразок ланцюга в таблиці тут .)

  • Нарешті, ми беремо продукт P, отримуючи нас abc/(8(s-a)(s-b)(s-c)).

Перегляньте деревоподібний графік того, як посилання поєднуються.


8
Зображення виглядають чудово! Приємного дотику!
DavidC

2
Я зробив верхнє зображення меншим і перетворив друге на посилання (каламбур не призначений).
Лінн

Я побачив зображення і одразу подумав: "Гарний, Лінн!" перш ніж подивитися, хто це опублікував ;-)
ETHproductions

7
Найкраще пояснення я бачив у програмі Jelly. Я все ще не розумію, але ближче!
Спарр

Я провів вибірку на тестовому випадку "6,0,12,0,14.0", і він дав `-0,8888888888888888 'замість 1,575, як показано в тестових випадках. Це проблема з тестовими кейсами чи кодом?
MBaas

13

Желе , 6 байт

S÷_2Pİ

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

Як це працює

S÷_2Pİ  Main link. Argument: [a, b, c]

S       Sum; compute 2s := a + b + c.
 ÷      Divide; yield [2s ÷ a, 2s ÷ b, 2s ÷ c].
  _2    Subtract 2; yield [2s ÷ a - 2, 2s ÷ b - 2, 2s ÷ c - 2].
    P   Product; yield (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).
     İ  Invert; yield 1 ÷ (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).

А-а-а, і я намагався використовувати ³⁴⁵як аргументи ...
Ерік Вихідний

11

JavaScript, 38 байт

Це ( зрізана ) лямбда:

a=>b=>c=>a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

(Якщо ви призначите його змінній, fвам потрібно назвати її на зразок f(3)(4)(5))


Побийте мене на це декількома секундами :) Розумієте, як формула працює аналогічно тій, яку надає питання?
Kritixi Lithos

@KritixiLithos Просто підключіться s = 1/2(a+b+c)до формули та спростіть: D (наприклад s-a = .5*b+.5*c-.5*a, і три чинники .5скасування з 8)
flawr

5
(a,b,c)=>така ж довжина і коштує менше байт для виклику;)
ETHproductions

4
Але я люблю каррі: D
flawr


8

MATL , 8 7 байт

tsGE-/p

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

Пояснення

Давайте використаємо вхідний [3 4 5]приклад

t    % Take input implicitly. Duplicate
     % STACK: [3 4 5], [3 4 5]
s    % Sum of array
     % STACK: [3 4 5], 12
G    % Push input again
     % STACK: [3 4 5], 12, [3 4 5]
E    % Multiply by 2, element-wise
     % STACK: [3 4 5], 12, [6 8 10]
-    % Subtract, element-wise
     % STACK: [3 4 5], [6 4 2]
/    % Divide, element-wise
     % STACK: [0.5 1 2.5]
p    % Product of array. Implicitly display
     % STACK: 1.25

8

R, 34 29 байт

x=scan();prod(x/(sum(x)-2*x))

Читає вхід зі stdin та зберігає як R-вектор x. Потім скористайтеся векторизацією R для формування знаменника.


7

Haskell, 36 байт

Це визначає функцію, #яка бере три аргументи.

(a#b)c=a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

Ви повинні називати це так: (3#4)5

Трохи довше, але, можливо, більш зграбні:

p=product
f v=p v/p((sum v-).(2*)<$>v)

6

MATLAB, 64 38 25 байт

Це іменна функція, яка реалізує формулу, як передбачено:

@(v)prod(v./(sum(v)-2*v))

Він передбачає, що вхід є списком з трьох значень, наприклад [3,4,5]. Цей приклад використовується в наступному поясненні:

             sum(v)        = 3+4+5 = 12
             sum(v)-2*v    = 12 - 2*[3,4,5] = 12 - [6,8,10] = [6,4,2]
         v./(sum(v)-2*v))  = [3,4,5] ./ [6,4,2] = [0.5,1,2.5]
    prod(v./(sum(v)-2*v))  = 0.5 * 1 * 2.5 = 1.25

6

Математика, 20 байт

1##&@@(#/(Tr@#-2#))&

Вводить введення як список трьох значень, який позначається #всередині функції. Tr@це найкоротший шлях , щоб підвести список (щоб отримати 2s) і 1##&@@(...)примножує три фактори i/(2s-2i)для iв a, b, c.

Якщо вхідні дані - цілі чи раціональні числа, ви отримаєте точний результат.



5

OCaml, 51 байт

fun a b c->a*.b*.c/.(b+.c-.a)/.(a+.c-.b)/.(a+.b-.c)

Так, окремі оператори для поплавків ...


5

Диво , 48 байт

@@@prod[#0#1#2/1- +#1#0#2/1- +#2#0#1/1- +#2#1#0]

RIP

Використання:

(((@@@prod[#0#1#2/1* * - +#1#0#2- +#2#0#1- +#2#1#0])3)4)5

Пояснення

Функціональні дзвінки коштують у Wonder порівняно з операторами інфікування іншими мовами. Через це я містив усі терміни в масиві і отримав добуток результату замість того, щоб множувати кожен окремий термін. Код був би еквівалентний чимось на кшталт:

(a,b,c)=>product([a,b,c,1/(b+c-a),1/(a+c-b),1/(a+b-c)])

1
Хм, чому "RIP"?
Луїс Мендо

Це набагато довше, ніж потрібно / очікувалося
Mama Fun Roll

5

На насправді , 10 8 байт

Ця відповідь ґрунтується на чудовій відповіді Дженніса Желе . Пропозиції з гольфу вітаються! Спробуйте в Інтернеті!

;Σ♀/♂¬πì

Ungolfing

     Implicit input [a, b, c].
;    Duplicate [a, b, c].
Σ    sum() to get twice the semiperimeter, 2*s.
♀/   Vectorized divide 2*s by [a, b, c] to get [2*s/a, 2*s/b, 2*s/c].
♂¬   Vectorized subtract 2 to get [2*s/a-2, 2*s/b-2, 2*s/c-2].
π    Get the product of the above to get 8*(s/a-1)*(s/b-1)*(s/c-1).
     This is the same as 8(s-a)(s-b)(s-c)/abc.
ì    Invert to get the aspect ratio, abc/8(s-a)(s-b)(s-c).
     Implicit return.

5

Minecraft 1,8, 1607 байт + 85 блоків = 1692 білати

Попередження: Не в гольф. Golfed буде приймати до 1 / 3 менше blytes.

Ось прокоментований скріншот:

enter image description here

  • Входи є a, bі c, і вихід єfin

  • fin, а всі інші змінні в Minecraft є цілими числами, тому стандартна точність Minecraft становить 0 десяткових знаків

  • Зелена межа: командні блоки зліва активуються після тих, що праворуч, які є просто змінними ініціалізаціями.

  • Важіль (сіро-коричневий прямокутник праворуч внизу) - курок контрацепції

  • Це займає стільки через те, як Minecraft обробляє змінні . Дуже спрощений огляд:

    • /scoreboard objectives add name dummyстворює нову змінну під назвою " name"

    • /scoreboard players set @p name numberвстановлює змінну nameдо number. Число повинно бути реальним числом, а не змінною.

    • /scoreboard players operation @p name += @p name2прирости nameпо name2. name2повинна бути змінною, а не числом.

      • -=, /= , *=, =І багато іншого можна використовувати замість , +=щоб декремент, помножити, розділити і т.д.
  • Я не збираюся розміщувати тут усі 43 команди. Це допомогло б це зробити в гольф, але також допоможе мені розігнати копію

  • Якщо використовуються 1.9 командні блоки, рішення (принаймні) використовує на 42 блоки менше. Якщо використовуються однобуквні змінні, буде збережено майже 200 байт.


4

Java, 38 байт

(a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c)

Тестування та непільгований

public class Pcg101234 {
  interface F {
    double f(double a, double b, double c);
  }
  public static void main(String[] args) {
    F f = (a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c);

    System.out.println(f.f(1,1,1));
    System.out.println(f.f(3,4,5));
    System.out.println(f.f(42,42,3.14));
    System.out.println(f.f(14,6,12));
    System.out.println(f.f(6,12,14));
    System.out.println(f.f(0.5,0.6,0.7));
  }
}

Перевірте!

Вихідні дані

1.0
1.25
6.947606226693615
1.575
1.575
1.09375

Я відчуваю, що (a,b,c)тут якось обманюють, тому що він не містить інформації про тип. IMO неявний лямбда-інтерфейс (у вашому випадку F) повинен рахуватися у загальній байтовій сумі.
Ф. Джордж

4
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Lambdas настійно рекомендується. Крім того, більшість записів Java 8 працює так без будь-яких зауважень. Якщо ви не погоджуєтесь і вважаєте, що я обдурив, пропоную офіційно запитати в мета, чи прийнято це позначення чи ні. Тим часом я вирівнюю попередні відповіді на Java 8.
Олів'є Грегоар

4

Медузи , 17 16 байт

Завдяки Zgarb за збереження 1 байта.

p%/*-)/+i
    2%

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

Пояснення

Це ґрунтується на тій самій зворотній формулі, що і у відповіді Денніса .

У більш традиційних функціональних позначеннях вищевказана програма звучить так:

print(
  1 / fold(
    multiply,
    fold(add, i) / i - 2
  )
)

Де iзнаходиться список вводу. Зауважте, що fold(multiply, ...)просто обчислюється продукт і fold(add, ...)сума, тому ми можемо додатково спростити це до:

print(1 / product(sum(i) / i - 2))

Реалізація sum(i) / iздійснюється через гачок)/+ , який визначає нову унарна функцію , щоб зробити обидва кроку відразу.


Збережіть байт гачком .
Згарб

4

Діалог APL , 10 9 байт

×/⊢÷+/-+⍨

Це анонімний функціональний потяг (на вершині вилки форка вилки), що означає, що кожна підфункція застосовується до аргументу всередині наступної структури:

 ┌─┴─┐          
×/ ┌─┼───┐      
    ÷ ┌─┼──┐  
      +/ - +⍨

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

×/ продукт

аргументи

÷ ділиться на

+/ сума аргументів

- мінус

+⍨ аргументи подвоїлися (літ. додано до себе)

Математичний фон.

ngn поголив байт.


Привіт, Adám, pls. нагадайте запитати вас про ´⊢´ на наступному тижні, якщо я забуду це :-)
MBaas

Я не знаю, як посилання "фоновий" нібито стосується цієї відповіді, тому що я взагалі не бачу жодного алгоритму. Також ви можете додати трохи інформації про порядок операцій? Я намагався відтворити цю відповідь на кількох різних мовах з різним порядком операцій, але завжди отримую відповідь, відмінну від такої у запитанні.
кіт

@cat Ну, алгоритм не мав на меті дати, а лише пояснити, що таке співвідношення сторін, оскільки такої сторінки у Вікіпедії немає. APL - справа наліво, це означає, що кожна функція бере як аргумент те, що знаходиться праворуч. Тому його можна прочитати зліва направо, як у поясненні.
Адам


3

постійного струму, 49 байт

5k?dsa?dsb?dsc++2/sslalblc**lsla-lslb-lslc-8***/p

Пряме виконання наведеної формули. Запрошує на три входи після виклику в трьох окремих рядках і виводить значення з плаваючою комою з 5 цифр після десяткової крапки до наступного рядка.

Пояснення

5k                                                # Set the output precision to 5 digits after the decimal
  ?dsa                                            # Prompt for first input value on first line, duplicate it, and then store it in register `a`
      ?dsb                                        # Prompt for second input, duplicate it, and store it in register `b`
          ?dsc                                    # Prompt for third input, duplicate it, and store it in register `c`
              ++2/ss                              # Sum up the 3 values on the main stack, then divide sum by 2 and store the result in register `s`
                    lalblc**                      # Copy all three values from registers `a`,`b`,`c` onto the main stack, find their product, and push result to top of main stack
                            lsla-                 # Copy value from register `s` onto main stack, subtract register `a`'s value from it, and push result to main stack
                                 lslb-            # Copy value from register `s` onto main stack, subtract register `b`'s value from it, and push result to main stack
                                      lslc-       # Copy value from register `s` onto main stack, subtract register `c`'s value from it, and push result to main stack
                                           8***   # Find the product of the top three values and 8 and then push the result to main stack
                                               /p # Divide the second to top value (a*b*c) by the top of stack value (8*(s-a)*(s-b)*(s-c)), push the result to the main stack, and then output the result to STDOUT

3

TI-Basic, 11 байт

Введення має бути у вигляді списку, як {A B C}.

prod(Ans)/prod(sum(Ans)-2Ans

Можливо, цей візуальний допоможе (пам’ятайте про це 2s = a+b+c ):

      abc abc abc prod (відповіді)
---------------- = --------------------- = ----------- -------- = -------------------
8 (sa) (sb) (sc) (2s-2a) (2s-2b) (2s-2c) (a + b + c) (1-2 {a, b, c}) prod (сума (відповіді) -2Анів)



2

По-четверте, 83 байти

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

: p 3 fpick ;
: T p p p ;
: f 0 s>f T f- f+ f- T f+ f- f* T f- f- f* 1/f f* f* f* ;

Спробуйте в Інтернеті - містить усі тестові приклади

Використовує формулу a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) ). В цілому вся програма використовує лише стек з плаваючою точкою. Виняток - 3в 3 fpick. Ця програма вимагає інтерпретатора, який підтримує fpick(Ideone працює, repl.it не працює).

Пояснення: трохи менше гольфу

\ 3 fpick takes the 3rd element (0-indexed) and pushes a copy
\ Used to copy parameters on the stack over another number 'x' ( a b c x -> a b c x a b c )
: f3p 3 fpick 3 fpick 3 fpick ;

: f                     \ define a function f
0 s>f f3p f- f+ f-      \ push a zero, copy params, compute 0-(a+b-c)
                        \ the zero allows me to copy (I need an 'x' to jump over)
f3p f+ f- f*            \ copy params and compute -(b+c-a), multiply by previous result
                        \ the negatives miraculously cancel
f3p f- f- f*            \ copy and compute (a+c-b), multiply by previous result
1/f f* f* f* ;          \ take the reciprocal and multiply by a*b*c
                        \ the result is left on the floating point stack

2

об'єм : 19 байт

@*$1/@*{@+$1-2.*$1}

Викликайте його так, ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' де inputfile.txtможе бути файл з масивом, розділеним пробілом, або -отримати з pipe / stdin.

Версія Unicode (той самий рахунок, але на 3 символи менше):

Π$1/Π{Σ$1-2.*$1}

На жаль, isedвитрачає багато символів для синтаксису вхідного аргументу.


2

vba, 76

Function r(a,b,c)
s=(a+b+c)/2:r=(a*b*c)/(8*(s-a)*(s-b)*(s-c))
End Function

Подзвоніть з

? r (3,4,5)

або у відмінності з

= r (5,12,13)


За допомогою алгоритму @ SuperJedi224 ви заощадите 6 байт:Public Function r(a,b,c):r=a*b*c/(b+c-a)/(a-b+c)/(a+b-c):End Function
steenbergh

2

C #, 82 байти

void ar(double a,double b,double c)=>Console.Write(a*b*c/(b+c-a)/(a+c-b)/(a+b-c));

Використання:

ar(42, 42, 3.14);


2

k, 19 bytes

{(*/x)%8*/-x-+/x%2}

Evaluates right to left - Divide the list x by 2, sum the result and subtract it from original x. Neg the answer and get the product of the result and 8. The result is the denominator, the numerator is the product of the list.


1

Lua, 45 bytes

a,b,c=...print(a*b*c/(b+c-a)/(a+c-b)/(a+b-c))

Heavily based on the JavaScript answer.

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