Cửa gara điện có mở không?


24

Cửa gara điện của tôi hoạt động như thế này:

  • Chỉ có một nút ấn để điều khiển cửa
  • Nếu cửa đóng hoàn toàn và tôi nhấn nút, cửa sẽ bắt đầu mở. Phải mất 10 giây để mở hoàn toàn
  • Nếu cửa mở hoàn toàn và tôi nhấn nút, cửa sẽ bắt đầu đóng. Phải mất 10 giây để đóng hoàn toàn
  • Nếu cánh cửa là một phần thông qua mở hoặc đóng và tôi nhấn nút, thì cánh cửa dừng lại và được mở một phần.
  • Bất cứ khi nào cánh cửa dừng di chuyển, từ tự động hoàn thành một hành động mở hoặc đóng, hoặc do gián đoạn thủ công bằng cách nhấn nút giữa chừng bằng một hành động, thì cơ chế sẽ đảo ngược và ghi nhớ hướng của nó cho hành động tiếp theo.
  • Nếu nút được ấn khi cửa dừng nhưng mở một phần, thì thời gian để nó hoàn thành hành động của nó sẽ là một phần nhỏ của 10 giây so với lượng cần thiết để di chuyển để hoàn thành hành động.

Giả sử cửa được đóng hoàn toàn khi bắt đầu.

Một danh sách đầu vào của số nguyên sẽ được đưa ra. Các số nguyên này là số giây tôi chờ giữa các lần nhấn liên tiếp của nút điều khiển.

Đầu ra hai điều:

  • một tỷ lệ phần trăm cho biết trạng thái của cửa sau khi tất cả các lần nhấn nút được hoàn thành và cửa đã đạt đến trạng thái ổn định. Đầu ra của %biểu tượng là tùy chọn.
  • một dấu hiệu rõ ràng về hướng cửa sẽ đi theo hướng nhấn nút tiếp theo. Đây có thể là up/ down, U/ D, +/ -, 1/ 0hoặc bất cứ điều gì bạn chọn.

Bạn có thể cho rằng cánh cửa mất vô cùng ít hơn 10 giây để hoàn thành một hành động mở hoặc đóng.

Ví dụ đầu vào:

<empty list>  # button was pushed just once
20            # button was pushed twice with 20 seconds between
10
5
20 20
10 10
5 5
1 2 3
8 9 10 11
11 10 9 8 7

Đầu ra dự kiến ​​tương ứng với đầu vào trên

100% D
0% U
0% U
50% D
100% D
100% D
0% U
100% D
0% U
20% U

Ví dụ làm việc của bài kiểm tra cuối cùng

  • Cửa bắt đầu đóng. Nút được đẩy
  • Đợi 11 giây. Cửa kết thúc mở hoàn toàn. Nút được đẩy.
  • Đợi 10 giây. Cửa kết thúc đóng hoàn toàn. Nút được đẩy.
  • Đợi 9 giây. Nút được đẩy. Cửa dừng ở mức mở 90%.
  • Đợi 8 giây. Nút được đẩy. Cửa bắt đầu đóng.
  • Đợi 7 giây. Nút được đẩy. Cửa dừng ở mức mở 20%. Hướng tiếp theo sẽ được lên.

Cửa nhà để xe của bạn dừng lại ở nửa mở, nếu bạn nhấn nút, trong khi đóng cửa? Của tôi không, chỉ để mở.
Bálint

@ Bálint cả hai cách cho tôi.
Chấn thương kỹ thuật số

@Maltysen cho phép gắn bó với tỷ lệ phần trăm ngay bây giờ.
Chấn thương kỹ thuật số

Có ổn không nếu một số dấu phẩy động là đầu ra nếu đầu vào cũng bao gồm (các) số dấu phẩy động?
R. Kap

@ R.Kap vâng, điều đó tốt.
Chấn thương kỹ thuật số

Câu trả lời:


6

Lua, 258 248 242 byte

u,s,p=1>0,0>1,0;io.read():gsub("%d+",function(a)if(not s)then p=u and p+a or p-a;if(p>=10 or p<=0)then s,p=1>0,p>0 and 10 or 0;end;u,s=not u,not s else s=0>1;end end)if(not s)then p=u and 10 or 0;u=not u;end;print(10*p.."% "..(u and"U"or"D"))

Bị đánh cắp

u,s,p=true,false,0;                          -- Up direction, Stopped, Position
io.read():gsub("%d+",function(t)             -- For each number in input
    if(not s)then                            -- If door wasn't stopped
        p=u and p+t or p-t;                  -- Position = Moving up ? +t : -t
        if(p>=10 or p<=0)then                -- If door fully opened or closed
            s,p=true,p>0 and 10 or 0;        -- Then door stopped at 0 or 10
        end 
        u,s=not u,not s;                     -- Toggle direction and toggle stopped
    else 
        s=false;                             -- If stopped, nothing happened, un-stop.
    end 
end)
-------------------- Done pressing the button --------------------
if(not s)then                                -- If left off moving
    p=u and 10 or 0;                         -- Finish movement
    u=not u;                                 -- Toggle direction
end 
print(10*p.."% "..(u and"U"or"D"))           -- Output answer

Tôi không thấy các trường hợp thử nghiệm của bạn có thể đúng ...

20 20 -- Initial push, after 20, garage is at 100, push to start it down, after 20, garage is at 0, push to start it up, garage finishes up.
10 10 -- Same as above
1 2 3 -- 0 U Moving, wait 1, 1 D Stopped, wait 2, 0 U stopped, wait 3, 100 D stopped

Đã sửa lỗi OP


Tôi vừa hoàn thành mục nhập của tôi và tôi cũng đồng ý với kết quả của bạn.
Neil


3

JavaScript (ES6), 109 106 byte

a=>a.map(e=>(s^=1)?(r-=e*(d=-d))>9?(s=0,r=10):r<1?(r=s=0):r:r,r=s=0,d=1)&&(s?r:5*++d)*10+(d-s?"% D":"% U")

@DigitalTrauma Phải là một lỗi tối ưu hóa. Tôi đã mở lại nó và bằng cách nào đó quản lý để tiết kiệm thêm 3 byte lần này!
Neil

3

Ruby, 152 byte

->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

Các trường hợp thử nghiệm:

f=->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

f[[]]            # => "100% D"
f[[20]]          # => "0% U"
f[[10]]          # => "0% U"
f[[5]]           # => "50% D"
f[[20,20]]       # => "100% D"
f[[10,10]]       # => "100% D"
f[[5,5]]         # => "0% U"
f[[1,2,3]]       # => "100% D"
f[[8,9,10,11]]   # => "0% U"
f[[11,10,9,8,7]] # => "20% U"

Là một lưu ý phụ thú vị, bạn có thể loại bỏ yêu cầu cho dấu ngoặc phụ với chi phí là một byte, bằng cách thay đổi ->v{thành ->*v{(tôi nghĩ). Ngoài ra, bạn cần có không gian trước khi sự :cũng như sau? Và bạn có chắc chắn rằng :a<=0không phân tích cú pháp (:a) <= 0?
Vụ kiện của Quỹ Monica

Mẹo hay! Mặc dù vậy, sẽ cần phải cân nhắc với quyền truy cập vào var. Đối với :a<=0, tôi sẽ nhận được ArgumentError: comparison of Symbol with 0 failednếu nó không hoạt động. Tôi nghĩ bởi vì nó đã phân tích cú pháp ?và biết nó trong một toán tử ternary, nó chỉ hoạt động. Các quy tắc thực sự là lạ. Tôi đã đặt dấu cách hoặc dấu ngoặc ở những nơi cần thiết để tránh các lỗi cú pháp như SyntaxError: unexpected tLABELNoMethodError: undefined method u? '`.
br3nt

Hãy thoải mái thực hiện chỉnh sửa nếu bạn có thể thấy bất kỳ cải tiến nào. Tôi đã hy vọng để có thể thoát khỏi a=u ? a+w : a-wvà thay đổi nó thành a=a+w*dnơi d1hay -1tùy thuộc vào phương hướng, nhưng tôi đã không làm việc nó ra được nêu ra.
br3nt

Từ những gì tôi hiểu, chỉnh sửa để làm cho mã tốt hơn thường không được khuyến khích; thay vào đó, bạn nên bình luận. Đối với ý tưởng của bạn để cải thiện, tôi không biết; có vẻ như nó có thể làm việc, nhưng tôi không chắc chắn.
Vụ kiện của Quỹ Monica

2

Python 3.5, 193 187 185 181 175 173 172 byte:

def G(*p):
 O=100;y=0;l=10;z,v='UG'
 for g in[*p,O]:
  if v=='G':Q=O*g//10;y=min(max(0,[Q,y-Q][z=='D']),O);l=min(10,g);z='UD'[z=='U']
  v='GS'[(O>y>0)*(v!='S')]
 print(y,z)

Lấy đầu vào dưới dạng các số được phân tách bằng dấu phẩy, ví dụ 1,2,3,4,5hoặc chẵn 1.2,3.4,7.8,9.2. Đầu ra cho dù cánh cửa trong bước tiếp theo đi lên hay xuống với UhoặcD , tương ứng. Sẽ chơi golf nhiều hơn theo thời gian.

Dùng thử trực tuyến! (Ideone) (Ở đây, đầu vào được lấy ở dạng danh sách bao gồm các số được phân tách bằng dấu phẩy, ví dụ [1,2,3,4,5].)


1

PHP, 128 120 byte

$d=$argv[]=10;
foreach($argv as$a)
  if($r){$p=min(max($p+$a*$d,0),100);$r=$p<1||99<$p;$d=-$d;}else$r=1;
echo"$p% ".DU[$d>0];

Mã được gói ở đây để phù hợp với hộp mã. Đặt mọi thứ trên một dòng duy nhất, đặt điểm đánh dấu mở PHP trước nó và lưu nó vào một tệp. Hoặc chạy nó từ dòng lệnh bằng cách sử dụng php -d error_reporting=0 -r '...the code...' [arguments].

Mã nguồn không mã hóa, bộ kiểm tra và các ví dụ về việc sử dụng có thể được tìm thấy trên github .

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.