নিকটতম বৃহত্তর সংখ্যাটি সন্ধান করুন


30

কাজটি

পূর্ণসংখ্যার কোনও অ্যারে দেওয়া, যেমন:

[-1,476,578,27,0,1,-1,1,2]

এবং সেই অ্যারের সূচক (উদাহরণটি 0 ভিত্তিক সূচক ব্যবহার করে, যদিও আপনি 1 ভিত্তিক সূচকও ব্যবহার করতে পারেন )):

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]

তারপরে সেই সূচকের উপাদানের চেয়ে নিকটতম সংখ্যাটি ফিরুন । উদাহরণস্বরূপ, 1 এর চেয়ে বেশি নিকটতম সংখ্যা 27 (2 সূচক দূরে)।

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]
            ^
Nearest greater number

Output = 27

অনুমিতি

  • নিকটস্থ মোড়ানো অন্তর্ভুক্ত নয়।
  • প্রোগ্রামটি কখনই 1 দৈর্ঘ্যের অ্যারে দেওয়া হবে না (যেমন; [55])।
  • আপনাকে ধরে নিতে হবে প্রদত্ত উপাদানগুলির চেয়ে সর্বদা একটি সংখ্যা বড়।
  • যদি সমান দূরত্বে উপাদানের চেয়ে 2 টি সংখ্যা বেশি হয় তবে আপনি যে কোনও একটিতে ফিরে আসতে পারেন

আই / ও জোড়

Input:
Index = 45
Array = [69, 43, 89, 93, 62, 25, 4, 11, 115, 87, 174, 60, 84, 58, 28, 67, 71, 157, 47, 8, 33, 192, 187, 87, 175, 32, 135, 25, 137, 92, 183, 151, 147, 7, 133, 7, 41, 12, 96, 147, 9, 134, 197, 3, 107, 164, 90, 199, 21, 71, 77, 62, 190, 122, 33, 127, 185, 58, 92, 106, 26, 24, 56, 79, 71, 24, 24, 114, 17, 84, 121, 188, 6, 177, 114, 159, 159, 102, 50, 136, 47, 32, 1, 199, 74, 141, 125, 23, 118, 9, 12, 100, 94, 166, 12, 9, 179, 147, 149, 178, 90, 71, 141, 49, 74, 100, 199, 160, 120, 14, 195, 112, 176, 164, 68, 88, 108, 72, 124, 173, 155, 146, 193, 30, 2, 186, 102, 45, 147, 99, 178, 84, 83, 93, 153, 11, 171, 186, 157, 32, 90, 57, 181, 5, 157, 106, 20, 5, 194, 130, 100, 97, 3, 87, 116, 57, 125, 157, 190, 83, 148, 90, 44, 156, 167, 131, 100, 58, 139, 183, 53, 91, 151, 65, 121, 61, 40, 80, 40, 68, 73, 20, 135, 197, 124, 190, 108, 66, 21, 27, 147, 118, 192, 29, 193, 27, 155, 93, 33, 129]
Output = 199

Input:
Index = 2
Array = [4,-2,1,-3,5]
Output = 4 OR 5

Input:
Index = 0
Array = [2124, -173, -155, 146, 193, -30, 2, 186, 102, 4545]
Output = 4545

Input:
Index = 0
Array = [1,0,2,3]
Output = 2

Input:
Index = 2
Array = [3,-1,-3,-2,5]
Output = -1 OR -2

আপনি কি এমন কোনও টেস্ট কেস যুক্ত করতে পারেন যেখানে ডান পরিবর্তে বামদিকে ফলাফলের সন্ধান হয়? অর্থাত্1; [7,1,-4,2]
কেভিন ক্রুইজসেন 4'17

আমি মনে করি 2; [3,-1,-3,-2,5]একটি দুর্দান্ত পরীক্ষার কেস। ইতিবাচক সংখ্যা রয়েছে তবে ফলাফলটি নেতিবাচক।
স্টিভি গ্রিফিন

আমি কি 2-ইনডেক্সড ব্যবহার করতে পারি?
টাইটাস

টাইটাস আমার অর্থ আপনি যদি সত্যিই চান
গ্রাভিটন

উত্তর:


7

এমএটিএল , 10 বাইট

yt&y)>fYk)

এটি 1-ভিত্তিক সূচক ব্যবহার করে। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

ইনপুট বিবেচনা করুন [4,-2,1,-3,5], 3একটি উদাহরণ হিসাবে।

y     % Take two inputs implicitly. Duplicate 2nd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5]
t     % Duplicate top of the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5]
&y    % Duplicate 3rd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5], 3
)     % Index: select elements from first input as indicated by second input
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], 1
>     % Greater than, element-wise
      % STACK: [4,-2,1,-3,5], 3, [1,0,0,0,1]
f     % Find: gives indices of non-zero entries
      % STACK: [4,-2,1,-3,5], 3, [1,5]
Yk    % Closest element: gives closest element of each entry in second input
      % ([1,5]) to each entry in the first input (3). In case of a tie it 
      % gives the left-most one
      % STACK: [4,-2,1,-3,5], 1
)     % Index: select elements from first input as indicated by second input
      % STACK: 4
      % Implicitly display

2
আপনার কি ব্যাখ্যা আছে?
নিক ক্লিফোর্ড

পুনঃটুইট আমি অপেক্ষার অপেক্ষায় ছিল ও.পি. ব্যাখ্যা যুক্ত হয়েছে
লুইস মেন্ডো


5

জেলি , 11 12 বাইট

+1 বাইট - কোনও মোড়ানোর অনুমতি নেই।

Jạż⁸ṢZṪ»\Q2ị

1-ইন্ডেক্স।

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


পূর্ববর্তী 11 বাইটার (মোড়ানো সূচক), 0-সূচী:

ṙżU$Fµ>ḢTḢị

এটি যেমন ব্যর্থ হয় 0 [1,0,2,3]
janrjan জোহানসেন

@ আরজান জোহানসেন আহ - এটি ফিরে এসেছে 3, যা 1 দূরে তাই, উম, হ্যাঁ "নিকটতম" সংজ্ঞায়িত করা হয়নি ...
জোনাথন অ্যালান

1
আমি ওপিকে সেই পরীক্ষার মামলাটি যুক্ত করতে বলেছি।
janrjan জোহানসেন

4

জাভাস্ক্রিপ্ট (ES6), 57 55 বাইট

বাক্য বিন্যাসে অ্যারে aএবং সূচি নেয় ।i(a)(i)

a=>g=(i,p)=>(x=a[i-p])>a[i]||(x=a[i+p])>a[i]?x:g(i,-~p)

পরীক্ষার মামলা


আপনি কি |পরিবর্তে ব্যবহার করতে পারবেন না ||?
নিল

@ নীল নো, xপ্রথম শর্তটি পূরণ হওয়ার পরে আমরা ওভাররাইট হওয়া চাই না ।
আর্নল্ড

3

পিএইচপি, 106 বাইট

<?for($y=($a=$_GET[0])[$x=$_GET[1]];$y>=$a[$x-++$i]&&$y>=$a[$x+$i];);echo$y<$a[$x+$i]?$a[$x+$i]:$a[$x-$i];

অনলাইন সংস্করণ


দেখে মনে হচ্ছে এগুলি প্রথম পরীক্ষার ক্ষেত্রে কাজ করে না।
নিক ক্লিফোর্ড

@ নিকক্লিফফোর্ড এখন এটি কাজ করা উচিত। আমি একটি ভুল পদ্ধতির গ্রহণ করেছি
জার্গ হালসারম্যান

3

হাস্কেল , 48 বাইট

i%l=minimum[[j*j,x]|(j,x)<-zip[-i..]l,x>l!!i]!!1

এটি অনলাইন চেষ্টা করুন! আরজান জোহানসেনের টেস্ট কাঠামো।


আপনি একটি তালিকা ব্যবহার করে এবং একটি বাইট সংরক্ষণ করতে পারবেন !!1পরিবর্তে (ঠিক পরিবর্তন Integerকরতে Intহেডারের মধ্যে)।
janrjan জোহানসেন 4:53

@ আরজান জোহেনসেন ধন্যবাদ, আমি চেষ্টা করেছিলাম এবং কেন এটির প্রকারের বিষয়ে অভিযোগ করা হয়েছে তা সম্পর্কে আমি নিশ্চিত নই।
xnor

2

x86-64 বিধানসভা, 40 বাইট

জোহান ডু টোয়েট এবং 2501 এর সি সমাধানগুলি বিশ্লেষণ করে অনুপ্রাণিত হয়ে নিম্নলিখিতটি একটি ফাংশন যা এক্স 86-64 প্ল্যাটফর্মের জন্য এমএএসএম এর সাথে একত্রিত হতে পারে।

এটি প্যারামিটারগুলি পাস করার জন্য মাইক্রোসফ্ট x64 কলিং কনভেনশন অনুসরণ করে , সুতরাং অ্যারের মোট দৈর্ঘ্যটি পাশ করা হয় ECX, আগ্রহের অবস্থানটি পাশ করা হয় EDXএবং পূর্ণসংখ্যা অ্যারেতে নির্দেশকটি পাস হয় R8(এটি একটি 64-বিট প্ল্যাটফর্ম, তাই এটি একটি -৪-বিট পয়েন্টার)।

এটি ফলাফলকে ("নিকটতম বৃহত্তর সংখ্যা") প্রদান করে EAX

             FindNearestGreater PROC      
8B F2       \    mov     esi, edx     ; move pos parameter to preferred register
8B D9       |    mov     ebx, ecx     ; make copy of count (ecx == i; ebx == count)
            | MainLoop:
8B C6       |    mov     eax, esi     ; temp  = pos
2B C1       |    sub     eax, ecx     ; temp -= i
99          |    cdq
33 C2       |    xor     eax, edx
2B C2       |    sub     eax, edx     ; temp = AbsValue(temp)
            | 
41 8B 14 B0 |    mov     edx, DWORD PTR [r8+rsi*4]
41 39 14 88 |    cmp     DWORD PTR [r8+rcx*4], edx
7E 04       |    jle     KeepGoing    ; jump if (pValues[i] <= pValues[pos])
3B D8       |    cmp     ebx, eax
77 02       |    ja      Next         ; jump if (count > temp)
            | KeepGoing:
8B C3       |     mov     eax, ebx    ; temp = count
            | Next:
8B D8       |     mov     ebx, eax    ; count = temp
E2 E3       |     loop    MainLoop    ; equivalent to dec ecx + jnz, but smaller (and slower)
            | 
            |     ; Return pValues[temp + pos]
03 C6       |     add     eax, esi
41 8B 04 80 |     mov     eax, DWORD PTR [r8+rax*4]
C3          /     ret
             FindNearestGreater ENDP

আপনি যদি সি কোড থেকে এটিকে কল করতে চান তবে প্রোটোটাইপটি হ'ল:

extern int FindNearestGreater(unsigned int count,
                              unsigned int pos,
                              const    int *pValues);



1

হাস্কেল , 53 বাইট

(#)গুলি এবং এর (আসলে যে কোনও ধরণের) Intএকটি তালিকা নেয় এবং তালিকার একটি উপাদান প্রদান করে।IntIntegerOrd

n#l=[x|i<-[1..],x:_<-(`drop`l)<$>[n-i,n+i],x>l!!n]!!0

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

  • nপ্রদত্ত সূচক এবং lপ্রদত্ত তালিকা / "অ্যারে"।
  • i, 1 থেকে উপরে পর্যন্ত মান গ্রহণ করা, nবর্তমানে পরীক্ষা করা থেকে দূরত্ব ।
  • প্রত্যেকের জন্য i, আমরা সূচকগুলি পরীক্ষা করি n-iএবং n+i
  • xএটি lপরীক্ষিত হওয়ার উপাদান । যদি এটি পরীক্ষাগুলি পাস করে তবে এটি ফলাফল তালিকাটি বোঝার একটি উপাদান হবে।
    • স্বেচ্ছাসেবী সূচকগুলির সাথে সূচীকরণ !!সীমাবদ্ধতার ত্রুটি ছাড়িয়ে যেতে পারে, dropপরিবর্তে পুরো তালিকা বা সেই ক্ষেত্রে খালি তালিকা দেয়। প্যাটার্নটি x:_পরীক্ষার সাথে মেলে যে ফলাফলটি খালি নয়।
    • x>l!!nপরীক্ষা করে দেখায় যে আমাদের উপাদানটি সূচকের উপাদানের চেয়ে বেশি n(যা বিদ্যমান বলে নিশ্চিত)।
    • !!0 শেষে উপলব্ধির তালিকার প্রথম ম্যাচ / উপাদানটি প্রদান করে।

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




1

জাভা (ওপেনজেডিকে 8) , 98 বাইট

int f(int n,int[]a){for(int s=1,i=1,x=a[n];;n+=i++*s,s=-s)if(0<=n&n<a.length&&a[n]>x)return a[n];}

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

নিম্নলিখিত যোগফলের আংশিক যোগফলগুলি দ্বারা নির্দিষ্ট ক্রমের সূচকগুলি পরীক্ষা করে:

initial value + 1 - 2 + 3 - 4 + 5 - 6 + ...

আমি কেবল প্রশ্নটি পড়ছিলাম এবং একটি উত্তর লেখা শুরু করতে চেয়েছিলাম .. বিটিডব্লিউ, কেন s=1,এবং ,s=-sএটির উত্তরে আপনার কোনও লাভ নেই .. আপনি কি কোনও পুরানো পদ্ধতির থেকে এটিকে সরিয়ে দিতে ভুলে গেছেন?
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুজসেন এটি একটি ভুল এবং আমি এখনই এটি সংশোধন করছি। এটি টেস্টকেসগুলি পাস করেছে কারণ all সমস্ত টেস্টকেসে, নিকটতম বৃহত্তর সংখ্যাটি ডানদিকে।
লিকি নুন

1

সি, 69 বাইট

t;b;f(*d,c,p){for(b=c;c--;)d[c]>d[p]&(t=abs(p-c))<b?b=t:0;*d=d[p+b];}

প্রথম আর্গুমেন্টটি একটি ইন / আউট আর্গুমেন্ট। আউটপুটটি তার প্রথম উপাদানটিতে সঞ্চিত থাকে।

এটি অনলাইনে কাজ দেখুন ।


1

আর, 59 বাইট

function(l,i)l[j<-l>l[i]][which.min(abs(1:length(l)-i)[j])]

একটি বেনামি ফাংশন প্রদান করে। যদি সমান দূরত্বে দুটি উপাদান বেশি থাকে তবে প্রথমটি (কম সূচক) ফিরে আসবে।

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



1

পিএইচপি, 73 বাইট

function($i,$a){for(;$b<=$a[$i];)$b=max($a[++$d+$i],$a[$i-$d]);return$b;}

ক্লোজার 0-ভিত্তিক সূচক এবং আর্গুমেন্ট থেকে অ্যারে লাগে। সমস্ত পরীক্ষার কেস যাচাই করুন


পরবর্তী উচ্চতর মান নয়। আপনার সর্বনিম্নতম দূরত্বের সাথে একটি মান প্রয়োজন
জার্গ হালসারম্যান

@ জার্গএলসারম্যান নির্দেশ করার জন্য ধন্যবাদ।
তিতাস



0

জাভা, 96 বাইট

int f(int n,int[]a){for(int s=1,i=1,x=a[n];0>(n+=i++*s)|n>=a.length||a[n]<=x;s=-s);return a[n];}

সনাক্তকারীদের নাম দেওয়া হয়েছে @ লিকি নুনের উত্তরের মতো। তদুপরি, বেশিরভাগ অংশই মূলত একইরূপে প্রান্তিককরণ করা হয়েছে: তুলনায় তুলনামূলকভাবে, এটিকে ifপ্রতিস্থাপন করা হয়েছে -কন্ডিশন দ্বারা for(অতিরিক্ত অর্ধেক বলিদান)। একটি কোলনকে ইনক্রিমেন্ট-অংশকে শর্তে সরিয়ে ফেলা হয়েছে (সুতরাং পূর্ববর্তী যদি বিবৃতিটি ব্যবহারিকভাবে "সরানো হয়েছে" - এর প্যারেন্যাসিসগুলি পরিবর্তন করে | চরিত্র গণনায় প্রভাব ফেলেনি।


0

Clojure, 95 বাইট

#(%(nth(nth(sort-by first(for[i(range(count %)):when(>(% i)(% %2))][(Math/abs(- i %2))i]))0)1))

এটিই সবচেয়ে সংক্ষিপ্ততম আমি নিয়ে আসতে পারলাম :( আমি এগুলি নিয়েও খেলার চেষ্টা করেছি তবে এটিকে শেষের লাইনে আনতে পারিনি:

#(map(fn[f c](f c))[reverse rest](split-at %2 %))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.