เป็นคนแรกเป็นคนแรก


11

ท้าทาย

งานง่าย รับอาร์เรย์และค่าแรกและสุดท้าย: คืนค่าแรกของสุดท้ายหลังจากที่แรกและสุดท้ายของก่อนก่อนที่สุดท้าย


หรือเพียงแค่: รับอาร์เรย์, var1, var2

อาร์เรย์ตัวอย่าง:

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

กลับ:

  • ดัชนีของ var2 แรกทางด้านขวาของ var1 แรกที่ปรากฏในอาร์เรย์

[var2,, first 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!
Jonathan Allan

2
เราสามารถคืนเอาต์พุตในลำดับที่กลับรายการได้หรือไม่? ตัวอย่างเช่นกรณีทดสอบจะส่งผล9, 2ให้6, 3และ0, 1ตามลำดับ (หรือบวกหนึ่งถ้าผลลัพธ์เป็น 1 ดัชนี)
Erik the Outgolfer

1
Seconding @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`]
Neil


2

Japt , 27 25 24 ไบต์

สร้างแรงบันดาลใจใน@Arnauld คำตอบ

ขอบคุณ @Shaggy -2 ไบต์และ @ETHproductions -1 ไบต์

ฉันเพิ่งเริ่มด้วย japt ดังนั้นมันจะต้องเป็นวิธีที่ดีกว่า \

[WsX=WbU)bV +XWsTWaV)aU]

ลองออนไลน์!


1
ยินดีต้อนรับสู่ Japt :) คุณสามารถแทนที่ช่องว่างคู่เหล่านั้นด้วย)เพื่อให้ starters บันทึกได้ 2 ไบต์
Shaggy

@Shaggy Tanks! ฉันไม่ทราบเกี่ยวกับสิ่งนั้น
Luis felipe De jesus Munoz

เช่นเดียวกับคุณฉันเชื่อว่ามีวิธีที่สั้นกว่า ไม่มีสมองที่จะลองคิดดูในตอนนี้!
Shaggy

ยินดีต้อนรับ! คุณสามารถบันทึกหนึ่งไบต์โดยใช้X=WbU)...+X: ลองออนไลน์! ฉันยังดิ้นรนเพื่อหาวิธีที่สั้นกว่าแม้ว่า ...
ETHproductions

1

APL (Dyalog Unicode) , 42 ไบต์SBCS

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ รับค่า var1, var2 เป็นอาร์กิวเมนต์ด้านซ้ายและอาร์เรย์เป็นอาร์กิวเมนต์ที่ถูกต้อง

{⍸<\(⍵=⊃⌽⍺)∧∨\⍵=⊃⍺},{⍸⌽<\(⍵=⊃⍺)∧∨\⍵=⊃⌽⍺}∘⌽

ลองออนไลน์!



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 จะถูกนำไปอ้างอิงดัชนีสุดท้ายของอาร์เรย์)

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 - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.