最初最後最後最初


11

チャレンジ

タスクは簡単です。配列と最初と最後の値が与えられた場合:最初の後の最後の最初と最後の前の最初の最後を返します。


または単純に:配列var1、var2を指定します。

配列の例:

[var2、var1、、var2、、var2、var1、var2、]

戻り値:

  • 配列に表示される最初のvar1の右側にある最初のvar2のインデックス。

[VAR2、第VAR1第VAR2、第VAR2、VAR1、第VAR2、】

  • 配列に表示される最後のvar2の左側にある最初のvar1のインデックス。

[var2、、2番目のvar1、、var2、、var2、最初のvar1最後のvar2、]

入力

2つの異なる正の整数

正の整数の配列

出力

回答のインデックス、順番

ルール

配列には各変数が少なくとも1つ含まれます(最小サイズは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へようこそ!
ジョナサンアラン

2
出力を逆の順序で返すことはできますか?たとえば、テストケースの結果は9, 2、それぞれ6, 3および0, 1(出力が1インデックスの場合はプラス1)になります。
エリックアウトゴルファー

1
@Jakobに続いて、現在の文言は例と一致しません。
NIT

回答:





4

JavaScript(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バイトに簡単な答えを減らすため、2つのパラメータを取り、そして私は次の67バイトのバージョンを思い付くことができました:(x,y,a,f=s=>a[z=y,y=x,x=z,s+=`ndexOf`](x,a[s](y)))=>[f`i`,f`lastI`]
ニール


2

Japt27 25 24バイト

@Arnauldの答えに触発

ありがとう@Shaggy -2バイトと@ETHproductions -1バイト

japtで始めたばかりなので、もっと良い方法に違いない。\

[WsX=WbU)bV +XWsTWaV)aU]

オンラインでお試しください!


1
Japtへようこそ:) )2バイトを節約するために、これらのダブルスペースをスターター用に置き換えることができます。
シャギー

@Shaggy Tanks!私はそのことを知りませんでした
ルイスフェリペデイエスムニョス

あなたのように、私はもっと短い方法があると確信しています。しかし、現時点でそれを理解しようとする頭脳を持っていません!
シャギー

ようこそ!あなたは使用して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)

オンラインでお試しください!

2番目は説明が簡単です。

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)

コードの2番目の部分は、これらの変更を除いて同じことを行います。

  • 使用する2G第二の入力(VAR1)とするための3G第3入力(VAR2)の代わりに暗黙の入力又はiそれらが消費されているので、
  • PY>P代わりに(配列を左から右に、累積最大値Y>を取得し、逆方向に)使用して、最初の出現の後ではなく最後の出現の前に1を取得します
  • 最初の場所ではなく、両方の条件が真である最後の場所f0)を取得するために使用します(MATLがモジュラーインデックスを使用するため機能します。したがって、0は配列の最後のインデックスを参照します)

1

MATLAB(80バイト)

入力がありxya。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

Java 8、114バイト

a java.util.List<Integer>と2つintのs(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)[]代わりにスンダと彼に感謝し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)
スンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.