Primeiro Último Último Primeiro

11

Desafio

A tarefa é simples. Dada uma matriz e um primeiro e último valor: Retorne o primeiro do último após o primeiro e o último do primeiro antes do último.


Ou simplesmente: dada uma matriz, var1, var2.

Matriz de exemplo:

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

Retorna:

  • O índice do primeiro var2 no lado direito do primeiro var1 que aparece na matriz.

[Var2,, primeiro var1 ,, primeiro var2 ,, segundo var2, var1, terceiro var2,]

  • O índice da primeira var1 no lado esquerdo da última var2 que aparece na matriz.

[var2,, segundo var1,, var2,, var2, primeiro var1 , último var2 ,]

Entrada

Dois números inteiros positivos distintos

Matriz de números inteiros positivos

Resultado

Índice de respostas, em ordem

Regras

A matriz conterá pelo menos uma de cada variável (tamanho mínimo de 2)

Suponha que as entradas funcionem

Exemplo: 0, 1 [1, 0]ou similar falharia

IO é flexível

Exemplos

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
fonte
3
pode var1ser igual a var2?
NGN
1
@ngn Não, não necessariamente. Se fossem, levariam a resultados principalmente triviais, portanto, não é necessário lidar com esse caso.
precisa
3
Bem-vindo ao PPCG!
Jonathan Allan
2
Podemos devolver a saída em ordem inversa? Por exemplo, os casos de teste resultariam em 9, 2, 6, 3e 0, 1respectivamente (ou mais um, se a saída for indexada em 1).
Erik the Outgolfer
1
Posicionando @Jakob, a redação atual não corresponde aos exemplos.
Nit

Respostas:

4

Python 2 , 72 bytes

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

Experimente online!

Lynn
fonte
4

JavaScript (ES6), 63 bytes

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

Experimente online!

Comentado

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

Versões alternativas

Usando JS embutidos, uma resposta mais direta é de 79 bytes:

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

que pode ser ligeiramente compactado para 75 bytes:

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

Experimente online!

Edit : @Neil conseguiu reduzi-lo para um muito bom 67 bytes :

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

Experimente online!

Arnauld
fonte
lastIndexOftem dois parâmetros, de modo que reduz a resposta clara a 70 bytes, e eu era capaz de chegar com a seguinte versão 67-byte:(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 bytes

-4 bytes graças a 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))

Experimente online!

frosqh
fonte
a-1-b == a + (-b-1) == a + ~bpode ser usado para -1 byte, atribuir a indexfunção a um nome obtém isso para 93 bytes
ovs 04/07/19
2

Japonês , 27 25 24 bytes

Inspirado na resposta @Arnauld

Obrigado @Shaggy -2 bytes e @ETHproductions -1 byte

Comecei com japt, então deve ser uma maneira melhor. \

[WsX=WbU)bV +XWsTWaV)aU]

Experimente online!

Luis felipe De jesus Munoz
fonte
1
Bem-vindo ao Japt :) Você pode substituir esses espaços duplos )por iniciantes para salvar 2 bytes.
Shaggy
@Shaggy Tanks! Eu não sabia disso
Luis felipe De jesus Munoz
Como você, estou convencido de que existe um método mais curto. Mas não tenha espaço para tentar descobrir no momento!
Shaggy
Bem-vinda! Você pode salvar um byte usando X=WbU)...+X: Experimente online! Eu também estou lutando para encontrar um método mais curto embora ...
ETHproductions
1

APL (Dyalog Unicode) , SBCS de 42 bytes

Função de infixo tácito anônimo. Pega var1, var2 como argumento à esquerda e a matriz como argumento à direita.

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

Experimente online!

Adão
fonte
1

R , 81 bytes

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

Experimente online!

(Indexado 1)

digEmAll
fonte
1

MATL , 27 bytes

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

Experimente online!

Como alternativa para o mesmo bytecount:

27 bytes

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

Experimente online!

O segundo é mais fácil de explicar:

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)

A segunda parte do código faz a mesma coisa, exceto pelas seguintes alterações:

  • use 2Gpara segunda entrada (var1) e 3Gprimeira 3ª entrada (var2) em vez de entrada implícita ou i, uma vez que essas foram consumidas
  • use PY>P(flip array da esquerda para a direita, obtenha o máximo cumulativo, volte) em vez de Y>, para obter 1s antes da última ocorrência e não após a primeira ocorrência
  • use f0)para obter o último lugar onde ambas as condições são verdadeiras, em vez do primeiro (funciona porque o MATL usa indexação modular, portanto, 0 é usado para se referir ao último índice da matriz)
sundar - Restabelecer Monica
fonte
1

MATLAB (80 bytes)

A entrada é x, ye a. Como o MATLAB é indexado em 1, você deve adicionar 1 aos casos de teste.

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

Caso de teste:

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 diz restabelecer Monica
fonte
0

Java 8, 114 bytes

Um lambda obtendo a java.util.List<Integer>e dois ints (var1, var2) e retornando um par separado por vírgula.

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

Experimente Online

Jakob
fonte
0

Kotlin , 132 bytes

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

Experimente online!

JohnWells
fonte
0

Julia , 71 64 bytes

graças ao sundar e ao find(A.==x)[]invés dele findfirst(A,x)).

.

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))
Tanj
fonte
Você pode retornar um índice baseado em 1 se o seu idioma for baseado em 1 (esse é o consenso usual aqui), portanto, não há necessidade de -1s. Além disso, você pode salvar outro byte usando em find(A.==x)[]vez de findfirst(A,x).
sundar - Restabelece Monica 07/07