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
[[1, 2], [4, 2], [3, 7]]
)T
?[1 2;4 2;3 7]
(menggunakan sintaks Julia)?Jawaban:
CJam,
1816 byteCobalah 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
sumber
Mathematica, 27 byte
sumber
Partition[t,2]
, yang sesuai dengan2/
di CJam. ;)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.
Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6.
sumber
The input will be a vector with six base 10 positive integers.
Julia, 32 byte
Bangun sebuah matriks dari persyaratan yang tepat dari produk silang, gunakan
det
untuk mendapatkan nilai yang dihasilkan, mengambil nilai absolut untuk berurusan dengan negatif, dan kemudian membaginya dengan 2 karena merupakan segitiga dan bukan jajaran genjang.sumber
Matlab / Oktaf, 26 byte
Saya tidak tahu tentang ini sejauh ini =)
sumber
Java,
7988 byteHanya menggunakan rumus dasar, tidak ada yang istimewa.
Sunting: Lupa untuk mengambil nilai absolut :(
sumber
return(t[0]*(t[3]...
sudah cukup, bukan?Minkolang 0.8 , 34 byte
Adakah yang mau telur
n0g
?Penjelasan
Sangat mudah. Menggunakan formula
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.sumber
JayScript , 58 byte
Mendeklarasikan fungsi anonim:
Contoh:
sumber
Ruby, 45
sumber
PHP - 68
8889byteTerima kasih kepada Martjin untuk beberapa petunjuk penting!
Untuk menggunakannya, buat file
area.php
dengan 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:Kemudian berikan koordinat pada baris perintah sebagai
x₁ y₁ x₂ y₂ x₃ y₃
, missumber
t
."$a
->$t
, hapus$a=$argv;
penyimpanan 9 byte<?php echo
dengan<?=
, menyimpan 7 byte lagiregister_globals=On
Andaphp.ini
(default). Baca selengkapnya di php.net/manual/en/security.globals.phpPyth,
3430 byteCobalah online.
Bekerja dengan menghitung abs (a * (df) + c * (fb) + e * (bd)) / 2 dari input a, b, c, d, e, f.
sumber
R, 37 byte
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,
abs
itu tidak akan diperlukan.sumber
Python 2,
484750 byteSangat sederhana; mengikuti persamaan standar:
Yang lain, pendekatan yang sama sederhana lebih lama:
Akses Python ke fungsi yang ditentukan adalah melalui numpy .
Berkat ikan lumpur untuk 1 byte dan xnor untuk menangkap kesalahan.
sumber
0
dari2.0
untuk meninggalkan2.
abs
membuat jawaban positif.PHP, 77
Berdasarkan jawaban @Yimin Rong, saya merasa saya bisa memperbaikinya dengan beberapa byte dengan menggunakan
list()
daripada langsung$argv
menyingkat beberapa variabel. Jugaecho
tidak membutuhkan ruang jika ada pembatas antara gema dan hal yang sedang digema.echo$variable;
,,echo(4+2);
danecho'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"Anda dapat menjalankannya melalui CLI
sumber
AWK - 51
42byteAWK tidak memiliki built-in
abs
sehingga digunakansqrt(x^2)
untuk menggantikan.Simpan sebagai
area.awk
dan gunakan sebagaiecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, misalnyasumber
PowerShell, 70 Bytes
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 ...sumber
$
dan[]
mengilhami saya untuk mencoba solusi AWK yang, pada akhirnya, tidak kompetitif!dc , 52 byte
Mengasumsikan input dalam register
t
sebagai:x1 y1 x2 y2 x3 y3
denganx1
di atast
tumpukan.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 tumpukant
ke tumpukan utama dan pindahkan berbagai bagian tumpukan utama ke register lain untuk penyimpanan (d
menduplikasi bagian atas tumpukan utama,r
membalikkan dua elemen teratas tumpukan utama,L/l
memindahkan / salin dari register yang diberikan ke main,s
pindah ke atas tumpukan utama ke register yang diberikan)Utama:
y3 x3 y2 x1
a
y1
:, bx2
:, cy2
:, t:y3
la lc lb lt la
: Menyalin bagian atas tumpukan dalam registera
,c
,b
,t
, dana
untuk stack utama agarUtama:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a
y1
:, bx2
:, cy2
:, t:y3
- * sd
: Menghitung((y3-y1)*x2)
dan hasilnya dimasukkan ke dalamd
(registera
,b
,c
, dant
tidak 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 utamaUtama:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: salin bagian atas registere
dand
ke tumpukan utama, hitung jumlah nilai 2 tumpukan teratas (mendorong hasil kembali ke tumpukan utama) dua kaliUtama:
(((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 (d
dane
tidak 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.sumber