Знайдіть найближчу більшу кількість


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 Я маю на увазі, якщо ти дуже хочеш
Гравітон

Відповіді:


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].
Ørjan Johansen

@ ØrjanJohansen Ах - це повернення 3, яке знаходиться за 1 проміжок часу, так, гм, так, "найближчий" не визначено ...
Джонатан Аллан

1
Я попросив ОП додати цей тестовий випадок.
Ørjan Johansen

4

JavaScript (ES6), 57 55 байт

Бере масив aта індекс iу синтаксисі currying (a)(i).

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

Тестові справи


Не можете використовувати |замість цього ||?
Ніл

@Neil Ні, ми не хочемо, xщоб їх переписували, коли виконується перша умова.
Арнольд


3

Haskell , 48 байт

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

Спробуйте в Інтернеті! Тест-рамка від Ørjan Johansen.


Ви можете зберегти байт, скориставшись списком, а !!1замість цього (просто змініть Integerна Intзаголовку).
Ørjan Johansen

@ ØrjanJohansen Спасибі, я спробував це і не знав, чому він скаржився на типи.
xnor

2

x86-64 Збірка, 40 байт

Натхненний аналізом Йохан дю Тоа та рішеннями 2501 C, далі - функція, яку можна зібрати з MASM для платформ x86-64.

Звідси випливає умова виклику 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

Якщо ви хочете викликати його з коду С, прототипом було б:

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



1

Haskell , 53 байти

(#)бере Intі список Ints або Integers (фактично будь-якого Ordтипу), і повертає елемент списку.

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

Java (OpenJDK 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
@KevinCruijssen це помилка, і я зараз її виправляю. Він пройшов випробування, тому що в усіх цих тестах праворуч найближча більша кількість.
Leaky Nun

1

C, 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

R, 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örgHülsermann Дякую за те, що звернули увагу.
Тит



0

Java, 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 Nun. Крім того, більшість частин вирівняні таким чином, щоб вони були однаковими: для порівняння, ifзамінили умовою for(жертвуючи додатковою комою). Товсту кишку було видалено переміщенням приростової частини в стан (тому круглі дужки попереднього if-оператора практично "переміщені") - змінюючи & на | не вплинуло на кількість персонажів.


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 %))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.