การแข่งขันของตัวเลข


16

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดลำดับเริ่มต้นของจำนวนเต็มบวกหนึ่งหลักที่แตกต่างกันอย่างชัดเจนและความยาวของแทร็กเป็นเอาท์พุทอินพุตหรือส่งคืนลำดับเสร็จสิ้นของตัวเลข

อินพุต[5,1,2,6,7] and 14กำหนดการแข่งขันต่อไปนี้:

--------------
76215 ->
--------------

กฎของการแข่งขัน

  • แทร็กล้อมรอบและหลักสามารถไปหลายรอบ
  • คำสั่งของขั้นตอนเป็นรอบและขึ้นอยู่กับตำแหน่งเริ่มต้น 5 1 2 6 7 5 1 2 ...ในตัวอย่างของเรา
  • ต้องไม่มีตัวเลขหลายหลักในตำแหน่งเดียวกัน
  • ทุกหลักมีความเร็วของdigit_valueเซลล์ต่อขั้นตอน การแซงตัวเลขหรือการบล็อกตัวเลขต่อเนื่องมีค่าใช้จ่ายเพิ่มอีกหนึ่งขั้น หากตัวเลขไม่มีความเร็วที่จำเป็นสำหรับสิ่งนั้นมันจะหยุดก่อนที่ตัวเลข (บล็อก) ตัวอย่าง:

    [41   ] => [ 1 4 ]  4 overtakes 1
    
    [2 1  ] => [ 21  ]  2 can only move 1 as it can't move 3 to overtake 1
    
    [4 12 ] => [ 412 ]  4 can only move 1 as it can't move 5 to overtake 12     
    
    [   3 ] => [ 3   ]  3 starting a new lap
    
  • ตัวเลขทุกตัวต้องผ่านdigit_valueรอบก่อนที่มันจะเสร็จ รอบจะเสร็จสมบูรณ์เมื่อเซลล์สุดท้ายของแทร็กถูกทิ้ง ตัวเลขที่เสร็จแล้วจะถูกลบออกจากแทร็ค

  • โปรดทราบว่าตัวเลขอาจถึงตำแหน่งเริ่มต้นหลายครั้งผ่านหนึ่งขั้นตอนและทำหลายรอบ

อินพุต

  • รายการเลขจำนวนเต็มบวกหนึ่งหลัก ( 1..9) ที่แตกต่างกันอย่างน้อยหนึ่งองค์ประกอบและจำนวนเต็มบวกเดียวมากกว่าความยาวของรายการความยาวของแทร็ก

เอาท์พุต

  • รายการตัวเลขตามลำดับพวกเขาเสร็จสิ้นในรูปแบบที่ชัดเจนใด ๆ

ตัวอย่าง

ภาพตัวอย่างทีละขั้นตอนสำหรับภาพ starting_order = [5,9,2] and length = 6

295   | Start position
29   5| digit 5 moves
2  9 5| digit 9 moves, finishing lap #1
  29 5| digit 2 moves
 529  | digit 5 moves, finishing lap #1
 52  9| digit 9 moves, finishing lap #2
 5  29| digit 2 moves
   529| digit 5 moves
 9 52 | digit 9 moves, finishing laps #3 and #4
29 5  | digit 2 moves, finishing lap #1
29   5| digit 5 moves
2  9 5| digit 9 moves, finishing lap #5
  29 5| digit 2 moves
 529  | digit 5 moves, finishing lap #2
 52  9| digit 9 moves, finishing lap #6
 5  29| digit 2 moves
   529| digit 5 moves
 9 52 | digit 9 moves, finishing laps #7 and #8
 9 5  | digit 2 moves, finishing lap #2 --> remove 2 from the track
59    | digit 5 moves, finishing lap #3
5     | digit 9 moves, finishing lap #9 --> remove 9 from the track
     5| digit 5 moves
    5 | digit 5 moves, finishing lap #4
      | digit 5 moves, finishing lap #5 --> remove 5 from the track
------
Finish order: 2 9 5

ตัวอย่างในรูปแบบ Input => Output

[3], 2  =>  [3]

[9, 5], 3  =>  [9, 5]

[5, 9, 2], 6  =>  [2, 9, 5]

[5, 9, 2], 10  =>  [5, 9, 2]

[5, 7, 8, 1, 2], 10  =>  [1, 5, 7, 8, 2]

[5, 1, 6, 8, 3, 2], 17  =>  [1, 6, 8, 2, 3, 5]

[1, 2, 3, 7, 8, 9], 15  =>  [1, 7, 8, 9, 2, 3]

[9, 8, 7, 3, 2, 1], 15  =>  [8, 7, 9, 1, 2, 3]

[1, 2, 3, 4, 5, 6, 7, 8, 9], 20  =>  [1, 2, 3, 4, 5, 6, 7, 8, 9]

[9, 8, 7, 6, 5, 4, 3, 2, 1], 20  =>  [8, 7, 5, 9, 6, 1, 2, 4, 3]

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ


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

@Andrew ใช่ไม่สามารถมีตัวเลขที่ซ้ำกันได้ แก้ไขคำถาม ขอบคุณ
randomra

สำหรับกรณีทดสอบ # 6 (ความยาว = 17) ฉันได้ผลลัพธ์ที่ต่างออกไปเล็กน้อย (กลับหลังสองหลักสุดท้าย) ฉันสงสัยว่าความผิดพลาดของฉันอยู่ที่ไหน บันทึกการแข่งขันของฉันคือนี้ คุณช่วยกรุณามอบให้คุณเพื่อที่ฉันจะได้พบกับความผิดพลาดได้หรือไม่?
Cristian Lupascu

@ w0lf บันทึกข้อแตกต่างที่นี่ คุณข้ามการย้ายด้วย 6 หลังจาก 1 เสร็จสิ้นที่มาเริ่ม (หมายเหตุบันทึกของฉันมีตัวเลขก่อนที่จะถูกลบออกจากการติดตามและคุณทำไม่ได้.)
randomra

คำตอบ:


3

ทับทิม 229 236

นี่คือฟังก์ชั่นที่รับพารามิเตอร์สองตัว: อาเรย์แทนตัวเลขและ int แสดงถึงความยาวของแทร็ก ส่งคืนอาร์เรย์ซึ่งแสดงถึงลำดับที่ตัวเลขสิ้นสุดการแข่งขัน

F=->d,l{
i=0
t=d.map{|x|[x,d.size-(i+=1)]}
r=[]
d.cycle.map{|n|
t==[]&&break
(c=t.find{|x,_|x==n})&&(s=n
w=c[1]
o=p
(a=(t-[c]).map{|_,p|p%l}
s-=1;w+=1
a&[w%l]==[]?(o=p;c[1]=w):o||s-=o=1)while s>0
c[1]>=n*l&&(t.delete c;r<<n))}
r}

ทดสอบออนไลน์: http://ideone.com/KyX5Yu

แก้ไข:คิดเทคนิคเพื่อบันทึกตัวอักษรเพิ่มเติม

เวอร์ชันที่ไม่ถูกปรับแต่ง:

F=->digits,length{
  digit_positions = digits.map.with_index{|d,i|[d,digits.size-i-1] }

  result = []

  digits.cycle.map{|n|
    break if digit_positions==[]
    crt = digit_positions.find{|x,_|x==n}
    next unless crt

    steps_left = n
    pos = crt[1]
    taking_over = false

    while steps_left > 0
      other_pos = (digit_positions-[crt]).map{|_,p|p%length}

      steps_left-=1
      pos += 1

      if other_pos.include? (pos%length)
        steps_left -= 1 unless taking_over
        taking_over = true
      else
        taking_over = false
        crt[1] = pos
      end
    end

    if crt[1] >= n*length
      digit_positions.delete(crt)
      result<<n
    end
  }
  result
}

2

Python 2, 345 ไบต์

น่าเสียดายที่มันสั้นกว่า @ w0lf ไม่มากนัก แต่เป็น whatev (โปรดทราบว่าเยื้องขนาดใหญ่เป็นแท็บซึ่งแปลเป็น 4 ช่องว่างเมื่อฉันโพสต์)

def r(o,l):
 n=len(o);s,t,a,d=dict(zip(o,range(n)[::-1])),-1,{_:0 for _ in o},[]     
 while len(s):
    t+=1;g=o[t%n]
    if g in d:continue
    y,k=s[g],1;i=z=w=0
    for _ in[0]*g:
     i+=1;m=y+i;e,p=m%l,m/l
     if-~a[g]+w>=g<d>m>=l:a[g]+=1;del s[g];d+=[g];break
     if e in s.values()and e!=y:i-=k;k=0
     else:k,s[g],(w,z)=1,e,[(w,z),(z,p)][z<p]
    a[g]+=z
 print d

0

นี่คือรหัสเบาะวิเศษของฉัน

ค (457 430b)

int v(int*M,int m){
int i,n,c,d,e=32,f=48,u=0,g=10,h,k,r,l=m,j;char a,*b=&a,*B,V[m];
for (i=0;u<m*m*m;i=(++u%m),*B=*b=(u<=l)?*b:e,b=B=&a)
printf("%c%c",0*(V[i]=(u<l?u>=(r=l-sizeof(M)/4)?M[u-r]+f:e:V[i])),((((V[c=(((V[i]=u<l?e:V[i])-f)/10<u/m)?j>=0&h<i|((h=(j=strchr(V+((k=(m+(d=(i-(V[i]-f)%g+1)))%m)),e)-V)<0?(int)(strchr(V,e)-V):(int)j)>=k)*(k>i)?h:m :m])=((V[c]==e)?(*(b=V+i)+(d<0)*g):V[c])))-f)%11==0?(*(B=V+c)-f)%g+f:0);
getch();
}

หมายเหตุ : มันต้องการการปรับปรุงเพิ่มเติม ...

แก้ไข:รหัสสั้นลง ... - ขนาดของ (int) = 4, ฟังก์ชั่น = v ยังคงเป็นตัวแปรที่จะทำ


My C เป็นสนิม แต่การโทรเหล่านั้นsizeofดูเหมือนว่าพวกเขาสามารถถูกแทนที่ด้วยหมายเลขเวทย์มนตร์ บางทีมันอาจจะไม่พกพาได้ แต่เฮ้ - นี่คือโค้ดกอล์ฟ
DLosc

รหัสของคุณดูเหมือนจะยาว 453 ตัวอักษรไม่ใช่ 457 นอกจากนี้ฉันคิดว่าคุณสามารถย่อให้สั้นลงได้อีกโดยลบช่องว่างที่ไม่จำเป็นออกและให้ชื่อฟังก์ชันสั้นลง
Cristian Lupascu

ดีขอบคุณสำหรับข้อเสนอ แต่สิ่งสำคัญสำหรับฉันฉันประสบความสำเร็จในการแพ็คสิ่งทั้งหมดในสองฟังก์ชั่นสำหรับวนและ printf ข้อบกพร่องเดียวที่ฉัน encoutered โปรแกรมให้พิมพ์ตัวอักษรที่ว่างเปล่าแทนนิล แต่การแข่งขันก็ยังคงจบลงอย่างถูกต้องถ้าเราทำให้ตัวเลขโมฆะไร้เดียงสาไร้ขีด จำกัด
Abr001am

ตัวแปร Iirc นั้นเป็นค่าเริ่มต้น ดังนั้น: v(int*M,int m){e=32;f=48;u=0;l=m;char a,... นอกจากนี้ช่องว่างเกือบทั้งหมดนั้นไม่จำเป็น ,V[m];for(i=0;... ...)printf( );getch();}
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.