Elektrikli garaj kapısı açık mı?


24

Elektrikli garaj kapım şöyle çalışıyor:

  • Kapıyı kontrol etmek için sadece bir buton var
  • Kapı tamamen kapanırsa ve düğmeye basarsam, kapı açılmaya başlar. Tamamen açmak 10 saniye sürer.
  • Kapı tamamen açıksa ve düğmeye basarsam, kapı kapanmaya başlar. Tamamen kapanması 10 saniye sürer.
  • Kapı açılma veya kapanmadan kısmen geçiyorsa ve düğmeye basarsam, kapı durur ve kısmen açık bırakılır.
  • Kapı hareket etmeyi durdurduğunda, ya açık ya da kapalı bir hareketin otomatik olarak tamamlanmasından ya da düğmeyi bir hareket boyunca yarıya iterek manuel olarak kesilmesinden sonra, mekanizma tersine dönecek ve bir sonraki hareket için yönünü hatırlayacaktır.
  • Kapı durdurulduğunda ancak kısmen açıldığında düğmeye basılırsa, eylemi tamamlaması için geçen süre, işlemi tamamlamak için hareket etmesi gereken miktarla orantılı olarak 10 saniyelik bir kesir olacaktır.

Başlangıçta kapının tamamen kapalı olduğunu varsayalım.

Tamsayıların bir giriş listesi verilecektir. Bu tamsayılar, kontrol düğmesine art arda basıldığında arasında beklediğim saniye sayısıdır.

İki şeyi çıktıla:

  • Tüm düğmelere basıldığında ve kapı sabit bir duruma geldiğinde kapının durumunu gösteren bir yüzde. %Sembol çıkışı isteğe bağlıdır.
  • Bir sonraki düğmeye basıldığında kapının hangi yöne gideceğine dair net bir gösterge. Bu, up/ down, U/ D, +/ -, 1/ 0veya seçtiğiniz ne olabilir.

Açık veya kapalı bir işlemi tamamlamak için kapının 10 saniyeden daha az sürdüğünü varsayabilirsiniz.

Örnek girişler:

<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

Yukarıdaki girişlere karşılık gelen beklenen çıkışlar

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

Son testin çalışılmış örneği

  • Kapı kapalı başlar. Düğmeye basıldı
  • 11 saniye bekleyin. Kapı tamamen açılıyor. Düğmeye basıldı.
  • 10 saniye bekle Kapı tamamen kapanıyor. Düğmeye basıldı.
  • 9 saniye bekleyin. Düğmeye basıldı. Kapı% 90 açıkta durur.
  • 8 saniye bekleyin. Düğmeye basıldı. Kapı kapanmaya başlar.
  • 7 saniye bekleyin. Düğmeye basıldı. Kapı% 20 açık durur. Bir sonraki yön yukarı olacak.

Kapatırken düğmeye basarsanız, garaj kapısı yarı açıkta duruyor mu? Benim değil, sadece açmak için.
Bálint

@ Blint, benim için iki yönlü.
Dijital Travma

@Maltysen şimdi yüzde ile yapışıyor.
Dijital Travma

Giriş aynı zamanda kayan nokta sayılarından da oluşuyorsa kayan nokta sayısının çıkması sorun olur mu?
R. Kap

@ R.Kap evet, sorun değil.
Dijital Travma

Yanıtlar:


6

Lua, 258 248 242 bayt

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

Ungolfed

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

Test davalarının nasıl doğru olabileceğini anlamadım.

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 Sabit


Girişimi yeni bitirdim ve sonuçlarınıza da katılıyorum.
Neil,


3

JavaScript (ES6), 109 106 bayt

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 Bir optimizasyon hatası olmalı. Tekrar açtım ve bu sefer 3 bayt daha kurtarmayı başardım!
Neil

3

Ruby, 152 bayt

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

Test durumları:

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"

Eğlenceli bir yan not olarak, sen değiştirerek, bir byte ücret karşılığında ilave parantez için gereksinimini kaldırabilirsiniz ->v{için ->*v{(Sanırım). Ayrıca, öncesi ve :sonrasındaki boşluklara mı ihtiyacınız var ? Ve eminiz :a<=0için ayrıştırmak değil (:a) <= 0?
Fon Monica'nın Davası

Güzel ipucu! Var olsa erişim ile tartılacaktı gerekir. Gelince :a<=0, ben bir alırdım ArgumentError: comparison of Symbol with 0 failedişe yaramadı eğer. Sanırım ayrıştırdığı ?ve üçlü bir operatörde olduğunu bildiği için işe yarıyor. Kurallar gerçekten garip. U SyntaxError: unexpected tLABELve NoMethodError: undefined method '' gibi sözdizimi hatalarını önlemek için gereken yerlere boşluk veya parantez koydum .
br3nt

Herhangi bir iyileştirme görebiliyorsanız, bir düzenleme yapmaktan çekinmeyin. Ben kurtulmak edebilmek için umuyordum a=u ? a+w : a-wbunu değiştirebilir a=a+w*dnerede dolduğunu 1veya -1yöne bağlı olarak, ama henüz bunu çalışmadım.
br3nt

Anladığım kadarıyla kodu daha iyi hale getirmek için düzenleme yapmak genellikle önerilmez; bunun yerine yorum yapmalısınız. Gelişme fikrinize gelince, bilmiyorum; İşe yarayacak gibi görünüyor, ama kesin olarak bilmiyorum.
Fon Monica'nın Davası

2

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

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)

Örneğin virgülle ayrılmış sayılar biçiminde 1,2,3,4,5veya hatta girdiler 1.2,3.4,7.8,9.2. Bir sonraki adımda kapının sırasıyla Uveya ile yukarı mı yoksa aşağı mı gittiğini gösterir D. Zamanla daha fazla golf yapacak.

Çevrimiçi Deneyin! (İdeone) (Burada girdi, virgülle ayrılmış sayılardan oluşan bir liste şeklinde alınır, örn [1,2,3,4,5].)


1

PHP, 128 120 bayt

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

Kod, kod kutusuna sığacak şekilde buraya sarılır. Her şeyi tek bir satıra koyun, PHP açık işaretçisini önüne koyun ve bir dosyaya kaydedin. Veya kullanarak komut satırından çalıştırın php -d error_reporting=0 -r '...the code...' [arguments].

Ungolfed kaynak kodu, test paketi ve kullanım örnekleri bulunabilir github .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.