Basamak Yarışı


16

Farklı tek basamaklı pozitif tamsayıların başlangıç ​​sırasını ve parçanın giriş çıktıları olarak uzunluğunu veren veya sayıların bitiş sırasını döndüren bir program veya işlev yazmalısınız.

Girdi [5,1,2,6,7] and 14aşağıdaki yarışı tanımlar:

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

Yarış kuralları

  • Parça etrafına sarılır ve rakamlar birden fazla tur atabilir.
  • Adım sırası döngüseldir ve başlangıç ​​konumuna bağlıdır. Örneğimizde 5 1 2 6 7 5 1 2 ....
  • Aynı konumda birden fazla basamak olamaz.
  • Her basamağın digit_valueadım başına hücre hızı vardır . Bir rakamı veya sürekli bir rakam bloğunu sollamak ekstra bir adım gerektirir. Rakam bunun için gerekli hıza sahip değilse, (blok) rakamlardan önce duracaktır. Örnekler:

    [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
    
  • Her rakam digit_valuebitmeden tur atmak zorundadır . Parçanın son hücresi bırakıldığında bir tur tamamlanır. Bitmiş bir rakam parçadan çıkarılır.

  • Bir basamağın bir adımda başlangıç ​​konumuna birden çok kez ulaşabileceğini ve birden fazla turu tamamlayabileceğini unutmayın.

Giriş

  • 1..9En az bir öğe ve tek bir pozitif tamsayı olan, listenin uzunluğundan, parçanın uzunluğundan daha büyük bir tek basamaklı pozitif tamsayıların ( ) listesi.

Çıktı

  • Belirli bir biçimde bitirildikleri sıradaki rakamların listesi.

Örnekler

Giriş için görsel adım adım örnek 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

Biçimdeki örnekler 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]

Bu kod golf bu yüzden en kısa giriş kazanır.


Muhtemelen, giriş dizisinin yinelenen öğeleri olamaz? Öyle görünüyor, ama bu durumun açıkça ifade edildiğini görmüyorum.
Andrew

@Andrew Evet, yinelenen rakamlar olamaz. Soruyu düzenledi. Teşekkürler.
randomra

Test durumu # 6 için (uzunluk = 17) Biraz farklı bir sonuç elde ederim (son iki basamak ters çevrildi). Hatanın nerede olduğunu merak ediyordum. Yarış günlüğüm bu . Hata mesajımı bulabilmem için lütfen sizinkini sağlayabilir misiniz?
Cristian Lupascu

@ w0lf Farkı buraya kaydedin . Derivasyonun başladığı 1 bittikten sonra 6 ile hareketi atlarsınız. (
Günlüğümün parçadan

Yanıtlar:


3

Yakut 229 236

Bu, iki parametre alan bir işlevdir: rakamları temsil eden bir dizi ve parçanın uzunluğunu temsil eden bir int. Rakamların yarışı bitirme sırasını temsil eden bir dizi döndürür.

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}

Çevrimiçi test edin: http://ideone.com/KyX5Yu

Düzenleme: Daha fazla karakter kaydetmek için bazı hileler anladım.

Ungolfed sürümü:

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 bayt

Çok kötü @ w0lf's daha kısa değil, ama ne. (Büyük girintilerin, yayınladığımda 4 boşluğa dönüşen sekmeler olduğunu unutmayın.)

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

İşte benim sihirli yastıklı kodum

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

Not : daha fazla iyileştirmeye ihtiyaç vardır ...

EDIT: kod kısaltılmış ... - sizeof (int) = 4, işlev = v, hala yerine bazı değişken kalır.


C'm paslanmış, ancak bu çağrıların sizeofyerini sihirli bir numara alabilir. Belki taşınabilir olmaz, ama hey - bu kod golf.
DLosc

Kodunuz 457 karakter uzunluğunda, 457 karakter uzunluğunda görünüyor. Ayrıca, gereksiz boşlukları kaldırarak ve işleve daha kısa bir ad vererek kodu daha da kısaltabileceğinizi düşünüyorum.
Cristian Lupascu

iyi teklifler için teşekkürler, ama benim için önemli bir şey, ben döngü ve printf, ben kodlanmış tek kusur, program nils yerine boş karakterler yazdırmaya devam iki işlev, her şeyi paketi başardı . ancak bu önemli boşluğa sahip betweed rakamlarını devirirsek yarış hala düzgün bir şekilde sona erer
Abr001am

IR değişkenleri varsayılan olarak int şeklindedir. Yani: v(int*M,int m){e=32;f=48;u=0;l=m;char a,... Ayrıca, o boşlukların neredeyse tamamı gereksizdir; ,V[m];for(i=0;... )printf(... );getch();}.
wizzwizz4
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.