Cuộc đua của các chữ số


16

Bạn nên viết một chương trình hoặc hàm có thứ tự bắt đầu gồm các số nguyên dương một chữ số riêng biệt và độ dài của bản nhạc làm đầu ra đầu vào hoặc trả về thứ tự kết thúc của các số.

Đầu vào [5,1,2,6,7] and 14xác định cuộc đua sau:

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

Quy tắc của cuộc đua

  • Theo dõi kết thúc tốt đẹp và chữ số có thể đi nhiều vòng.
  • Thứ tự các bước là tuần hoàn và dựa trên vị trí bắt đầu. Trong ví dụ của chúng tôi 5 1 2 6 7 5 1 2 ....
  • Không thể có nhiều chữ số trong cùng một vị trí.
  • Mỗi chữ số có tốc độ digit_valuedi động trên mỗi bước. Vượt qua một chữ số hoặc một khối chữ số liên tục tốn thêm một bước. Nếu chữ số không có tốc độ cần thiết thì nó sẽ dừng trước (khối) chữ số. Ví dụ:

    [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
    
  • Mỗi chữ số phải đi digit_valuevòng trước khi nó kết thúc. Một vòng đua được hoàn thành khi ô cuối cùng của bản nhạc được để lại. Một chữ số hoàn thành được loại bỏ khỏi đường đua.

  • Lưu ý rằng một chữ số có thể đạt đến vị trí bắt đầu của nó nhiều lần qua một bước và hoàn thành nhiều vòng.

Đầu vào

  • Danh sách các số nguyên dương một chữ số riêng biệt ( 1..9) có ít nhất một phần tử và một số nguyên dương duy nhất, lớn hơn độ dài của danh sách, độ dài của bản nhạc.

Đầu ra

  • Một danh sách các chữ số theo thứ tự chúng đã hoàn thành ở bất kỳ định dạng rõ ràng nào.

Ví dụ

Một ví dụ trực quan từng bước cho đầu vào 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

Ví dụ ở định dạng 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]

Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.


Có lẽ, mảng đầu vào có thể có các yếu tố trùng lặp? Có vẻ như vậy, nhưng tôi không thấy điều kiện đó được nêu rõ ràng.
Andrew

@Andrew Có, không thể có bất kỳ chữ số trùng lặp nào. Chỉnh sửa câu hỏi. Cảm ơn.
ngẫu nhiên

Đối với trường hợp thử nghiệm # 6 (length = 17) tôi nhận được kết quả hơi khác (hai chữ số cuối được đảo ngược). Tôi đã tự hỏi sai lầm của tôi ở đâu. Nhật ký cuộc đua của tôi là thế này . Bạn có thể vui lòng cung cấp của bạn để tôi có thể tìm và tìm lỗi của tôi?
Cristian Lupascu

@ w0lf Đăng nhập chênh lệch tại đây. Bạn bỏ qua di chuyển với 6 sau khi 1 kết thúc nơi bắt nguồn. (Lưu ý nhật ký của tôi chứa các chữ số trước khi xóa khỏi bản nhạc và của bạn thì không.)
Randomra

Câu trả lời:


3

Ruby 229 236

Đây là một hàm có hai tham số: một mảng biểu thị các chữ số và int biểu thị độ dài của rãnh. Nó trả về một mảng, thể hiện thứ tự các chữ số kết thúc cuộc đua.

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}

Kiểm tra trực tuyến: http://ideone.com/KyX5Yu

Chỉnh sửa: Tìm ra một số thủ thuật để tiết kiệm thêm một số ký tự.

Phiên bản bị đánh cắp:

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 byte

Thật tệ, nó không ngắn hơn @ w0lf, nhưng whatev. (Lưu ý rằng các thụt lề lớn là các tab, dịch sang 4 không gian khi tôi đăng.)

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

đây là mã đệm ma thuật của tôi

C (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();
}

Lưu ý : cần cải thiện nhiều hơn ...

EDIT: mã rút ngắn ... - sizeof (int) = 4, function = v, vẫn còn một số biến thay thế để làm.


My C bị gỉ, nhưng những cuộc gọi đó sizeofdường như có thể được thay thế bằng một con số ma thuật. Có lẽ nó sẽ không di động, nhưng này - đây là môn đánh gôn.
DLosc

Mã của bạn dường như dài 453 ký tự chứ không phải 457. Ngoài ra, tôi nghĩ bạn có thể rút ngắn nó hơn nữa bằng cách xóa các khoảng trắng không cần thiết và đặt tên hàm ngắn hơn.
Cristian Lupascu

cũng cảm ơn về các đề xuất, nhưng điều quan trọng đối với tôi, tôi đã thành công trong việc đóng gói toàn bộ hai chức năng, cho vòng lặp và printf, lỗ hổng duy nhất tôi trang bị, chương trình tiếp tục in các ký tự trống thay vì nils. nhưng cuộc đua vẫn kết thúc đúng cách nếu chúng ta loại bỏ những chữ số trống rỗng bất lực đó
Abr001am

Các biến Iirc là int theo mặc định. Vì vậy: v(int*M,int m){e=32;f=48;u=0;l=m;char a,... Ngoài ra, gần như tất cả các khoảng trắng đó là không cần thiết; ,V[m];for(i=0;... )printf(... );getch();}.
wizzwizz4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.