รับค่าที่ใกล้เคียงที่สุดกับตัวเลข


16

ในกอล์ฟรหัสนี้คุณจะต้องได้รับหมายเลขที่ใกล้เคียงที่สุดจากรายการอื่นในรายการ

ผลลัพธ์อาจเป็นจำนวนที่ใกล้เคียงที่สุดกับอินพุต

ตัวอย่าง:

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

และโปรแกรมอาจทำงานกับตัวเลขติดลบ

ตัวอย่าง:

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


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

กฎ:

ดังที่ได้กล่าวมาก่อนหน้านี้มันจะต้องทำงานกับตัวเลขติดลบ

หากมีสองคำตอบ (ตัวอย่าง: 0 - [5, -5]) โปรแกรมจะให้ความสำคัญกับจำนวนต่ำสุด (-5)

นี่คือรหัสกอล์ฟเพื่อให้รหัสที่สั้นที่สุดชนะ!


6
มันให้ความสำคัญกับตัวเลขที่ต่ำกว่าที่ควรกล่าวถึงในกฎ
เดนนิส

หากหมายเลขเป้าหมายมีอยู่ในรายการเอาต์พุตควรเป็นหมายเลขนั้นหรือหมายเลขอื่นที่ใกล้เคียงที่สุดจากรายการ?
trichoplax

ฉันรู้ว่าคำตอบที่ยอมรับคือชั่วขณะ
AlexINF

4
@ Alex82 แน่นอนคุณรู้ว่าคุณจะเปลี่ยนคำตอบที่ยอมรับได้ถ้ามีคนที่ดีกว่าเข้ามา แต่บางคนถูกท้าทายด้วยคำตอบที่ได้รับการยอมรับอยู่แล้ว ดังนั้นน้อยเกี่ยวกับว่าการยอมรับ แต่เนิ่นๆจริงหรือไม่ แต่ผู้คนจะได้รับความประทับใจที่ผิด
Martin Ender

1
เป็นจำนวนเต็มจำนวนอินพุตหรือไม่
randomra

คำตอบ:


6

Pyth, 6 ไบต์

haDQSE

ชุดทดสอบ

ป้อนข้อมูลในแบบฟอร์มต่อไปนี้บน STDIN:

num
array

คำอธิบาย:

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 ไบต์

->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
ฉันคิดว่าคุณไม่ต้องการ #sort เนื่องจาก min_by จะเรียงลำดับจากขั้นต่ำเป็นสูงสุดแล้ว ดังนั้นจึงสามารถสั้นกว่านี้ได้:->n,a{a.min_by{|x|(n-x).abs}}
TiSer

4

Mathematica ขนาด 12 ไบต์

Min@*Nearest

FTW ในตัว! คำอธิบายของ Buettner: "Mathematica มีการติดตั้งภายในเครื่องNearestแต่จะส่งคืนรายการหมายเลขที่เชื่อมโยงทั้งหมดดังนั้นเราจำเป็นต้องเขียนด้วยMinเพื่อแยกการผูก"


7
นั่นคือสิ่งที่ฉันได้รับการเขียนคำอธิบาย ...
มาร์ตินเอนเดอร์

1
คุณสามารถเพิ่ม "ลองออนไลน์ได้ไหม"
AlexINF

1
@ Alex82 ดูเหมือนว่าไม่น่าจะเป็น Mathematica (ซึ่งเป็นกรรมสิทธิ์)
Martin Ender

@ Alex82 ทดสอบที่นี่: lab.open.wolframcloud.com/app/view/newNotebook?ext=nb
thedude


2

JavaScript ES6, 64 56 54 ไบต์

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

ลองออนไลน์

ขอบคุณ@Nielสำหรับการบันทึกสองไบต์

ตัวอย่างการทดสอบ:

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>


ประหยัด 2 ไบต์โดยรวมสิ่งต่าง ๆ :(i,a)=>a.sort((a,b)=>s(i-a)-s(i-b)||a-b,s=Math.abs)[0]
Neil

คุณสามารถบันทึกไบต์โดยความดีความชอบการทำงานของคุณ: i=>a=>...แล้วf(i)(a)เป็นวิธีที่คุณเรียกมันว่า
Patrick Roberts เมื่อ

@PatrickRoberts ในกรณีนี้ฉันจะบอกว่าไม่เพราะ OP กำลังขอฟังก์ชั่น (หรือ simulere) ที่ใช้กับค่า: inputและรายการ / array / ... เป็นจำนวนเต็ม
andlrc

2

เยลลี่, 7 6 ไบต์

ạżṛỤḢị

ลองออนไลน์!

มันทำงานอย่างไร

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

Python 2, 56 ไบต์

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

รับหมายเลขเป้าหมายก่อนa=input()- สิ่งนี้จะต้องเก็บไว้ในตัวแปร

จากนั้นจะเรียงลำดับอินพุตด้วยฟังก์ชันที่lambda x:abs(a-x)ใช้ (คิดmap(lambda x:abs(a-x), input()))

จากนั้นใช้ค่าต่ำสุดในกรณีที่มีค่าซ้ำกัน


0

TeaScript ขนาด 10 ไบต์

T#(y-l)a)░

TeaScript ไม่รองรับอินพุตอาร์เรย์ดังนั้นในการเรียกใช้คอนโซล: TeaScript("T#y-la)░", [[1, 2, 3], 1], {}, TEASCRIPT_PROPS)ไปยัง Runthis

คำอธิบาย

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


0

Haskell, 38 ไบต์

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

ตัวอย่างการใช้งาน: ->2 # [1,5,3]1

สำหรับองค์ประกอบในรายการป้อนข้อมูลแต่ละlทำให้คู่ของความแตกต่างแน่นอนขององค์ประกอบที่มีจำนวนอินพุตeและองค์ประกอบของตัวเองเช่นe=2, ->l=[1,5,3] [(1,1),(3,5),(1,3)]ค้นหาขั้นต่ำและทิ้งความแตกต่าง


0

zsh, 75 73 71 70 67 ไบต์

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

ต้องการอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

โปรดทราบว่าช่องว่างทั้งสี่ใน echoนั้นควรจะเป็นแท็บจริงๆ แต่ Stack Exchange จะแปลงแท็บเป็นช่องว่างในโพสต์ทั้งหมด

ไม่รองรับ Bash เนื่องจากfor ไวยากรณ์

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)

ขอบคุณdev-nullสำหรับ 2 ไบต์!


0

Perl 6 , 31 ไบต์

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

การใช้งาน:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.