First Last Last First

11

Tantangan

Tugasnya sederhana. Diberikan array dan nilai pertama dan terakhir: Kembalikan yang pertama dari yang terakhir setelah yang pertama, dan yang terakhir dari yang pertama sebelum yang terakhir.


Atau sederhananya: Diberikan array, var1, var2.

Contoh Array:

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

Kembali:

  • Indeks var2 pertama di sisi kanan var1 pertama yang muncul dalam array.

[var2,, var1 pertama ,, var2 pertama ,, var2 kedua, var1, var2 ketiga,]

  • Indeks var1 pertama di sisi kiri var2 terakhir yang muncul dalam array.

[var2,, var1 kedua,, var2,, var2, var1 pertama , var2 terakhir ,]

Memasukkan

Dua bilangan bulat positif yang berbeda

Array bilangan bulat positif

Keluaran

Indeks jawaban, secara berurutan

Aturan

Array akan mengandung setidaknya satu dari setiap variabel (ukuran minimum 2)

Asumsikan input berfungsi

Contoh: 0, 1 [1, 0]atau yang serupa akan gagal

IO fleksibel

Contohnya

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
CelakaLout
sumber
3
dapat var1sama dengan var2?
ngn
1
@ ngn Tidak, belum tentu. Jika mereka itu sebagian besar akan menyebabkan hasil yang sepele, jadi itu tidak perlu untuk menangani kasus itu.
WretchedLout
3
Selamat datang di PPCG!
Jonathan Allan
2
Bisakah kita mengembalikan output dalam urutan terbalik? Sebagai contoh, kasus uji akan menghasilkan 9, 2, 6, 3dan 0, 1masing - masing (atau ditambah satu jika output diindeks 1).
Erik the Outgolfer
1
Seconding @ Jakob, kata-kata saat ini tidak cocok dengan contoh.
Nit

Jawaban:

4

Python 2 , 72 byte

def f(x,y,a):i=a.index;j=a[::-1].index;print i(y,i(x)),len(a)+~j(x,j(y))

Cobalah online!

Lynn
sumber
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]

Cobalah online!

Berkomentar

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

Versi alternatif

Menggunakan JS built-in, jawaban yang lebih mudah adalah 79 byte:

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

yang dapat sedikit dikompresi hingga 75 byte:

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

Cobalah online!

Sunting : @Neil berhasil menguranginya menjadi 67-byte yang sangat bagus :

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

Cobalah online!

Arnauld
sumber
lastIndexOfmembutuhkan dua parameter, sehingga mengurangi jawaban langsung menjadi 70 byte, dan saya dapat menghasilkan versi 67-byte berikut:(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 bytes terima kasih kepada 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))

Cobalah online!

frosqh
sumber
a-1-b == a + (-b-1) == a + ~bdapat digunakan untuk -1 byte, menugaskan indexfungsi untuk nama membuat ini menjadi 93 byte
ovs
2

Japt , 27 25 24 byte

Terinspirasi dalam jawaban @Arnauld

Terima kasih @Shaggy -2 bytes dan @ETHproductions -1 byte

Saya baru saja mulai dengan japt jadi pasti cara yang lebih baik. \

[WsX=WbU)bV +XWsTWaV)aU]

Cobalah online!

Luis felipe De jesus Munoz
sumber
1
Selamat datang di Japt :) Anda dapat mengganti spasi ganda dengan )untuk pemula untuk menghemat 2 byte.
Shaggy
@Shaggy Tanks! Saya tidak tahu tentang itu
Luis felipe De jesus Munoz
Seperti Anda, saya yakin ada metode yang lebih pendek. Namun, jangan memiliki ruang otak untuk mencoba mengetahuinya!
Shaggy
Selamat datang! Anda dapat menyimpan satu byte dengan menggunakan X=WbU)...+X: Coba online! Saya juga berjuang untuk menemukan metode yang lebih pendek ...
ETHproduksi
1

APL (Dyalog Unicode) , 42 byte SBCS

Fungsi infiks diam-diam anonim. Mengambil var1, var2 sebagai argumen kiri dan array sebagai argumen kanan.

{⍸<\(⍵=⊃⌽⍺)∧∨\⍵=⊃⍺},{⍸⌽<\(⍵=⊃⍺)∧∨\⍵=⊃⌽⍺}∘⌽

Cobalah online!

Adm
sumber
1

R , 81 byte

function(a,b,v,x=which(v==b),y=which(v==a))c(x[x>y[1]][1],tail(y[y<tail(x,1)],1))

Cobalah online!

(1-diindeks)

menggali semua
sumber
1

MATL , 27 byte

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

Cobalah online!

Alternatif untuk bytecount yang sama:

27 byte

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

Cobalah online!

Yang kedua lebih mudah untuk dijelaskan:

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)

Bagian kedua dari kode melakukan hal yang sama, kecuali untuk perubahan ini:

  • gunakan 2Guntuk input kedua (var1) dan 3Ginput ke-3 pertama (var2) bukan input implisit atau i, karena sudah dikonsumsi
  • gunakan PY>P(flip array kiri-ke-kanan, dapatkan kumulatif maksimum, balik kembali) alih-alih Y>, untuk mendapatkan 1s sebelum kejadian terakhir alih-alih setelah kejadian pertama
  • gunakan f0)untuk mendapatkan tempat terakhir di mana kedua kondisi itu benar, alih-alih tempat pertama (berfungsi karena MATL menggunakan pengindeksan modular, jadi 0 diambil untuk merujuk ke indeks terakhir array)
sundar - Pasang kembali Monica
sumber
1

MATLAB (80 byte)

Input adalah x, y, dan a. Karena MATLAB diindeks 1, Anda harus menambahkan 1 untuk menguji kasus.

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

Kasus cobaan:

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
kata aaaaa mengembalikan Monica
sumber
0

Java 8, 114 byte

Seorang lambda mengambil a java.util.List<Integer>dan dua ints (var1, var2) dan mengembalikan pasangan yang dipisahkan koma.

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

Cobalah secara Online

Jakob
sumber
0

Kotlin , 132 byte

{f:Int,l:Int,a:Array<Int>->{var p=a.indexOfFirst{it==f}
while(a[p]!=l)p++
var i=a.indexOfLast{it==l}
while(a[i]!=f)i--
Pair(p,i)}()}

Cobalah online!

JohnWells
sumber
0

Julia , 71 64 byte

berkat Sundar dan nya find(A.==x)[]bukan findfirst(A,x)).

.

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))
Tanj
sumber
Anda dapat mengembalikan indeks berbasis 1 jika bahasa Anda berbasis 1 (itulah konsensus biasa di sini), jadi tidak perlu untuk -1s. Anda juga dapat menyimpan byte lain dengan menggunakan find(A.==x)[]alih-alih findfirst(A,x).
sundar - Reinstate Monica