Finde die nächstgrößere Zahl

30

Die Aufgabe

Bei einem beliebigen Array von Ganzzahlen, zB:

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

und einen Index dieses Arrays (in diesem Beispiel wird eine auf 0 basierende Indizierung verwendet , obwohl Sie auch eine auf 1 basierende Indizierung verwenden können .):

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

Geben Sie dann die nächste Zahl zurück, die größer als das Element an diesem Index ist . In diesem Beispiel ist die nächstgelegene Zahl größer als 1 27 (bei 2 Indizes).

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

Output = 27

Annahmen

  • Nearest beinhaltet keine Verpackung.
  • Das Programm erhält niemals ein Array der Länge 1 (zB; [55]).
  • Es ist anzunehmen, dass es immer eine Zahl gibt, die größer als das angegebene Element ist.
  • Wenn zwei Zahlen in gleichen Abständen größer als das Element sind, können Sie eine der beiden zurückgeben .

E / A-Paare

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
Graviton
quelle
Könnten Sie einen Testfall hinzufügen, in dem links statt rechts nach einem Ergebnis gesucht wird? dh1; [7,1,-4,2]
Kevin Cruijssen
Ich finde 2; [3,-1,-3,-2,5]das ein schöner Testfall. Es gibt positive Zahlen, aber das Ergebnis ist negativ.
Stewie Griffin
Kann ich 2-indizierte verwenden?
Titus
@ Titus Ich meine, wenn Sie wirklich wollen
Graviton

Antworten:

7

MATL , 10 Bytes

yt&y)>fYk)

Dies verwendet eine 1-basierte Indizierung. Probieren Sie es online!

Erläuterung

Betrachten Eingänge [4,-2,1,-3,5], 3als Beispiel.

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
Luis Mendo
quelle
2
Hast du eine Erklärung?
Nick Clifford
@ NickClifford Sicher! Ich habe auf die Klärung des OP gewartet. Erklärung hinzugefügt
Luis Mendo
6

Gelee , 10 Bytes

ị<ṛTạ⁸$ÞḢị

Probieren Sie es online!

Dennis
quelle
Ich habe ewig herumgespielt und versucht, die Sortierung auf den absoluten Wert zu bringen :(
Jonathan Allan
5

Jelly , 11 12 Bytes

+1 Byte - Kein Umbruch erlaubt.

Jạż⁸ṢZṪ»\Q2ị

1-indiziert.

Probieren Sie es online!


Vorherige 11 Bytes (Indexierung umbrechen), 0-indexiert:

ṙżU$Fµ>ḢTḢị
Jonathan Allan
quelle
Dies scheitert z 0 [1,0,2,3].
Ørjan Johansen
@ ØrjanJohansen Ah - es kehrt zurück 3, das ist 1 weg, ähm, yeah "am nächsten" ist nicht definiert ...
Jonathan Allan
1
Ich habe OP gebeten, diesen Testfall hinzuzufügen.
Ørjan Johansen
4

JavaScript (ES6), 57 Byte

Übernimmt das Array aund den Index iin der aktuellen Syntax (a)(i).

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

Testfälle

Arnauld
quelle
Kannst du nicht |statt verwenden ||?
Neil
@Neil Nein, wir möchten xnicht überschrieben werden, wenn die erste Bedingung erfüllt ist.
Arnauld
3

PHP, 106 Bytes

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

Online Version

Jörg Hülsermann
quelle
Sieht so aus, als würden diese im ersten Testfall nicht funktionieren.
Nick Clifford
@NickClifford Jetzt sollte es funktionieren. Ich habe mich geirrt
Jörg Hülsermann
3

Haskell , 48 Bytes

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

Probieren Sie es online! Test Framework von Ørjan Johansen.

xnor
quelle
Sie können ein Byte speichern, indem Sie eine Liste verwenden und !!1stattdessen (ändern Sie einfach Integerin Intin der Kopfzeile).
Ørjan Johansen
@ ØrjanJohansen Danke, ich hatte das ausprobiert und war unsicher warum es sich über Typen beschwert.
Xnor
2

x86-64-Assembly, 40 Byte

Inspiriert von der Analyse der C-Lösungen von Johan du Toit und 2501 ist das Folgende eine Funktion, die mit MASM für x86-64-Plattformen zusammengestellt werden kann.

Es folgt der Microsoft x64-Aufrufkonvention zum Übergeben von Parametern, sodass die Gesamtlänge des Arrays übergeben wird ECX, die interessierende Position übergeben EDXwird und der Zeiger auf das Ganzzahl-Array übergeben wirdR8 (es ist also eine 64-Bit-Plattform) ein 64-Bit-Zeiger).

Es gibt das Ergebnis (die "nächstgrößere Zahl") in zurück 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

Wenn Sie es aus C-Code aufrufen möchten, wäre der Prototyp:

extern int FindNearestGreater(unsigned int count,
                              unsigned int pos,
                              const    int *pValues);
Cody Gray
quelle
1

Ruby , 64 Bytes

->a,i{a[(0...a.size).select{|j|a[j]>a[i]}.min_by{|j|(i-j).abs}]}

Probieren Sie es online!

Wert Tinte
quelle
1

Haskell , 53 Bytes

(#)Nimmt eine Intund eine Liste von Ints oder Integers (tatsächlich jeder OrdTyp) und gibt ein Element der Liste zurück.

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

Wie es funktioniert

  • nist der angegebene Index und list die angegebene Liste / "Array".
  • iMit Werten ab 1 wird der Abstand zum naktuell getesteten Wert angegeben .
  • Für jeden iprüfen wir Indizes n-iund n+i.
  • x ist das Element von l getestet zu werden. Wenn es die Tests besteht, ist es ein Element des resultierenden Listenverständnisses.
    • Indizieren beliebiger Indizes mit !!kann zu einem Fehler außerhalb der Grenzen führen, während dropin diesem Fall entweder die gesamte Liste oder eine leere Liste zurückgegeben wird. Die Musterübereinstimmung mit x:_prüft, ob das Ergebnis nicht leer ist.
    • x>l!!ntestet, ob unser Element größer ist als das Element am Index n(dessen Existenz garantiert ist).
    • !!0 Am Ende wird die erste Übereinstimmung / das erste Element des Listenverständnisses zurückgegeben.

Probieren Sie es online!

Ørjan Johansen
quelle
1

Brachylog , 17 Bytes

hH&∋₎<.&t:I≜+:H∋₍

Probieren Sie es online!

Erläuterung

hH                      Call the list H
  &∋₎<.                 Output is greater than the number at the specified index
       &t:I≜            Label I (0, then 1, then -1, then 2, then -2, …)
            +           Sum I with the input Index
             :H∋₍       Output is the element of H at index <the sum>
Tödlich
quelle
1

Java (OpenJDK 8) , 98 Byte

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

Probieren Sie es online!

Überprüft die Indizes in der Reihenfolge, die durch die Teilsummen der folgenden Summe angegeben wird:

initial value + 1 - 2 + 3 - 4 + 5 - 6 + ...
Undichte Nonne
quelle
Ich habe gerade die Frage gelesen und wollte anfangen, eine Antwort zu schreiben. Übrigens, warum hat das s=1,und ,s=-sin Ihrer Antwort keinen Sinn. Haben Sie vergessen, es aus einem alten Ansatz zu entfernen?
Kevin Cruijssen
1
@ KevinCruijssen es ist ein Fehler und ich repariere es jetzt. Es hat die Testfälle bestanden, da in all diesen Testfällen die nächstgrößere Zahl rechts ist.
Undichte Nonne
1

C 69 Bytes

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

Das erste Argument ist ein In / Out-Argument. Die Ausgabe wird in ihrem ersten Element gespeichert.

Sehen Sie , wie es online funktioniert .

2501
quelle
1

R, 59 Bytes

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

Gibt eine anonyme Funktion zurück. Falls zwei Elemente in gleichen Abständen größer sind, wird der erste zurückgegeben (kleinerer Index).

Probieren Sie es online!

Giuseppe
quelle
1

Pyth - 28 Bytes

JEehf>@T1@JQo@NZm(adQ@Jd)UlJ

Versuch es

Maria
quelle
1

PHP, 73 Bytes

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

Für Closure werden 0-basierte Indizes und Arrays aus Argumenten verwendet. Überprüfen Sie alle Testfälle .

Titus
quelle
Nicht der nächsthöhere Wert. Sie benötigen einen Wert mit dem niedrigsten Abstand, der höher ist
Jörg Hülsermann
@ JörgHülsermann Danke für den Hinweis.
Titus
0

Pyth, 16 Bytes

JEh>#@JQ@LJaDQUJ

Testsuite .

Undichte Nonne
quelle
0

C 110 Bytes

c,o;e(g,l,f)int*g;{for(o=g[l],c=1;c<f;c++)l+c<f&&g[l+c]>o?o=g[l+c],c=f:0,l-c>=0&&g[l-c]>o?o=g[l-c],c=f:0;g=o;}

Probieren Sie es online aus

Johan du Toit
quelle
0

Java, 96 Bytes

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

Bezeichner werden wie die Antwort von @Leaky Nun benannt. Darüber hinaus wurden die meisten Teile so ausgerichtet, dass sie im Grunde genommen gleich sind: Im Vergleich wurde die ifdurch die forBedingung -condition ersetzt (wobei das zusätzliche Semikolon geopfert wurde). Ein Doppelpunkt wurde entfernt, indem ein Inkrement-Teil in eine Bedingung verschoben wurde (die Klammern der vorherigen if-Anweisung wurden also praktisch "verschoben") - indem & in | geändert wurde hatte keinen Einfluss auf die Anzahl der Charaktere.

Johannes
quelle
0

Clojure, 95 Bytes

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

Dies ist die kürzeste, die ich mir einfallen lassen konnte :( Ich habe auch versucht, damit herumzuspielen, konnte sie aber nicht ins Ziel bringen:

#(map(fn[f c](f c))[reverse rest](split-at %2 %))
NikoNyrh
quelle