Obtenga el valor más cercano al número

16

En este código de golf, debe obtener el número más cercano de otro en una lista.

La salida puede ser el número más cercano a la entrada.

Ejemplo:

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

Y, el programa puede funcionar con números negativos.

Ejemplo:

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


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

REGLAS:

Como se mencionó anteriormente, tiene que trabajar con números negativos.

Si hay dos respuestas (Ejemplo: 0 - [5, -5]), el programa da prioridad al número más bajo. (-5)

Este es el código de golf, por lo que gana el código más corto.

AlexINF
fuente
66
da prioridad a los números más bajos que deberían mencionarse en las reglas.
Dennis
Si el número objetivo está presente en la lista, ¿la salida debería ser ese número o el otro número más cercano de la lista?
trichoplax
Lo sé, la respuesta aceptada es temporal.
AlexINF
44
@ Alex82 Claro, usted sabe que cambiará la respuesta aceptada si llega una mejor, pero algunas personas se desaniman por los desafíos que ya tienen una respuesta aceptada, porque desafortunadamente no todos los autores de los desafíos están tan atentos a las respuestas tardías. Por lo tanto, se trata menos de si aceptar temprano es realmente malo, sino de si las personas tendrán una impresión equivocada.
Martin Ender
1
¿Los números de entrada son enteros?
randomra

Respuestas:

6

Pyth, 6 bytes

haDQSE

Banco de pruebas

Ingrese el siguiente formulario en STDIN:

num
array

Explicación:

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
fuente
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
Pomo de la puerta
fuente
1
Creo que no necesita #sort, ya que min_by ya lo ordenará de min a max. Entonces, puede ser aún más corto:->n,a{a.min_by{|x|(n-x).abs}}
TiSer
4

Mathematica, 12 bytes

Min@*Nearest

FTW incorporado! La explicación de Buettner: "Mathematica tiene una función incorporada Nearestpara esto, pero devuelve una lista de todos los números empatados. Por lo tanto, necesitamos componerlo Minpara romper el empate".

LegionMammal978
fuente
77
Eso es lo que obtengo por escribir una explicación ...
Martin Ender
1
¿Podría agregar un "Pruébelo en línea"?
AlexINF
1
@ Alex82 Parece poco probable para Mathematica (que es propietario).
Martin Ender
@ Alex82 Pruébelo aquí: lab.open.wolframcloud.com/app/view/newNotebook?ext=nb
thedude
3

Pyth, 8 bytes

hS.mabQE

Explicación

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

Pruébalo en línea!

Azul
fuente
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]

Pruébalo en línea

Gracias a @Niel por guardar dos bytes

Fragmento de prueba:

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
fuente
Ahorre 2 bytes combinando los tipos:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil
Puede guardar un byte al cursar su función: i=>a=>...así f(i)(a)es como lo llama.
Patrick Roberts
@PatrickRoberts En este caso, diría que no, porque OP está pidiendo una función (o simulere) que tome los valores: inputy una lista / matriz / ... como enteros
andlrc
2

Jalea, 7 6 bytes

ạżṛỤḢị

Pruébalo en línea!

Cómo funciona

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

MATL , 10 bytes

Sti-|4#X<)

Pruébalo en línea!

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
fuente
1

Python 2, 56 bytes

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

Obtiene el número objetivo primero a=input() ; debe almacenarse en una variable.

Luego ordena la entrada con la función lambda x:abs(a-x)aplicada (piensemap(lambda x:abs(a-x), input()) )

Luego toma el valor mínimo en caso de valores duplicados

Azul
fuente
0

TeaScript, 10 bytes

T#(y-l)a)░

TeaScript no admite la entrada de matriz, por lo que en la ejecución de la consola: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS) esto.

Explicación

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

R, 42 bytes

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

Haskell, 38 bytes

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

Ejemplo de uso: 2 # [1,5,3]-> 1.

Para cada elemento en la lista de entrada, lhaga un par de la diferencia absoluta del elemento con el número de entrada ey el elemento en sí, por ejemplo e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Encuentra el mínimo y descarta la diferencia.

nimi
fuente
0

zsh, 75 73 71 70 67 bytes

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

Espera entrada como argumentos de línea de comando.

Tenga en cuenta que los cuatro espacios en el echo se supone que es una pestaña, pero Stack Exchange convierte las pestañas en espacios en todas las publicaciones.

No es compatible con Bash debido a la for sintaxis.

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)

¡Gracias a dev-null por 2 bytes!

Pomo de la puerta
fuente
0

Perl 6 , 31 bytes

{@^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
Brad Gilbert b2gills
fuente