Pierwszy Ostatni Ostatni Pierwszy

11

Wyzwanie

Zadanie jest proste. Biorąc pod uwagę tablicę oraz pierwszą i ostatnią wartość: Zwraca pierwszy z ostatnich po pierwszym i ostatni z pierwszych przed ostatnim.


Lub po prostu: biorąc pod uwagę tablicę, var1, var2.

Przykładowa tablica:

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

Powrót:

  • Indeks pierwszego var2 po prawej stronie pierwszego var1, który pojawia się w tablicy.

[Zm2,, pierwszy zm1 ,, pierwszy zm2 , drugi zm2, zm1 trzeci zm2,]

  • Indeks pierwszego var1 po lewej stronie ostatniego var2, który pojawia się w tablicy.

[var2,, drugi var1,, var2,, var2, pierwszy var1 , ostatni var2 ,]

Wejście

Dwie różne dodatnie liczby całkowite

Tablica dodatnich liczb całkowitych

Wynik

Indeks odpowiedzi, w kolejności

Zasady

Tablica będzie zawierać co najmniej jedną z każdej zmiennej (minimalny rozmiar 2)

Załóżmy, że dane wejściowe działają

Przykład: 0, 1 [1, 0]lub podobny nie powiedzie się

IO jest elastyczny

Przykłady

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
WretchedLout
źródło
3
może var1być równy var2?
ngn
1
@ngn Nie, niekoniecznie. Gdyby tak było, prowadziłoby to do przeważnie trywialnych wyników, więc nie trzeba zajmować się tą sprawą.
WretchedLout
3
Witamy w PPCG!
Jonathan Allan
2
Czy możemy zwrócić dane wyjściowe w odwrotnej kolejności? Na przykład, badania przypadków będzie powodować 9, 2, 6, 3i 0, 1odpowiednio (a plus jeden, jeśli wyjście 1 indeksowane).
Erik the Outgolfer
1
W przypadku oddelegowania @Jakob obecne sformułowanie nie pasuje do przykładów.
Nit

Odpowiedzi:

4

Python 2 , 72 bajty

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

Wypróbuj online!

Lynn
źródło
4

JavaScript (ES6), 63 bajty

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

Wypróbuj online!

Skomentował

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

Alternatywne wersje

Korzystając z wbudowanych JS, prostsza odpowiedź to 79 bajtów:

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

który można lekko skompresować do 75 bajtów:

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

Wypróbuj online!

Edycja : @Neil udało się zredukować do bardzo ładnego 67-bajtowego :

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

Wypróbuj online!

Arnauld
źródło
lastIndexOfprzyjmuje dwa parametry, dzięki czemu prosta odpowiedź jest zmniejszana do 70 bajtów, a ja mogłem wymyślić następującą 67-bajtową wersję:(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 bajtów

-4 bajty dzięki 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))

Wypróbuj online!

frosqh
źródło
a-1-b == a + (-b-1) == a + ~bmoże być użyty dla -1 bajtu, przypisanie indexfunkcji do nazwy powoduje, że jest to 93 bajty
ovs
2

Japt , 27 25 24 bajtów

Inspirowany odpowiedzią @Arnauld

Dzięki @Shaggy -2 bajty i @ETHproductions -1 bajt

Właśnie zacząłem od skoku, więc musi to być lepszy sposób. \

[WsX=WbU)bV +XWsTWaV)aU]

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
1
Witamy w Japt :) Możesz zamienić te podwójne spacje )na startery, aby zaoszczędzić 2 bajty.
Kudłaty
@Shaggy Tanks! Nie wiedziałem o tym
Luis Felipe De Jesus Munoz
Podobnie jak ty jestem przekonany, że istnieje krótsza metoda. Jednak w tej chwili nie masz przestrzeni mózgowej, aby spróbować to rozgryźć!
Kudłaty
Witamy! Możesz zapisać jeden bajt, używając X=WbU)...+X: Wypróbuj online! Walczę też o znalezienie krótszej metody ...
ETHproductions
1

R , 81 bajtów

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))

Wypróbuj online!

(1-indeksowany)

digEmAll
źródło
1

MATL , 27 bajtów

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

Wypróbuj online!

Alternatywnie dla tego samego bajtu:

27 bajtów

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

Wypróbuj online!

Drugi łatwiej wyjaśnić:

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)

Druga część kodu robi to samo, z wyjątkiem tych zmian:

  • użyj 2Gdla drugiego wejścia (var1) i 3Gpierwszego trzeciego wejścia (var2) zamiast niejawnego wejścia lub i, ponieważ zostały one wykorzystane
  • użyj PY>P(odwróć tablicę od lewej do prawej, uzyskaj skumulowane maksimum, odwróć) zamiast Y>, aby uzyskać 1 s przed ostatnim wystąpieniem zamiast po pierwszym wystąpieniu
  • użyj, f0)aby uzyskać ostatnie miejsce, w którym oba warunki są spełnione, zamiast pierwszego (działa, ponieważ MATL używa indeksowania modułowego, więc 0 odnosi się do ostatniego indeksu tablicy)
sundar - Przywróć Monikę
źródło
1

MATLAB (80 bajtów)

Wejście jest x, yi a. Ponieważ MATLAB ma indeks 1, należy dodać 1 do przypadków testowych.

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

Przypadek testowy:

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
aaaaa mówi o przywróceniu Moniki
źródło
0

Java 8, 114 bajtów

Lambda bierze a java.util.List<Integer>i dwa ints (var1, var2) i zwraca parę oddzieloną przecinkami.

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

Wypróbuj online

Jakob
źródło
0

Kotlin , 132 bajty

{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)}()}

Wypróbuj online!

JohnWells
źródło
0

Julia , 71 64 bajtów

dzięki Sundar i jego find(A.==x)[]zamiast findfirst(A,x)).

.

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))
Tanj
źródło
Możesz zwrócić indeks oparty na 1, jeśli twój język jest oparty na 1 (to jest tutaj zwykły konsensus), więc nie potrzebujesz -1. Możesz także zapisać kolejny bajt, używając find(A.==x)[]zamiast findfirst(A,x).
sundar - Przywróć Monikę