Получить ближайшее значение к числу


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
приоритет отдается меньшим числам, которые должны быть указаны в правилах.
Деннис

Если целевой номер присутствует в списке, должен ли вывод быть тем номером или самым близким другим номером из списка?
Трихоплакс

Я знаю, что принятый ответ является временным.
AlexINF

4
@ Alex82 Конечно, вы знаете, что вы измените принятый ответ, если придет лучший, но некоторые люди отталкиваются от проблем, у которых уже есть принятый ответ, потому что, к сожалению, не каждый автор проблем настолько внимателен к поздним ответам. Таким образом, речь идет не о том, является ли принятие рано на самом деле плохим, а о том, получат ли люди неправильное впечатление.
Мартин Эндер

1
Входные числа целые?
рандома

Ответы:


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

Рубин, 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 уже отсортирует его от минимального до максимального. Итак, это может быть еще короче:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Mathematica, 12 байт

Min@*Nearest

Встроенные модули FTW! Объяснение Бюттнера: «Mathematica имеет встроенную функцию Nearestдля этого, но возвращает список всех связанных чисел. Следовательно, нам нужно составить его, Minчтобы разорвать связь».


7
Вот что я получаю за написание объяснения ...
Мартин Эндер,

1
Не могли бы вы добавить «Попробуйте онлайн»?
AlexINF

1
@ Alex82 Кажется маловероятным для Mathematica (который является собственностью).
Мартин Эндер

@ Alex82 Проверьте это здесь: lab.open.wolframcloud.com/app/view/newNotebook?ext=nb
thedude


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]
Нил

Вы можете сохранить байт, каррируя свою функцию: i=>a=>...тогда f(i)(a), как вы ее называете.
Патрик Робертс

@PatrickRoberts В этом случае я бы сказал нет, потому что OP запрашивает функцию (или simulere), которая принимает значения: inputи список / массив / ... в виде целых чисел
andlrc

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)команду : runthis.

объяснение

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


0

Haskell, 38 байт

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

Пример использования: 2 # [1,5,3]-> 1.

Для каждого элемента в списке ввода lсоздайте пару абсолютных разностей элемента с номером ввода eи самим элементом, например e=2, l=[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 преобразует вкладки в пробелы во всех сообщениях.

Не совместим с Bash из-за for синтаксиса.

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 , 31 байт

{@^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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.