Luas segitiga

16

Tantangan mudah lainnya untuk Anda.

Tugas Anda

Tulis program atau fungsi yang mengambil input, yang berisi 3 pasang koordinat x dan y dan hitung luas segitiga yang terbentuk di dalamnya. Bagi mereka yang tidak ingat bagaimana cara menghitungnya, Anda dapat menemukannya di sini .

Contoh:

1,2,4,2,3,7       # input as x1,y1,x2,y2,x3,y3
7.5               # output

Lihat di Wolfram Alpha

Beberapa pertimbangan:

  • Inputnya adalah enam basis 10 bilangan bulat positif.
  • Anda dapat menganggap input dalam format yang masuk akal .
  • Poin akan selalu membentuk segitiga yang valid.
  • Anda dapat mengasumsikan input sudah disimpan dalam variabel seperti t.
  • Kode terpendek dalam byte menang!

Sunting: Untuk menghindari kebingungan, saya telah menyederhanakan cara input harus ditangani tanpa membahayakan salah satu kode saat ini.

Ingat bahwa program / fungsi Anda harus menampilkan area yang valid, sehingga tidak dapat memberikan angka negatif sebagai output

Mutador
sumber
1
Re: edit Anda. Apakah itu berarti bahwa saya dapat memiliki array pasangan yang sebenarnya (misalnya, [[1, 2], [4, 2], [3, 7]]) T?
Dennis
4
Saya masih bingung. Posting masih mengatakan "3 pasang" dan "enam ... bilangan bulat". Perhatikan bahwa menghapus salah satu dari itu akan membuat beberapa jawaban tidak valid.
xnor
1
Saya tidak suka melihat perubahan pertanyaan setelah mengirim dan menjawab. Tapi kali ini saya bisa menghemat 2 byte lagi, jadi tidak apa-apa
edc65
1
Jika kita dapat menganggapnya sebagai tiga pasangan, dapatkah kita menganggapnya sebagai array multidimensi? Yaitu, [1 2;4 2;3 7](menggunakan sintaks Julia)?
Glen O
2
@YiminRong Luas suatu segitiga tidak boleh negatif menurut definisi. Tidak masalah apa urutan poinnya.
Rainbolt

Jawaban:

16

CJam, 18 16 byte

T(f.-~(+.*:-z.5*

Cobalah online di juru bahasa CJam .

Ide

Seperti disebutkan di Wikipedia , luas segitiga [[0 0] [x y] [z w]]dapat dihitung sebagai |det([[x y] [z w]])| / 2 = |xw-yz| / 2.

Untuk segitiga generik [[a b] [c d] [e f]], kita dapat menerjemahkan verteks pertama ke asal, sehingga memperoleh segitiga [[0 0] [c-a d-b] [e-a f-b]], yang luasnya dapat dihitung dengan rumus di atas.

Kode

T                  e# Push T.
                   e# [[a b] [c d] [e f]]
   (               e# Shift out the first pair.
                   e# [[c d] [e f]] [a b]
    f.-            e# For [c d] and [e f], perform vectorized
                   e# subtraction with [a b].
                   e# [[c-a d-b] [e-a f-b]]
       ~           e# Dump the array on the stack.
                   e# [c-a d-b] [e-a f-b]
        (+         e# Shift and append. Rotates the second array.
                   e# [c-a d-b] [f-b e-a]
          .*       e# Vectorized product.
                   e# [(c-a)(f-b) (d-b)(e-a)]
            :-     e# Reduce by subtraction.
                   e# (c-a)(f-b) - (d-b)(e-a)
              z    e# Apply absolute value.
                   e# |(c-a)(f-b) - (d-b)(e-a)|
               .5* e# Multiply by 0.5.
                   e# |(c-a)(f-b) - (d-b)(e-a)| / 2
Dennis
sumber
10

Mathematica, 27 byte

Area@Polygon@Partition[t,2]
alephalpha
sumber
17
Saya suka bagaimana ini menggunakan Built-in dan masih lebih lama dari jawaban cjam.
Carcigenicate
2
@Carcigenicate masalah sebenarnya adalah Partition[t,2], yang sesuai dengan 2/di CJam. ;)
Martin Ender
10

JavaScript (ES6) 42 .44.

Edit format input berubah, saya dapat menyimpan 2 byte

Fungsi anonim yang mengambil array sebagai parameter dan mengembalikan nilai yang dihitung.

(a,b,c,d,e,f)=>(a*(d-f)+c*(f-b)+e*(b-d))/2

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6.

f=(a,b,c,d,e,f)=>(a*(d-f)+c*(f-b)+e*(b-d))/2

function test()
{
  var v=I.value.match(/\d+/g)
  I.value = v
  R.innerHTML=f(...v)
}
<input id=I onchange="test()"><button onclick="test()">-></button><span id=R></span>

edc65
sumber
1
Tidak bisakah Anda hanya mengambil nilai sebagai parameter standar dan menyelamatkan diri Anda sendiri 2 karakter pada pembuatan array?
Mwr247
@ Mwr247 tantangannya mengatakanThe input will be a vector with six base 10 positive integers.
edc65
Aha. Saya awalnya menafsirkan bahwa sebagai makna setiap pasangan membuat vektor koordinat (seperti contoh Wolfram), yang bertentangan dengan input itu sendiri terbatas pada array, dan dengan demikian dapat menggunakan format lain. Lebih masuk akal sekarang.
Mwr247
@ Mwr247 sekarang Anda benar
edc65
8

Julia, 32 byte

abs(det(t[1:2].-t[[3 5;4 6]]))/2

Bangun sebuah matriks dari persyaratan yang tepat dari produk silang, gunakan detuntuk mendapatkan nilai yang dihasilkan, mengambil nilai absolut untuk berurusan dengan negatif, dan kemudian membaginya dengan 2 karena merupakan segitiga dan bukan jajaran genjang.

Glen O
sumber
7

Matlab / Oktaf, 26 byte

Saya tidak tahu tentang ini sejauh ini =)

polyarea(t(1:2:5),t(2:2:6))
cacat
sumber
6

Java, 79 88 byte

float f(int[]a){return Math.abs(a[0]*(a[3]-a[5])+a[2]*(a[5]-a[1])+a[4]*(a[1]-a[3]))/2f;}

Hanya menggunakan rumus dasar, tidak ada yang istimewa.

Sunting: Lupa untuk mengambil nilai absolut :(

Geobit
sumber
Anda tidak perlu membuatnya bisa dijalankan?
downrep_nation
3
Contohnya hanya menunjukkan panggilan fungsi, dan itu adalah standar yang relatif normal di sini.
Geobits
2
Per pertanyaan, • Anda dapat mengasumsikan input sudah disimpan dalam variabel seperti 't'. Jadi, return(t[0]*(t[3]...sudah cukup, bukan?
AdmBorkBork
@ TimmyD Terasa teduh melakukannya, tetapi itu akan menurunkannya menjadi 62 byte. Hmmm .... Aku akan membiarkannya apa adanya, setidaknya untuk saat ini.
Geobits
5

Minkolang 0.8 , 34 byte

ndndn0g-n1g-n0g-n0g-1R*1R*-$~2$:N.

Adakah yang mau telur n0g?

Penjelasan

Sangat mudah. Menggunakan formula |(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2.

nd      x1, x1
nd      x1, x1, y1, y1
n0g-    x1, y1, y1, x2-x1
n1g-    x1, y1, x2-x1, y2-y1
n0g-    y1, x2-x1, y2-y1, x3-x1
n0g-    x2-x1, y2-y1, x3-x1, y3-y1
1R*     y3-y1, x2-x1, (y2-y1)(x3-x1)
1R*     (y2-y1)(x3-x1), (y3-y1)(x2-x1)
-       (y2-y1)(x3-x1) - (y3-y1)(x2-x1)
$~      |(y2-y1)(x3-x1) - (y3-y1)(x2-x1)|
2$:     |(y2-y1)(x3-x1) - (y3-y1)(x2-x1)|/2 (float division)
N.      Output as integer and quit.
El'endia Starman
sumber
3

JayScript , 58 byte

Mendeklarasikan fungsi anonim:

function(a,b,c,d,e,f){return (a*(d-f)+c*(f-b)+e*(b-d))/2};

Contoh:

var nFunct = function(a,b,c,d,e,f){return (a*(d-f)+c*(f-b)+e*(b-d))/2};
print(nFunct(1,2,4,2,3,7));
mınxomaτ
sumber
apa yang g lakukan?
Level River St
@steveverrill Tidak, saya hanya seorang idiot. Memperbaiki ...
mınxomaτ
3

Ruby, 45

->a,b,p,q,x,y{((a-x)*(q-y)-(p-x)*(b-y)).abs/2}
Level River St
sumber
3

PHP - 68 88 89 byte

Terima kasih kepada Martjin untuk beberapa petunjuk penting!

<?=.5*abs(($t[1]-$t[5])*($t[4]-$t[2])-($t[1]-$t[3])*($t[6]-$t[2]))?>

Untuk menggunakannya, buat file area.phpdengan konten ini, baris tambahan bertemu dengan anggapan data disimpan dalamt bagian variabel dari spesifikasi, dan end pada akhirnya menambahkan carriage return sehingga hasilnya bagus dan terpisah:

<?php $t = $argv; ?>
<?=.5*abs(($t[1]-$t[5])*($t[4]-$t[2])-($t[1]-$t[3])*($t[6]-$t[2]))?>
␍

Kemudian berikan koordinat pada baris perintah sebagai x₁ y₁ x₂ y₂ x₃ y₃, mis

$ php area.php 1 2 4 2 3 7
7.5

sumber
"Anda dapat mengasumsikan input sudah disimpan dalam variabel seperti t." $a-> $t, hapus $a=$argv;penyimpanan 9 byte
Martijn
Setelah itu, Anda dapat menggantinya <?php echodengan <?=, menyimpan 7 byte lagi
Martijn
Anda dapat mengatakan bahwa ini adalah PHP4.1, dengan file register_globals=OnAnda php.ini(default). Baca selengkapnya di php.net/manual/en/security.globals.php
Ismael Miguel
2

Pyth, 34 30 byte

KCcQ2c.asm*@hKd-@eKhd@eKtdU3 2

Cobalah online.

Bekerja dengan menghitung abs (a * (df) + c * (fb) + e * (bd)) / 2 dari input a, b, c, d, e, f.

Sam Cappleman-Lynes
sumber
2

R, 37 byte

cat(abs(det(rbind(matrix(t,2),1))/2))

Mengubah vektor koordinat menjadi matriks dan mengetuk pada baris 1's.
Menghitung determinan dan membaginya dengan 2.
Mengembalikan hasil absolut. Jika pesanan selalu searah jarum jam, absitu tidak akan diperlukan.

> t = c(1,2,4,2,3,7)
> cat(det(rbind(matrix(t,2),1))/2)
7.5
MickyT
sumber
2

Python 2, 48 47 50 byte

Sangat sederhana; mengikuti persamaan standar:

lambda a,b,c,d,e,f:abs(a*(d-f)+c*(f-b)+e*(b-d))/2.

Yang lain, pendekatan yang sama sederhana lebih lama:

def a(a,b,c,d,e,f):return abs(a*(d-f)+c*(f-b)+e*(b-d))/2. # 57
lambda t:abs(t[0]*(t[3]-t[5])+t[2]*(t[5]-t[1])+t[4]*(t[1]-t[3]))/2. # 67
def a(t):return abs(t[0]*(t[3]-t[5])+t[2]*(t[5]-t[1])+t[4]*(t[1]-t[3]))/2. # 74

Akses Python ke fungsi yang ditentukan adalah melalui numpy .

Berkat ikan lumpur untuk 1 byte dan xnor untuk menangkap kesalahan.

Celeo
sumber
Anda dapat menghapus 0dari 2.0untuk meninggalkan2.
Biru
Benar sekali, @muddyfish, terima kasih!
Celeo
Apakah ini Python 2 atau 3? Division bekerja secara berbeda tergantung pada versinya ...
mbomb007
Diklarifikasi, @ mbomb007.
Celeo
1
Anda perlu absmembuat jawaban positif.
xnor
2

PHP, 77

Berdasarkan jawaban @Yimin Rong, saya merasa saya bisa memperbaikinya dengan beberapa byte dengan menggunakan list()daripada langsung $argvmenyingkat beberapa variabel. Juga echotidak membutuhkan ruang jika ada pembatas antara gema dan hal yang sedang digema.

echo$variable;,, echo(4+2);dan echo'some string';sama-sama validechofunction($variable) membingungkan PHP.

Di sisi lain, saya juga menambahkan abs()agar secara matematis akurat, karena beberapa kombinasi simpul menghasilkan "area negatif"

list($t,$a,$b,$c,$d,$e,$f)=$argv;echo.5*abs(($a-$e)*($d-$b)-($a-$c)*($f-$b));

Anda dapat menjalankannya melalui CLI

php -r "list($t,$a,$b,$c,$d,$e,$f)=$argv;echo.5*abs(($a-$e)*($d-$b)-($a-$c)*($f-$b));" 1 2 4 2 3 7
7.5
JPMC
sumber
2

AWK - 51 42 byte

AWK tidak memiliki built-in abssehingga digunakan sqrt(x^2)untuk menggantikan.

{print sqrt((($1-$5)*($4-$2)-($1-$3)*($6-$2))^2)/2}

Simpan sebagai area.awkdan gunakan sebagai echo x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk, misalnya

$ echo 1 2 4 2 3 7 | awk -f area.awk
7.5

sumber
1

PowerShell, 70 Bytes

[math]::Abs(($t[0]-$t[4])*($t[3]-$t[1])-($t[0]-$t[2])*($t[5]-$t[1]))/2

Menggunakan formula standar yang sama dengan solusi lain. Per pertanyaan, menganggap array sudah diisi sebelumnya, mis $t=(1,2,4,2,3,7). Tapi ooof , apakah sintaks $dan []membunuh yang ini ...

AdmBorkBork
sumber
Komentar Anda tentang hukuman karena menggunakan $dan []mengilhami saya untuk mencoba solusi AWK yang, pada akhirnya, tidak kompetitif!
1

dc , 52 byte

Mengasumsikan input dalam register t sebagai: x1 y1 x2 y2 x3 y3dengan x1di atas ttumpukan.

1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p

1 2 4 2 3 7stStStStStSt #puts coordinates into register t (closest thing dc has to variables) 1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p 7.5

Ini menggunakan rumus berikut untuk area:

(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2

Dan untuk rincian proses yang cepat:

  • 1k Lt Lt sa Lt sb Lt d sc Lt lt r: atur presisi desimal ke 1 tempat, pindahkan bagian tumpukan tke tumpukan utama dan pindahkan berbagai bagian tumpukan utama ke register lain untuk penyimpanan ( dmenduplikasi bagian atas tumpukan utama, rmembalikkan dua elemen teratas tumpukan utama, L/lmemindahkan / salin dari register yang diberikan ke main,s pindah ke atas tumpukan utama ke register yang diberikan)

    Utama: y3 x3 y2 x1

    a y1:, b x2:, c y2:, t:y3

  • la lc lb lt la: Menyalin bagian atas tumpukan dalam register a, c, b, t, dan auntuk stack utama agar

    Utama: y1 y3 x2 y2 y1 y3 x3 y2 x1

    a y1:, b x2:, c y2:, t:y3

  • - * sd: Menghitung ((y3-y1)*x2)dan hasilnya dimasukkan ke dalam d(register a, b, c, dan ttidak lagi digunakan jadi saya akan menjatuhkan mereka dari daftar tumpukan sekarang)

    Utama: y2 y1 y3 x3 y2 x1

    d:((y3-y1)*x2)

  • - * se - *: menghitung ((y1-y2)*y3)dan ((y2-x3)*x1); simpan bekas die dan tinggalkan yang terakhir di tumpukan utama

    Utama: ((y2-x3)*x1)

    d:, ((y3-y1)*x2)e:((y1-y2)*y3)

  • le ld + +: salin bagian atas register edan dke tumpukan utama, hitung jumlah nilai 2 tumpukan teratas (mendorong hasil kembali ke tumpukan utama) dua kali

    Utama: (((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))

    d:, ((y3-y1)*x2)e:((y1-y2)*y3)

  • 2 /: dorong 2 ke tumpukan utama, bagi nilai ke-2 pada tumpukan dengan tanggal 1 ( ddan etidak lagi digunakan, jatuhkan dari daftar tumpukan)

    Utama: (((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2

Menyusun ulang nilai pada tumpukan dapat kita lihat itu setara dengan rumus di bagian atas penjelasan ini: (x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2

  • p: Cetak bagian atas tumpukan utama ke keluaran.
SnoringFrog
sumber