Obter o valor mais próximo do número

16

Neste código de golfe, você precisa obter o número mais próximo de outro em uma lista.

A saída pode ser o número mais próximo da entrada.

Exemplo:

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

E, o programa pode funcionar com números negativos.

Exemplo:

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


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

REGRAS:

Como mencionado anteriormente, ele tem que trabalhar com números negativos.

Se houver duas respostas (exemplo: 0 - [5, -5]), o programa prioriza o número mais baixo. (-5)

Este é o código de golfe, então o código mais curto vence!

AlexINF
fonte
6
prioriza números mais baixos Isso deve ser mencionado nas regras.
Dennis
Se o número de destino estiver presente na lista, a saída deve ser esse número ou o outro número mais próximo da lista?
Trichoplax
Eu sei, a resposta aceita é temporal.
21416 AlexINF
4
@ Alex82 Claro, você sabe que mudará a resposta aceita se uma resposta melhor surgir, mas algumas pessoas se deixam levar por desafios que já têm uma resposta aceita, porque, infelizmente, nem todo autor de desafio está atento a respostas tardias. Portanto, é menos sobre se aceitar cedo é realmente ruim, mas se as pessoas terão uma impressão errada.
Martin Ender
1
Os números de entrada são inteiros?
Random # 14/16

Respostas:

6

Pitão, 6 bytes

haDQSE

Suíte de teste

Insira o seguinte formulário no STDIN:

num
array

Explicação:

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
fonte
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
Maçaneta da porta
fonte
1
Eu acho que você não precisa de #sort, já que min_by já o classifica de min para max. Portanto, pode ser ainda mais curto:->n,a{a.min_by{|x|(n-x).abs}}
TiSer 02/02
4

Mathematica, 12 bytes

Min@*Nearest

Built-ins FTW! A explicação de Buettner: "O Mathematica tem um built-in Nearestpara isso, mas retorna uma lista de todos os números empatados. Por isso, precisamos compor isso Minpara quebrar o empate".

LegionMammal978
fonte
7
Isso é o que eu recebo para escrever uma explicação ...
Martin Ender
1
Você poderia adicionar um "Experimente online"?
21416 AlexINF
1
@ Alex82 Parece improvável para o Mathematica (que é proprietário).
Martin Ender
3

Pitão, 8 bytes

hS.mabQE

Explicação

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

Experimente online!

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

Experimente online

Obrigado a @Niel por salvar dois bytes

Snippet de teste:

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
fonte
Guardar 2 bytes por combinar os tipos:(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil
Você pode salvar um byte fazendo um curry em sua função: i=>a=>...então f(i)(a)é como você o chama.
Patrick Roberts
@PatrickRoberts Neste caso, eu diria que não, porque OP está pedindo uma função (ou simulere) que leva a valores: inpute uma lista / array / ... como inteiros
andlrc
2

Geléia, 7 6 bytes

ạżṛỤḢị

Experimente online!

Como 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
fonte
1

MATL , 10 bytes

Sti-|4#X<)

Experimente 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
fonte
1

Python 2, 56 bytes

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

Obtém o número de destino primeiro a=input() - isso deve ser armazenado em uma variável.

Em seguida, classifica a entrada com a função lambda x:abs(a-x) aplicada (pense map(lambda x:abs(a-x), input()))

Em seguida, assume o valor mínimo no caso de quaisquer valores duplicados

Azul
fonte
0

TeaScript, 10 bytes

T#(y-l)a)░

O TeaScript não suporta entrada de matriz, portanto, na execução do console: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)para executar isso.

Explicação

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

R, 42 bytes

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

Haskell, 38 bytes

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

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

Para cada elemento da lista de entrada, lfaça um par da diferença absoluta do elemento com o número de entrada ee o próprio elemento, por exemplo e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Encontre o mínimo e descarte a diferença.

nimi
fonte
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 linha de comando.

Observe que os quatro espaços no echo verdade deveriam ser uma guia, mas o Stack Exchange converte as guias em espaços em todas as postagens.

Não é compatível com o Bash devido à for sintaxe.

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)

Graças a dev-null por 2 bytes!

Maçaneta da porta
fonte
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
fonte