Lucas Vs. Cửa nhà để xe từ xa


15

Khước từ

Trong khi tôi biết có câu hỏi liên quan đặc biệt này , câu hỏi của tôi sử dụng hai cửa gara, một thành phần ngẫu nhiên, và tôi cũng dựa trên các sự kiện trong đời thực, thấy con trai tôi vô tình hạ một cánh cửa nhà để xe trong khi tôi đi ra khỏi nhà để xe tuần trước ... Không có gì giống như một cú đánh vào đầu để làm cho nước ép sáng tạo chảy! ;)

Bối cảnh

Lucas (con trai 15 tháng tuổi của tôi) thích chơi với điều khiển từ xa. Có hai nút trên điều khiển từ xa này, một cho cửa nhà để xe bên trái và một cho cửa nhà để xe bên phải. Cả hai nút hoạt động theo cùng một cách; nhấn một lần để cửa bắt đầu mở, nhấn lần nữa để dừng, nhấn lần nữa để bắt đầu đóng, nhấn lần nữa để dừng lại, v.v.

Lucas thích điều khiển từ xa này, anh sẽ ngẫu nhiên nhấn một trong các nút, hoặc cả hai hoặc không có gì cả. Nếu cả hai được nhấn, không có tín hiệu nào được gửi, nhưng nhấn một nút sẽ gửi tín hiệu.

Vì vậy, thử thách chơi gôn được chia thành hai phần:

Phần một

Tạo một chuỗi dài 60 ký tự đại diện cho nút bấm ngẫu nhiên của Lucas nhấn trong một phút. "Ngẫu nhiên" trong trường hợp này có nghĩa là "với cơ hội như nhau của mỗi đầu vào tại mỗi lần đánh dấu". Các nhân vật như sau:

  • 0: Lucas đã nhấn không có nút hoặc đã nhấn cả hai nút. Dù bằng cách nào, không có tín hiệu đã được gửi.
  • 1: Nút cho cửa nhà để xe bên trái đã được Lucas nhấn
  • 2: Nút cho cửa nhà để xe bên phải đã được Lucas nhấn

Phần hai

Sử dụng chuỗi được tạo trong Phần một, mô phỏng việc mở và đóng của nhà để xe hai xe bằng cách sử dụng các số làm kích hoạt để mở, dừng và đóng các cửa này.

Cửa nhà để xe của tôi khá nhanh (xem phần Tuyên bố miễn trừ trách nhiệm ở trên). Khi bạn nhấn nút, phải mất bốn giây để mở hoặc đóng hoàn toàn.

Vì vậy, nếu đóng cửa:

  • 0 giây: 0% mở (đóng); khi nhấn nút, cửa bắt đầu mở
  • 1 giây: mở 25%
  • 2 giây: mở 50%
  • 3 giây: mở 75%
  • 4 giây: mở 100%, dừng cửa

Và do đó, nếu mở:

  • 0 giây: mở 100%; khi nhấn nút, cửa bắt đầu đóng
  • 1 giây: mở 75%
  • 2 giây: mở 50%
  • 3 giây: mở 25%
  • 4 giây: 0% mở (đóng), dừng cửa

Nếu một cánh cửa cụ thể đang chuyển động, một tín hiệu cho cùng một cánh cửa đó sẽ ngăn chặn nó. Tín hiệu tiếp theo được gửi đến cùng một cánh cửa sau đó sẽ gửi nó đi theo hướng ngược lại. Nếu cửa bị dừng khi trước đó đã chuyển động và hiện đang mở hoàn toàn hoặc đóng hoàn toàn khi nhận được tín hiệu "dừng", cửa sẽ đăng ký là "dừng" ở trạng thái mở hoàn toàn hoặc đóng hoàn toàn, sẵn sàng để di chuyển theo hướng ngược lại khi nhận được tín hiệu mới.

Với mô phỏng này, cả hai cửa nhà để xe sẽ ban đầu ở vị trí đóng. Vì vậy, chúng ta hãy xem danh sách các lệnh 10 giây và xem điều gì sẽ xảy ra nếu Lucas thực hiện chúng trên điều khiển từ xa:

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)

Đầu ra

Phần đầu tiên của đầu ra yêu cầu hiển thị chuỗi ký tự ngẫu nhiên dài 60 ký tự "0", "1" và "2" được tạo từ Phần một. ví dụ. 212022112021202211202120221120212022112021202211202120221120

Bên dưới chuỗi này, là việc xử lý các "tín hiệu" này theo các quy tắc được đề cập ở trên về cách các cửa nhà để xe sẽ hành xử với từng nhân vật tương ứng (trên cơ sở từng giây). Bạn sẽ kết thúc với 60 dòng là kết quả bên dưới chuỗi hiển thị ban đầu.

Mỗi dòng được xử lý này sẽ có dạng: N: (L:X% XXXXXXX, R:Y% YYYYYYY)trong đó:

  • N là ký tự thứ n từ chuỗi ngẫu nhiên tương ứng, sẽ ở dạng 0, 1 hoặc 2.
  • X% là tỷ lệ phần trăm mở của cửa bên trái (không có phần đệm bằng 0)
  • XXXXXXX là trạng thái của cửa bên trái. Nếu cửa không chuyển động (nghĩa là không mở hoặc đóng), trạng thái "dừng" được thi hành, nghĩa là nó đã bị dừng trong chuyển động (chỉ có thể ở mức 25%, 50% hoặc 75%) hoặc dừng khi mở hoàn toàn (100% ) hoặc đóng hoàn toàn (0%). Nếu không, cánh cửa sẽ là "mở" hoặc "đóng".
  • Y% là tỷ lệ mở của cửa bên phải (không có phần đệm bằng 0)
  • YYYYYYY là tình trạng của cánh cửa bên phải. Nếu cửa không chuyển động (nghĩa là không mở hoặc đóng), trạng thái "dừng" được thi hành, nghĩa là nó đã bị dừng trong chuyển động (chỉ có thể ở mức 25%, 50% hoặc 75%) hoặc dừng khi mở hoàn toàn (100% ) hoặc đóng hoàn toàn (0%). Nếu không, cánh cửa sẽ là "mở" hoặc "đóng".

Ví dụ hiển thị bên dưới bằng 10 "tín hiệu" và 10 dòng được xử lý

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)

Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ là người chiến thắng rõ ràng. Tôi đã làm điều này dễ dàng hơn một chút bằng cách sử dụng các cụm từ như "mở", "dừng" và "đóng", đó là tất cả bảy chữ cái ... vì vậy bạn có thể muốn đưa nó vào chiến lược của mình.

May mắn nhất!


Bạn nên xác định định dạng đầu ra rõ ràng hơn cho Phần 2.
LegionMammal978

@ LegionMammal978 Bạn cảm thấy thiếu gì từ đầu ra?
WallyWest

1
Hiện tại tôi không biết, nhưng tôi nghĩ đó là một câu hỏi gọn gàng - tôi có thể giải quyết nó.
DLosc

1
Tại sao 1lệnh cuối cùng dừng cửa bên trái ở mức 75% trong ví dụ của bạn?
Arnauld

1
Tất cả 0,1 và 2 nên xuất hiện như nhau trong phần đầu tiên, hoặc không nên bấm, nhấn đúp, nhấn trái và nhấn phải đều xuất hiện như nhau? (có nghĩa là 0 có nhiều khả năng vì nó đại diện cho hai kịch bản gây ra kết quả giống nhau và kết quả ...)
Socratic Phoenix

Câu trả lời:


2

Pyth, 156 149 145 byte

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

Một bản dịch trực tiếp câu trả lời Python của tôi .

Hãy thử trực tuyến!

Giải trình:

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))                        "

Ồ Cảm ơn câu trả lời này, cũng như lời giải thích về mã ... Tôi thực sự đã hiểu ý nghĩa của nó khi tôi đạt đến cuối của nó ...
WallyWest

5

Javascript (ES6), 277 275 263 253 250 247 234 byte

_=>(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)

Ungolfed và bình luận

_ => (
  // 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
)

Bản giới thiệu

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


Ồ, tôi rất ấn tượng với một lớp lót và ném nó vào console.log ở đó! Làm tốt!
WallyWest

1
Thật kỳ lạ là không hoạt động trong Firefox, chỉ có 4 dòng đầu ra, như thế này 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](dòng mới sau dấu phẩy và dấu ngoặc)
edc65

@ edc65 - Thật tệ. Tôi đọc sai hướng dẫn về định dạng đầu ra. Điều này là cố định.
Arnauld

@Arnauld Bạn cũng có thể xóa dấu ngoặc đơn v^=(c-i-1?0:v&8||24)để tiết kiệm cho bạn hai byte.
WallyWest

PS @Arnauld, cảm ơn vì đã tham gia!
WallyWest

4

Python 2, 377 370 361 357 345 335 326 316 312 306 304 byte

Cấp độ thụt lề thứ hai là một tab thô ( \t), chơi rất tệ với Markdown, do đó, nó được thay thế bằng hai khoảng trắng.

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))

Tôi gần như chắc chắn điều này có thể được chơi gôn hơn nữa.

Ungolfed, với ý kiến:

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],
  )

Đã lưu 4 14 15 byte nhờ @TheBikingViking!

Đã lưu 6 byte nhờ @ValueInk!


1
Bạn có thể thay đổi range(60)thành [0]*60.
TheBikingViking 29/8/2016

1
@TheBikingViking Cảm ơn! Tôi đang chỉnh sửa nó ngay bây giờ.
Đồng

2
Bạn có thể làm 'p'[1::3](thay thế dấu nháy đơn bằng backticks) thay vì ''.join(map(str,p)).
TheBikingViking

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

2
@ValueInk Dòng đó lạm dụng một lỗi trong phần hiểu danh sách của Python 2 để đặt thành nchuỗi đó. nđược sử dụng trên dòng cuối cùng để giải nén closing, stopped, openingtừ chuỗi đó.
Đồng

2

Ruby, 263 261 260 254 byte

Làm thế nào mà câu trả lời của JavaScript lại ngắn đến vậy ??? Nó đã vượt qua tôi khi tôi đi vắng và hiện tại vẫn đang chiến thắng ...

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 byte

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

Không khởi tạo trình tạo ngẫu nhiên nhưng sử dụng ngẫu nhiên để phân phối tốt hơn. Phải có một cách tốt hơn để chơi logic này mặc dù ...

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)

Phiên bản cũ hơn 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;}}

Phiên bản cũ hơn 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
Bạn có thể chuyển đổi nó thành mã?
haykam

2

PHP, 254 247 246 245 235 230 226 byte

đánh bại ES một lần nữa!

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;

đánh gôn từ số 311 này (phiên bản hoàn chỉnh đầu tiên, đã có một số môn đánh gôn):

<?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]];}

phá vỡ

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: có bạn! :)
Tít

1

Lambda Java 8, 500 ký tự

Tôi đã làm hết sức mình, đây là những gì tôi nghĩ ra:

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

Ungolfed thành một lớp hoàn chỉnh:

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

Khá thẳng về phía trước. Các biến stepLeft / stepRight khoanh tròn từ 0-3. Thực hiện một số phép toán đơn giản thay đổiLeft / changeRight giữ các thay đổi tương đối tương ứng trên mỗi bước, sẽ được thêm vào leftDoor / rightDoor. Nhiều câu lệnh để bắt khi cánh cửa phải tự dừng lại.

Hãy giúp tôi rút ngắn điều này, tôi nghĩ có rất nhiều việc phải làm.


1

Haskell (lambdabot) - 409 byte

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

Vui lòng thêm tất cả những thứ cần thiết imports, ví dụ cho randomsmã của bạn (và số byte). Nếu có một trình thông dịch nhập theo mặc định, hãy tham khảo nó trong tên ngôn ngữ.
nimi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.