Ini terinspirasi oleh masalah dunia nyata yang saya miliki. Saya ingin tahu apakah ada cara cerdas untuk melakukannya.
Anda diberi dua array yang tidak disortir, A dan B, masing-masing berisi jumlah float yang sewenang-wenang. A dan B tidak harus memiliki panjang yang sama. Tulis fungsi yang mengambil elemen-elemen A secara berurutan dan temukan nilai terdekat dalam array B. Hasilnya harus dimuat dalam array baru.
Kondisi menang
Kode terpendek menang (seperti biasa).
Jawaban:
APL, 13
17(21 byte dalam UTF-8)
Jika Anda ingin benar lambda (A sebagai argumen kiri dan B sebagai kanan):
Bagaimana itu bekerja:
{...}¨A
memanggil fungsi lambda{...}
dengan setiap nilai A (alih-alih memanggil dengan array A), mengumpulkan hasil ke array dengan bentuk yang sama|⍵-B
menghitung nilai absolut dari perbedaan antara argumen ⍵ dan semua dalam B (- adalah pengurangan, | adalah abs).↑⍋
mengambil indeks elemen terkecil (⍋ macam indeks pengembalian array, ↑ dapatkan elemen pertama)B[...]
hanya mengambil elemen berdasarkan indeks.Solusinya cukup lurus ke depan, meskipun menggunakan fitur luar biasa dari fungsi sortasi APL yang mengembalikan vektor permutasi (indeks elemen yang diurutkan dalam array asli) daripada array yang diurutkan sendiri.
sumber
Mathematica - 17
Bagaimana cara kerjanya? Ya, saya akui ada sedikit kecurangan di sini karena Mathematica memiliki fungsi terdekat yang ada di dalamnya . Sisanya mudah dan berkaitan dengan mengatur hasilnya dalam array 1D. Itu terlihat jelek hanya karena upaya ekstra untuk membuatnya pendek.
sumber
C # -
1039787 BytesSaya tidak begitu yakin apakah saya memahami pertanyaan ini dengan benar tetapi ini solusinya.
Saya menggunakan Daftar daripada array, karena memungkinkan saya untuk menulis kode yang lebih pendek.Array integer lebih pendek dari daftar integer.
Memasukkan:
Metode:
Keluaran:
Jika jawaban saya tidak benar, silakan tinggalkan komentar di bawahnya.
EDIT: AS @grax menunjukkan, pertanyaannya sekarang tentang mengapung. Karena itu saya ingin memasukkan jawabannya juga.
95 Bytes (jawaban Grax)
sumber
item
menjadii
dan Anda akan mengamankan 6 karakter tambahan;)float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 karakter
Penjelasan:
outer(A,B,`-`)
menghitung untuk setiap elemen x dari A perbedaanx-B
dan mengeluarkan hasilnya sebagai matriks (panjang dimensi (A) x panjang (B)).which.min
memilih indeks dari angka minimal.apply(x, 1, f)
menerapkan fungsif
pada setiap baris matriksx
.Jadi
apply(abs(outer(A,B,`-`)),1,which.min)
mengembalikan indeks perbedaan absolut minimal antara setiap elemen A dan elemen vektor B.Pemakaian:
sumber
CJam - 14
Kode utama ada di baris kedua, sisanya untuk menggunakan input standar dan output cantik.
Cobalah di http://cjam.aditsu.net/
Penjelasan:
q~
membaca dan mengevaluasi inputf{...}
mengeksekusi blok untuk setiap elemen dari array pertama dan objek berikutnya (yang merupakan array kedua), mengumpulkan hasil dalam array{...}$
mengurutkan array kedua menggunakan blok untuk menghitung kunci untuk setiap item1$
menyalin salinan saat ini item dari array pertama-z
mengurangi kemudian mengambil nilai absolut0=
mengambil nilai pertama dari array yang diurutkan (yang dengan kunci minimum)\;
membuang item dari array pertamap
mencetak representasi string dari hasilContoh (terinspirasi dari jawaban lain):
Input:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Keluaran:
[10 12 12 14 10]
Input:
[0 25 10 38] [3 22 15 49 2]
Keluaran:
[2 22 15 49]
sumber
Javascript (E6) 54
56 59Minimalkan jarak. Menggunakan persegi alih-alih abs hanya menghemat chars.
Edit aljabar ...
Edit perbaiki tugas yang tidak berguna (sisa tes tanpa definisi fungsi)
Apakah
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Uji
Hasil:
[10, 12, 12, 14, 10]
sumber
D=
tidak diperlukan, karenamap
mengembalikan array baru. Fungsi sortir alternatif (sama panjang):(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 karakter
a
danb
adalah array input, dan array yang diinginkan adalah hasil ekspresi.sumber
Haskell, 55
Pada awalnya, saya berpikir untuk menggunakan
minimumBy
dancomparing
, tetapi karena mereka tidak di Prelude, butuh satu ton karakter untuk memenuhi syarat mereka. Juga mencuri ide kuadrat dari beberapa jawaban lain untuk mengurangi karakter.sumber
PowerShell - 44
Contoh
Dengan
$a
dan$b
diatur ke:Output adalah
sumber
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Ruby, 40
Sama seperti jawaban Python, tetapi mengkuadratkan sedikit terser daripada cara apa pun yang bisa saya pikirkan untuk mengambil nilai absolut.
sumber
Pyth -
1211 byteCatatan: Pyth jauh lebih muda dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk menang.
Metode sederhana, menggunakan
o
fungsi pesanan untuk mendapatkan jarak minimal danm
menambahkannya pada daftara
.Cobalah online di sini .
sumber
TI-BASIC, 24
Tidak mendekati APL, tetapi menggunakan fungsi yang kurang kuat - ini tidak menggunakan fungsi "diurutkan berdasarkan" atau "indeks paling tidak". Kerugian dari TI-BASIC di sini adalah kurangnya fungsi dan array multidimensi.
Tidak Disatukan:
Min (fungsi memiliki dua perilaku: ketika digunakan dengan bilangan real atau daftar, ia memberikan nilai terkecil; namun, ketika digunakan dengan bilangan atau daftar kompleks, ia memberikan nilai dengan nilai absolut terkecil. Menambah
0i
atau mengalikan dengani^2
menyebabkan penerjemah menjadi gunakan perilaku kedua, jadimin(1,-2)
kembalikan-2
sedangkanmin(1+0i,-2+0i)
pengembalian1
.sumber
Fortran 90: 88
Ini mengharuskannya
contain
diedit dalam program lengkap:Kurung kurawal mendeklarasikan array sementara
(...,i=)
mewakilido
loop tersirat ; Saya kemudian mengembalikan nilaib
elemena(i)-b
yang diminimalkan.sumber
Matlab: 48
Mengasumsikan bahwa
A
danB
adalah matriks 1D di ruang kerja, hasil akhir adalahC
di ruang kerja. Ini kemungkinan juga akan bekerja di Octave. Pengindeksan bersyarat membuat melakukan ini cukup sepele.sumber
C 144
163Oke ... Saya rasa kode kecil ini perlu penjelasan.
Pada awalnya saya mencoba melakukan pekerjaan dengan dua level untuk loop menemukan perbedaan min dan mengatur nilai saat ini ke nilai min B. Itu sangat mendasar.
Hal yang sama dapat dicapai dengan fungsi qsort dan komparator. Saya membuatnya menjadi B berdasarkan perbedaan, bukan elemen B. Terlalu banyak fungsi untuk algoritma sekecil itu. Jadi fungsi q sekarang melayani dua tujuan. Pada awalnya, ini adalah algoritma itu sendiri, kedua (ketika qsort menyebutnya) komparator. Untuk komunikasi antara kedua negara, saya harus menyatakan global.
m adalah singkatan dari apakah itu dalam keadaan komparator atau yang utama .
contoh:
sumber
GolfScript, 49 byte
Catatan: ini adalah solusi parsial. Saya sedang berupaya menjadikannya solusi yang lengkap
Iya nih. GolfScript mendukung floating point. Cobalah di sini . Contoh:
Keluaran:
sumber
C # 262
Program menemukan perbedaan minimal dan menyimpan nilai terdekat dari Array B. Saya akan bekerja di golf segera.
Program lengkap dengan kode uji
sumber
C #: 120
Linq mengagumkan:
sumber