첫 번째 마지막 마지막 첫


11

도전

작업은 간단합니다. 배열과 첫 번째 및 마지막 값이 주어지면 첫 번째와 마지막 값 중 첫 번째와 마지막 값 중 첫 번째 값을 반환합니다.


또는 간단히 : var1, var2 배열이 주어집니다.

배열 예 :

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

반환:

  • 배열에 나타나는 첫 번째 var1의 오른쪽에있는 첫 번째 var2의 인덱스입니다.

[var2,, 첫 번째 var1 ,, 첫 번째 var2 ,, 두 번째 var2, var1, 세 번째 var2,]

  • 배열에 나타나는 마지막 var2의 왼쪽에있는 첫 번째 var1의 인덱스입니다.

[var2,, 두 번째 var1,, var2,, var2, 첫 번째 var1 , 마지막 var2 ,]

입력

두 개의 양의 정수

양의 정수 배열

산출

순서대로 답변 색인

규칙

배열은 각 변수 중 최소 하나를 포함합니다 (최소 크기 2).

입력이 작동한다고 가정

예 : 0, 1 [1, 0]또는 이와 유사한 기능이 실패합니다

유연한 IO

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
var1와 동일 var2?
ngn

1
@ngn 아니오, 반드시 그런 것은 아닙니다. 그것들이 대부분이라면 사소한 결과로 이어질 수 있으므로 그 사건을 처리 할 필요는 없습니다.
WretchedLout

3
PPCG에 오신 것을 환영합니다!
Jonathan Allan

2
출력을 역순으로 반환 할 수 있습니까? 예를 들어, 테스트 케이스가 초래 9, 2, 6, 30, 1각각 (출력하거나 더한 경우 인덱스 1).
Outgolfer 에릭

1
@Jakob 다음으로, 현재 단어가 예제와 일치하지 않습니다.
Nit

답변:





4

자바 스크립트 (ES6), 63 바이트

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

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

댓글

(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]

대체 버전

JS 내장 기능을 사용하면보다 간단한 대답은 79 바이트입니다.

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

75 바이트로 약간 압축 할 수 있습니다.

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

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

편집 : @Neil 은 매우 멋진 67 바이트 로 줄 였습니다 .

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

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


lastIndexOf는 두 가지 매개 변수를 사용하므로 간단한 대답을 70 바이트로 줄일 수 있으며 다음 67 바이트 버전을 만들 수있었습니다.(x,y,a,f=s=>a[z=y,y=x,x=z,s+=`ndexOf`](x,a[s](y)))=>[f`i`,f`lastI`]
Neil


2

Japt , 27 25 24 바이트

@Arnauld의 답변 에서 영감을 얻었습니다.

감사합니다 @Shaggy -2 바이트 및 @ETHproductions -1 바이트

방금 jap으로 시작 했으므로 더 나은 방법이어야합니다. \

[WsX=WbU)bV +XWsTWaV)aU]

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


1
Japt에 오신 것을 환영합니다 :) 이중 공간을 대체 )하여 초보자가 2 바이트를 절약 할 수 있습니다 .
얽히고 설킨

@Shaggy Tanks! 나는 그것을 알지 못했다
Luis felipe De jesus Munoz

당신처럼, 나는 더 짧은 방법이 있다고 확신합니다. 그래도 지금 그것을 알아낼 뇌 공간이 없어!
얽히고 설킨

어서 오십시오! 다음을 사용하여 1 바이트를 절약 할 수 있습니다 X=WbU)...+X. 온라인에서 사용해보십시오! 나는 또한 더 짧은 방법을 찾기 위해 고군분투하고 있습니다 ...
ETHproductions



1

MATL , 27 바이트

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

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

동일한 바이트 수에 대한 대안 :

27 바이트

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

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

두 번째는 설명하기가 더 쉽습니다.

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)

코드의 두 번째 부분은 다음 변경 사항을 제외하고 동일한 작업을 수행합니다.

  • 사용하는 2G제 2 입력 (VAR1)와위한 3G제 3 입력 (VAR2) 대신 암시 입력이나 i그 소비 된 이후,
  • 사용 PY>P(플립 어레이는 왼쪽에서 오른쪽으로, 최대 누적 플립 다시 얻기) 대신에 Y>(1S)를 얻기 위해, 마지막에 검출되기 전에 대신 최초로 출현 후
  • 사용 f0)얻기 위해 마지막 (0 배열의 마지막 인덱스를 참조 촬영되도록, MATL이 모듈 색인을 사용하기 때문에 작품) 두 조건이 모두 대신 처음의 해당 장소를

1

MATLAB (80 바이트)

입력은 x, ya입니다. MATLAB은 1- 인덱싱되므로 테스트 사례에 1을 추가해야합니다.

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

테스트 사례 :

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

자바 8, 114 바이트

s 는 a java.util.List<Integer>와 2를 취하고 int(var1, var2) 쉼표로 구분 된 쌍을 반환합니다.

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

온라인 시도



0

줄리아 , 71 64 바이트

find(A.==x)[]대신 sundar와 그의 덕분 에 findfirst(A,x)).

.

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

언어가 1 기반 (여기서는 일반적인 합의) 인 경우 1 기반 인덱스를 반환 할 수 있으므로 -1이 필요하지 않습니다. 또한 find(A.==x)[]대신에 를 사용하여 다른 바이트를 저장할 수 있습니다 findfirst(A,x).
sundar-복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.