Course des chiffres

16

Vous devez écrire un programme ou une fonction qui a donné un ordre de départ d'entiers positifs distincts à un chiffre et la longueur de la piste en tant que sorties d'entrée ou retourne l'ordre d'arrivée des nombres.

L'entrée [5,1,2,6,7] and 14définit la course suivante:

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

Règles de la course

  • La piste s'enroule et les chiffres peuvent parcourir plusieurs tours.
  • L'ordre des étapes est cyclique et basé sur la position de départ. Dans notre exemple 5 1 2 6 7 5 1 2 ....
  • Il ne peut pas y avoir plusieurs chiffres dans la même position.
  • Chaque chiffre a une vitesse de digit_valuecellule par pas. Le dépassement d'un chiffre ou d'un bloc continu de chiffres coûte une étape supplémentaire. Si le chiffre n'a pas la vitesse nécessaire pour cela, il s'arrêtera avant le (bloc de) chiffre (s). Exemples:

    [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
    
  • Chaque chiffre doit faire des digit_valuetours avant de terminer. Un tour est terminé lorsque la dernière cellule de la piste est laissée. Un chiffre terminé est supprimé de la piste.

  • Notez qu'un chiffre peut atteindre sa position de départ plusieurs fois au cours d'une étape et effectuer plusieurs tours.

Contribution

  • Une liste d'entiers positifs distincts à un chiffre (1..9 ) avec au moins un élément et un seul entier positif, supérieur à la longueur de la liste, la longueur de la piste.

Production

  • Une liste de chiffres dans l'ordre où ils ont terminé dans un format non ambigu.

Exemples

Un exemple visuel étape par étape pour l'entrée 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

Exemples de format 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]

Il s'agit de code-golf, donc l'entrée la plus courte l'emporte.

randomra
la source
Vraisemblablement, le tableau d'entrée ne peut pas avoir d'éléments en double? Cela ressemble à cela, mais je ne vois pas cette condition énoncée explicitement.
Andrew
@Andrew Oui, il ne peut pas y avoir de chiffres en double. Modifié la question. Merci.
randomra
Pour le cas de test n ° 6 (longueur = 17), j'obtiens un résultat légèrement différent (les deux derniers chiffres sont inversés). Je me demandais où était mon erreur. Mon journal est la course ce . Pouvez-vous s'il vous plaît fournir le vôtre afin que je puisse différencier et trouver mon erreur?
Cristian Lupascu
@ w0lf Enregistrez la différence ici. Vous sautez de se déplacer avec 6 après 1 fin où la dérivation commence. (Notez que mon journal contient les chiffres avant d'être supprimés de la piste et pas le vôtre.)
randomra

Réponses:

3

Rubis 229 236

Il s'agit d'une fonction qui prend deux paramètres: un tableau représentant les chiffres et un int représentant la longueur de la piste. Il renvoie un tableau, représentant l'ordre dans lequel les chiffres terminent la course.

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}

Testez-le en ligne: http://ideone.com/KyX5Yu

Edit: Compris quelques astuces pour enregistrer d'autres caractères.

Version non golfée:

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
}
Cristian Lupascu
la source
2

Python 2, 345 octets

Dommage qu'il ne soit pas plus court que celui de @ w0lf, mais whatev. (Notez que les grands retraits sont des tabulations, qui se traduisent par 4 espaces lorsque je poste.)

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
sirpercival
la source
0

voici mon code matelassé magique

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

Remarque : il a besoin d'être amélioré ...

EDIT: code raccourci ... - sizeof (int) = 4, fonction = v, reste encore une variable à remplacer.

Abr001am
la source
Mon C est rouillé, mais ces appels sizeofsemblent pouvoir être remplacés par un nombre magique. Peut-être que ce ne serait pas aussi portable, mais bon - c'est du golf de code.
DLosc
Votre code semble être long de 453 caractères, pas 457. En outre, je pense que vous pouvez le raccourcir davantage en supprimant les espaces inutiles et en donnant à la fonction un nom plus court.
Cristian Lupascu
bien merci pour les propositions, mais l'important pour moi, j'ai réussi à emballer le tout dans deux fonctions, pour loop et printf, le seul défaut que j'ai rencontré, le programme continue à imprimer des caractères vides au lieu de nils. mais la course se termine toujours correctement si nous éliminons ce chiffre impuissant entre les vides
Abr001am
Les variables Iirc sont int par défaut. Donc: v(int*M,int m){e=32;f=48;u=0;l=m;char a,... De plus, presque tout cet espace est inutile; ,V[m];for(i=0;... )printf(... );getch();}.
wizzwizz4