निकटतम बड़ी संख्या ज्ञात कीजिए


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]
केविन क्रूज़सेन

मुझे लगता 2; [3,-1,-3,-2,5]है कि यह एक अच्छा परीक्षण मामला है। सकारात्मक संख्याएं हैं, लेकिन परिणाम नकारात्मक है।
स्टीवी ग्रिफिन

क्या मैं 2-अनुक्रमित का उपयोग कर सकता हूं?
टाइटस

@Titus मेरा मतलब है अगर तुम सच में करना चाहते हैं
Graviton

जवाबों:


7

MATL , 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
क्या आपके पास स्पष्टीकरण है?
निक क्लिफर्ड

@NickClifford ज़रूर! मैं ओपी स्पष्टीकरण का इंतजार कर रहा था। स्पष्टीकरण में कहा गया है
लुइस मेंडो


5

जेली , 11 12 बाइट्स

+1 बाइट - कोई रैपिंग की अनुमति नहीं है।

Jạż⁸ṢZṪ»\Q2ị

1 अनुक्रमित।

इसे ऑनलाइन आज़माएं!


पिछला 11 बटर (रैपिंग इंडेक्सिंग), 0-अनुक्रमित:

ṙżU$Fµ>ḢTḢị

यह उदाहरण पर विफल रहता है 0 [1,0,2,3]
अर्जन जोहानसन

@ ,RjanJohansen आह - यह लौटता है 3, जो कि 1 दूर है, उम, हाँ "निकटतम" परिभाषित नहीं है ...
जोनाथन एलन

1
मैंने ओपी से उस टेस्ट केस को जोड़ने के लिए कहा।
अर्जन जोहानसन

4

जावास्क्रिप्ट (ईएस 6), 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

PHP, 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];

ऑनलाइन संस्करण


ऐसा लगता है कि ये पहले परीक्षण के मामले में काम नहीं करते हैं।
निक क्लिफर्ड

@NickClifford अब यह काम करना चाहिए। मैंने एक गलत तरीका अपनाया है
Jörg Hülsermann

3

हास्केल , 48 बाइट्स

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

इसे ऑनलाइन आज़माएं! अर्जन जोहानसेन से टेस्ट फ्रेमवर्क।


आप एक सूची का उपयोग करके एक बाइट बचा सकता है !!1बजाय (बस बदलने Integerके लिए Intशीर्षक में)।
अर्जन जोहानसन

@ TriedrjanJohansen धन्यवाद, मैंने कोशिश की थी और यह अनिश्चित था कि यह किस प्रकार के बारे में शिकायत करता है।
xnor

2

x86-64 विधानसभा, 40 बाइट्स

जोहान डू टिट और 2501 के सी समाधानों का विश्लेषण करके प्रेरित , निम्नलिखित एक फ़ंक्शन है जिसे x86-64 प्लेटफार्मों के लिए MASM के साथ इकट्ठा किया जा सकता है।

यह गुजरने वाले मापदंडों के लिए Microsoft x64 कॉलिंग कन्वेंशन का अनुसरण करता है , इसलिए सरणी की कुल लंबाई में पारित किया जाता है ECX, ब्याज की स्थिति में पारित किया जाता है EDX, और पूर्णांक सरणी के लिए सूचक में पारित किया जाता है R8(यह 64-बिट प्लेटफॉर्म है, इसलिए यह है एक 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

यदि आप इसे C कोड से कॉल करना चाहते हैं, तो प्रोटोटाइप होगा:

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



1

हास्केल , 53 बाइट्स

(#)एक Intऔर Ints या Integers (वास्तव में किसी भी Ordप्रकार) की एक सूची लेता है, और सूची का एक तत्व देता है।

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

यह काम किस प्रकार करता है

  • nदिया गया सूचकांक है और lदी गई सूची / "सरणी" है।
  • i1 से मूल्यों को ऊपर की ओर ले जाना, 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 + ...

मैं सिर्फ सवाल पढ़ रहा था और एक उत्तर लिखना शुरू करना चाहता था .. Btw, क्यों s=1,और ,s=-s, इसका आपके जवाब में कोई उपयोग नहीं है .. क्या आप इसे पुराने दृष्टिकोण से हटाना भूल गए थे?
केविन क्रूज़सेन

1
@ केविनक्रूजसेन यह एक गलती है और मैं इसे अब ठीक कर रहा हूं। इसने टेस्टेसिस पास किया क्योंकि उन सभी टेस्टकेस में, निकटतम अधिक संख्या दाईं ओर है।
लीक नून

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

PHP, 73 बाइट्स

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

समापन 0-आधारित सूचकांक और तर्कों से सरणी लेता है। सभी परीक्षण मामलों की जाँच करें


अगला उच्च मूल्य नहीं। आपको सबसे कम दूरी के साथ एक मूल्य की आवश्यकता है जो कि अधिक है
Jörg Hülsermann

@ JörgHülsermann इशारा करने के लिए धन्यवाद।
टाइटस



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];}

पहचानकर्ताओं का नाम @Leaky नन के जवाब की तरह है। इसके अलावा, अधिकांश भागों को मूल रूप से समान होने के लिए गठबंधन किया गया है: तुलना में, -condition (अतिरिक्त अर्धविराम का त्याग) ifद्वारा प्रतिस्थापित किया गया है for। एक बृहदान्त्र को वृद्धि-भाग को स्थिति में स्थानांतरित करके हटा दिया गया है (इसलिए पिछले if- बयान के कोष्ठक व्यावहारिक रूप से "स्थानांतरित" हो गए हैं) - बदलना और बदलना है | चरित्र गणना पर प्रभाव नहीं पड़ा।


0

क्लोजर, 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 %))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.