Dapatkan nilai terdekat ke nomor

16

Dalam golf kode ini, Anda perlu mendapatkan nomor terdekat dari yang lain dalam daftar.

Output mungkin nomor terdekat dengan input.

Contoh:

value: (Input) 5 --- [1,2,3] --- 3

Dan, program dapat bekerja dengan angka negatif.

Contoh:

value: (Input) 0 --- [-1,3,5] --- -1


value: (Input) 2 --- [1, 5, 3] --- 1 (Because it gives priority to lower numbers)

ATURAN:

Seperti yang disebutkan sebelumnya, itu harus bekerja dengan angka negatif.

Jika ada dua jawaban (Contoh: 0 - [5, -5]), program memberikan prioritas ke angka terendah. (-5)

Ini kode golf sehingga kode terpendek menang!

AlexINF
sumber
6
itu memberi prioritas ke angka yang lebih rendah. Itu harus disebutkan dalam aturan.
Dennis
Jika nomor target ada dalam daftar, haruskah outputnya berupa nomor itu atau nomor terdekat lainnya dari daftar?
trichoplax
Saya tahu, jawaban yang diterima bersifat sementara.
AlexINF
4
@ Alex82 Tentu, Anda tahu bahwa Anda akan mengubah jawaban yang diterima jika jawaban yang lebih baik masuk, tetapi beberapa orang tidak senang dengan tantangan yang sudah memiliki jawaban yang diterima, karena sayangnya tidak semua penulis tantangan memiliki perhatian terhadap jawaban yang terlambat. Jadi kurang tentang apakah menerima lebih awal sebenarnya buruk tetapi apakah orang akan mendapatkan kesan yang salah.
Martin Ender
1
Apakah bilangan bulat bilangan masukan?
randomra

Jawaban:

6

Pyth, 6 byte

haDQSE

Suite uji

Masukkan formulir berikut di STDIN:

num
array

Penjelasan:

haDQSE
          Implicit: Q = eval(input()) (num)
     E    Evaluate input (array)
    S     Sort (smaller values to the front)
 aDQ      Sort by absolute difference with Q.
h         Take the first element of the sorted list, the min.
          Print implicitly.
isaacg
sumber
6

Ruby, 34 byte

->n,a{a.sort.min_by{|x|(n-x).abs}}
a.sort       min_by tiebreaks by position in array, so put smaller numbers 1st
.min_by{|x|  select the element which returns the smallest val for predicate...
(n-x).abs}   (absolute) difference between input num and element
Gagang pintu
sumber
1
Saya pikir Anda tidak perlu #sort, karena min_by sudah akan mengurutkannya dari min ke max. Jadi, bisa lebih pendek:->n,a{a.min_by{|x|(n-x).abs}}
TiSer
4

Mathematica, 12 byte

Min@*Nearest

FTW internal! Penjelasan Buettner: "Mathematica memiliki bawaan Nearestuntuk ini, tetapi mengembalikan daftar semua angka yang diikat. Oleh karena itu, kita perlu menyusunnya dengan Minuntuk memutuskan hubungan."

LegionMammal978
sumber
7
Itulah yang saya dapat ketika menulis penjelasan ...
Martin Ender
1
Bisakah Anda menambahkan "Coba online"?
AlexINF
1
@ Alex82 Tampaknya tidak mungkin untuk Mathematica (yang merupakan hak milik).
Martin Ender
3

Pyth, 8 byte

hS.mabQE

Penjelasan

         - autoassign Q = eval(input())
  .m   E -   min_values([V for b in eval(input())])
    abQ  -    abs(b-Q)
 S       -  sorted(^)
h        - ^[0]

Cobalah online!

Biru
sumber
2

JavaScript ES6, 64 56 54 byte

(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]

Cobalah online

Terima kasih kepada @Niel karena telah menghemat dua byte

Cuplikan Tes:

f=(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0];

[
  [5, [1, 2, 3]],
  [2, [3, 5, 1]],
  [2, [1, 3, 5]],
  [0, [-1, 2, 3]],
  [5, [1, 2, 3]]
].map(v=>O.textContent+=JSON.stringify(v)+": "+f.apply(null,v)+"\n")
<pre id=O></pre>

andlrc
sumber
Hemat 2 byte dengan menggabungkan jenis:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil
Anda dapat menyimpan byte dengan mengeringkan fungsi Anda: i=>a=>...maka f(i)(a)begitulah Anda menyebutnya.
Patrick Roberts
@ PatrickRoberts Dalam hal ini saya akan mengatakan tidak, karena OP meminta fungsi (atau simulere) yang mengambil nilai: inputdan daftar / array / ... sebagai bilangan bulat
andlrc
2

Jelly, 7 6 byte

ạżṛỤḢị

Cobalah online!

Bagaimana itu bekerja

ạżṛỤḢị Main link. Left input: n (number). Right input: A (list)

ạ      Take the asbolute difference of n and the items of A.
  ṛ    Yield the right argument, A.
 ż     Zip the left result with the right one.
       This pairing causes ties in absolute value to be broken by initial value.
   Ụ   Grade up; sort the indices of the resulting list by their associated values.
    Ḣ  Retrieve the first index, which corresponds to the smallest value.
     ị Retrieve the item of A at that index.
Dennis
sumber
1

MATL , 10 byte

Sti-|4#X<)

Cobalah online!

S       % implicitly input array, and sort. This ensures smaller numbers have priority
t       % duplicate
i       % input number
-|      % compute array of absolute differences
4#X<    % arg min. If there are several minimizers, the position of the first is returned
)       % index into original array. Implicitly display
Luis Mendo
sumber
1

Python 2, 56 byte

a=input()
print sorted(input(),key=lambda x:abs(a-x))[0]

Mendapat nomor target terlebih dahulu a=input()- ini harus disimpan dalam variabel.

Kemudian mengurutkan input dengan fungsi yang lambda x:abs(a-x)diterapkan (pikirkan map(lambda x:abs(a-x), input()))

Kemudian diperlukan nilai minimum jika ada nilai duplikat

Biru
sumber
0

TeaScript, 10 byte

T#(y-l)a)░

TeaScript tidak mendukung input array sehingga di konsol run: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)to runthis.

Penjelasan

T#  // Sort input by...
  (y-l)a // absolute difference with input
)░  // First item in array
Downgoat
sumber
0

R, 42 byte

x=sort(scan());x[which.min(abs(x-scan()))]
mnel
sumber
0

Haskell, 38 byte

e#l=snd$minimum$(zip=<<map(abs.(e-)))l

Contoh penggunaan: 2 # [1,5,3]-> 1.

Untuk setiap elemen dalam daftar input, lbuat pasangan dari perbedaan absolut elemen dengan nomor input edan elemen itu sendiri, misalnya e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Temukan minimum dan buang perbedaannya.

nimi
sumber
0

zsh, 75 73 71 70 67 byte

for n in ${@:2};{echo "$[$1-n]    $n"}|tr -d -|sort -n|head -1|cut -f2

Mengharapkan input sebagai argumen baris perintah.

Perhatikan bahwa keempat spasi dalam echoseharusnya merupakan tab, tetapi Stack Exchange mengonversi tab menjadi spasi di semua posting.

Tidak kompatibel dengan Bash karena for sintaksisnya.

for n in ${@:2};      for each argument except the first...
{echo "$[$1-n]\t$n"}  output the difference from the first argument
                        and then the original number
|tr -d -              poor man's abs()
|sort -n              sort by first num (difference), tiebreaking by second num
                        (original value)
|head -1              take the thing that sorted first
|cut -f2              print field 2 (aka discard the difference)

Terima kasih kepada dev-null untuk 2 byte!

Gagang pintu
sumber
0

Perl 6 , 31 byte

{@^b.sort.sort((*-$^a).abs)[0]}

Pemakaian:

my &code = {@^b.sort.sort((*-$^a).abs)[0]}

say code 5, [1,2,3];   # 3
say code 0, [-1,3,5];  # -1
say code 2, [1, 5, 3]; # 1
say code 0, [5,-5];    # -5
Brad Gilbert b2gills
sumber