Đánh giá tỷ lệ khung hình của một hình tam giác


35

Cho ba độ dài của một tam giác, đánh giá AR tỷ lệ khung hình của nó theo công thức sau:

nhập mô tả hình ảnh ở đây

Ở đâu

nhập mô tả hình ảnh ở đây

Một tam giác càng gần với tam giác thì càng gần với 1tỷ lệ khung hình của nó. Tỷ lệ khung hình lớn hơn hoặc bằng với 1các hình tam giác hợp lệ.

Đầu vào

Đầu vào là ba số dương thực sự có thể được gói gọn trong một danh sách hoặc bất cứ thứ gì tương tự nếu cần.

Chương trình của bạn phải xuất ra cùng một giá trị bất kể thứ tự mà ba bước sóng được nhập là gì.

Những ba số sẽ luôn luôn được sidelengths hợp lệ của một tam giác (tam giác thoái hóa như một với sidelengths 1, 12sẽ không được cung cấp như là đầu vào). Bạn không cần lo lắng về sự thiếu chính xác của dấu phẩy động khi các giá trị trở nên cực kỳ gần với một tam giác suy biến (ví dụ: có thể chấp nhận rằng chương trình của bạn sẽ bị lỗi division by 0cho đầu vào [1, 1, 1.9999999999999999]).

Đầu vào có thể được đưa ra thông qua STDIN, như là một đối số chức năng, hoặc bất cứ điều gì tương tự.

Đầu ra

Đầu ra là một số thực lớn hơn hoặc bằng 1với độ chính xác tiêu chuẩn có thể chấp nhận được trong ngôn ngữ của bạn.

Đầu ra có thể được in tới STDOUT, trả về từ một chức năng hoặc bất cứ thứ gì tương tự.

Các trường hợp thử nghiệm

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


s nên là (a + b + c) / 3 ?
costrom

3
@costrom Không, công thức đúng. s là nửa cung của tam giác . công thức của bạn sẽ không được xác định cho một tam giác đều.
Gây tử vong

Tôi có thể nhận được số float cho đầu vào không hoặc tôi có cần lấy số nguyên không?
Erik the Outgolfer

@ErikGolfer リ ッ ク ゴ ル フ ァ Có thể chấp nhận đầu vào 42.0thay vì 42.
Gây tử vong vào

@Firthize Cảm ơn. Ngoài ra, tất cả các đầu vào có thể được 0?
Erik the Outgolfer

Câu trả lời:


19

Thạch , 6 byte

Câu trả lời này dựa trên câu trả lời 05AB1E của Emigna . Rất cám ơn Dennis và Lynn đã giúp đỡ trong việc tìm ra câu trả lời này. Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

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 byte và bạn vẫn muốn đề xuất chơi golf? :-D
Luis Mendo

1
@LuisMendo Nếu có thể, chắc chắn: D
Sherlock9

1
Cấm đẩy không phải là thuật ngữ khá chính xác; Jelly không dựa trên stack. Thay vào đó, ⁸÷được lấy ra khỏi chuỗi như một đơn vị, và nên được đọc như là chia đối số bên trái ban đầu cho điều này , hoặc một cái gì đó.
Lynn

1
@Lynn Tôi đã chơi golf Thực tế trong vài tháng nay. Thuật ngữ dựa trên ngăn xếp được đặt chắc chắn trong não của tôi: D Nên được sửa ngay bây giờ.
Sherlock9

56

Thạch , 7 byte

SH_÷@HP

Hãy thử trực tuyến!

Giải trình

nhập mô tả hình ảnh ở đây

Hãy đọc chuỗi này:

  • Đối số ngầm là một danh sách [a, b, c].

  • Đầu tiên chúng tôi đọc S. Điều này có tổng : a + b + c.

  • Sau đó, chúng tôi đọc H. Điều này giảm một nửa : (a + b + c)/2. (Đây là s.)

  • Sau đó, chúng tôi đọc một dyad _(trừ), tiếp theo là một dyad khác. Đây là một cái móc : nó thiếu một đối số đúng, vì vậy nó nhận được đối số cho chuỗi này [a, b, c], mang lại cho chúng ta [s-a, s-b, s-c]. (Đây là mẫu chuỗi thứ năm trong bảng ở đây .)

  • Sau đó, chúng tôi đọc cặp dyad-monad ÷@H. Đây là một ngã ba : ÷@là sự phân chia với các đối số được lật và Hgiảm một nửa, vì vậy giá trị làm việc của chúng ta sẽ làm Hcho đối số của chuỗi này ÷bị thay đổi. Điều này vector hóa; chúng ta còn lại với [(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]. (Đây là mẫu chuỗi thứ hai trong bảng ở đây .)

  • Cuối cùng, chúng tôi mang sản phẩm đến P, nhận chúng tôi abc/(8(s-a)(s-b)(s-c)).

Xem biểu đồ giống như cây về cách các liên kết khớp với nhau.


8
Những hình ảnh trông thật tuyệt! Liên lạc tốt đẹp!
DavidC

2
Tôi đã làm cho hình ảnh trên cùng nhỏ hơn bản thân mình, và biến hình ảnh thứ hai thành một liên kết (không có ý định chơi chữ).
Lynn

Tôi nhìn thấy hình ảnh và ngay lập tức nghĩ, "Đẹp đấy, Lynn!" trước khi nhìn vào người đăng nó ;-)
ETHproductions

7
Giải thích tốt nhất tôi từng thấy về một chương trình Jelly. Tôi vẫn không hiểu, nhưng gần hơn!
Sparr

Tôi đã chạy mẫu đối với trường hợp thử nghiệm ỏ6.0,12.0,14.0` và nó đã cho `-0.8888888888888888, thay vì 1.575 như trong các trường hợp thử nghiệm. Đây có phải là một vấn đề với các trường hợp thử nghiệm hoặc mã của bạn?
MBaas

13

Thạch , 6 byte

S÷_2Pİ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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).

Ahh, và tôi đã cố gắng sử dụng ³⁴⁵làm đối số ...
Erik the Outgolfer

11

JavaScript, 38 byte

Đây là một lambda ( cà ri ):

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

(Nếu bạn gán nó cho một biến fbạn cần gọi nó như thế nào f(3)(4)(5))


Đánh bại tôi trong vài giây :) Tâm trí giải thích cách thức công thức hoạt động tương tự như công thức được cung cấp bởi câu hỏi?
Kritixi Lithos

@KritixiLithos Chỉ cần cắm s = 1/2(a+b+c)vào công thức và đơn giản hóa: D (ví dụ: s-a = .5*b+.5*c-.5*avà ba yếu tố .5hủy với 8)
flawr

5
(a,b,c)=>là chiều dài tương tự, và chi phí ít byte để gọi;)
ETHproductions

4
Nhưng tôi yêu cà ri: D
flawr


8

MATL , 8 7 byte

tsGE-/p

Hãy thử trực tuyến!

Giải trình

Hãy sử dụng đầu vào [3 4 5]làm ví dụ

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 byte

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

Đọc đầu vào từ stdin và lưu trữ như R-vector x. Sau đó, sử dụng vector hóa của R để tạo thành mẫu số.


7

Haskell, 36 byte

Điều này xác định hàm #có ba đối số.

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

Bạn phải gọi nó như sau: (3#4)5

Một chút lâu hơn nhưng có lẽ nhiều golf hơn:

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

6

MATLAB, 64 38 25 byte

Đây là một hàm bất biến thực hiện công thức như được cung cấp:

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

Nó giả sử đầu vào là một danh sách gồm ba giá trị, vd [3,4,5]. Ví dụ này được sử dụng trong giải thích sau:

             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

Toán học, 20 byte

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

Lấy đầu vào là một danh sách gồm ba giá trị, được gọi là #bên trong hàm. Tr@là con đường ngắn nhất để tổng hợp một danh sách (để có được 2s) và 1##&@@(...)nhân lên ba yếu tố i/(2s-2i)cho itrong a, b, c.

Nếu đầu vào là số nguyên hoặc số hữu tỷ, bạn sẽ nhận được kết quả chính xác.



5

OCaml, 51 byte

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

Yay, các nhà khai thác riêng cho phao ...


5

Kỳ quan , 48 byte

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

YÊN NGHỈ

Sử dụng:

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

Giải trình

Các cuộc gọi chức năng rất tốn kém trong Wonder khi so sánh với các toán tử infix trong các ngôn ngữ khác. Bởi vì điều này, tôi chứa tất cả các điều khoản trong một mảng và nhận được kết quả của kết quả thay vì nhân mọi thuật ngữ. Mã này sẽ tương đương với một cái gì đó như:

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

1
Hmm, tại sao "RIP"?
Luis Mendo

Nó dài hơn nhiều so với mức cần thiết / dự kiến
Mama Fun Roll

5

Trên thực tế , 10 8 byte

Câu trả lời này dựa trên câu trả lời Jelly tuyệt vời của Dennis . Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

;Σ♀/♂¬πì

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 byte + 85 khối = 1692 blyte

Cảnh báo: Không được đánh gôn. Golfed sẽ mất đến 1 / 3 ít blytes.

Dưới đây là một ảnh chụp màn hình bình luận:

nhập mô tả hình ảnh ở đây

  • Các đầu vào là a, bc, và đầu ra làfin

  • finvà tất cả các biến khác trong Minecraft là số nguyên, vì vậy độ chính xác của Minecraft là 0 điểm thập phân

  • Đường viền màu xanh lá cây: các khối lệnh bên trái sẽ kích hoạt sau các khối bên phải, chỉ là các khởi tạo biến.

  • Cần gạt (hình chữ nhật màu nâu xám ở phía dưới bên phải) là bộ kích hoạt

  • Nó chiếm quá nhiều vì cách Minecraft xử lý các biến . Một tổng quan rất đơn giản:

    • /scoreboard objectives add name dummytạo một biến mới có tên " name"

    • /scoreboard players set @p name numberđặt biến namethành number. Số phải là số thực, không phải là biến.

    • /scoreboard players operation @p name += @p name2gia tăng nametheo name2. name2phải là một biến, không phải là một số.

      • -=, /=, *=, =Và nhiều hơn nữa có thể được sử dụng thay +=cho sụt lần, nhân, chia, vv
  • Tôi sẽ không đăng tất cả 43 lệnh ở đây. Nó sẽ giúp chơi golf này, nhưng cũng sẽ giúp tôi sao chép điên cuồng

  • Nếu khối lệnh 1.9 được sử dụng, giải pháp sẽ (ít nhất) sử dụng ít hơn 42 khối. Nếu các biến một chữ cái sẽ được sử dụng, gần 200 byte sẽ được lưu.


4

Java, 38 byte

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

Kiểm tra và không có người

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

Kiểm tra nó!

Đầu ra

1.0
1.25
6.947606226693615
1.575
1.575
1.09375

Tôi cảm thấy như (a,b,c)là một sự gian lận ở đây, bởi vì nó không chứa thông tin loại. IMO giao diện lambda ẩn (trong trường hợp của bạn F) sẽ được tính vào tổng số byte.
F. George

4
@ mEQ5aNLrK3lqs3kfSa5HbvsTwe0nIu Lambdas rất được khuyến khích. Ngoài ra, hầu hết các mục nhập Java 8 hoạt động như thế mà không có bất kỳ nhận xét nào. Nếu bạn không đồng ý và coi tôi đã lừa dối, tôi mời bạn hỏi chính thức trong meta nếu ký hiệu này có được chấp nhận hay không. Trong khi đó, tôi căn chỉnh các câu trả lời Java 8 trước đó.
Olivier Grégoire

4

Sứa , 17 16 byte

Cảm ơn Zgarb vì đã tiết kiệm 1 byte.

p%/*-)/+i
    2%

Hãy thử trực tuyến!

Giải trình

Điều này dựa trên cùng một công thức đối ứng như câu trả lời của Dennis .

Trong ký hiệu chức năng truyền thống hơn, chương trình trên có nội dung như sau:

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

Nơi iđây là danh sách đầu vào. Lưu ý rằng fold(multiply, ...)chỉ cần tính toán sản phẩm và fold(add, ...)tổng, vì vậy chúng tôi có thể đơn giản hóa hơn nữa để:

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

Việc sum(i) / inày được thực hiện thông qua hook )/+xác định hàm unary mới để thực hiện cả hai bước cùng một lúc.


Lưu một byte bằng một cái móc .
Zgarb

4

APL Dyalog , 10 9 byte

×/⊢÷+/-+⍨

Đây là một hàm chức năng ẩn danh (trên đỉnh của một ngã ba của một ngã ba), có nghĩa là mọi hàm phụ được áp dụng cho đối số, bên trong cấu trúc sau:

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

Dùng thử trực tuyến!

×/ sản phẩm của

các đối số

÷ chia

+/ tổng của các đối số

- dấu trừ

+⍨ các đối số tăng gấp đôi (thêm vào chính họ)

Nền toán học.

ngn cạo một byte.


Xin chào Adám, xin vui lòng. nhắc tôi hỏi bạn về ⊢⊢ vào tuần tới nếu tôi quên nó :-)
MBaas

Tôi không biết làm thế nào liên kết "nền" được cho là liên quan đến câu trả lời này bởi vì tôi thấy không có thuật toán nào cả. Ngoài ra, bạn có thể thêm một số thông tin về thứ tự hoạt động? Tôi đã cố gắng tạo lại câu trả lời này bằng một vài ngôn ngữ khác nhau với thứ tự hoạt động khác nhau nhưng tôi luôn nhận được câu trả lời khác với câu hỏi đó.
con mèo

@cat Chà, nó không có ý định đưa ra thuật toán, chỉ để giải thích tỷ lệ khung hình là gì, vì không có trang nào như vậy trên Wikipedia. APL là từ phải sang trái, có nghĩa là mọi hàm đều lấy bất cứ thứ gì ở bên phải làm đối số. Do đó, nó có thể được đọc từ trái sang phải như trong phần giải thích.
Adám


3

dc, 49 byte

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

Một thực hiện trực tiếp của công thức được đưa ra. Nhắc nhở ba đầu vào khi gọi trên ba dòng riêng biệt và xuất giá trị dấu phẩy động có 5 chữ số sau dấu thập phân sang dòng tiếp theo.

Giải trình

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 byte

Đầu vào phải ở dạng danh sách, như thế nào {A B C}.

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

Có lẽ hình ảnh này sẽ giúp (nhớ rằng 2s = a+b+c):

      abc abc abc prod (Ans)
---------------- = --------------------- = ----------- -------- = -------------------
8 (sa) (sb) (sc) (2s-2a) (2s-2b) (2s-2c) (a + b + c) (1-2 {a, b, c}) prod (sum (Ans) -2Ans)



2

Forth, 83 byte

Giả sử các tham số dấu phẩy động bắt đầu trên ngăn xếp dấu phẩy động. Để lại kết quả trên ngăn xếp điểm nổi. Sử dụng ngăn xếp cho params / return là tiêu chuẩn cho 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* ;

Dùng thử trực tuyến - chứa tất cả các trường hợp thử nghiệm

Sử dụng công thức a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) ). Khá nhiều toàn bộ chương trình chỉ sử dụng ngăn xếp dấu phẩy động. Ngoại lệ là 3trong 3 fpick. Chương trình này yêu cầu một trình thông dịch hỗ trợ fpick(Ideone hoạt động, repl.it không).

Giải thích: hơi ít chơi golf

\ 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

ised : 19 byte

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

Gọi nó là ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' nơi inputfile.txtcó thể là một tệp có mảng được phân tách bằng dấu cách hoặc -để nhận từ pipe / stdin.

Phiên bản Unicode (cùng mã byte nhưng ít hơn 3 ký tự):

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

Thật không may, isedlãng phí rất nhiều ký tự cho cú pháp đối số đầu vào của nó.


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

Gọi với

? r (3,4,5)

hoặc trong excel với

= r (5,12,13)


Bạn sẽ lưu 6 byte với thuật toán của @ SuperJedi224: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 byte

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

Sử dụng:

ar(42, 42, 3.14);


2

k, 19 byte

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

Đánh giá từ phải sang trái - Chia danh sách x cho 2, tính tổng kết quả và trừ nó khỏi x gốc. Phủ định câu trả lời và nhận sản phẩm của kết quả và 8. Kết quả là mẫu số, tử số là sản phẩm của danh sách.


1

Lua, 45 byte

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

Dựa nhiều vào câu trả lời JavaScript.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.