Lấy giá trị gần nhất với số


16

Trong mã golf này, bạn cần lấy số gần nhất từ ​​một số khác trong danh sách.

Đầu ra có thể là số gần nhất với đầu vào.

Thí dụ:

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

Và, chương trình có thể hoạt động với số âm.

Thí dụ:

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


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

QUY TẮC:

Như đã đề cập trước đó, nó phải làm việc với các số âm.

Nếu có hai câu trả lời (Ví dụ: 0 - [5, -5]), chương trình ưu tiên số thấp nhất. (-5)

Đây là mã golf nên mã ngắn nhất sẽ thắng!


6
nó ưu tiên cho các số thấp hơn Điều đó nên được đề cập trong các quy tắc.
Dennis

Nếu số mục tiêu có mặt trong danh sách, đầu ra nên là số đó hay số khác gần nhất từ ​​danh sách?
trichoplax

Tôi biết, câu trả lời được chấp nhận là tạm thời.
AlexINF

4
@ Alex82 Chắc chắn, bạn biết rằng bạn sẽ thay đổi câu trả lời được chấp nhận nếu có câu trả lời hay hơn, nhưng một số người bị loại bỏ bởi những thách thức đã có câu trả lời được chấp nhận, bởi vì không may, không phải tác giả thách thức nào cũng chú ý đến câu trả lời muộn. Vì vậy, nó ít hơn về việc chấp nhận sớm thực sự là xấu nhưng liệu mọi người sẽ có ấn tượng sai.
Martin Ender

1
Là số nguyên đầu vào?
Randomra

Câu trả lời:


6

Bình thường, 6 byte

haDQSE

Bộ kiểm tra

Nhập vào dưới dạng sau trên STDIN:

num
array

Giải trình:

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.

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

1
Tôi nghĩ bạn không cần #sort, vì min_by sẽ sắp xếp nó từ tối thiểu đến tối đa. Vì vậy, nó có thể còn ngắn hơn nữa:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Toán học, 12 byte

Min@*Nearest

FTW tích hợp! Giải thích của Buettner: "Mathematica có tích hợp sẵn Nearestcho việc này, nhưng nó trả về một danh sách tất cả các số bị ràng buộc. Do đó, chúng tôi cần phải soạn thảo nó Minđể phá vỡ mối quan hệ."


7
Đó là những gì tôi nhận được khi viết lời giải thích ...
Martin Ender

1
Bạn có thể thêm một "Dùng thử trực tuyến"?
AlexINF

1
@ Alex82 Có vẻ như không thể đối với Mathematica (là độc quyền).
Martin Ender



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]

Dùng thử trực tuyến

Cảm ơn @Niel vì đã lưu hai byte

Đoạn kiểm tra:

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>


Lưu 2 byte bằng cách kết hợp các loại:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil

Bạn có thể tiết kiệm một byte bằng cách tách lạng bộ chức năng của bạn: i=>a=>...đó f(i)(a)là cách bạn gọi nó.
Patrick Roberts

@PatrickRoberts Trong trường hợp này tôi sẽ nói không, bởi vì OP đang yêu cầu một hàm (hoặc simulere) có giá trị: inputvà một danh sách / mảng / ... dưới dạng số nguyên
andlrc

2

Thạch, 7 6 byte

ạżṛỤḢị

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ạżṛỤḢị 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.

1

MATL , 10 byte

Sti-|4#X<)

Hãy thử trực tuyến!

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

1

Python 2, 56 byte

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

Lấy số mục tiêu đầu tiên a=input()- điều này phải được lưu trữ trong một biến.

Sau đó, nó sắp xếp đầu vào với chức năng lambda x:abs(a-x)được áp dụng (nghĩ map(lambda x:abs(a-x), input()))

Sau đó, nó lấy giá trị tối thiểu trong trường hợp có bất kỳ giá trị trùng lặp nào


0

TeaScript, 10 byte

T#(y-l)a)░

TeaScript không hỗ trợ đầu vào mảng nên trong giao diện điều khiển chạy: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)to runthis.

Giải trình

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

0

R, 42 byte

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

0

Haskell, 38 byte

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

Ví dụ sử dụng: 2 # [1,5,3]-> 1.

Đối với mỗi phần tử trong danh sách đầu vào llàm cho một cặp chênh lệch tuyệt đối của nguyên tố này với số lượng đầu vào evà các yếu tố bản thân, ví dụ như e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Tìm mức tối thiểu và loại bỏ sự khác biệt.


0

zsh, 75 73 71 70 67 byte

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

Yêu cầu đầu vào là đối số dòng lệnh.

Lưu ý rằng bốn khoảng trắng trong echothực tế được coi là một tab, nhưng Stack Exchange chuyển đổi các tab thành khoảng trắng trong tất cả các bài viết.

Không tương thích Bash vì for cú pháp.

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)

Cảm ơn dev-null cho 2 byte!


0

Perl 6 , 31 byte

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

Sử dụng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.