Ottieni il valore più vicino al numero


16

In questo codice golf, è necessario ottenere il numero più vicino da un altro in un elenco.

L'output può essere il numero più vicino all'ingresso.

Esempio:

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

E, il programma potrebbe funzionare con numeri negativi.

Esempio:

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


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

REGOLE:

Come accennato in precedenza, deve funzionare con numeri negativi.

Se ci sono due risposte (Esempio: 0 - [5, -5]), il programma dà la priorità al numero più basso. (-5)

Questo è il codice golf, quindi vince il codice più corto!


6
dà la priorità ai numeri più bassi che dovrebbero essere menzionati nelle regole.
Dennis,

Se il numero di destinazione è presente nell'elenco, l'output dovrebbe essere quel numero o l'altro numero più vicino dell'elenco?
trichoplax,

Lo so, la risposta accettata è temporale.
AlexINF,

4
@ Alex82 Certo, si sa che cambierai la risposta accettata se uno migliore entra, ma alcune persone sono messi fuori dalle sfide che hanno già una risposta accettata, perché purtroppo non ogni sfida dell'autore è che attenta alle risposte tardive. Quindi è meno se l'accettazione precoce sia effettivamente negativa, ma se le persone avranno l'impressione sbagliata.
Martin Ender,

1
I numeri di input sono numeri interi?
randomra,

Risposte:


6

Pyth, 6 byte

haDQSE

Suite di test

Immettere il seguente modulo su STDIN:

num
array

Spiegazione:

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

Rubino, 34 byte

->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
Penso che non ti serva #sort, poiché min_by lo ordinerà già da min a max. Quindi, può essere anche più breve:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Mathematica, 12 byte

Min@*Nearest

FTW integrato! Spiegazione di Buettner: "Mathematica ha un built-in Nearestper questo, ma restituisce un elenco di tutti i numeri collegati. Quindi, dobbiamo comporlo Minper spezzare il pareggio".


7
Questo è quello che ottengo scrivendo una spiegazione ...
Martin Ender,

1
Potresti aggiungere un "Provalo online"?
AlexINF,

1
@ Alex82 Sembra improbabile per Mathematica (che è proprietario).
Martin Ender,


3

Pyth, 8 byte

hS.mabQE

Spiegazione

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

Provalo online!


2

JavaScript ES6, 64 56 54 byte

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

Provalo online

Grazie a @Niel per aver salvato due byte

Snippet di prova:

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>


Salva 2 byte combinando i tipi:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil

È possibile salvare un byte per accattivarsi la vostra funzione: i=>a=>...allora f(i)(a)è come si chiama.
Patrick Roberts,

@PatrickRoberts In questo caso direi di no, perché OP sta chiedendo una funzione (o simulere) che porti ai valori: inpute un elenco / array / ... come numeri interi
NRC

2

Gelatina, 7 6 byte

ạżṛỤḢị

Provalo online!

Come funziona

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

Sti-|4#X<)

Provalo 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

1

Python 2, 56 byte

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

Ottiene innanzitutto il numero di destinazione a=input(): questo deve essere memorizzato in una variabile.

Quindi ordina l'ingresso con la funzione lambda x:abs(a-x)applicata (pensa map(lambda x:abs(a-x), input()))

Prende quindi il valore minimo in caso di valori duplicati


0

TeaScript, 10 byte

T#(y-l)a)░

TeaScript non supporta l'input di array, quindi nell'esecuzione della console: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)a runthis.

Spiegazione

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

0

R, 42 byte

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

0

Haskell, 38 byte

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

Esempio di utilizzo: 2 # [1,5,3]-> 1.

Per ogni elemento nell'elenco di input l crea una coppia della differenza assoluta dell'elemento con il numero di input ee l'elemento stesso, ad es e=2. l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Trova il minimo e scarta la differenza.


0

zsh, 75 73 71 70 67 byte

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

Prevede input come argomenti della riga di comando.

Si noti che i quattro spazi in echodovrebbero essere in realtà una scheda, ma Stack Exchange converte le schede in spazi in tutti i post.

Non compatibile con Bash a causa della for sintassi.

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)

Grazie a dev-null per 2 byte!


0

Perl 6 , 31 byte

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

Uso:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.