İlk Son Son İlk İlk


11

Meydan okuma

Görev basit. Bir dizi ve bir ilk ve son değer verildiğinde: Birinciden sonraki sondan birincisini ve sondan önceki ilkin sonunu döndürür.


Veya basitçe: Bir dizi verilir, var1, var2.

Örnek Dizi:

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

Dönüş:

  • Dizide görünen ilk var1'in sağ tarafındaki ilk var2 dizini.

[var2,, ilk var1 ,, ilk var2 ,, ikinci var2, var1, üçüncü var2,]

  • Dizide görünen son var2'nin sol tarafındaki ilk var1'in dizini.

[var2,, ikinci var1,, var2,, var2, ilk var1 , son var2 ,]

Giriş

İki farklı pozitif tamsayı

Pozitif tamsayı dizisi

Çıktı

Cevap dizini

kurallar

Dizi, her bir değişkenten en az birini içerecektir (minimum boyut 2)

Girdilerin işe yaradığını varsayın

Örnek: 0, 1 [1, 0]veya benzeri başarısız olur

ES esnektir

Örnekler

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
olabilir var1eşit olması var2?
— ngn

1
@ngn Hayır, ille de değil. Eğer olsaydı, çoğunlukla önemsiz sonuçlara yol açacaktı, bu yüzden bu davayı ele almak gerekli değildir.
— WretchedLout

3
PPCG'ye Hoşgeldiniz!
— Jonathan Allan

2
Çıktıyı ters sırada döndürebilir miyiz? Örneğin, test durumlarda neden olur 9, 2, 6, 3ve 0, 1sırasıyla (çıkış veya artı bir 1 ise endeksli).
— Outgolfer Erik

1
@ Jakob'dan sonra, mevcut ifade örneklerle eşleşmiyor.
— Nit

Yanıtlar:





4

JavaScript (ES6), 63 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

Alternatif versiyonlar

JS yerleşiklerini kullanarak, daha basit bir yanıt 79 bayttır:

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

75 bayta hafifçe sıkıştırılabilen:

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

Çevrimiçi deneyin!

Düzenleme : @Neil çok güzel bir 67 bayt azaltmayı başardı :

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

Çevrimiçi deneyin!


lastIndexOfiki parametre alır, böylece basit cevabı 70 bayta indirir ve aşağıdaki 67 baytlık bir versiyona gelebildim:(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 bayt

Ovs sayesinde -4 bayt

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

Çevrimiçi deneyin!


a-1-b == a + (-b-1) == a + ~b-1 bayt için kullanılabilir, indexfonksiyonun bir isme atanması bunu 93 bayta
— ovs

2

Japt , 27 25 24 bayt

@Arnauld yanıtından esinlendi

Teşekkürler @Shaggy -2 bayt ve @ETHproductions -1 bayt

Japt ile yeni başladım, bu yüzden daha iyi bir yol olmalı.

[WsX=WbU)bV +XWsTWaV)aU]

Çevrimiçi deneyin!


1
Japt'e hoş geldiniz :) Bu çift boşlukları )yeni başlayanlar için 2 bayt tasarruf etmek için değiştirebilirsiniz .
— Shaggy

@Shaggy Tankları! Bunu bilmiyordum
— Luis felipe De jesus Munoz

Sizin gibi, daha kısa bir yöntem olduğuna ikna oldum. Yine de, şu anda anlamaya çalışmak için beyin fırtınası yok!
— Shaggy

Hoşgeldiniz! Şunu kullanarak bir bayt kaydedebilirsiniz X=WbU)...+X: Çevrimiçi deneyin! Ben de daha kısa bir yöntem bulmak için mücadele ediyorum ...
— ETHproductions



1

MATL , 27 bayt

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

Çevrimiçi deneyin!

Alternatif olarak aynı bayt hesabı için:

27 bayt

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

Çevrimiçi deneyin!

İkincisinin açıklaması daha kolaydır:

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)

Kodun ikinci kısmı, bu değişiklikler dışında aynı şeyi yapar:

  • kullanımı 2G, ikinci girişe (Q1) ile ve 3Gilk 3. girişi (var2) yerine kapalı giriş veya ibu tüketilen beri
  • ilk olaydan sonra değil , sonPY>P tekrardan Y>1s önce almak için (soldan sağa çevirme, kümülatif maksimum alma, geri çevirme) kullanın
  • ilk yer yerine her iki koşulun da geçerli olduğu son yeri f0)almak için kullanın (MATL modüler dizinleme kullandığından çalışır, bu nedenle dizinin son dizinine başvurmak için 0 alınır)

1

MATLAB (80 bayt)

Girdi olduğunu x, yve a. MATLAB 1 dizinli olduğu için test senaryolarına 1 eklemeniz gerekir.

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

Test durumu:

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 bayt

A java.util.List<Integer>ve iki ints (var1, var2) alan ve virgülle ayrılmış bir çift döndüren bir lambda .

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

Çevrimiçi Deneyin



0

Julia , 71 64 bayt

sundar ve onun find(A.==x)[]yerine teşekkürler findfirst(A,x)).

.

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

Diliniz 1 tabanlıysa (buradaki olağan konsensüs) 1 tabanlı bir dizin döndürebilirsiniz, bu nedenle -1'lere gerek yoktur. Ayrıca, find(A.==x)[]yerine kullanarak başka bir bayt kaydedebilirsiniz findfirst(A,x).
— sundar - Monica'yı geri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.