Mengevaluasi rasio aspek segitiga

35

Diberikan tiga garis samping segitiga, evaluasi rasio aspeknya AR dengan rumus berikut:

masukkan deskripsi gambar di sini

dimana

masukkan deskripsi gambar di sini

Semakin dekat ke keseimbangan suatu segitiga, semakin dekat 1dengan rasio aspeknya. Rasio aspek lebih besar atau sama dengan 1untuk untuk segitiga yang valid.

Input

Inputnya adalah tiga angka positif nyata yang dapat diringkas dalam daftar atau yang serupa jika perlu.

Program Anda harus menampilkan nilai yang sama, apa pun urutan di mana tiga garis samping dimasukkan.

Ketiga angka tersebut akan selalu menjadi garis miring yang valid dari sebuah segitiga (segitiga yang merosot seperti segitiga dengan garis miring 1, 1dan 2tidak akan diberikan sebagai input). Anda tidak perlu khawatir tentang ketidakakuratan floating point ketika nilai menjadi sangat dekat dengan segitiga yang merosot (misalnya, dapat diterima bahwa program Anda akan melakukan kesalahan division by 0untuk input [1, 1, 1.9999999999999999]).

Input dapat diberikan melalui STDIN, sebagai argumen fungsi, atau yang serupa.

Keluaran

Outputnya adalah bilangan real yang lebih besar atau sama dengan 1dengan akurasi standar yang dapat diterima dalam bahasa Anda.

Output dapat dicetak ke STDOUT, dikembalikan dari fungsi, atau yang serupa.

Uji kasus

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Haruskah s be (a + b + c) / 3 ?
costrom
3
@costrom Tidak, rumusnya benar. s adalah semiperimeter segitiga . rumus Anda tidak akan terdefinisi untuk segitiga sama sisi.
Fatalkan
Bisakah saya mendapatkan float untuk input atau apakah saya perlu mendapatkan bilangan bulat juga?
Erik the Outgolfer
@ErikGolferエリックゴルファーHal ini dapat diterima untuk masukan 42.0bukan 42.
Fatalkan
@Terima kasih. Juga, bisakah semua inputnya 0?
Erik the Outgolfer

Jawaban:

19

Jelly , 6 byte

Jawaban ini didasarkan pada jawaban 05AB1E Emigna . Banyak terima kasih kepada Dennis dan Lynn untuk bantuan mereka dalam mencari tahu jawaban ini. Selamat datang saran bermain golf! Cobalah online!

S_Ḥ⁸÷P

Tidak melakukanolf

           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).
Sherlock9
sumber
4
6 byte dan Anda masih ingin saran bermain golf? :-D
Luis Mendo
1
@LuisMendo Jika memungkinkan, pastikan: D
Sherlock9
1
"Dorong" bukan terminologi yang benar; Jelly tidak berbasis stack. Melainkan, ⁸÷terlepas dari rantai sebagai satu unit, dan harus dibaca sebagai membagi argumen kiri awal dengan ini , atau sesuatu.
Lynn
1
@ Lynn Saya sudah bermain golf Sebenarnya selama beberapa bulan sekarang. Terminologi berbasis tumpukan melekat erat di otak saya: D Harus diperbaiki sekarang.
Sherlock9
56

Jelly , 7 byte

SH_÷@HP

Cobalah online!

Penjelasan

masukkan deskripsi gambar di sini

Mari kita baca rantai ini:

  • Argumen implisit adalah daftar [a, b, c].

  • Pertama kita baca S. Ini mengambil jumlah tersebut: a + b + c.

  • Lalu, kita baca H. Ini bagian itu: (a + b + c)/2. (Ini s.)

  • Kemudian, kita membaca angka dua _(kurangi), diikuti oleh angka dua lain. Ini adalah sebuah kait : tidak memiliki argumen yang benar, sehingga ia menerima argumen untuk rantai ini [a, b, c], memberi kita [s-a, s-b, s-c]. (Ini adalah pola rantai kelima dalam tabel di sini .)

  • Kemudian, kita membaca pasangan diad-monad ÷@H. Ini adalah percabangan : ÷@adalah pembagian dengan argumen terbalik, dan dibagi Hdua, sehingga nilai kerja kami dapat Hpula argumen ke rantai ini ÷dengan itu. Ini vektorisasi; kita pergi dengan [(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]. (Ini adalah pola rantai kedua dalam tabel di sini .)

  • Akhirnya, kami membawa produk P, mendapatkan kami abc/(8(s-a)(s-b)(s-c)).

Lihat grafik seperti pohon tentang bagaimana tautannya cocok.

Lynn
sumber
8
Gambar tampak hebat! Sentuhan yang bagus!
DavidC
2
Saya membuat gambar atas lebih kecil sendiri, dan mengubah yang kedua menjadi sebuah tautan (tidak ada permainan kata pun).
Lynn
Saya melihat gambar itu dan segera berpikir, "Bagus, Lynn!" sebelum melihat siapa yang mempostingnya ;-)
ETHproduk
7
Penjelasan terbaik yang pernah saya lihat tentang program Jelly. Saya masih tidak mengerti, tapi lebih dekat!
Sparr
Saya menjalankan sampel terhadap case-test ´6.0,12.0, 14.0` dan memberikan `-0.88888888888888888` bukannya 1,575 seperti yang ditunjukkan dalam case-test. Apakah ini masalah dengan test case atau kode Anda?
MBaas
13

Jelly , 6 byte

S÷_2Pİ

Cobalah online!

Bagaimana itu bekerja

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).
Dennis
sumber
Ahh, dan aku mencoba menggunakan ³⁴⁵argumen ...
Erik the Outgolfer
11

JavaScript, 38 byte

Ini adalah lambda ( kari ):

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

(Jika Anda menetapkannya ke variabel, fAnda harus menyebutnya seperti f(3)(4)(5))

cacat
sumber
Kalahkan saya beberapa detik :) Pikiran menjelaskan bagaimana formula bekerja sama dengan yang disediakan oleh pertanyaan?
Kritixi Lithos
@KritixiLithos Cukup sambungkan s = 1/2(a+b+c)ke dalam rumus dan sederhanakan: D (mis. s-a = .5*b+.5*c-.5*a, Dan tiga faktor .5pembatalan dengan 8)
flawr
5
(a,b,c)=>adalah panjang yang sama, dan biaya lebih murah byte untuk menelepon;)
ETHproduksi
4
Tapi saya suka kari: D
flawr
9

05AB1E , 11 7 byte

05AB1E menggunakan pengkodean CP-1252 .

O¹·-¹/P

Cobalah online!

Penjelasan

O         # sum input
 ¹        # push input again
  ·       # multiply by 2
   -      # subtract from sum
    ¹/    # divide by input
      P   # product
Emigna
sumber
8

MATL , 8 7 byte

tsGE-/p

Cobalah online!

Penjelasan

Mari kita gunakan input [3 4 5]sebagai contoh

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
Luis Mendo
sumber
8

R, 34 29 byte

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

Membaca input dari stdin dan menyimpan sebagai R-vektor x. Kemudian gunakan vektorisasi R untuk membentuk penyebut.

Billywob
sumber
7

Haskell, 36 byte

Ini mendefinisikan fungsi #yang membutuhkan tiga argumen.

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

Anda harus menyebutnya sebagai berikut: (3#4)5

Sedikit lebih lama tetapi mungkin lebih golf:

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

MATLAB, 64 38 25 byte

Ini adalah fungsi apa pun yang mengimplementasikan rumus seperti yang disediakan:

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

Ini mengasumsikan input menjadi daftar tiga nilai misalnya [3,4,5]. Contoh ini digunakan dalam penjelasan berikut:

             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
cacat
sumber
6

Mathematica, 20 byte

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

Mengambil input sebagai daftar tiga nilai, yang disebut sebagai #di dalam fungsi. Tr@adalah cara terpendek untuk menjumlahkan daftar (untuk mendapatkan 2s) dan 1##&@@(...)mengalikan tiga faktor i/(2s-2i)untuk imasuka, b, c .

Jika input bilangan bulat atau bilangan rasional, Anda akan mendapatkan hasil yang pasti.

Martin Ender
sumber
5

OCaml, 51 byte

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

Yay, operator terpisah untuk kendaraan ...

shooqie
sumber
5

Bertanya-tanya , 48 byte

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

MENINGGAL DUNIA

Pemakaian:

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

Penjelasan

Panggilan fungsi mahal di Wonder jika dibandingkan dengan operator infix dalam bahasa lain. Karena itu, saya memuat semua istilah dalam sebuah array dan mendapatkan produk dari hasil alih-alih mengalikan setiap istilah. Kode akan sama dengan sesuatu seperti:

(a,b,c)=>product([a,b,c,1/(b+c-a),1/(a+c-b),1/(a+b-c)])
Mama Fun Roll
sumber
1
Hmm, mengapa "RIP"?
Luis Mendo
Ini jauh lebih lama dari yang diperlukan / diharapkan
Mama Fun Roll
5

Sebenarnya , 10 8 byte

Jawaban ini didasarkan pada jawaban Jelly yang sangat baik dari Dennis . Selamat datang saran bermain golf! Cobalah online!

;Σ♀/♂¬πì

Tidak melakukanolf

     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.
Sherlock9
sumber
5

Minecraft 1.8, 1607 byte + 85 blok = 1692 blytes

Peringatan: Tidak golf. Golfed akan memakan waktu hingga 1 / 3 kurang blytes.

Berikut ini adalah tangkapan layar yang dikomentari:

masukkan deskripsi gambar di sini

  • Input adalah a, b, dan c, dan output adalahfin

  • fin, dan semua variabel lainnya di Minecraft adalah bilangan bulat, sehingga akurasi standar Minecraft adalah 0 poin desimal

  • Perbatasan hijau: blok perintah di sebelah kiri akan aktif setelah yang di sebelah kanan, yang hanya inisialisasi variabel.

  • Tuas (persegi panjang abu-abu di kanan bawah) adalah pemicu alat

  • Dibutuhkan begitu banyak karena cara Minecraft menangani variabel . Gambaran yang sangat sederhana:

    • /scoreboard objectives add name dummymembuat variabel baru bernama " name"

    • /scoreboard players set @p name numberset variabel namemenjadi number. Angka harus berupa bilangan real, bukan variabel.

    • /scoreboard players operation @p name += @p name2selisih nameoleh name2. name2harus berupa variabel, bukan angka.

      • -=, /=, *=, =Dan lebih dapat digunakan sebagai pengganti +=untuk pengurangan, perkalian, pembagian, dll
  • Saya tidak akan memposting semua 43 perintah di sini. Ini akan membantu bermain golf ini, tetapi juga akan membantu saya melakukan copypasting yang gila

  • Jika 1.9 blok perintah akan digunakan, solusinya akan (setidaknya) menggunakan 42 blok lebih sedikit. Jika variabel satu huruf akan digunakan, hampir 200 byte akan disimpan.

RudolfJelin
sumber
4

Java, 38 byte

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

Menguji dan tidak berkhianat

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

Menguji!

Keluaran

1.0
1.25
6.947606226693615
1.575
1.575
1.09375
Olivier Grégoire
sumber
Saya merasa (a,b,c)agak curang di sini, karena tidak mengandung informasi jenis. IMO antarmuka lambda implisit (dalam kasus Anda F) harus dihitung dalam jumlah byte total.
F. George
4
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Lambdas sangat direkomendasikan. Juga, sebagian besar entri Java 8 bekerja seperti itu tanpa komentar. Jika Anda tidak setuju dan menganggap saya curang, saya mengundang Anda untuk bertanya secara formal dalam meta apakah notasi ini diterima atau tidak. Sementara itu, saya menyelaraskan jawaban Java 8 sebelumnya.
Olivier Grégoire
4

Ubur-ubur , 17 16 byte

Terima kasih kepada Zgarb karena telah menghemat 1 byte.

p%/*-)/+i
    2%

Cobalah online!

Penjelasan

Ini didasarkan pada formula timbal balik yang sama dengan jawaban Dennis .

Dalam notasi fungsional yang lebih tradisional, program di atas berbunyi sebagai berikut:

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

Di mana idaftar input. Perhatikan bahwa fold(multiply, ...)hitung saja produk dan fold(add, ...)jumlahnya, sehingga kami dapat lebih menyederhanakan ini menjadi:

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

The sum(i) / idiimplementasikan melalui hook )/+yang mendefinisikan fungsi unary baru untuk melakukan kedua langkah sekaligus.

Martin Ender
sumber
Simpan satu byte dengan sebuah kait .
Zgarb
4

Dyalog APL , 10 9 byte

×/⊢÷+/-+⍨

Ini adalah fungsi kereta anonim (di atas garpu dari garpu garpu), yang berarti bahwa setiap sub-fungsi diterapkan pada argumen, di dalam struktur berikut:

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

TryAPL online!

×/ produk dari

argumen

÷ dibagi dengan

+/ jumlah argumen

- minus

+⍨ argumen digandakan (lit. ditambahkan ke diri mereka sendiri)

Latar belakang matematika.

ngn mencukur satu byte.

Adm
sumber
Hai Adam, tolong. ingatkan aku untuk bertanya kepadamu tentang ´⊢´ minggu depan jika aku melupakannya :-)
MBaas
Saya tidak tahu bagaimana tautan "latar belakang" seharusnya berkaitan dengan jawaban ini karena saya tidak melihat algoritme sama sekali. Juga, dapatkah Anda menambahkan beberapa info tentang urutan operasi? Saya sudah mencoba mereproduksi jawaban ini dalam beberapa bahasa yang berbeda dengan urutan operasi yang berbeda tetapi saya selalu mendapatkan jawaban yang berbeda dari yang ada di pertanyaan.
kucing
@cat Yah, itu tidak dimaksudkan untuk memberikan algoritma, hanya untuk menjelaskan apa aspek rasio, karena tidak ada halaman seperti itu di Wikipedia. APL adalah kanan-ke-kiri, artinya setiap fungsi mengambil apa pun yang berada di kanan sebagai argumen. Oleh karena itu, dapat dibaca dari kiri ke kanan seperti pada penjelasan.
Adám
3

dc, 49 byte

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

Implementasi langsung dari formula yang diberikan. Anjuran untuk tiga input pada saat pemanggilan pada tiga baris terpisah dan mengeluarkan nilai titik-mengambang dengan 5 digit setelah titik desimal ke baris berikutnya.

Penjelasan

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
R. Kap
sumber
3

TI-Basic, 11 byte

Masukan harus dalam bentuk daftar, seperti {A B C}.

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

Mungkin visual ini akan membantu (ingat itu 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 (jumlah (Ans)) -2Ans)
Timtech
sumber
2

Perl 6 , 44 byte

->\a,\b,\c{a*b*c/(b+c -a)/(a+c -b)/(a+b -c)}
Brad Gilbert b2gills
sumber
2

Python, 55 byte

def f(x,y,z):s=x+y+z;return 1/((s/x-2)*(s/y-2)*(s/z-2))

Penghargaan untuk Dennis . Saya baru saja porting. Dalam Python, bahasa yang banyak diabaikan.

Erik the Outgolfer
sumber
2

Keempat, 83 byte

Mengasumsikan parameter floating point dimulai pada tumpukan floating point. Meninggalkan hasilnya pada tumpukan floating point. Menggunakan tumpukan untuk params / kembali adalah standar untuk Keempat.

: 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* ;

Cobalah online - berisi semua kotak uji

Menggunakan formula a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) ). Hampir seluruh program hanya menggunakan tumpukan floating point. Pengecualian adalah 3di 3 fpick. Program ini membutuhkan juru bahasa yang mendukung fpick(Ideone berfungsi, repl.it tidak).

Penjelasan: sedikit kurang 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
mbomb007
sumber
2

ised : 19 byte

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

Sebut saja sebagai ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' tempat inputfile.txtfile dengan array yang dipisahkan ruang, atau -untuk menerima dari pipe / stdin.

Versi Unicode (bytecount yang sama tetapi 3 karakter lebih sedikit):

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

Sayangnya, isedmembuang banyak karakter untuk sintaks argumen inputnya.

orion
sumber
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

Telepon dengan

? r (3,4,5)

atau unggul dengan

= r (5,12,13)

SeanC
sumber
Anda akan menghemat 6 byte dengan algoritma @ 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));

Pemakaian:

ar(42, 42, 3.14);
WeskerTyrant
sumber
2

k, 19 byte

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

Mengevaluasi kanan ke kiri - Membagi daftar x dengan 2, jumlah hasilnya dan kurangi dari yang asli x. Negasikan jawabannya dan dapatkan produk dari hasilnya dan 8. Hasilnya adalah penyebutnya, pembilangnya adalah produk dari daftar.

Paul Kerrigan
sumber
1

Lua, 45 byte

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

Sangat berdasarkan pada jawaban JavaScript.

Aku melakukannya
sumber