루카스 대 차 고문 리모컨


15

기권

이 특정 관련 질문이 있다는 것을 알고 있지만 내 질문은 무작위 구성 요소 인 두 개의 차고 문을 사용하며 실제 사건을 기반으로하고 있습니다. 지난주에 차고 ... 창의적인 주스를 흘리기 위해 머리에 타격을주는 것만 큼 좋은 것은 없습니다! ;)

배경

루카스 (15 개월 된 아들)는 차고 리모컨을 가지고 노는 것을 좋아합니다. 이 리모컨에는 왼쪽 차고 도어 용 버튼과 오른쪽 차고 도어 용 버튼이 있습니다. 두 버튼 모두 같은 방식으로 작동합니다. 한 번 누르면 도어가 열리고, 다시 누르면 중지되고, 다시 누르면 닫히고, 다시 누르면 중지됩니다.

루카스는이 리모컨을 좋아합니다. 그는 버튼 중 하나를 무작위로 누르거나 전혀 누르지 않을 것입니다. 둘 다 누르면 신호가 전송되지 않지만 하나의 버튼을 누르면 신호가 전송됩니다.

따라서 코드 골프 챌린지는 두 부분으로 나뉩니다.

1 부

1 분 동안 Lucas 임의 버튼 누름을 나타내는 60 자 길이의 문자열을 생성하십시오. 이 경우 "임의"는 "각 틱에서 각 입력의 기회가 동일 함"을 의미합니다. 문자는 다음과 같습니다.

  • 0 : Lucas가 아무 버튼도 누르지 않았거나 두 버튼을 눌렀습니다. 어느 쪽이든, 신호가 전송되지 않았습니다.
  • 1 : Lucas가 왼쪽 차고 문의 버튼을 눌렀습니다.
  • 2 : 루카스가 오른쪽 차 고문 버튼을 눌렀습니다.

두 번째 부분

Part One에서 생성 된 스트링을 사용하여 문을 열고, 멈추고 닫는 트리거로 숫자를 사용하여 2 대의 차고를 열고 닫는 것을 시뮬레이션합니다.

내 차고 문은 매우 빠릅니다 (위의 면책 사항 참조). 버튼을 누르면 완전히 열리거나 닫히는 데 4 초가 걸립니다.

따라서 닫힌 경우 :

  • 0 초 : 0 % 개방 (폐쇄); 버튼을 누르면 도어가 열리기 시작합니다
  • 1 초 : 25 % 개방
  • 2 초 : 50 % 개방
  • 3 초 : 75 % 개방
  • 4 초 : 100 % 개방, 도어 스톱

따라서 열려있는 경우 :

  • 0 초 : 100 % 개방; 버튼을 누르면 도어가 닫히기 시작합니다
  • 1 초 : 75 % 개방
  • 2 초 : 50 % 개방
  • 3 초 : 25 % 개방
  • 4 초 : 0 % 열림 (닫힘), 문 정지

특정 문이 움직이면 같은 문에 대한 신호로 문이 멈 춥니 다. 그 다음에 같은 문으로 보내진 다음 신호는 반대 방향으로 움직입니다. 이전에 작동 중일 때 문이 정지되고 "정지"신호가 수신 될 때 문이 완전히 열리거나 완전히 닫히면 문은 완전 열림 또는 완전 닫힘 상태에서 "중지됨"으로 등록됩니다. 새로운 신호를 받으면 반대 방향으로 움직입니다.

이 시뮬레이션을 사용하면 두 차고 문이 처음에는 닫힌 위치에있게됩니다. 따라서 10 초의 명령 목록을보고 Lucas가 원격에서 명령을 수행하는 경우 어떻게되는지 살펴 보겠습니다.

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

산출

출력의 첫 번째 부분에는 60 부 길이의 임의의 "0", "1"및 "2"문자가 1 부에서 생성되어 표시되어야합니다. 예. 212022112021202211202120221120212022112021202211202120221120

이 문자열 아래에는 차고 문이 각 문자별로 어떻게 작동하는지에 대한 위에서 언급 한 규칙에 따라 이러한 "신호"를 처리하는 방법이 있습니다 (초마다). 초기 표시 문자열 아래에 60 개의 줄이 있어야합니다.

이러한 처리 된 각 라인은 다음과 같은 형식입니다 N: (L:X% XXXXXXX, R:Y% YYYYYYY).

  • N은 각각의 임의 문자열에서 n 번째 문자이며 0, 1 또는 2 형식입니다.
  • X %는 왼쪽 문을 여는 비율입니다 (패딩 없음)
  • XXXXXXX는 왼쪽 문의 상태입니다. 문이 움직이지 않는 경우 (즉, 열리지 않거나 닫히지 않은 경우) "중지됨"상태가 적용됩니다. 즉, 문이 움직이지 않거나 (25 %, 50 % 또는 75 %에서만 가능) 완전히 열렸을 때 멈추었습니다 (100 % ) 또는 완전 폐쇄 (0 %)입니다. 그렇지 않으면 문이 "열림"또는 "닫음"중 하나가됩니다.
  • Y %는 오른쪽 문을 여는 비율입니다 (패딩 없음)
  • YYYYYYY는 오른쪽 문의 상태입니다. 문이 움직이지 않는 경우 (즉, 열리지 않거나 닫히지 않은 경우) "중지됨"상태가 적용됩니다. 즉, 문이 움직이지 않거나 (25 %, 50 % 또는 75 %에서만 가능) 완전히 열렸을 때 멈추었습니다 (100 % ) 또는 완전 폐쇄 (0 %)입니다. 그렇지 않으면 문이 "열림"또는 "닫음"중 하나가됩니다.

10 개의 "신호"및 10 개의 처리 된 라인을 사용하는 아래의 예

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

이것은 코드 골프이므로 가장 짧은 코드가 확실한 승자가 될 것입니다. "열기", "중지됨"및 "닫기"와 같은 문구를 모두 사용하여 7 가지 문자를 사용하여이 작업을 약간 쉽게 만들었습니다.

행운을 빌어 요!


파트 2에 대해보다 명확한 출력 형식을 정의해야합니다.
LegionMammal978

@ LegionMammal978 출력에서 ​​무엇을 놓치고 있다고 생각하십니까?
WallyWest

1
나는 지금은 아니지만, 그것이 좋은 질문이라고 생각합니다.
DLosc

1
1예제에서 마지막 명령이 왼쪽 문을 75 %로 멈추지 않는 이유는 무엇 입니까?
Arnauld

1
첫 번째 부분에 0, 1 및 2가 모두 동일하게 표시되어야합니까, 누르지 않음, 두 번 누름, 왼쪽 누름 및 오른쪽 누름이 모두 동일하게 표시되어야합니까? (즉, 0은 동일한 결과를 유발하는 두 가지 시나리오를 나타내므로 더 가능성이 높습니다 ...)
Socratic Phoenix

답변:


2

Pyth, 156 (149) 145 바이트

jkJmO3U60K=G*]Z3=b*3]_1VJFHS2I&=T@KHq*2hT@XHGTH XbHT XKH0)) XKN*_@XbN|@KN@bNN!@KN%+N": (L:%s, R:%s)"m++*@Gd25"% "%3>"csoltpooespnipinengdg"h@KdS2

내 파이썬 답변 의 직접 번역 .

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

설명:

jk                              " print ''.join(map(str,                   "
JmO3U60                         "  J = [randint(0,2) for _ in range(60)])) "
K=G*]Z3                         " K = copy(G = [0] * 3)                    "
=b*3]_1                         " b = [-1] * 3                             "
VJ                              " for N in J:                              "
FHS2                            "  for H in range(1, 3):                   "
I&=T@KH                         "   if ((T = K[H]) and                     "
q*2hT@XHGTH                     "       (2 * (T + 1) == (G[H] += T)[H]):   "
 XbHT                           "    b[H] = T                              "
 XKH0))                         "    K[H] = 0                              "
 XKN*_@XbN|@KN@bNN              "  K[N] = (-(b[N] = K[N] or B[N])[N] *     "
!@KN                            "   (not K[N]))                            "
%+N": (L:%s, R:%s)"             "  print(str(N) + ': (L:%s, R:%s)' %       "
m++                             "   map(lambda d:                          "
*@Gd25                          "    G[d] * 25 +                           "
"% "                            "    '% ' +                                "
%3>"csoltpooespnipinengdg"h@Kd  "    'csoltpooespnipinengdg'[K[d]+1::3]]   "
S2                              "   ), range(1, 3))                        "

와! 이 답변과 코드에 대한 설명에 감사드립니다 ... 코드의 끝에 도달했을 때 실제로 이해가되었습니다 ...
WallyWest

5

자바 스크립트 (ES6), 277 275 263 253 250 247 234 바이트

_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

언 골프 및 댓글

_ => (
  // Initialize array:
  //   - d = door states as integers
  //     - bits 0 to 2: door opening state (from 0b000 = 0% to 0b100 = 100%)
  //     - bit #3: door in motion (0: no, 1: yes)
  //     - bit #4: door direction (0: closing, 1: opening)
  d = [0, 0],

  // Initialize strings:
  //   - l = list of commands
  //   - s = door states in plain text
  l = s = '',

  // Iterate on an array of 60 entries.
  [...Array(60)].map(_ => (
    // c = new random command (0, 1 or 2)
    // Append new line and new command to s.
    s += `\n${c = Math.random() * 3 | 0}:(`,

    // Append new command to l.
    l += c,

    // For each door ...
    d = d.map((v, i) => (
      // If the door is in motion, update its opening state.
      // Clear the 'in motion' bit if a bound is reached (either closed or fully open).
      v = v & 8 ? v & 16 ? v - 27 ? v + 1 : 20 : v - 9 ? v - 1 : 0 : v,

      // If the current command is intended for this door, update its direction and
      // 'in motion' bit. Direction is changed on the 'stopped => moving' transition.
      v ^= c + ~i ? 0 : v & 8 || 24,

      // Translate the door state in plain text and append it to s
      s +=
        'LR'[i] +
        `:${(v & 7) * 25}% ` +
        (v & 8 ? v & 16 ? 'opening' : 'closing' : 'stopped') +
        ',)'[i],

      // Value to be taken into account by map()
      v
    ))
  )),

  // Final result to be returned
  l + s
)

데모

let f = 
_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

console.log(f())


와우, 나는 하나의 라이너에 감동하여 그것을 console.log에 던졌습니다! 잘 했어!
WallyWest

1
흥미롭게도 Firefox에서는 작동하지 않으며 다음과 같이 4 줄만 출력됩니다 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](쉼표와 괄호 뒤에 줄 바꿈)
edc65

@ edc65-사실은 나쁘다. 출력 형식에 대한 지침을 잘못 읽었습니다. 이것은 고정되어 있습니다.
Arnauld

@Arnauld 괄호를 제거하여 v^=(c-i-1?0:v&8||24)2 바이트를 절약 할 수도 있습니다 .
WallyWest

PS @Arnauld, 참여해 주셔서 감사합니다!
WallyWest

4

파이썬 2 377 370 361 357 345 335 326 316 312 306 304 바이트

두 번째 들여 쓰기 수준은 원시 탭입니다 ( \t재생), 정말 이 두 개의 공백으로 대체되고, 그래서 심하게 마크 다운으로.

from random import*
p=[randint(0,2)for d in[[0]*3]*60]
print`p`[1::3]
v=[-1]*3
c=[0]*3
f=lambda y:str(c[y]*25)+'% '+'csoltpooespnipinengdg'[d[y]+1::3]
for x in p:
 for i in 1,2:
  q=d[i];c[i]+=q
  if(2*-~q==c[i])*q:v[i]=q;d[i]=0
 z=d[x]
 if z:v[x]=z
 d[x]=-v[x]*(z==0);print'%d: (L:%s, R:%s)'%(x,f(1),f(2))

나는 이것이 더 골프를 칠 수 있다고 확신합니다.

코멘트가없는 언 골프 드 :

import random

# Generate the random string - represented as a list of ints
presses = [random.randint(0, 2) for _ in range(60)]
print ''.join(map(str, presses))

# Constants for door states used for easier reading
CLOSING = -1
STOPPED = 0
OPENING = 1

# Variables representing the state of the garage doors
# There's a third element in these so that x[0] resolves to a dummy slot
# (this way, we can avoid a conditional down the road)
prev_states = [CLOSING, CLOSING, 0]
door_states = [STOPPED, STOPPED, 0]
door_pcts = [0, 0, 0]  # delta 1 = 25%

for press in presses:
  # Close/open the door 1 more
  for i in 1, 2:
    if door_states[i] != STOPPED:
      delta_pct, stop_pct = (-1, 0) if door_states[i] == CLOSING else (1, 4)
      door_pcts[i] += delta_pct
      if door_pcts[i] == stop_pct:
        prev_states[i] = door_states[i]
        door_states[i] = STOPPED

  # Handle pressing a button
  # If the press is 0 (no press), the 0th element resolves to a dummy
  # door, thus saving us an expensive conditional

  if door_states[press] == STOPPED:
    door_states[press] = -prev_states[press]
  else:
    prev_states[press] = door_states[press]
    door_states[press] = STOPPED

  # Print the status update
  print '%d: (L:%d%% %s, R:%d%% %s)' % (
    press,
    door_pcts[0]*25,
    ['closing', 'stopped', 'opening'][door_states[0]+1],
    door_pcts[1]*25,
    ['closing', 'stopped', 'opening'][door_states[1]+1],
  )

저장 4 14 15 @TheBikingViking 덕분에 바이트!

@ValueInk 덕분에 6 바이트가 절약되었습니다!


1
당신은 변경할 수 있습니다 range(60)[0]*60.
TheBikingViking

1
트윗 담아 가기 지금 편집 중입니다.
구리

2
'p'[1::3]대신 (아포스트로피를 백틱으로 대체) 할 수 있습니다 ''.join(map(str,p)).
TheBikingViking

2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking

2
@ValueInk이 줄은 파이썬 2의 목록 이해에있는 버그를 악용 n하여 해당 문자열 로 설정 합니다. n추출 할 마지막 줄에 사용되는 closing, stopped, opening해당 문자열에서.
구리

2

루비, 263 261 260 254 바이트

JavaScript의 답변은 어떻게 짧아 졌습니까 ??? 내가 외출 중이었고 현재도이기는 중입니다 ...

s=(1..60).map{rand 3}
puts s*''
D=1,2
d=[25]*3;a=[0]*3;m=[p]*3
s.map{|i|D.map{|j|m[j]&&a[j]+=d[j];(0..100)===a[j]+d[j]||i!=j&&(d[j]*=-1;m[j]=p)}
(m[i]^=1)||d[i]*=-1
puts"#{i}: (L%s, R%s)"%D.map{|j|":#{a[j]}% #{%w"stopped opening closing"[m[j]?d[j]:0]}"}}

2

C, 420 433 424 374 바이트

#define F(X,x) X=x==1?X+1:x==2?X-1:X;X=X<0?0:X>4?4:X;x=X==0?0:X==4?3:x
#define G(x) x=x==1?3:x==2?0:x==3?2:x+1
#define H(X,x) X*25,x==0||x==3?"stopped":x==1?"opening":"closing"
c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)G(l);else if(x[c]==2)G(r);printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],H(L,l),H(R,r));F(L,l);F(R,r);}}

랜덤 생성기를 시드하지 않지만 더 나은 분포를 위해 랜덤을 사용합니다. 그래도이 논리를 골프화하는 더 좋은 방법이 있어야합니다.

110121100121212100112200222111200020111100022122202112202211002
1: (L:0% opening, R:0% stopped)
1: (L:25% stopped, R:0% stopped)
0: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
1: (L:25% stopped, R:50% opening)
0: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
1: (L:25% closing, R:100% stopped)
2: (L:0% stopped, R:100% closing)
1: (L:0% opening, R:75% closing)
2: (L:25% opening, R:50% stopped)
1: (L:50% stopped, R:50% stopped)
2: (L:50% stopped, R:50% opening)
1: (L:50% closing, R:75% opening)
0: (L:25% closing, R:100% stopped)
0: (L:0% stopped, R:100% stopped)
1: (L:0% opening, R:100% stopped)
1: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
1: (L:25% closing, R:75% stopped)
1: (L:0% opening, R:75% stopped)
1: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
0: (L:25% stopped, R:75% closing)
1: (L:25% closing, R:50% closing)
1: (L:0% opening, R:25% closing)
1: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
2: (L:0% stopped, R:0% opening)
2: (L:0% stopped, R:25% stopped)
1: (L:0% opening, R:25% stopped)
2: (L:25% opening, R:25% closing)
2: (L:50% opening, R:0% opening)
2: (L:75% opening, R:25% stopped)
0: (L:100% stopped, R:25% stopped)
2: (L:100% stopped, R:25% closing)
1: (L:100% closing, R:0% stopped)
1: (L:75% stopped, R:0% stopped)
2: (L:75% stopped, R:0% opening)
2: (L:75% stopped, R:25% stopped)
0: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% closing)
2: (L:75% stopped, R:0% opening)
1: (L:75% opening, R:25% opening)
1: (L:100% closing, R:50% opening)

이전 버전 1 :

c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

이전 버전 2 :

c,i,l,r,L,R,x[60];g(){while(i<60)printf("%d",x[i++]=random()%3);}main(){g();while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("%d: (L:%d%% %s, R:%d%% %s)\n",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

2
코드로 변환 할 수 있습니까?
haykam

2

PHP, 254 247 246 245 235 230 226 바이트

ES를 다시 때리다!

for($t=60;$t--;)$s.=rand()%3;echo$s;for(;++$t<60;print"
$c: ($o[1], $o[2])")for($i=3;--$i;$o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '.[opening,stopped,closing][abs($z-1)])if(((1&$z=&$r[$i])&&!(3&$d[$i]+=2-$z))|$i&$c=$s[$t])$z=++$z%4;

이 311에서 골프를 쳤다.

<?for($i=60;$i--;)$s.=rand(0,2);echo$s;$d=$r=[0,0];$n=[L,R];$p=[stopped,opening,stopped,closing];for($t=-1;++$t<60;print"
$c: (".join(', ',$x).")")for($m=$c=$s[$t],$i=-1;$i++<1;){if($r[$i]&1)if(!($d[$i]+=2-$r[$i])||4==$d[$i])$m|=$i+1;if($m&$i+1)$r[$i]=(1+$r[$i])%4;$x[$i]="$n[$i]:".($d[$i]*25)."% ".$p[$r[$i]];}

고장

for($t=60;$t--;)$s.=rand()%3;   // part 1               also initializes $t to -1
echo$s;
for(
    ;
    ++$t<60;
    print"\n$c: ($o[1], $o[2])" // print output
)
    for($i=3;--$i;  // loop $i from 2 to 1 (door number)
        // generate output
        $o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '
        .[opening,stopped,closing][abs($z-1)]           // map 0123 to 1012
    )
        if(((1&$z=&$r[$i])  // if door in motion        ... and reference the array item
            &&!(3&              // 2. if end position   "&&" needed for short circuit
            $d[$i]+=2-$z        // 1. move door         2-$z maps 1,3 to 1,-1 = delta
            )
        )|$i&$c=$s[$t])     // 3. or if button $i pressed   "|" needed for no short circuit
            $z=++$z%4;          // rotate direction     ++$z%4 maps 0,1,2,3 to 1,2,3,0
        // generate output (loop post condition)
    // print output (loop post condition)

@Arnauld : 알았어요! :)
Titus

1

Java 8 람다, 500 자

나는 최선을 다했다. 내가 생각해 낸 것은 다음과 같다.

()->{String r="";int i=0,l=0,m=0,n=1,o=1,p=0,q=0;for(;i++<60;)r+=(int)(Math.random()*3);for(char s:r.toCharArray()){l+=p;m+=q;if(l>99&p>0){l=100;p=25*(((n=++n%4)-1)%2);}if(l<1&p<0){l=0;p=25*(((n=++n%4)-1)%2);}if(m>99&q>0){m=100;q=25*(((o=++o%4)-1)%2);}if(m<1&q<0){m=0;q=25*(((o=++o%4)-1)%2);}if(s<49);else if(s>49)q=25*(((o=++o%4)-1)%2);else p=25*(((n=++n%4)-1)%2);r+="\n"+s+": (L:"+l+"% "+(p<0?"closing":p>0?"opening":"stopped")+", R:"+m+"% "+(q<0?"closing":q>0?"opening":"stopped")+")";}return r;}

완전한 수업으로 풀리지 않음 :

public class Q91479 {

    public static String movedDoorsCombined() {
        String result = "";
        int i = 0, leftDoor = 0, rightDoor = 0, stepLeft = 1, stepRight = 1, changeLeft = 0, changeRight = 0;

        for (; i++ < 60;) {
            result += (int) (Math.random() * 3);
        }

        for (char step : result.toCharArray()) {
            // update stats
            leftDoor += changeLeft;
            rightDoor += changeRight;

            if (leftDoor > 99 & changeLeft > 0) {
                leftDoor = 100;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (leftDoor < 1 & changeLeft < 0) {
                leftDoor = 0;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (rightDoor > 99 & changeRight > 0) {
                rightDoor = 100;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            if (rightDoor < 1 & changeRight < 0) {
                rightDoor = 0;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }

            if (step < 49) {
                // 0
            }
            else if (step > 49) {
                // right
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            else {
                // left
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            result += "\n" + step + ": (L:" + leftDoor + "% "
                        + (changeLeft < 0 ? "closing" : changeLeft > 0 ? "opening" : "stopped")
                        + ", R:" + rightDoor + "% "
                        + (changeRight < 0 ? "closing" : changeRight > 0 ? "opening" : "stopped")
                        + ")";
        }
        return result;
    }
}

꽤 직설적 인. stepLeft / stepRight 변수는 0-3 사이에서 원을 그립니다. 간단한 수학 변경하기 leftLeft / changeRight는 단계 당 각각의 상대적인 변화를 유지하며, 이는 leftDoor / rightDoor에 추가됩니다. 문이 스스로 멈춰야 할 때 잡기위한 많은 if 문.

이것을 단축하도록 도와주세요. 할 일이 많다고 생각합니다.


1

하스켈 (lambdabot)-409 바이트

p=(cycle[0,1,0,-1],0)
t(d:q,s)=(if d/=0&&(s+d<1||3<s+d)then q else d:q,s+d)
k i(a,b)=[o i,": (L:",j a,", ","R:",j b,")"]>>=id
j(d:_,s)=o(round$(fromIntegral s/4)*100)++"% "++words"closing stopped opening"!!(d+1)
s=scanl$ \(a,b)i->i(t a,t b)
main=do b<-(fmap(round.(*(2::Float))).take 60<$>randoms)<$>getStdGen;putStrLn.unlines$(o=<<b):(zipWith k b.w.s(p,p)$([id,f$f w,second$f w]!!)<$>b)
o=show;f=first;w=tail

imports예를 들어 randoms코드 및 바이트 수에 필요한 모든을 추가하십시오 . 기본적으로 가져 오는 통역사가있는 경우 언어 이름으로 통역사를 참조하십시오.
nimi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.