조합 잠금 카운터


20

장면은 다음과 같습니다

브라이언이 갑자기 흡입기를 필요로 할 때 피터는 친구 브라이언과 체육관에 있습니다. Brian은 바닥에 쓰러지기 전에 Peter에게 콤비네이션 자물쇠의 코드를 알려줍니다.

피터가 브라이언의 사물함에 도착한 후, 지시자가 가리키는 것을보고, 스튜 이는 그를 매복시키고 그의 얼굴에 후추 통조림을 뿌려서 피터를 막는다.

베드로는 자물쇠를 보지 않고 자물쇠를 열려고합니다. 그는 다이얼을 오른쪽으로 돌리기 시작하고 통과하는 동안 숫자를 세었다. 그런 다음 올바른 번호에서 다이얼을 왼쪽으로 돌리면서 카운트를 시작하고 잠금이 열릴 때까지 다이얼을 오른쪽으로 돌립니다.


도전 과제 :

Brian의 조합과 표시기 위치의 두 가지 입력을받는 기능 / 프로그램을 작성하십시오. 베드로가 세어야 할 숫자를 출력하십시오.

규칙 :

  • 조합과 지표 위치는 별도의 인수 여야합니다.
  • 입력은 명령 프롬프트 또는 함수 인수로 가능합니다.
  • 출력은 화면에 인쇄되어야하며 그렇지 않으면 표시됩니다 (파일이 아님).
  • 시작 위치가 첫 번째 숫자와 동일하지 않으며 조합의 세 숫자가 모두 고유하다고 가정하십시오.
  • 아래 그림에 표시된 잠금 장치이며 가능한 숫자는 0-39입니다.

명령:

아래의 자물쇠를 열려면 일련의 지침을 따라야합니다.

  1. 코드를 알아야합니다. 지금은 (38, 16, 22)이라고 가정하십시오.
  2. 다이얼을 오른쪽으로 3 번 돌리고 (시작 번호를 3 번 ​​통과) 첫 번째 숫자 (38)가 표시기와 정렬되면 멈 춥니 다.
  3. 다이얼을 왼쪽으로 완전히 돌리면서 첫 번째 숫자를 지나고 두 번째 숫자 (16)가 표시기와 일치하면 멈 춥니 다.
  4. 다이얼을 오른쪽으로 돌리고 세 번째 숫자 (22)가 표시와 일치하면 멈 춥니 다
  5. 잠금 장치를 아래로 당깁니다

여기에 이미지 설명을 입력하십시오

예:

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의 답변보다 짧은 경우에도 여전히 승리 할 수 ​​있습니다.


9
그가 속도를 세지 않으면 흡입기는 무의미 할 것이다 ... 따라서 내 프로그램은 :function combination(code){alert("Help! Someone open this locker, the combination is "+code+"!")}
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ, valid point ... :-) 그러나 : 1. 우리가 말하고있는 피터 사람은 창고에서 가장 날카로운 도구가 아닙니다. 2. 당신은 누군가에게 당신에게 코드를 말하고 싶지 않을 것입니다. 3. Stewie가 여분의 스프레이 캔을 가지고 있을지 누가 ​​알겠습니까?
Stewie Griffin

1
아 맞다 스튜 이는 무한한 스프레이 스프레이 캔을 가지고 있지? Haha : 3
Conor O'Brien

우리는 여전히 그 자물쇠를 여는 다른 알고리즘을 사용할 수 있습니까?
bmarks

1
베드로는 무술을 배워야합니다. (그리고 Brian이 무너 졌을 때 체육관에 코치가없는 이유는 무엇입니까? 예산 삭감?;)
kirbyfan64sos

답변:


3

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.

1

그루비, 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)

1

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

1

파이썬 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],[]))

온라인으로 사용해보십시오!

마지막 줄에서 일부 부분을 더 잘 연결할 수 있다고 생각하지만 여전히 골프를 처음 코딩하고 목록 조합을 짧은 방법으로 처리하는 방법을 모르겠습니다.

개선에 대한 아이디어가 있습니까?


0

하스켈 , 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 바이트 절약


대신 l s t=대입 연산자 s#t=를 선언하여 선언을 단축 할 수 있습니다 . 또한 두 개 이상의 인수에 대해서도 작동합니다 (a%b)c s=.
Laikoni

그리고 당신이 떨어질 수 있다고 생각합니다 s+1.
Laikoni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.