电动车库门是否打开?


24

我的电动车库门的工作方式如下:

  • 只有一个按钮可以控制门
  • 如果门完全关闭并且我按下了按钮,则门开始打开。完全打开需要10秒
  • 如果门完全打开并且我按下了按钮,则门开始关闭。完全关闭需要10秒
  • 如果门是在打开或关闭过程中的一部分,而我按下了按钮,则门将停止并部分打开。
  • 每当门停止移动时,无论是自动完成打开或关闭动作,还是由于在动作中途按下按钮而手动中断时,机构都会倒转并记住下一个动作的方向。
  • 如果在门停止但部分打开时按下按钮,则完成操作所需的时间将少于完成该操作所需移动的时间的10秒。

假设门在开始时完全关闭。

将给出一个整数输入列表。这些整数是我连续两次按下控制按钮之间等待的秒数。

输出两件事:

  • 一旦完成所有按钮的按下并且门已达到稳定状态,指示门状态的百分比。%符号的输出是可选的。
  • 在下一次按下按钮时就明确指示门将向哪个方向行驶。可以是up/ downU/ D+/ -1/ 0或您选择的任何内容。

您可能会假设门无限短地少于10秒才能完成打开或关闭动作。

输入示例:

<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

与上述投入相对应的预期产出

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

最后测试的工作示例

  • 门开始关闭。按下按钮
  • 等待11秒钟。门最终完全打开。按下按钮。
  • 等待10秒钟。门最终完全关闭。按下按钮。
  • 等待9秒钟。按下按钮。门停在90%打开的位置。
  • 等待8秒钟。按下按钮。门开始关闭。
  • 等待7秒钟。按下按钮。门停在20%打开的位置。下一个方向将向上。

您的车库门停在半开状态,如果您在关闭时按下按钮,您会知道吗?我的不是,只是为了开放。
巴林特,2016年

@Bálint都是我的。
Digital Trauma

@Maltysen现在坚持使用百分比。
Digital Trauma

如果输入也包含浮点数,则输出浮点数可以吗?
卡普

@ R.Kap是的,很好。
Digital Trauma

Answers:


6

Lua中,258个 248 242字节

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

不打高尔夫球

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

我看不出您的测试用例如何正确...

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

OP固定


我刚刚完成输入,我也同意你的结果。
尼尔


3

的JavaScript(ES6),109个 106字节

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一定是优化错误。我已经对其进行了优化,这次又设法节省了3个字节!
尼尔

3

Ruby,152个字节

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

有趣的是,您可以更改->v{->*v{(我认为),从而以一个字节为代价消除对额外括号的要求。另外,你需要的空间之前:以及之后?并且您确定:a<=0不会解析为(:a) <= 0吗?
基金莫妮卡的诉讼

不错的提示!虽然需要权衡访问var的权限。至于:a<=0ArgumentError: comparison of Symbol with 0 failed如果它不起作用,我会得到一个提示。我认为是因为它解析了?并且知道它在三元运算符中,所以它可以正常工作。规则确实很奇怪。我将空格或方括号放在需要避免语法错误(例如SyntaxError: unexpected tLABELand NoMethodError: undefined method u?'`)的位置。
br3nt

如果您看到任何改进,请随时进行编辑。我希望能够摆脱a=u ? a+w : a-w并改变它a=a+w*d哪里d1-1取决于方向,但我还没有算出来呢。
br3nt

据我了解,通常不鼓励进行编辑以使代码更好。相反,您应该发表评论。至于你的改进想法,我不知道。似乎可以使用,但是我不知道。
Fund Monica的诉讼

2

蟒3.5,193个 187 185 181 175 173 172字节:

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)

以逗号分隔的数字形式输入,例如1,2,3,4,51.2,3.4,7.8,9.2。分别使用U或输出下一步中的门是向上还是向下D。随着时间的推移,高尔夫运动会更多。

在线尝试!(Idone)(此处输入是由逗号分隔的数字组成的列表的形式,例如[1,2,3,4,5]。)


1

PHP,128120字节

$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];

代码被包装在此处以适合代码框。将所有内容放在一行中,在其前面放置PHP打开标记,然后将其保存到文件中。或使用从命令行运行它php -d error_reporting=0 -r '...the code...' [arguments]

可以在github上找到未发布的源代码,测试套件和用法示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.