Uzyskaj najbliższą wartość do liczby

16

W tym kodzie golfowym musisz uzyskać najbliższy numer z innego na liście.

Wyjście może być liczbą najbliższą wejściu.

Przykład:

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

Program może działać z liczbami ujemnymi.

Przykład:

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


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

ZASADY:

Jak wspomniano wcześniej, musi działać z liczbami ujemnymi.

Jeśli są dwie odpowiedzi (Przykład: 0 - [5, -5]), program nadaje priorytet najniższej liczbie. (-5)

To jest kod golfowy, więc wygrywa najkrótszy kod!

AlexINF
źródło
6
przyznaje pierwszeństwo niższym liczbom, o których należy wspomnieć w przepisach.
Dennis
Jeśli numer docelowy jest obecny na liście, to czy wynikiem powinna być ta liczba, czy najbliższy inny numer z listy?
trichoplax
Wiem, że przyjęta odpowiedź jest doczesna.
AlexINF
4
@ Alex82 Jasne, ty wiesz, że będziesz zmieniać przyjętym odpowiedź, jeśli lepszy przychodzi, ale niektórzy ludzie odstraszają wyzwań, które już mają Zaakceptowanych odpowiedź, bo niestety nie każdy autor wyzwaniem jest to, że oddany do późnych odpowiedzi. Nie chodzi więc o to, czy wcześniejsze zaakceptowanie jest złe, ale czy ludzie odniosą złe wrażenie.
Martin Ender
1
Czy liczby wejściowe są liczbami całkowitymi?
randomra

Odpowiedzi:

6

Pyth, 6 bajtów

haDQSE

Zestaw testowy

Wprowadź w następującym formularzu na STDIN:

num
array

Wyjaśnienie:

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
źródło
6

Rubinowy, 34 bajty

->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
Klamka
źródło
1
Myślę, że nie potrzebujesz #sortowania, ponieważ min_by już posortuje je od min do maks. Może być nawet krótszy:->n,a{a.min_by{|x|(n-x).abs}}
TiSer
4

Mathematica, 12 bajtów

Min@*Nearest

Wbudowane FTW! Wyjaśnienie Buettnera: „Mathematica ma do tego wbudowaną funkcję Nearest, ale zwraca listę wszystkich powiązanych liczb. Dlatego musimy ją skomponować, Minaby zerwać remis”.

LegionMammal978
źródło
7
Właśnie to otrzymuję za napisanie wyjaśnienia ...
Martin Ender
1
Czy możesz dodać „Wypróbuj online”?
AlexINF
1
@ Alex82 Wydaje się mało prawdopodobne dla Mathematica (która jest zastrzeżona).
Martin Ender
@ Alex82 Przetestuj tutaj: lab.open.wolframcloud.com/app/view/newNotebook?ext=nb
thedude
3

Pyth, 8 bajtów

hS.mabQE

Wyjaśnienie

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

Wypróbuj online!

niebieski
źródło
2

JavaScript ES6, 64 56 54 bajtów

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

Wypróbuj online

Dzięki @Niel za zapisanie dwóch bajtów

Fragment testowy:

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
źródło
Zaoszczędź 2 bajty, łącząc różne rodzaje:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil
Można zapisać bajt przez currying swoją funkcję: i=>a=>...czym f(i)(a)jest, jak to nazwać.
Patrick Roberts,
@PatrickRoberts W tym przypadku powiedziałbym, że nie, ponieważ OP prosi o funkcję (lub simulere), która przyjmuje wartości: inputi listę / tablicę / ... jako liczby całkowite
andlrc
2

Galaretka, 7 6 bajtów

ạżṛỤḢị

Wypróbuj online!

Jak to działa

ạżṛỤḢị 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
źródło
1

MATL , 10 bajtów

Sti-|4#X<)

Wypróbuj 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
źródło
1

Python 2, 56 bajtów

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

Najpierw pobiera numer docelowy a=input()- należy go zapisać w zmiennej.

Następnie sortuje dane wejściowe z lambda x:abs(a-x)zastosowaną funkcją (pomyśl map(lambda x:abs(a-x), input()))

Następnie przyjmuje minimalną wartość w przypadku jakichkolwiek zduplikowanych wartości

niebieski
źródło
0

TeaScript, 10 bajtów

T#(y-l)a)░

TeaScript nie obsługuje wprowadzania danych z tablicy, więc w trakcie uruchamiania konsoli: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)to runthis.

Wyjaśnienie

T#  // Sort input by...
  (y-l)a // absolute difference with input
)░  // First item in array
Downgoat
źródło
0

R, 42 bajty

x=sort(scan());x[which.min(abs(x-scan()))]
mnel
źródło
0

Haskell, 38 bajtów

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

Przykład użycia: 2 # [1,5,3]-> 1.

Dla każdego elementu na liście wejściowego lutworzyć parę bezwzględnej różnicy elementu do liczby wejściowych ei samego elementu, na przykład e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Znajdź minimum i odrzuć różnicę.

nimi
źródło
0

zsh, 75 73 71 70 67 bajtów

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

Oczekuje danych wejściowych jako argumentów wiersza poleceń.

Zauważ, że cztery spacje w echo rzeczywistości mają być tabulatorem, ale Stack Exchange konwertuje tabulatory na spacje we wszystkich postach.

Nie jest kompatybilny z Bash ze względu na for składnię.

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)

Dzięki dev-null za 2 bajty!

Klamka
źródło
0

Perl 6 , 31 bajtów

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

Stosowanie:

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
źródło