Sayıya en yakın değeri al


16

Bu kod golf, bir listede başka bir numaradan en yakın numarayı almak gerekir.

Çıkış, girişe en yakın sayı olabilir.

Misal:

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

Ve program negatif sayılarla çalışabilir.

Misal:

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


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

KURALLAR:

Daha önce de belirtildiği gibi, negatif sayılarla çalışması gerekir.

İki cevap varsa (Örnek: 0 - [5, -5]), program en düşük sayıya öncelik verir. (-5)

Bu kod golf yani kısa kod kazanır!


6
kurallarda belirtilmesi gereken düşük sayılara öncelik verir .
Dennis

Hedef sayı listede varsa, çıktı bu sayı mı yoksa listeden en yakın diğer sayı mı olmalı?
trichoplax

Biliyorum, kabul edilen cevap geçicidir.
AlexINF

4
Alex82 Sure @, sen daha iyi biri gelir eğer kabul cevabı değiştirmeyi, biliyorum, ama bazı insanlar ne yazık ki her zorluk yazar sonlarında cevaplara bu özenli çünkü zaten kabul edilen bir cevabım var zorluklar tarafından ertelendi. Bu yüzden, erken kabul etmenin gerçekten kötü olup olmadığı daha az ama insanların yanlış izlenime sahip olup olmayacağı.
Martin Ender

1
Giriş numaraları tamsayılar mı?
randomra

Yanıtlar:


6

Pyth, 6 bayt

haDQSE

Test odası

STDIN üzerine aşağıdaki formu girin:

num
array

Açıklama:

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

Ruby, 34 bayt

->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
Sanırım #sort'a ihtiyacınız yok, çünkü min_by zaten min'den max'a sıralayacaktır. Yani, daha da kısa olabilir:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Mathematica, 12 bayt

Min@*Nearest

Dahili FTW! Buettner'ın açıklaması: "Mathematica'nın bunun için yerleşik bir yeri var Nearest, ancak tüm bağlı sayıların bir listesini döndürüyor Min.


7
Bir açıklama yazmak için aldığım şey budur ...
Martin Ender

1
"Çevrimiçi deneyin" i ekleyebilir misiniz?
AlexINF

1
@ Alex82 Mathematica'ya (muhtemelen tescilli) benzemiyor.
Martin Ender


3

Pyth, 8 bayt

hS.mabQE

açıklama

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

Çevrimiçi deneyin!


2

JavaScript ES6, 64 56 54 bayt

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

Çevrimiçi deneyin

@Niel'e iki bayt kaydettiği için teşekkürler

Test Parçacığı:

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>


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

Sen bir bayt kaydedebilirsiniz currying işlevinizi: i=>a=>...o zaman f(i)(a)diyorsunuz nasıl.
Patrick Roberts

@PatrickRoberts Bu durumda hayır diyebilirim, çünkü OP değerlere götüren bir fonksiyon (veya simulere) istiyor: inputve tamsayı olarak bir liste / dizi / ...
andlrc

2

Jöle, 7 6 bayt

ạżṛỤḢị

Çevrimiçi deneyin!

Nasıl çalışır

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

Sti-|4#X<)

Çevrimiçi deneyin!

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 bayt

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

Önce hedef numarayı alır a=input()- bu bir değişkente saklanmalıdır.

Daha sonra girişi lambda x:abs(a-x)uygulanan işlevle sıralar (düşün map(lambda x:abs(a-x), input()))

Daha sonra yinelenen değerler olması durumunda minimum değeri alır


0

TeaScript, 10 bayt

T#(y-l)a)░

TeaScript dizi girişini desteklemediğinden, konsolda şunu çalıştırın: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)runthis.

açıklama

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

0

R, 42 bayt

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

0

Haskell, 38 bayt

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

Kullanım örneği: 2 # [1,5,3]->1 .

Giriş listesindeki lher eleman için, giriş numarası eve elemanın kendisi ile elemanın mutlak farkının bir çiftini yapın , örneğin e=2, l=[1,5,3]-> [(1,1),(3,5),(1,3)]. Minimum değeri bulun ve farkı atın.


0

zsh, 75 73 71 70 67 bayt

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

Komut satırı bağımsız değişkenleri olarak girdi bekler.

Buradaki dört boşluğun echoaslında bir sekme olması gerektiğini, ancak Stack Exchange'in sekmeleri tüm yayınlardaki boşluklara dönüştürdüğünü unutmayın.

for Sözdizimi nedeniyle Bash uyumlu değil .

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)

2 bayt için dev-null'a teşekkürler !


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.