Ermitteln Sie den Wert, der der Zahl am nächsten kommt

16

Bei diesem Codegolf müssen Sie die nächstgelegene Nummer von einer anderen in einer Liste abrufen.

Die Ausgabe kann die dem Eingang am nächsten liegende Zahl sein.

Beispiel:

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

Und das Programm kann mit negativen Zahlen arbeiten.

Beispiel:

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


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

REGELN:

Wie bereits erwähnt, muss es mit negativen Zahlen funktionieren.

Wenn es zwei Antworten gibt (Beispiel: 0 - [5, -5]), gibt das Programm der niedrigsten Nummer den Vorrang. (-5)

Dies ist Codegolf, also gewinnt der kürzeste Code!

AlexINF
quelle
6
Niedrigere Zahlen haben Priorität. Dies sollte in den Regeln erwähnt werden.
Dennis
Wenn die Zielnummer in der Liste vorhanden ist, sollte die Ausgabe diese Nummer oder die nächste andere Nummer aus der Liste sein?
Trichoplax
Ich weiß, die akzeptierte Antwort ist zeitlich.
AlexINF
4
@ Alex82 Sicher, du weißt, dass du die akzeptierte Antwort ändern wirst, wenn eine bessere Antwort eingeht , aber einige Leute sind von Herausforderungen abgeschreckt, die bereits eine akzeptierte Antwort haben, weil leider nicht jeder Herausforderungsautor so aufmerksam auf späte Antworten ist. Es geht also weniger darum, ob frühzeitiges Akzeptieren wirklich schlecht ist, sondern ob die Leute den falschen Eindruck bekommen.
Martin Ender
1
Sind die eingegebenen Zahlen ganze Zahlen?
Randomra

Antworten:

6

Pyth, 6 Bytes

haDQSE

Testsuite

In der folgenden Form auf STDIN eingeben:

num
array

Erläuterung:

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
quelle
6

Ruby, 34 Bytes

->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
Türknauf
quelle
1
Ich glaube, Sie brauchen kein #sort, da min_by es bereits von min nach max sortiert. So kann es noch kürzer sein:->n,a{a.min_by{|x|(n-x).abs}}
TiSer
4

Mathematica, 12 Bytes

Min@*Nearest

Eingebaute FTW! Buettners Erklärung: "Mathematica hat eine eingebaute Funktion Nearest, die jedoch eine Liste aller verknüpften Zahlen zurückgibt. Daher müssen wir sie komponieren Min, um das Band zu durchbrechen."

LegionMammal978
quelle
7
Dafür bekomme ich eine Erklärung ...
Martin Ender
1
Könnten Sie ein "Online ausprobieren" hinzufügen?
AlexINF
1
@ Alex82 Scheint unwahrscheinlich für Mathematica (was proprietär ist).
Martin Ender
3

Pyth, 8 Bytes

hS.mabQE

Erläuterung

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

Probieren Sie es online!

Blau
quelle
2

JavaScript ES6, 64 56 54 Bytes

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

Probieren Sie es online aus

Vielen Dank an @Niel für das Speichern von zwei Bytes

Testschnipsel:

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>

undlrc
quelle
Speichern Sie 2 Bytes, indem Sie die Sortierungen kombinieren:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil
Sie können durch ein Byte speichern currying Ihre Funktion: i=>a=>...dann f(i)(a)ist , wie Sie es nennen.
Patrick Roberts
@PatrickRoberts In diesem Fall würde ich nein sagen, weil OP nach einer Funktion (oder einer Simulation) fragt, die Werte annimmt: inputund eine Liste / ein Array / ... als Ganzzahlen
andlrc
2

Gelee, 7 6 Bytes

ạżṛỤḢị

Probieren Sie es online!

Wie es funktioniert

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

MATL , 10 Bytes

Sti-|4#X<)

Probieren Sie es 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
quelle
1

Python 2, 56 Bytes

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

Erhält zuerst die Zielnummer a=input()- diese muss in einer Variablen gespeichert werden.

Es sortiert dann die Eingabe mit der lambda x:abs(a-x)angewendeten Funktion (think map(lambda x:abs(a-x), input()))

Bei doppelten Werten wird dann der Mindestwert verwendet

Blau
quelle
0

TeaScript, 10 Bytes

T#(y-l)a)░

TeaScript unterstützt keine Array-Eingaben. Führen Sie daher in der Konsole TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)Folgendes aus:

Erläuterung

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

R, 42 Bytes

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

Haskell, 38 Bytes

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

Anwendungsbeispiel: 2 # [1,5,3]-> 1.

Für jedes Element in der Eingabeliste lein Paar der absoluten Differenz des Elements mit der Eingangsnummer machen eund das Elemente selbst, zum Beispiel e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Finden Sie das Minimum und verwerfen Sie die Differenz.

nimi
quelle
0

zsh, 75 73 71 70 67 Bytes

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

Erwartet Eingaben als Befehlszeilenargumente.

Beachten Sie, dass die vier Leerzeichen im echoeigentlich eine Registerkarte sein sollen, Stack Exchange jedoch Tabulatoren in Leerzeichen in allen Posts konvertiert.

Aufgrund der for Syntax nicht Bash-kompatibel .

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)

Danke an dev-null für 2 Bytes!

Türknauf
quelle
0

Perl 6 , 31 Bytes

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

Verwendung:

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
quelle