Đầu tiên cuối cùng đầu tiên


11

Thử thách

Nhiệm vụ rất đơn giản. Đưa ra một mảng và giá trị đầu tiên và giá trị cuối cùng: Trả về giá trị đầu tiên của giá trị cuối cùng sau giá trị đầu tiên và giá trị cuối cùng trước giá trị cuối cùng.


Hoặc đơn giản là: Cho một mảng, var1, var2.

Mảng ví dụ:

[var2 ,, var1 ,, var2 ,, var2, var1, var2,]

Trở về:

  • Chỉ số của var2 đầu tiên ở phía bên phải của var1 đầu tiên xuất hiện trong mảng.

[var2 ,, var1 đầu tiên , var2 đầu tiên , var2 thứ hai, var1, var2 thứ ba,]

  • Chỉ số của var1 đầu tiên ở phía bên trái của var2 cuối cùng xuất hiện trong mảng.

[var2 ,, thứ hai var1 ,, var2 ,, var2, var1 đầu tiên , var2 cuối cùng ,]

Đầu vào

Hai số nguyên dương khác biệt

Mảng số nguyên dương

Đầu ra

Chỉ số câu trả lời, theo thứ tự

Quy tắc

Mảng sẽ chứa ít nhất một trong mỗi biến (kích thước tối thiểu là 2)

Giả sử đầu vào làm việc

Ví dụ: 0, 1 [1, 0]hoặc tương tự sẽ thất bại

IO rất linh hoạt

Ví dụ

Input
First = 2; Last = 4; [0, 2, 4, 2, 3, 1, 4, 0, 1, 2, 4, 9]

Output
2, 9

Input
First = 4; Last = 2; [0, 2, 4, 2, 3, 1, 4, 0, 1, 2, 4, 9]

Output
3, 6

Input
First = 0; Last = 1; [0, 1]

Output
1, 0

3
var1thể bằng var2?
ngn

1
@ngn Không, không nhất thiết. Nếu chúng là nó sẽ dẫn đến kết quả tầm thường, vì vậy không cần thiết phải xử lý trường hợp đó.
Khốn khổ vào

3
Chào mừng đến với PPCG!
Jonathan Allan

2
Chúng ta có thể trả lại đầu ra theo thứ tự đảo ngược không? Ví dụ, các trường hợp thử nghiệm sẽ dẫn đến 9, 2, 6, 30, 1tương ứng (hoặc cộng với một nếu đầu ra là 1 chỉ mục).
Erik the Outgolfer

1
Phân biệt @Jakob, từ ngữ hiện tại không khớp với các ví dụ.
Nit

Câu trả lời:





4

JavaScript (ES6), 63 byte

(x,y,a)=>a.map(P=(v,i)=>v-y?v-x?0:a=i:1/(p=a)?P=+P||i:0)&&[P,p]

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

Đã bình luận

(x, y, a) =>          // given the two integers x, y and the array a[]
  a.map(P =           // initialize P to a non-numeric value
            (v, i) => // for each value v at position i in a[]:
    v - y ?           //   if v is not equal to y:
      v - x ?         //     if v is not equal to x:
        0             //       do nothing
      :               //     else (v = x):
        a = i         //       save the current position in a
    :                 //   else (v = y):
      1 / (p = a) ?   //     update p to a (last position of x); if p is numeric (>= 0):
        P = +P || i   //       unless P is also already numeric, update it to i
                      //       (if P is numeric, it's necessarily greater than 0 because
                      //       we've also seen x before; that's why +P works)
      :               //     else:
        0             //       do nothing
  )                   // end of map()
  && [P, p]           // return [P, p]

Phiên bản thay thế

Sử dụng các hàm dựng sẵn của JS, một câu trả lời đơn giản hơn là 79 byte:

(x,y,a)=>[a.indexOf(y,a.indexOf(x)),a.slice(0,a.lastIndexOf(y)).lastIndexOf(x)]

có thể được nén nhẹ đến 75 byte:

(x,y,a)=>[a.indexOf(y,a.indexOf(x)),a.slice(0,a[L='lastIndexOf'](y))[L](x)]

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

Chỉnh sửa : @Neil quản lý để giảm nó xuống 67 byte rất đẹp :

(x,y,a,f=s=>a[z=y,y=x,x=z,s+=`ndexOf`](x,a[s](y)))=>[f`i`,f`lastI`]

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


lastIndexOfmất hai tham số, do đó làm giảm câu trả lời đơn giản xuống 70 byte và tôi đã có thể đưa ra phiên bản 67 byte sau:(x,y,a,f=s=>a[z=y,y=x,x=z,s+=`ndexOf`](x,a[s](y)))=>[f`i`,f`lastI`]
Neil

3

Python 3 , 97 93 byte

-4 byte nhờ vào ovs

def h(f,l,a,I=list.index):j=I(a,f);i=len(a)+~I(a[::-1],l);print(I(a[j:],l)+j,i-I(a[i::-1],f))

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


a-1-b == a + (-b-1) == a + ~bcó thể được sử dụng cho -1 byte, việc gán indexchức năng cho một tên sẽ đạt được 93 byte
ovs

2

Japt , 27 25 24 byte

Lấy cảm hứng trong câu trả lời @Arnauld

Cảm ơn @Shaggy -2 byte và @ETHproductions -1 byte

Tôi mới bắt đầu với japt nên đó là cách tốt hơn. \

[WsX=WbU)bV +XWsTWaV)aU]

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


1
Chào mừng bạn đến với Japt :) Bạn có thể thay thế các không gian kép đó bằng )cho người mới bắt đầu để tiết kiệm 2 byte.
Shaggy

Xe tăng @Shaggy! Tôi không biết điều đó
Luis felipe De jesus Munoz

Giống như bạn, tôi tin rằng có một phương pháp ngắn hơn. Mặc dù vậy, đừng có bộ não để cố gắng tìm ra nó vào lúc này!
Shaggy

Chào mừng bạn Bạn có thể lưu một byte bằng cách sử dụng X=WbU)...+X: Dùng thử trực tuyến! Tôi cũng đang vật lộn để tìm một phương pháp ngắn hơn mặc dù ...
Sản phẩm ETH



1

MATL , 27 byte

y=Y>/ti=PY>P/t3G=f1)w2G=f0)

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

Thay thế cho cùng một bytecount:

27 byte

y=Y>yi=*f1)y3G=PY>Pb2G=*f0)

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

Điều thứ hai dễ giải thích hơn:

y   % implicitly get the first two inputs (the array and var1),
    %  and duplicate the first input
    %  stack: [[0 2 4 2 3 1 4 0 1 2 4 9] 2 [0 2 4 2 3 1 4 0 1 2 4 9]]
=   % compare and return logical (boolean) array
    %  stack: [[0 2 4 2 3 1 4 0 1 2 4 9] [0 1 0 1 0 0 0 0 0 1 0 0]]
Y>  % cumulative maximum - make all values after the first 1 also 1s
    %  stack: [[0 2 4 2 3 1 4 0 1 2 4 9] [0 1 1 1 1 1 1 1 1 1 1 1]]
    %  now we have 1s in positions at and after the first time var1 appears
y   % duplicate 2nd element in stack
    %  stack: [[0 2 4 2 3 1 4 0 1 2 4 9] [0 1 1 1 1 1 1 1 1 1 1 1] [0 2 4 2 3 1 4 0 1 2 4 9]]
i=  % compare with the next input (var2), returning a boolean array
    % stack: [[0 2 4 2 3 1 4 0 1 2 4 9] [0 1 1 1 1 1 1 1 1 1 1 1] [0 0 1 0 0 0 1 0 0 0 1 0]]
*   % multiply the two boolean arrays - so we'll have 1s only where var2 was present after the first occurrence of var1
    % stack: [[0 2 4 2 3 1 4 0 1 2 4 9] [0 0 1 0 0 0 1 0 0 0 1 0]]
f1) % find the index of the first 1 in that (this is our first result value)

Phần thứ hai của mã thực hiện điều tương tự, ngoại trừ những thay đổi sau:

  • sử dụng 2Gcho đầu vào thứ hai (var1) và 3Gđầu vào thứ 3 (var2) thay vì đầu vào ngầm hoặc i, vì những đầu vào này đã được tiêu thụ
  • sử dụng PY>P(lật mảng từ trái sang phải, lấy tối đa tích lũy, lật ngược lại) thay vì Y>, để có 1 giây trước lần xuất hiện cuối cùng thay vì sau lần xuất hiện đầu tiên
  • sử dụng f0)để có được vị trí cuối cùng trong đó cả hai điều kiện đều đúng, thay vì vị trí đầu tiên (hoạt động vì MATL sử dụng lập chỉ mục mô-đun, vì vậy 0 được dùng để chỉ chỉ mục cuối cùng của mảng)

1

MATLAB (80 byte)

Đầu vào là x, y, và a. Vì MATLAB là 1 chỉ mục, bạn nên thêm 1 vào các trường hợp thử nghiệm.

xi=find(a==x);
yi=find(a==y);
yi(find(yi>xi(1),1))
xi(find(xi<yi(end),1,'last'))

Trường hợp thử nghiệm:

x=4
y=2
a =  [0, 2, 4, 2, 3, 1, 4, 0, 1, 2, 4, 9]

% 
xi=find(a==x);
yi=find(a==y);
yi(find(yi>xi(1),1))
xi(find(xi<yi(end),1,'last'))

ans =

     4


ans =

     7

0

Java 8, 114 byte

Một lambda lấy một java.util.List<Integer>và hai ints (var1, var2) và trả về một cặp được phân tách bằng dấu phẩy.

(a,f,l)->a.indexOf(f)+a.subList(a.indexOf(f),a.size()).indexOf(l)+","+a.subList(0,a.lastIndexOf(l)).lastIndexOf(f)

Dùng thử trực tuyến



0

Julia , 71 64 byte

cảm ơn chủ nhật và find(A.==x)[]thay vìfindfirst(A,x)) .

.

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))

Bạn có thể trả về chỉ mục dựa trên 1 nếu ngôn ngữ của bạn dựa trên 1 (đó là sự đồng thuận thông thường ở đây), do đó không cần -1. Ngoài ra, bạn có thể lưu một byte khác bằng cách sử dụng find(A.==x)[]thay vì findfirst(A,x).
- Phục hồi Monica
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.