Перший Останній Останній Перший


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

3
може var1дорівнювати var2?
ngn

1
@ngn Ні, не обов’язково. Якби вони були, це призвело б до переважно тривіальних результатів, тому не варто впоратися з цим випадком.
WretchedLout

3
Ласкаво просимо до PPCG!
Джонатан Аллан

2
Чи можемо ми повернути вихід у зворотному порядку? Наприклад, тестові приклади приведуть 9, 2, 6, 3і , 0, 1відповідно (або плюс один , якщо вихід 1-індексований).
Erik the 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`]

Спробуйте в Інтернеті!


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`]
Ніл


2

Japt , 27 25 24 байт

Натхненний відповіддю @Arnauld

Дякуємо @Shaggy -2 байт та @ETHproductions -1 байт

Я щойно почав з japt, тому це повинен бути кращий спосіб. \

[WsX=WbU)bV +XWsTWaV)aU]

Спробуйте в Інтернеті!


1
Ласкаво просимо в Japt :) Ви можете замінити ці подвійні пробіли на )для початку, щоб зберегти 2 байти.
Shaggy

@Shaggy Tanks! Я цього не знав
Луїс феліпе Де єсус Муноз

Як і ви, я переконаний, що існує коротший метод. Не майте мозкового простору, щоб спробувати це з'ясувати на даний момент!
Shaggy

Ласкаво просимо! Ви можете зберегти один байт, скориставшись X=WbU)...+X: Спробуйте в Інтернеті! Я також намагаюся знайти більш короткий метод ...
ETHproductions



1

MATL , 27 байт

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

Спробуйте в Інтернеті!

По черзі на той самий рахунок:

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першого третього входу (var2) замість неявного введення або i, оскільки вони були спожиті
  • використовуйте PY>P(переверніть масив вліво-вправо, отримайте накопичувальний максимум, поверніть назад) замість Y>, щоб отримати 1s перед останнім явищем, а не після першого появи
  • використовувати, f0)щоб отримати останнє місце, де обидві умови істинні, а не перше місце (працює тому, що MATL використовує модульну індексацію, тому 0 приймається для позначення останнього індексу масиву)

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)

Спробуйте це в Інтернеті



0

Джулія , 71 64 байт

завдяки Sundar та його find(A.==x)[]замість findfirst(A,x)).

.

(A,x,y)->findnext(A,y,find(A.==x)[]),findprev(A,x,findlast(A,y))

Ви можете повернути індекс на основі 1, якщо ваша мова заснована на 1 (це звичайний консенсус тут), тому немає потреби в -1. Крім того, ви можете зберегти інший байт, використовуючи find(A.==x)[]замість findfirst(A,x).
sundar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.