获取最接近数字的值


16

在此代码中,您需要从列表中的另一个号码获得最接近的号码。

输出可能是最接近输入的数字。

例:

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

并且,该程序可能会使用负数。

例:

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


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

规则:

如前所述,它必须使用负数。

如果有两个答案(例如:0-[5,-5]),则程序将优先考虑最低的数字。(-5)

这是代码高尔夫球,所以最短的代码获胜!


6
它优先考虑较小的数字,这在规则中应予以提及。
丹尼斯

如果目标号码在列表中,则输出应该是该号码还是列表中最接近的其他号码?
trichoplax

我知道,可接受的答案是暂时的。
AlexINF '02

4
@ Alex82当然,知道,如果输入更好的答案,您将更改接受的答案,但是有些人被已经接受了答案的挑战所推迟,因为不幸的是,并不是每个挑战作者都那么关注后期的答案。因此,与其说早接受是否真的不好,不如说人们是否会得到错误的印象。
Martin Ender

1
输入的数字是整数吗?
randomra

Answers:


6

Pyth,6个字节

haDQSE

测试套件

在STDIN上以以下形式输入:

num
array

说明:

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个字节

->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
我认为您不需要#sort,因为min_by已经将它从min到max排序。因此,它甚至可以更短:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Mathematica,12个字节

Min@*Nearest

内置FTW!Buettner的解释:“ Mathematica对此具有内置功能Nearest,但是它返回所有绑定数字的列表。因此,我们需要对其进行组合Min以打破平局。”


7
那就是我写一个解释所得到的...
Martin Ender

1
您可以添加“在线试用”吗?
AlexINF

1
@ Alex82对于Mathematica(专有)似乎不太可能。
Martin Ender


3

Pyth,8个字节

hS.mabQE

说明

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

在线尝试!


2

的JavaScript ES6,64个 56 54字节

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

在线尝试

感谢@Niel节省了两个字节

测试片段:

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>


通过组合排序节省2个字节:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil

您可以通过保存一个字节讨好你的函数:i=>a=>...那么f(i)(a)你是怎么称呼它。
帕特里克·罗伯茨

@PatrickRoberts在这种情况下,我会说不,因为OP要求一个接受值的函数(或simulere):input以及一个作为整数的列表/数组/ ...
andlrc 2016年

2

果冻,7 6个字节

ạżṛỤḢị

在线尝试!

怎么运行的

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

Sti-|4#X<)

在线尝试!

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个字节

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

首先获取目标编号a=input()-必须将其存储在变量中。

然后使用lambda x:abs(a-x)应用的功能对输入进行排序(认为map(lambda x:abs(a-x), input())

如果有重复值,则取最小值


0

TeaScript,10个字节

T#(y-l)a)░

TeaScript不支持数组输入,因此在控制台中运行:运行TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)this。

说明

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

0

R,42个字节

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

0

Haskell,38个字节

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

用法示例:2 # [1,5,3]-> 1

对于在输入列表中的每个元件l使一对元件的与所述输入数的绝对差的e和元件本身,例如e=2l=[1,5,3]- > [(1,1),(3,5),(1,3)]。找到最小值并丢弃差异。


0

zsh,75 73 71 70 67字节

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

期望输入作为命令行参数。

请注意,中的四个空格echo实际上应该是一个制表符,但是Stack Exchange会将制表符转换为所有帖子中的空格。

由于for 语法不兼容Bash 。

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)

感谢dev-null 2个字节!


0

Perl 6字节

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

用法:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.