İ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.