Untuk menormalkan suatu vektor berarti menskalakannya menjadi panjang 1 ( vektor satuan ), sambil menjaga arahnya konsisten.
Misalnya, jika kita ingin menormalkan vektor dengan 3 komponen, u , pertama-tama kita akan menemukan panjangnya:
| u | = sqrt (u x 2 + u y 2 + u z 2 )
... dan kemudian skala setiap komponen dengan nilai ini untuk mendapatkan vektor panjang 1.
û = u ÷ | u |
Tantangan
Tugas Anda adalah menulis sebuah program atau fungsi yang, mengingat daftar bilangan bulat yang tidak kosong, menafsirkannya sebagai vektor, dan menormalkannya. Ini harus bekerja untuk sejumlah dimensi, misalnya (kasus uji dibulatkan ke dua tempat desimal):
[20] -> [1]
[-5] -> [-1]
[-3, 0] -> [-1, 0]
[5.5, 6, -3.5] -> [0.62, 0.68, -0.40]
[3, 4, -5, -6] -> [0.32, 0.43, -0.54, -0.65]
[0, 0, 5, 0] -> [0, 0, 1, 0]
Aturan:
- Anda dapat mengasumsikan daftar input akan:
- Memiliki setidaknya satu elemen yang tidak nol
- Hanya berisi angka dalam rentang titik mengambang standar bahasa Anda
- Output Anda harus akurat untuk setidaknya dua tempat desimal . Mengembalikan nilai fraksi / nilai simbolik "presisi tak terbatas" juga diperbolehkan, jika ini adalah cara bahasa Anda menyimpan data secara internal.
- Pengajuan harus berupa program lengkap yang menjalankan I / O, atau suatu fungsi. Pengajuan fungsi dapat mengembalikan daftar baru, atau mengubah daftar yang diberikan di tempat.
- Fungsi / kelas vektor bawaan diizinkan. Selain itu, jika bahasa Anda memiliki jenis vektor yang mendukung jumlah dimensi yang berubah-ubah, Anda dapat mengambil salah satunya sebagai input.
Ini adalah kontes kode-golf , jadi Anda harus berusaha mencapai solusi sesingkat mungkin (dalam byte).
code-golf
math
array-manipulation
geometry
FlipTack
sumber
sumber
Jawaban:
05AB1E , 4 byte
Kode:
Cobalah online!
Penjelasan
sumber
JavaScript (ES6), 31 byte
Uji kasus
Tampilkan cuplikan kode
sumber
Mathematica, 9 byte
Cobalah online!
sumber
#/Norm@#&
untuk jumlah byte yang sama.J , 8 byte
Cobalah online!
6 byte
%|@j./
berfungsi jika vektor setidaknya 2 dimensi .sumber
%1%:@#.*:
Jelly ,
53 byteCobalah online! , atau lihat test suite
Disimpan 2 byte berkat mil!
sumber
÷ÆḊ
Oktaf , 13 byte
Cobalah online!
sumber
C,
7370 byteTerima kasih kepada @Christoph karena telah menghemat satu byte!
Cobalah online!
sumber
s=0,i=0
bukannyas=i=0
menghemat satus[-i]
tetapi sayangnya*--v/=sqrt(s);
1 byte lebih pendek.s
dani
secara otomatis diinisialisasi ke 0. (Ternyata saya tidak perlu menginisialisasii
dalam fungsi, karena fungsi selalu meninggalkannya pada nilai 0)v[-i]
mendapatkan nilai-nilai dalam urutan yang benar.Python,
4746 byteCobalah online!
sumber
Julia , 9 byte
Cobalah online!
sumber
CJam , 9 byte
Cobalah online!
Penjelasan
sumber
TI-Basic, 6 byte
Jalankan dengan
{1,2,3}:prgmNAME
, di mana{1,2,3}
vektor dinormalisasi.Membagi setiap elemen dalam vektor dengan akar kuadrat dari jumlah kuadrat elemennya.
sumber
R , 23 byte
Cobalah online!
v%*%v
menghitung titik produk v dengan dirinya sendiri.Fungsi ini akan mengeluarkan peringatan untuk vektor dengan panjang 2 atau lebih besar.
sumber
Java (OpenJDK 8) , 57 byte
Cobalah online!
sumber
MATL , 5 byte
Cobalah online!
Saya tidak sepenuhnya yakin ini adalah cara terpendek untuk melakukan ini. Pertama, kita menduplikasi input, lalu pilih tipe output kedua
|
(yang mana adalahabs
,norm
ataudeterminant
). Akhirnya, kami membagi input dengan norma.Alternatif untuk 7 byte:
sumber
Haskell , 29 byte
Cobalah online!
Atau untuk 1 byte lebih banyak pointfree:
map=<<flip(/).sqrt.sum.map(^2)
sumber
Funky , 42 byte
Cobalah online!
sumber
Ohm v2 , 5 byte
Cobalah online!
sumber
C ++ (gcc), 70 byte
Masukan oleh
std::valarray<float>
. Menimpa vektor asli.Cobalah online!
sumber
#import
bekerja setidaknya dengan GCC, Dentang dan MinGW juga. Tapi, ya, itu bukan standar C ++.Common Lisp, 69 byte
Cobalah online!
sumber
APL (Dyalog) ,
131210 byte1 byte disimpan berkat @ Adám
2 byte disimpan berkat @ngn
Cobalah online!
Bagaimana?
sumber
⊢÷.5*⍨(+/×⍨)
∘
jika itu tidak diturunkan). Selain itu, cukup tukar⍺
dan⍵
untuk⊣
dan⊢
:{⍵÷.5*⍨+/×⍨⍵}
→{⍵÷.5*⍨(+/(×⍨⍵))}
→⊢÷.5*⍨(+/(×⍨⊢))
→⊢÷.5*⍨(+/(×⍨))
→⊢÷.5*⍨(+/×⍨)
(+/×⍨)
->+.×⍨
Sekam ,
87 byteCobalah online!
sumber
C # (.NET Core) , 51 + 64 = 115 byte
Cobalah online!
+64 byte untuk
using System;using System.Collections.Generic;using System.Linq;
C # (.NET Core) , 94 + 13 = 107 byte
Cobalah online!
+13 byte untuk
using System;
Pendekatan non-Linq
DeGolfed
sumber
Perl 5 , 45 + 1 (
-a
) = 46 byteCobalah online!
sumber
Pip , 10 byte
9 byte kode, +1 untuk
-p
bendera.Mengambil vektor sebagai argumen baris perintah yang terpisah. Cobalah online!
Bagaimana itu bekerja
sumber
Pyth, 5 byte
Cobalah online: Test Suite
Penjelasan:
sumber
Perl 6 , 25 byte
Cobalah online!
$_
, argumen daftar ke fungsi, dibagi elementwise (»/»
) oleh akar kuadrat dari jumlah kuadrat elemen (»²
).sumber
Ruby,
3935 byte-4 byte terima kasih kepada G B.
sumber
sum{...}
sebagai gantinyamap{...}.sum
APL NARS 12 Karakter
sumber
f←
dalam hitungan byte Anda, karena Anda dapat menggunakan dfns tanpa itu. Omong-omong, apakah√
satu byte tunggal di NARS? Saya tidak terbiasa dengan hal itu, jadi tanyakan sajaGoogle Sheets, 65 byte
Daftar input ada di kolom
A
dengan satu entri per sel. Beginilah biasanya spreadsheet menggunakan daftar. Sayangnya, ini biasanya akan menghasilkan daftar panjang,0,0,0,0,0,....
di akhir sehingga kita harus mengabaikan mereka yang memilikiIf Blank then Blank else Math
logika.Jika semuanya ada dalam satu sel, maka solusinya adalah 95 byte:
sumber
Cepat 4, 44 byte
Hitung ulang norma vektor untuk setiap komponen, tetapi setidaknya ini singkat!
sumber