고유 한 한 자리 양의 정수의 시작 순서와 트랙의 길이를 입력 출력으로 제공하거나 숫자의 종료 순서를 반환하는 프로그램 또는 함수를 작성해야합니다.
입력 [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]
이것은 코드 골프이므로 가장 짧은 항목이 이깁니다.
답변
루비 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, 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
답변
여기 내 마법의 패딩 코드가 있습니다
씨 (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();
}
참고 : 더 개선이 필요합니다 …
편집 : 코드가 단축되었습니다 …- sizeof (int) = 4, function = v, 여전히 대체 할 변수가 남아 있습니다.