Первый Последний Последний Первый

11

Вызов

Задача проста. Для данного массива и первого и последнего значения: вернуть первое из последнего после первого и последнее из первого перед последним.


Или просто: учитывая массив, var1, var2.

Пример массива:

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

Возвращение:

  • Индекс первого var2 справа от первого var1, который появляется в массиве.

[Var2,, первый var1 ,, первый var2 , во -вторых var2, var1, var2 третий,]

  • Индекс первого var1 слева от последнего var2, который появляется в массиве.

[var2,, второй var1,, var2,, var2, первый var1 , последний var2 ,]

вход

Два разных положительных целых числа

Массив натуральных чисел

Выход

Указатель ответов, по порядку

правила

Массив будет содержать как минимум одну переменную (минимальный размер 2)

Предположим, входные данные работают

Пример: 0, 1 [1, 0]или подобное не получится

IO гибкий

Примеры

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
источник
3
может var1быть равным var2?
нгн
1
@ngn Нет, не обязательно. Если бы они были, это привело бы в основном к тривиальным результатам, поэтому нет необходимости разбираться с этим делом.
WretchedLout
3
Добро пожаловать в PPCG!
Джонатан Аллан
2
Можем ли мы вернуть результат в обратном порядке? Например, тестовые случаи будут приводить к 9, 2, 6, 3и 0, 1соответственно (или плюс один, если выходные данные индексируются 1).
Эрик Outgolfer
1
После @Jakob текущая формулировка не соответствует примерам.
Нить

Ответы:

4

JavaScript (ES6), 63 байта

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

Попробуйте онлайн!

комментарии

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

Альтернативные версии

Используя встроенные JS, более простой ответ - 79 байтов:

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

который может быть немного сжат до 75 байт:

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

Попробуйте онлайн!

Редактировать : @Neil удалось уменьшить его до очень хорошего 67 байт :

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

Попробуйте онлайн!

Arnauld
источник
lastIndexOfпринимает два параметра, так что прямой ответ уменьшается до 70 байт, и мне удалось придумать следующую 67-байтовую версию:(x,y,a,f=s=>a[z=y,y=x,x=z,s+=`ndexOf`](x,a[s](y)))=>[f`i`,f`lastI`]
Нейл
3

Python 3 , 97 93 байта

-4 байта благодаря овсу

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

Попробуйте онлайн!

frosqh
источник
a-1-b == a + (-b-1) == a + ~bможет использоваться для -1 байта, назначение indexфункции имени получает это до 93 байтов
ovs
2

Japt , 27 25 24 байта

Вдохновленный в ответе @Arnauld

Спасибо @Shaggy -2 байта и @ETHproductions -1 байт

Я только начал с japt, так что это должно быть лучше. \

[WsX=WbU)bV +XWsTWaV)aU]

Попробуйте онлайн!

Луис Фелипе Де Иисус Муньос
источник
1
Добро пожаловать в Japt :) Вы можете заменить эти двойные пробелы )для начала, чтобы сэкономить 2 байта.
Лохматый
@ Shaggy Tanks! Я не знал об этом
Луис Фелипе Де Иисус Муньос
Как и вы, я уверен, что есть более короткий метод. Но пока у вас нет мозгов, чтобы попытаться понять это!
Лохматый
Добро пожаловать! Вы можете сохранить один байт, используя X=WbU)...+X: Попробуйте онлайн! Я также изо всех сил пытаюсь найти более короткий метод, хотя ...
ETHproductions
1

MATL , 27 байт

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

Попробуйте онлайн!

Поочередно для того же bytecount:

27 байт

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

Попробуйте онлайн!

Второй легче объяснить:

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)

Вторая часть кода делает то же самое, за исключением следующих изменений:

  • использовать 2Gдля второго ввода (var1) и 3Gпервого 3-го входа (var2) вместо неявного ввода или i, поскольку они были использованы
  • используйте PY>P(перевернуть массив слева направо, получить кумулятивный максимум, перевернуть) вместо Y>, чтобы получить 1 с до последнего вхождения, а не после первого вхождения
  • используйте, f0)чтобы получить последнее место, где оба условия выполняются, а не первое (работает, потому что MATL использует модульную индексацию, поэтому 0 используется для ссылки на последний индекс массива)
sundar - Восстановить Монику
источник
1

MATLAB (80 байт)

Ввод является x, yи a. Поскольку MATLAB индексируется 1, вы должны добавить 1 в тестовые случаи.

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

Прецедент:

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 байт

Лямбда, берущая a java.util.List<Integer>и два ints (var1, var2) и возвращающая пару через запятую.

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

Попробуйте онлайн

Jakob
источник
0

Юлия , 71 64 байта

спасибо Сундар и его find(A.==x)[]вместо findfirst(A,x)).

,

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))
Tanj
источник
Вы можете вернуть индекс на основе 1, если ваш язык основан на 1 (здесь это обычный консенсус), поэтому нет необходимости в -1. Кроме того, вы можете сохранить другой байт, используя find(A.==x)[]вместо findfirst(A,x).
sundar - Восстановить Монику