โทรศัพท์ไร้สายเก่า


9

ฉันต้องโทรหาเพื่อน ๆ แต่ปุ่มของโทรศัพท์ไร้สายทำงานไม่ถูกต้อง ปุ่มเดียวที่ฉันสามารถกดได้คือ [ขึ้น], [ลง] และ [โทร] สามารถใช้ [ขึ้น] และ [ลง] เพื่อนำทางในสายล่าสุดของฉันและสามารถใช้ [โทร] เพื่อโทรหาชื่อที่เลือกได้ โทรศัพท์ของฉันมีรายการที่มีNการโทรล่าสุดและฉันรู้ว่าเพื่อนทุกคนที่ฉันต้องการโทรอยู่ในรายการนี้


งาน:

คุณจะได้รับหมายเลขNและรายชื่อL:

  • N คือจำนวนการโทรล่าสุดที่โทรศัพท์ของฉันจำได้
  • L มีชื่อตามลำดับที่ฉันต้องการโทร

คุณต้องส่งออกจำนวนกดปุ่มที่ฉันต้องการในการจัดเรียงที่ดีที่สุดของรายการโทรล่าสุด


ตัวอย่าง:

-> อินพุต:

โทรหาแอนนาบ็อบแล้วก็แอนนาอีกครั้ง ด้วยรายการโทรล่าสุดขนาด 5

5
Anna
Bob
Anna

-> เอาท์พุท:

การจัดเรียงที่เหมาะสมที่สุดที่เป็นไปได้: Anna, Foo, Bar, Foobar, Bob

5    # Key presses: [Call] Anna, [Up] + [Call] Bob, [Down] + [Call] Anna

กรณีทดสอบเพิ่มเติม:

Input: 5, Anna, Bob, Carl
Output: 5

Input: 5, Anna, Bob, Carl, Anna
Output: 8

Input: 5, A, B, C, D, E, A
Output: 11

Input: 6, A, B, C, D, E, A
Output: 12

Input: 4, A, B, C, B, A
Output: 10

กฎ:

  • เคอร์เซอร์ของคุณจะเริ่มต้นในตำแหน่งแรกของรายการเสมอ
  • คุณสามารถรับอินพุตNและLจากแหล่งใดก็ได้: แป้นพิมพ์พารามิเตอร์ไฟล์ ฯลฯ
  • ชื่อในรายการสามารถอยู่ในรูปแบบที่สมเหตุสมผลเช่น: สตริง, จำนวนเต็ม, ตัวอักษร;
  • เมื่อคุณมาถึงจุดสิ้นสุดของรายการโทรล่าสุดและกด [ลง] อีกครั้งเคอร์เซอร์จะล้อมรอบ สิ่งเดียวกันจะเกิดขึ้นเมื่อคุณอยู่ในช่วงเริ่มต้นของรายการโทรล่าสุดและกด [ขึ้น];
  • เมื่อคุณโทรหาใครบางคนชื่อของบุคคลนั้นจะถูกย้ายไปยังตำแหน่งแรกของรายการโทรล่าสุดและส่วนที่เหลือจะถูกกดลง
  • เมื่อคุณโทรหาใครบางคนเคอร์เซอร์ของคุณจะถูกย้ายไปที่ตำแหน่งแรก
  • ชื่อเพื่อนไม่สามารถปรากฏได้มากกว่าหนึ่งครั้งในรายการโทรล่าสุด
  • คุณสามารถเติมรายการโทรล่าสุดของคุณด้วยรายการจำลอง (ดูตัวอย่าง);
  • Nจำนวนเพื่อนที่จะเรียกจะไม่มากกว่า

คำตอบ:


1

Ruby , 97 95 94 ไบต์

->n,a{r=a.size;1.upto(r-1){|i|r+=[p=a[(a[0,i].rindex(a[i])||i-2)+1...i].uniq.size,n-p].min};r}

ลองออนไลน์!

ในการจัดเรียงที่เหมาะสมที่สุดชื่อแรกจะได้รับการกดหนึ่งครั้ง ( Call) ชื่อที่ยังไม่ถูกเรียกใช้จะมีการกดสองครั้ง ( Up Call) และชื่อที่มีจำนวนแตกต่างกันไปขึ้นอยู่กับจำนวนชื่อที่ไม่ซ้ำกันอื่น ๆ ที่ได้รับการเรียกตั้งแต่นั้นมาและไม่ว่าจะวางไว้ใกล้กับด้านบน

ฉันคิดว่านี่เป็นกลยุทธ์ที่คล้ายกันหรือเหมือนกับของ WaffleCohn


3

Python 3 , 195 185 164 bytes

-4 ไบต์ขอบคุณ @notjagan
-27 ไบต์ขอบคุณ @FelipeNardiBatista

lambda n,l:min(g([*x],l,n)for x in permutations(range(n)))
def g(x,l,n,r=0):
 for p in l:a=x.index(p);x=[x.pop(a)]+x;r-=~min(a,n-a)
 return r
from itertools import*

ลองออนไลน์!

L ถูกใช้เป็นรายการจำนวนเต็มจาก [0, N)


-4 ไบต์
notjagan

@notjagan สิ่งนี้ไม่ทำงานตามที่x=[x[a]]+x[:a]+x[a+1:]กำหนดให้xกับรายการวัตถุใหม่ iจะยังคงเป็นindexวิธีการบนวัตถุรายการเก่า
OVS

@ovs -10 ไบต์ใช้คำแนะนำของเฟลิเป้และสิ่งที่ฉันมีนอกเหนือจากx.indexนี้
notjagan


@FelipeNardiBatista ขอบคุณมาก
OVS

1

JavaScript (SpiderMonkey) , 213 143 ไบต์

(N,L)=>L.reduce((t,v,i)=>{x=0,a=[v]
for(j=i;j-->=0&!~a.indexOf(L[j]);x++)a+=L[j]+","
return i?t+((x=L.indexOf(v)-i?x:1)<N-x?x:N-x):t},L.length)

ลองออนไลน์!

สร้างข้อตกลงที่ดีที่สุดของชื่อที่กำหนดแล้วนับจำนวนกดคีย์

ข้ามการสร้างและนับจำนวนการกดปุ่มเพียงปุ่มเดียวซึ่งแต่ละชื่อจะได้รับการจัดเรียงอย่างเหมาะสมที่สุด

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