Отримайте найближче значення до числа


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
Чи є вхідні числа цілими числами?
randomra

Відповіді:


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 вже буде сортувати його від min до max. Отже, це може бути і коротше:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Математика, 12 байт

Min@*Nearest

Вбудовані FTW! Пояснення Бюттнера: "Математика має 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 У цьому випадку я б сказав "ні", тому що ОП просить функцію (або 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

Хаскелл, 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

зш, 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.