가장 큰 숫자 찾기


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 개의 숫자가 더 큰 경우 둘 중 하나를 반환 할 수 있습니다 .

I / O 쌍

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]
케빈 Cruijssen

2; [3,-1,-3,-2,5]좋은 테스트 사례 라고 생각 합니다. 양수는 있지만 결과는 음수입니다.
Stewie Griffin

2 색인을 사용할 수 있습니까?
Titus

@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
설명이 있습니까?
Nick Clifford

트윗 담아 가기 OP 설명을 기다리고있었습니다. 추가 설명
Luis Mendo


5

젤리 , 11 12 바이트

+1 바이트-줄 바꿈이 허용되지 않습니다.

Jạż⁸ṢZṪ»\Q2ị

1- 색인.

온라인으로 사용해보십시오!


이전 11 바이트 (래핑 인덱싱), 0 인덱싱 :

ṙżU$Fµ>ḢTḢị

예를 들어 실패합니다 0 [1,0,2,3].
Ørjan Johansen

@ ØrjanJohansen Ah-그것은 31을 반환합니다 . 그래서, 음, "가장 가까운"은 정의되어 있지 않습니다 ...
Jonathan Allan

1
OP에 해당 테스트 사례를 추가하도록 요청했습니다.
Ørjan Johansen

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)

테스트 사례


|대신 사용할 수 없습니까 ||?
Neil

@ 닐 아니요, x첫 번째 조건이 충족 될 때 덮어 쓰고 싶지 않습니다 .
Arnauld


3

하스켈 , 48 바이트

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

온라인으로 사용해보십시오! Ørjan Johansen의 테스트 프레임 워크.


당신은 목록을 사용하여 바이트를 저장할 수 있습니다 !!1대신 (단지 변경 IntegerInt헤더에).
Ørjan Johansen

@ ØrjanJohansen 감사합니다, 나는 그것을 시도했고 왜 유형에 대해 불평했는지 확실하지 않았습니다.
xnor

2

x86-64 어셈블리, 40 바이트

Johan du Toit2501 의 C 솔루션 을 분석하여 영감을 얻은 다음은 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 바이트

(#)s 또는 s Int의 목록 (실제로는 모든 유형)을 가져 와서 목록의 요소를 반환합니다.IntIntegerOrd

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합니다.
  • xl테스트되는 요소입니다 . 테스트를 통과하면 결과 목록 이해의 요소가됩니다.
    • 임의의 인덱스를 사용하여 인덱싱 !!하면 범위를 벗어난 오류가 발생할 수 있지만 drop대신 전체 목록 또는 빈 목록이 반환됩니다. 패턴 일치 x:_는 결과가 비어 있지 않은지 확인합니다.
    • x>l!!n요소가 색인의 요소보다 큰지 테스트합니다 n(존재할 수 있음).
    • !!0 끝에는 목록 이해의 첫 번째 일치 / 요소를 반환합니다.

온라인으로 사용해보십시오!



1

Brachylog , 17 바이트

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

온라인으로 사용해보십시오!

설명

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>

1

자바 (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 + ...

난 그냥 질문을 읽고 답을 쓰기 시작하고 싶어 .., BTW 왜 한 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])]

익명 함수를 반환합니다. 같은 거리에 두 요소가 더 큰 경우 첫 번째 요소 (더 작은 인덱스)를 반환합니다.

온라인으로 사용해보십시오!






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 Nun의 답변과 같은 이름을 갖습니다. 또한 대부분의 부분은 기본적으로 동일하게 정렬되었습니다. 반면에, 부분 iffor추가 세미콜론을 희생하여 -condition 으로 대체되었습니다 . 증가 부분을 조건으로 이동하여 콜론이 제거되었습니다 (따라서 이전 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 %))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.