장면은 다음과 같습니다
브라이언이 갑자기 흡입기를 필요로 할 때 피터는 친구 브라이언과 체육관에 있습니다. Brian은 바닥에 쓰러지기 전에 Peter에게 콤비네이션 자물쇠의 코드를 알려줍니다.
피터가 브라이언의 사물함에 도착한 후, 지시자가 가리키는 것을보고, 스튜 이는 그를 매복시키고 그의 얼굴에 후추 통조림을 뿌려서 피터를 막는다.
베드로는 자물쇠를 보지 않고 자물쇠를 열려고합니다. 그는 다이얼을 오른쪽으로 돌리기 시작하고 통과하는 동안 숫자를 세었다. 그런 다음 올바른 번호에서 다이얼을 왼쪽으로 돌리면서 카운트를 시작하고 잠금이 열릴 때까지 다이얼을 오른쪽으로 돌립니다.
도전 과제 :
Brian의 조합과 표시기 위치의 두 가지 입력을받는 기능 / 프로그램을 작성하십시오. 베드로가 세어야 할 숫자를 출력하십시오.
규칙 :
- 조합과 지표 위치는 별도의 인수 여야합니다.
- 입력은 명령 프롬프트 또는 함수 인수로 가능합니다.
- 출력은 화면에 인쇄되어야하며 그렇지 않으면 표시됩니다 (파일이 아님).
- 시작 위치가 첫 번째 숫자와 동일하지 않으며 조합의 세 숫자가 모두 고유하다고 가정하십시오.
- 아래 그림에 표시된 잠금 장치이며 가능한 숫자는 0-39입니다.
명령:
아래의 자물쇠를 열려면 일련의 지침을 따라야합니다.
- 코드를 알아야합니다. 지금은 (38, 16, 22)이라고 가정하십시오.
- 다이얼을 오른쪽으로 3 번 돌리고 (시작 번호를 3 번 통과) 첫 번째 숫자 (38)가 표시기와 정렬되면 멈 춥니 다.
- 다이얼을 왼쪽으로 완전히 돌리면서 첫 번째 숫자를 지나고 두 번째 숫자 (16)가 표시기와 일치하면 멈 춥니 다.
- 다이얼을 오른쪽으로 돌리고 세 번째 숫자 (22)가 표시와 일치하면 멈 춥니 다
- 잠금 장치를 아래로 당깁니다
예:
Input
38 16 22
33
Output
33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 39 38 39 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22
표준 코드 골프 규칙이 적용됩니다.
나중에 게시 된 솔루션은 Dennis의 답변보다 짧은 경우에도 여전히 승리 할 수 있습니다.
답변
CJam, 52 39 바이트
q~[3X0].{@40,m<1$({(+W%}&:T*T@#)T<)}e_p
CJam 통역사 에서 온라인으로 사용해보십시오 .
작동 원리
q~ e# Read and evaluate all input. This pushes the initial position
e# as an integer and the combination as an array.
[3X0] e# Push [3 1 0]. This encodes the respective numbers of full turns
.{ e# For each number in the combination (N) and the corresponding
e# number of full turns (F):
@ e# Rotate the initial position on top of the stack.
40,m< e# Push [0 ... 39] and rotate it that many units to the left.
e# For position P, this pushes [P P+1 ... 39 0 ... P-2 P-1].
1$( e# Copy F and subtract 1.
{ e# If the result is non-zero:
(+ e# Rotate the array of length 40 one unit to the left.
W% e# Reverse it.
}& e# For position P, this pushes [P P-1 ... 0 39 ... P+2 P+1].
:T* e# Save in T and repeat the array F.
T@ e# Push T. Rotate N on top of the stack.
#) e# Find the index of N in T and add 1 to it.
T< e# Keep that many elements from the beginning of T.
) e# Pop the last element of the result (N).
} e# N is the new initial position.
e_p e# Flatten the resulting array and print it.
답변
그루비, 189 175 바이트
표시기가 arg0으로 전달되고 콤보가 명령 행에서 arg1, arg2 및 arg3으로 전달된다고 가정합니다.
i=(args[0]as int)+1
r={i--;i=i<0?39:i;print"$i "}
l={i=++i%40;print"$i "}
M={j,c->while(i!=j as int){c()}}
120.times{r()}
M(args[1],r)
40.times{l()}
M(args[2],l)
M(args[3],r)
답변
Perl 5 , 129 + 1 (-a) = 130 바이트
sub c{$f=pop;do{say$f;$f+=$_[0];$f=$f==-1?39:$f==40?0:$f}while$f-$_[1]}$p=3;c(2*!$p-1,@F[$_,$p]),$p=$_ for 3,3,3,0,0,1,2;say$F[2]
방법?
sub c{ # Takes 3 parameters: increment, ending position, starting position
$f=pop; # first place to start counting
do{
say$f; # output current position
$f+=$_[0]; # move position
$f=$f==-1?39:$f==40?0:$f # roll over when passing zero
}while$f-$_[1] # stop when ending positition reached
}
# @F gets defined by the -a command line option
# @F holds the combination followed by the starting position
$p=3; # starting position is in array index 3, this variable will track the array index of
# the current position on the dial
c(2*!$p-1,@F[$_,$p]),$p=$_ # call the movement function (c), setting direction to the left (1) or right (-1) as needed
# based on the array index of the previous position (go left when moving from array index 0)
for 3,3,3,0,0,1,2; # list of the array index of the next position
say$F[2] # output final position
답변
파이썬 2, 262 바이트
너무 오래 느낀다. 그러나 많은 일들이 진행되고 있습니다.
def f(l,s):
r=lambda a,b,c=1:range(a,b,c)
a=r(39,l[0],-1);b=r(l[0],-1,-1)
c=r(l[1],l[2]-1,-1)if l[2]<l[1]else r(l[1],-1,-1);c.extend(r(39,l[2]-1,-1))
return' '.join(`x`for x in sum([r(s,-1,-1),a,b,a,b,a,b,r(39,l[0],-1),r(l[0],40),r(0,40),r(0,l[1]+1),c],[]))
마지막 줄에서 일부 부분을 더 잘 연결할 수 있다고 생각하지만 여전히 골프를 처음 코딩하고 목록 조합을 짧은 방법으로 처리하는 방법을 모르겠습니다.
개선에 대한 아이디어가 있습니까?
답변
하스켈 , 135112 바이트
s!t=[s..39]++[0..mod(t-1)40]
s#t=[s,s-1..0]++[39,38..mod(t+1)40]
(a%b)c s=[s#s,s#s,s#s,s#a,a!a,a!b,b#c,[c]]>>=id
Laikoni 덕분에 23 바이트 절약