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

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

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!


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!


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!


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

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)

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

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



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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.