প্রদত্ত অ্যারেতে নিকটতম সংখ্যাটি সন্ধান করুন


21

এটি আমার আসল বিশ্ব সমস্যা থেকে অনুপ্রাণিত। আমি এই বিষয়ে কোন চালাক উপায় আছে কিনা তা জানতে আগ্রহী

আপনাকে দুটি অরসোর্টেড অ্যারে, এ এবং বি দেওয়া হবে, প্রতিটি ফ্লোটের একটি স্বেচ্ছাসেবী সংখ্যার সমন্বিত। অ এবং বি এর সমান দৈর্ঘ্য নেই। একটি ক্রিয়া লিখুন যা ক্রমানুসারে A এর উপাদানগুলি গ্রহণ করে এবং অ্যারে বিতে নিকটতম মানটি আবিষ্কার করে ফলাফলটি একটি নতুন অ্যারেতে অন্তর্ভুক্ত থাকতে হবে।

জয়ের শর্ত

সংক্ষিপ্ততম কোড জয় (যথারীতি)।


1
নিকটতম পূর্ণসংখ্যার বৃত্তাকার?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ আমি পড়লাম "A এর প্রতিটি উপাদানকে বি এর নিকটতম উপাদানকে গোল করে"
জন ডিভোরাক

@ জনডভোরাক: আচ্ছা, আমি গোলাকার দিক সম্পর্কে অংশটি বুঝতে পারি, তবে সমস্যাটি কতগুলি সংখ্যা নির্দিষ্ট করে নি।
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ নিকটতম ফ্লোট থেকে রাউন্ড। উত্তরটি অ্যারে / তালিকা বি থেকে ভেসে
উঠতে হবে

1
A এবং B অ্যারে বাছাই করা হবে?
স্তর নদী সেন্ট

উত্তর:


17

এপিএল, 13 17

(ইউটিএফ -8 এ 21 বাইট)

B[{↑⍋|⍵-B}¨A]

আপনি যদি সত্যিকারের ল্যাম্বদা চান (A বাম আর্গুমেন্ট হিসাবে এবং বি ডানদিকে):

{⍵[⍺{↑⍋|⍺-⍵}¨⊂⍵]}

কিভাবে এটা কাজ করে:

{...}¨Aল্যাম্বডা ফাংশনটি {...}প্রতি A মান (পরিবর্তে অ্যারে হিসাবে প্রার্থনা করার পরিবর্তে) এর সাথে অনুরোধ করে ফলাফলগুলি একই আকারের অ্যারে সংগ্রহ করে

|⍵-B আর্গুমেন্ট between এবং সমস্ত বি এর মধ্যে পার্থক্যের পরম মানেরগুলিকে গণনা করে (- বিয়োগফল, | অ্যাবস হয়)।

↑⍋ সর্বনিম্ন মৌলটির সূচি নেয় (ar অ্যারে রিটার্নিং সূচকগুলি সাজানো, প্রথম উপাদান পান)

B[...] কেবলমাত্র সূচি (এস) দ্বারা উপাদান (গুলি) আনছে।

সমাধানটি বেশ দৃ .়তর, এটি এপিএল এর বাছাই ফাংশন রিটার্নিং ক্রমুয়েশন ভেক্টর (মূল অ্যারে অনুসারে উপাদানগুলির সূচকগুলি সাজানো) এর পরিবর্তে দুর্দান্ত সাজানোর পরিবর্তে দুর্দান্ত বৈশিষ্ট্য ব্যবহার করে।


কিভাবে কাজ করে?
জন ডিভোরাক

উত্তরে
বর্ণিত

পৃথিবীতে আপনি কীভাবে এটি লিখতে জানেন?
মার্টিজন

এটি চাইনিজ লেখার মতো। আমার জন্য, এলিয়েন শব্দ বা এলিয়েন চরিত্রগুলি লেখার কোনও বড় পার্থক্য নেই ...
ভোভানিয়াম

17

গণিত - 17

#&@@@Nearest@A/@B

এটা কিভাবে কাজ করে? হ্যাঁ, আমি স্বীকার করেছি যে এখানে কিছুটা প্রতারণা করা হচ্ছে কারণ গণিতের নিকটতম কার্যকারিতা রয়েছে। বাকিগুলি সোজা এবং 1D অ্যারেতে ফলাফলটি সাজানোর সাথে সম্পর্কিত। এটিকে ছোট করার অতিরিক্ত প্রচেষ্টা করার কারণে এটি কেবল কুরুচিপূর্ণ দেখাচ্ছে।


1
হা! স্বাগত! :)
ডঃ বেলিসারিয়াস

6

সি # - 103 97 87 বাইট

আমি এই প্রশ্নটি সঠিকভাবে বুঝতে পেরেছি কিনা তা সম্পর্কে আমি নিশ্চিত নই তবে যাইহোক এখানেই আমার সমাধান। আমি অ্যারের পরিবর্তে তালিকাগুলি ব্যবহার করেছি, কারণ এটি আমাকে সংক্ষিপ্ত কোড লেখার অনুমতি দেয়।

একটি পূর্ণসংখ্যার অ্যারে পূর্ণসংখ্যার তালিকার চেয়ে ছোট।

ইনপুট:

t(new int[] { 0, 25, 10, 38 }, new int[] { 3, 22, 15, 49, 2 });

পদ্ধতি:

void t(int[]a,int[]b){var e=a.Select(c=>b.OrderBy(i=>Math.Abs(c-i)).First()).ToArray();

আউটপুট:

2, 22, 15, 49

যদি আমার উত্তরটি সঠিক না হয় তবে দয়া করে এটির নীচে একটি মন্তব্য দিন।

সম্পাদনা: @ গ্রাফিক্স যেমন উল্লেখ করেছেন, প্রশ্ন এখন ভাসমানদের নিয়ে। তাই আমি তার উত্তরটিও অন্তর্ভুক্ত করতে চাই।

95 বাইট (গ্রাক্সের উত্তর)

float[]t(float[]a,float[]b){return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}

তালিকাগুলিও ঠিক আছে।
অরহিম

1
পুনরায় নামকরণ itemকরুন iএবং আপনি 6 অতিরিক্ত অক্ষর নিরাপদে রাখবেন;)
অ্যাসক্র্যাট

@ অ্যাশক্র্যাট আপনাকে অনেক ধন্যবাদ!
tsavinho

3
1. ফাংশনটি নতুন মানটি ফিরিয়ে আনতে বিশেষভাবে বলে না, তবে আমি মনে করি আপনার উচিত। ২. যেহেতু প্রশ্নটি float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
ভাসার

@ গ্র্যাক্স আমি যখন আমার প্রথম উত্তরটি লিখেছিলাম, প্রশ্নটি ভাসমানদের বিষয়ে নয়। যেহেতু প্রশ্নটি আপডেট হয়েছে, আমি আপনার উত্তরটিও অন্তর্ভুক্ত করেছি। আপনাকে অনেক ধন্যবাদ.
tsavinho

5

আর, 41 অক্ষর

B[apply(abs(outer(A,B,`-`)),1,which.min)]

ব্যাখ্যা:

outer(A,B,`-`)A এর প্রতিটি এলিমেন্টের x এর জন্য পার্থক্য করে x-Bএবং ফলাফলকে ম্যাট্রিক্স (মাত্রার দৈর্ঘ্যের (A) x দৈর্ঘ্য (B)) হিসাবে আউটপুট করে।
which.minসর্বনিম্ন সংখ্যার সূচকটি বেছে নিয়েছে। ম্যাট্রিক্সের প্রতিটি সারিতে
apply(x, 1, f)ফাংশন প্রয়োগ করে । সুতরাং এ এর প্রতিটি উপাদান এবং ভেক্টর বি এর উপাদানগুলির মধ্যে সর্বনিম্ন পরম পার্থক্য সূচকগুলি প্রদান করেfx
apply(abs(outer(A,B,`-`)),1,which.min)

ব্যবহার:

> A <- runif(10,0,50)
> B <- runif(10,0,50)
> A
[1] 10.0394987 23.4564467 19.6667152 36.7101256 47.4567670 49.8315028  2.1321263 19.2866901  0.7668489 22.5539178
> B
[1] 44.010174 32.743469  1.908891 48.222695 16.966245 23.092239 24.762485 30.793543 48.703640  6.935354
> B[apply(abs(outer(A,B,`-`)),1,which.min)]
[1]  6.935354 23.092239 16.966245 32.743469 48.222695 48.703640  1.908891 16.966245  1.908891 23.092239

5

সিজেম - 14

q~
f{{1$-z}$0=\;}
p

প্রধান কোডটি দ্বিতীয় লাইনে রয়েছে, বাকিটি স্ট্যান্ডার্ড ইনপুট এবং সুন্দর আউটপুট ব্যবহারের জন্য।

এটি http://cjam.aditsu.net/ এ চেষ্টা করুন

ব্যাখ্যা:

q~ইনপুটটি
f{...}প্রথম অ্যারে এবং পরের অবজেক্টের (যা দ্বিতীয় অ্যারে) প্রতিটি উপাদানের জন্য ব্লকটি কার্যকর করে এবং মূল্যায়ণ করে প্রতিটি অ্যারের
{...}$জন্য একটি কী গণনা করার জন্য ব্লকের সাহায্যে দ্বিতীয় অ্যারেটি ফলাফল সংগ্রহ
1$করে বর্তমান কপি করে প্রথম অ্যারের
-zবিয়োগফলের আইটেমটি পরে নিরঙ্কুশ মানটি
0=বাছাই করা অ্যারের প্রথম মান নেয় (সর্বনিম্ন কী সহ একটি)
\;প্রথম অ্যারে থেকে আইটেমটি বাতিল
pকরে ফলাফলের স্ট্রিং উপস্থাপনা মুদ্রণ করে

উদাহরণ (অন্যান্য উত্তর থেকে অনুপ্রাণিত):

ইনপুট: [10.1 11.2 12.3 13.4 9.5] [10 12 14]
আউটপুট:[10 12 12 14 10]

ইনপুট: [0 25 10 38] [3 22 15 49 2]
আউটপুট:[2 22 15 49]


4

জাভাস্ক্রিপ্ট (E6) 54 56 59

হ্রাস করুন দূরত্ব। অ্যাবসের পরিবর্তে স্কোয়ার ব্যবহার করে কেবল অক্ষর সংরক্ষণ করুন। বীজগণিত
সম্পাদনা করুন ... অকেজো অ্যাসাইনমেন্টটি ঠিক
করুন (ফাংশনের সংজ্ঞা ডাব্লু / ও এর একটি পরীক্ষার বাকী)

F=(A,B)=>A.map(a=>B.sort((x,y)=>x*x-y*y+2*a*(y-x))[0])

ছিল F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])

পরীক্ষা

F([10.1, 11.2, 12.3, 13.4, 9.5],[10, 12, 14])

ফলাফল: [10, 12, 12, 14, 10]


1
D=প্রয়োজন নেই, হিসাবে mapনতুন অ্যারে প্রদান করে। বিকল্প (একই দৈর্ঘ্য) সাজানোর ক্রিয়া:(x,y)=>(x-=a)*x-(y-=a)*y
nderscore

4

পাইথন 3.x - 55 টি অক্ষর

f=lambda a,b:[min((abs(x-n),x)for x in b)[1]for n in a]

aএবং bইনপুট অ্যারে হয় এবং কাঙ্ক্ষিত অ্যারে হ'ল অভিব্যক্তির ফলাফল।


আমি উত্তরটি সম্পাদনা করে এটিকে একটি ফাংশন হিসাবে তৈরি করেছি কারণ প্রশ্নটির একটি ফাংশন প্রয়োজন requires
ব্যবহারকারী 80551

3

হাস্কেল, 55

c a b=[[y|y<-b,(y-x)^2==minimum[(z-x)^2|z<-b]]!!0|x<-a]

প্রথমদিকে, আমি ব্যবহার করার কথা ভেবেছিলাম minimumByএবং comparing, তবে যেহেতু এগুলি প্রিলেডে নেই, তাদের যোগ্যতা অর্জনের জন্য এটি একটি টন অক্ষর নিয়েছে। একটি চরিত্র শেভ করতে অন্য কিছু উত্তর থেকে স্কোয়ারিং আইডিয়াটিও চুরি করেছে।


3

পাওয়ারশেল - 44

$a|%{$n=$_;($b|sort{[math]::abs($n-$_)})[0]}

উদাহরণ

সাথে $aএবং $bসেট করা:

$a = @(36.3, 9, 50, 12, 18.7, 30)
$b = @(30, 10, 40.5, 20)

আউটপুট হয়

40.5, 10, 40.5, 10, 20, 30

এটি উদাহরণস্বরূপ আপনি এটি ভাসমান পরিচালনাও করতে পারেন তা উদাহরণস্বরূপ ভাসমানগুলি ব্যবহার করতে পারেন
bebe

@bebe - ধন্যবাদ, এটি পরিষ্কার করার জন্য আপডেট হয়েছে।
রিন্যান্ট

-3 বাইট:$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
মিজি

2

রুবি, 40

f=->a,b{a.map{|x|b.min_by{|y|(x-y)**2}}}

পাইথন উত্তর হিসাবে একই, কিন্তু স্কোয়ারিং আমি নিরঙ্কুশ মান গ্রহণ করার জন্য যেভাবেই ভাবতে পারি তার চেয়ে কিছুটা ক্ষুদ্র।


2

পাইথ - 12 11 বাইট

দ্রষ্টব্য: পাইথ এই চ্যালেঞ্জের চেয়ে অনেক কম বয়সী, সুতরাং এই উত্তরটি জয়ের যোগ্য নয়।

সহজ পদ্ধতি, oন্যূনতম দূরত্ব পেতে অর্ডার ফাংশনটি ব্যবহার করে এবং mতালিকাটির উপরে এটিএসস করে a

mho.a-dNQvz

m    vz    Map over evaled first input and implicitly print
 ho Q      Minimal mapped over evaled second input
  .a-      Absolute difference
   d       Lambda param 1
   b       Lambda param 2

এটি এখানে অনলাইনে চেষ্টা করুন


@ জাকুব ওহ হ্যাঁ, দুঃখিত।
মালটিসেন 7'15

2

টিআই-বেসিক, 24

∟A+seq(min(∟B+i²∟A(N)),N,1,dim(∟A

এপিএলের কাছাকাছি আসে না, তবে কম শক্তিশালী ফাংশন ব্যবহার করে - এটি কোনও "সাজানো" বা "সর্বনিম্ন সূচক" ফাংশন ব্যবহার করে না। এখানে টিআই-বেসিকের অসুবিধা হ'ল এটির কার্যকারিতা এবং বহুমাত্রিক অ্যারেগুলির অভাব।

Ungolfed:

seq(       ,N,1,dim(∟A           #Sequence depending on the Nth element of list A
    ∟A(N)+min(   +0i)            #Number with minimum absolute value, add to ∟A(N)
              ∟B-∟A(N)           #Subtracts Nth element of ∟A from all elements of B

মিনিটের জন্য (ফাংশন দুই আচরণে রয়েছে: যখন বাস্তব সংখ্যা বা তালিকা সঙ্গে ব্যবহার করা হয়, এটা ক্ষুদ্রতম মান দেয়, যাইহোক, যখন জটিল সংখ্যা বা তালিকা সঙ্গে ব্যবহার করা হয়, এটা ক্ষুদ্রতম পরম মান মান দেয় যোগ করা হচ্ছে। 0iঅথবা গুন i^2কারণ ব্যাখ্যাকারী করতে দ্বিতীয় আচরণ ব্যবহার করেন, তাই min(1,-2)আয় -2যেহেতু min(1+0i,-2+0i)আয় 1


1

ফরট্রান 90: 88

function f();integer::f(size(a));f(:)=[(b(minloc(abs(a(i)-b))),i=1,size(a))];endfunction

এটি containএকটি সম্পূর্ণ প্রোগ্রামের মধ্যে এডিট করা প্রয়োজন :

program main
   real :: a(5), b(3)
   integer :: i(size(a))
   a = [10.1, 11.2, 12.3, 13.4, 9.5]
   b = [10, 12, 14]
   i = f()
   print*,i
 contains
   function f()
     integer :: f(size(a))
     f(:)=[(b(minloc(abs(a(i)-b))),i=1,size(a))]
   end function
end program main

স্কোয়ার ধনুর্বন্ধনীগুলি (...,i=)একটি আবদ্ধ doলুপ উপস্থাপন করার সময় একটি অ্যারে ঘোষণা করে ; তারপরে আমি bযার উপাদানটি a(i)-bহ্রাস করা হয় তার মানটি ফিরিয়ে দেব ।


1

মতলব: 48

f=@(a)B(abs(B-a)==min(abs(B-a)));C=arrayfun(f,A)

ধরে নিই যে Aএবং ওয়ার্ক স্পেসে B1 ডি ম্যাট্রিক রয়েছে, চূড়ান্ত ফলাফলটি Cওয়ার্কস্পেসে। এটি সম্ভবত পাশাপাশি অক্টোবায়ও কাজ করবে। শর্তাধীন ইন্ডেক্সিং এটি মোটামুটি তুচ্ছ করে তোলে।


0

সি 144 163

#define f float
f T, *C, m;
f *q(f *A, f *B, int S, f s)
{
    if(m) 
        return abs(T - *A) - abs(T - *B);
    for ( 
        C = malloc(S * 4);
        m = S--;
        C[S] = *B
    ) 
        T = A[S], 
        qsort(B, s, 4, q);
    return C;
}

ঠিক আছে ... আমি মনে করি এই ছোট কোডটির ব্যাখ্যা দরকার।

প্রথমে আমি নূন্যতম পার্থক্যের সন্ধান করার জন্য দুটি স্তরের লুপ দিয়ে কাজটি করার চেষ্টা করেছি এবং বর্তমান মানটি বি এর মানকে ন্যূনতম এ সেট করব। এটা খুব বেসিক।

Qsort এবং একটি তুলনামূলক ফাংশন দিয়ে একই জিনিস পৌঁছে যেতে পারে । আমি এটিকে বি এর উপাদানগুলির পরিবর্তে পার্থক্য অনুসারে বাছাই করি। এই জাতীয় অ্যালগরিদমের জন্য অনেকগুলি ফাংশন। সুতরাং ফাংশন q এখন দুটি উদ্দেশ্য পরিবেশন করে। প্রথমদিকে, এটি নিজেই অ্যালগরিদম, দ্বিতীয়ত (যখন কুইসোর্ট এটিকে কল করে) একটি তুলনামূলক। দুই রাষ্ট্রের মধ্যে যোগাযোগের জন্য, আমাকে বিশ্বব্যাপী ঘোষণা করতে হয়েছিল।

মিটার এটি তুলনামূলক রাজ্যে বা প্রধান এক হিসাবে দাঁড়িয়েছে for

উদাহরণ:

float A[] = {1.5, 5.6, 8.9, -33.1};
float B[] = {-20.1, 2.2, 10.3};
float *C;

C = q(A, B, sizeof(A)/sizeof(*A), sizeof(B)/sizeof(*B));
// C holds 2.2,2.2,10.3,-20.1

166/163 শ্বেতক্ষেত্র গণনা করে না?
কাইল কানোজ

অবশ্যই না. স্পেস এবং নিউলাইনগুলি বোঝার সুবিধার জন্য।
বেবে

0

গল্ফস্ক্রিপ্ট, 49 বাইট

দ্রষ্টব্য: এটি একটি আংশিক সমাধান। আমি এটিকে একটি সম্পূর্ণ সমাধান তৈরিতে কাজ করছি

{{\.@\.[.,,\]zip@{[\~@-abs]}+%{~\;}$0=0==}%\;}:f;

হ্যাঁ। গল্ফস্ক্রিপ্ট ভাসমান পয়েন্টকে সমর্থন করে। এখানে চেষ্টা করে দেখুন । উদাহরণ:

# B is [-20.1 2.2 10.3]
[-201 10 -1?*
22 10 -1?*
103 10 -1?*]

# A. No floating point numbers allowed here.
# This is because 1.5{}+ (where the 1.5 is a
# single floating point number, not 1.5,
# which would be 1 1 5) results in the block
# {1.5 }, which leads to 1 1 5 when executed
[1 5 9 -30]

আউটপুট:

[2.2 2.2 10.3 -20.1]

0

সি # 262

প্রোগ্রামটি ন্যূনতম পার্থক্য সন্ধান করে এবং অ্যারে বি থেকে নিকটতম মান সংরক্ষণ করে shortly

List<float> F(List<float> a, List<float> b)
{
List<float> c = new List<float>();
float diff,min;
int k;
for(int i=0; i<a.Count;i++)
{
diff=0;
min=1e6F;
k = 0;
for(int j=0; j<b.Count;j++)
{
diff = Math.Abs(a[i] - b[j]);
if (diff < min)
{
min = diff;
k = j;
}
}
c.Add(b[k]);
}
return c;
}

পরীক্ষার কোড সহ সম্পূর্ণ প্রোগ্রাম

using System;
using System.Collections.Generic;
public class JGolf
{
    static List<float> NearestValues(List<float> a, List<float> b)
    {
        List<float> c = new List<float>();
        float diff,min;
        int k;
        for(int i=0; i<a.Count;i++)
        {
            diff=0;
            min=1e6F;
            k = 0;
            for(int j=0; j<b.Count;j++)
            {
                diff = Math.Abs(a[i] - b[j]);
                if (diff < min)
                {
                    min = diff;
                    k = j;
                }
            }
            c.Add(b[k]);
        }
        return c;
    }

    public static void Main(string[] args)
    {
        List<float> A = RandF(8413);
        Console.WriteLine("A");
        Print(A);
        List<float> B = RandF(9448);
        Console.WriteLine("B");
        Print(B);

        List<float> d = JGolf.NearestValues(A, B);
        Console.WriteLine("d");
        Print(d);
        Console.ReadLine();
    }

    private static List<float> RandF(int seed)
    {
        Random r = new Random(seed);
        int n = r.Next(9) + 1;
        List<float> c = new List<float>();
        while (n-- > 0)
        {
            c.Add((float)r.NextDouble() * 100);
        }
        return c;
    }

    private static void Print(List<float> d)
    {
        foreach(float f in d)
        {
            Console.Write(f.ToString()+", ");
        }
    }
}

0

সি #: 120

লিনক দুর্দান্ত:

float[] t(float[] A, float[] B){return A.Select(a => B.First(b => Math.Abs(b-a) == B.Min(c=>Math.Abs(c-a)))).ToArray();}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.