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.