電気ガレージのドアは開いていますか?


24

私の電気駐車場のドアは次のように機能します。

  • ドアを制御するためのプッシュボタンは1つだけです
  • ドアが完全に閉じてボタンを押すと、ドアが開き始めます。完全に開くには10秒かかります
  • ドアが完全に開いていてボタンを押すと、ドアが閉じ始めます。完全に閉じるには10秒かかります
  • ドアが開閉の途中にあり、ボタンを押すと、ドアが停止し、部分的に開いたままになります。
  • 開閉動作の自動完了、または動作の途中でボタンを押して手動で中断したことにより、ドアの動きが止まるたびに、メカニズムは反転し、次の動作の方向を記憶します。
  • ドアが停止しているが部分的に開いているときにボタンを押すと、そのアクションを完了するまでの時間は、アクションを完了するために移動する必要がある量に比例して、わずか10秒になります。

開始時にドアが完全に閉じていると仮定します。

整数の入力リストが提供されます。これらの整数は、コントロールボタンを連続して押す間に待機する秒数です。

2つのことを出力します。

  • すべてのボタンのプッシュが完了し、ドアが定常状態に達したときのドアの状態を示すパーセンテージ。%シンボルの出力はオプションです。
  • 次のボタンを押すとドアが移動する方向を明確に示します。これは、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%開いた状態で停止します。次の方向に進みます。

ガレージのドアは、閉じている間にボタンを押すと半開きで停止しますか?私のものは、開くためだけではありません。
バリント

@Bálintは私の両方です。
デジタルトラウマ

@Maltysenは今やパーセンテージに固執します。
デジタル外傷

入力も浮動小数点数で構成されている場合、浮動小数点数が出力されても大丈夫ですか?
R. Kap

@ R.Kapはい、それで結構です。
デジタル外傷

回答:


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

ルビー、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{(と思う)に変更することで、1バイトのコストで余分なブラケットの要件を削除できます。また、前後にスペースが必要:ですか?そして、: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場所dである1-1の方向に応じて、私はまだそれを働いていません。
-br3nt

私が理解していることから、コードを改善するための編集は一般的に推奨されていません。代わりに、コメントする必要があります。改善のためのあなたのアイデアについては、私は知らない。それはうまくいくように思えますが、私は確かに知らない。
ファンドモニカの訴訟

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,5、さらにはコンマで区切られた数字の形式で入力を取ります1.2,3.4,7.8,9.2。次のステップでドアがUまたはDでそれぞれ上下するかどうかを出力します。時間が経つにつれて、ゴルフはさらに増えます。

オンラインでお試しください!(Ideone)(ここでは、入力はコンマ区切りの数字で構成されるリストの形式で取得されます(例:)[1,2,3,4,5]


1

PHP、128 120バイト

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

コードは、コードボックスに収まるようにここでラップされます。すべてを1行で入力し、PHPオープンマーカーをその前に配置して、ファイルに保存します。または、を使用してコマンドラインから実行しphp -d error_reporting=0 -r '...the code...' [arguments]ます。

使用されていないソースコード、テストスイート、および使用例はgithubにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.