Tìm số lớn nhất gần nhất


30

Nhiệm vụ

Cho bất kỳ mảng số nguyên nào, vd:

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

và một chỉ mục của mảng đó (ví dụ này sử dụng lập chỉ mục dựa trên 0 , mặc dù bạn cũng có thể sử dụng lập chỉ mục dựa trên 1. ):

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

Sau đó trả về số gần nhất lớn hơn phần tử tại chỉ mục đó . Trong ví dụ, số gần nhất lớn hơn 1 là 27 (cách 2 chỉ số).

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

Output = 27

Giả định

  • Gần nhất không bao gồm gói.
  • Chương trình sẽ không bao giờ được cung cấp một mảng có độ dài 1 (ví dụ; [55]).
  • Bạn phải giả sử luôn có một số lớn hơn phần tử đã cho.
  • Nếu có 2 số lớn hơn phần tử ở khoảng cách bằng nhau, bạn có thể trả về một số .

Cặp 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

Bạn có thể thêm một trường hợp thử nghiệm trong đó nó tìm kết quả ở bên trái thay vì bên phải không? tức là1; [7,1,-4,2]
Kevin Cruijssen

Tôi nghĩ 2; [3,-1,-3,-2,5]là một trường hợp thử nghiệm tốt đẹp. Có số dương, nhưng kết quả là âm.
Stewie Griffin

Tôi có thể sử dụng 2 chỉ mục không?
Tít

@Titus Ý tôi là nếu bạn thực sự muốn
Graviton

Câu trả lời:


7

MATL , 10 byte

yt&y)>fYk)

Điều này sử dụng lập chỉ mục dựa trên 1. Hãy thử trực tuyến!

Giải trình

Hãy xem xét các đầu vào [4,-2,1,-3,5], 3như một ví dụ.

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
Bạn có một lời giải thích?
Nick Clifford

@NickClifford Chắc chắn! Tôi đã chờ đợi OP làm rõ. Đã giải thích thêm
Luis Mendo


5

Thạch , 11 12 byte

+1 byte - Không cho phép gói.

Jạż⁸ṢZṪ»\Q2ị

1 chỉ mục.

Hãy thử trực tuyến!


11 byter trước đó (gói chỉ mục), 0-index:

ṙżU$Fµ>ḢTḢị

Điều này thất bại trên ví dụ 0 [1,0,2,3].
Ørjan Johansen

@ RjanJohansen Ah - nó trở lại 3, cách đó 1 phút, ừm, vâng "gần nhất" không được xác định ...
Jonathan Allan

1
Tôi yêu cầu OP thêm trường hợp thử nghiệm đó.
Ørjan Johansen

4

JavaScript (ES6), 57 55 byte

Lấy mảng avà chỉ mục itrong cú pháp currying (a)(i).

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

Các trường hợp thử nghiệm


Bạn có thể không sử dụng |thay thế ||?
Neil

@Neil Không, chúng tôi không muốn xbị ghi đè khi điều kiện đầu tiên được thực hiện.
Arnauld


3

Haskell , 48 byte

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

Hãy thử trực tuyến! Khung kiểm tra từ Ørjan Johansen.


Bạn có thể lưu một byte bằng cách sử dụng một danh sách và !!1thay vào đó (chỉ cần thay đổi Integerthành Inttrong tiêu đề).
Ørjan Johansen

@ RjanJohansen Cảm ơn, tôi đã thử điều đó và không chắc tại sao nó lại phàn nàn về các loại.
xnor

2

Hội x86-64, 40 byte

Lấy cảm hứng bằng cách phân tích các giải pháp C của Johan du Toit2501 , sau đây là một chức năng có thể được lắp ráp với MASM cho các nền tảng x86-64.

Nó tuân theo quy ước gọi Microsoft x64 để truyền tham số, do đó tổng chiều dài của mảng được truyền vào ECX, vị trí quan tâm được truyền vào EDXvà con trỏ tới mảng số nguyên được truyền vào R8(đó là nền tảng 64 bit, vì vậy, nó là một con trỏ 64 bit).

Nó trả về kết quả ("số lớn nhất gần nhất") trong 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

Nếu bạn muốn gọi nó từ mã C, nguyên mẫu sẽ là:

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



1

Haskell , 53 byte

(#)lấy một Intvà một danh sách Ints hoặc Integers (thực tế là bất kỳ Ordloại nào ) và trả về một phần tử của danh sách.

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

Làm thế nào nó hoạt động

  • nlà chỉ mục đã cho và llà danh sách / "mảng" đã cho.
  • i, nhận các giá trị từ 1 trở lên, là khoảng cách từ nhiện đang được thử nghiệm.
  • Đối với mỗi i, chúng tôi kiểm tra các chỉ số n-in+i.
  • xlà yếu tố lđược thử nghiệm. Nếu nó vượt qua các bài kiểm tra, nó sẽ là một yếu tố của việc hiểu danh sách kết quả.
    • Lập chỉ mục các chỉ số tùy ý với !!có thể đưa ra lỗi giới hạn, trong khi dropthay vào đó trả về toàn bộ danh sách hoặc danh sách trống trong trường hợp đó. Mẫu phù hợp với x:_kiểm tra rằng kết quả không trống.
    • x>l!!nkiểm tra rằng phần tử của chúng tôi lớn hơn phần tử tại chỉ mục n(được đảm bảo tồn tại).
    • !!0 ở cuối trả về kết quả khớp / phần tử đầu tiên của việc hiểu danh sách.

Hãy thử trực tuyến!



1

Brachylog , 17 byte

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

Hãy thử trực tuyến!

Giải trình

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

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

Hãy thử trực tuyến!

Kiểm tra các chỉ số theo thứ tự được chỉ định bởi tổng một phần của tổng sau:

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

Tôi chỉ đọc câu hỏi và muốn bắt đầu viết câu trả lời .. Btw, tại sao s=1,,s=-s, nó không có ích gì trong câu trả lời của bạn .. Bạn đã quên xóa nó khỏi một cách tiếp cận cũ?
Kevin Cruijssen

1
@KevinCruijssen đó là một lỗi và tôi đang sửa nó ngay bây giờ. Nó đã vượt qua các testcase bởi vì trong tất cả các testcase đó, số lớn nhất gần nhất nằm ở bên phải.
Nữ tu bị rò rỉ

1

C, 69 byte

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

Đối số đầu tiên là một đối số vào / ra. Đầu ra được lưu trữ trong phần tử đầu tiên của nó.

Xem nó hoạt động trực tuyến .


1

R, 59 byte

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

trả về một hàm ẩn danh. Trong trường hợp có hai phần tử lớn hơn ở khoảng cách bằng nhau, sẽ trả về phần tử đầu tiên (chỉ số nhỏ hơn).

Hãy thử trực tuyến!






0

Java, 96 byte

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

Các định danh được đặt tên như câu trả lời của @Leaky Nun. Hơn nữa, hầu hết các bộ phận đã được căn chỉnh về cơ bản là giống nhau: So sánh, phần ifđã được thay thế bằng for-condition (hy sinh dấu chấm phẩy bổ sung). Một dấu hai chấm đã được loại bỏ bằng cách di chuyển phần tăng dần vào điều kiện (vì vậy dấu ngoặc đơn của câu lệnh if trước đó thực tế "di chuyển") - thay đổi & thành | không có tác động đến số lượng nhân vật.


0

Clojure, 95 byte

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

Đây là lần ngắn nhất tôi có thể nghĩ ra :( Tôi cũng đã thử chơi xung quanh nó nhưng không thể đưa nó về đích:

#(map(fn[f c](f c))[reverse rest](split-at %2 %))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.