Apakah pintu garasi listrik terbuka?

24

Pintu garasi listrik saya berfungsi seperti ini:

  • Hanya ada satu tombol untuk mengendalikan pintu
  • Jika pintu tertutup sepenuhnya dan saya menekan tombol, pintu mulai terbuka. Dibutuhkan 10 detik untuk membuka sepenuhnya
  • Jika pintu terbuka penuh dan saya menekan tombol, pintu mulai menutup. Dibutuhkan 10 detik untuk menutup sepenuhnya
  • Jika pintunya terbuka atau dibuka dan saya menekan tombolnya, maka pintunya berhenti dan dibiarkan terbuka sebagian.
  • Setiap kali pintu berhenti bergerak, baik dari penyelesaian otomatis tindakan terbuka atau tertutup, atau dari gangguan manual dengan menekan tombol di tengah-tengah tindakan, maka mekanisme akan mundur dan mengingat arahnya untuk tindakan selanjutnya.
  • Jika tombol ditekan ketika pintu berhenti tetapi sebagian terbuka, maka jumlah waktu untuk menyelesaikan aksinya akan menjadi sebagian kecil dari 10 detik sebanding dengan jumlah yang dibutuhkannya untuk bergerak untuk menyelesaikan aksinya.

Anggap pintu tertutup sepenuhnya pada awalnya.

Daftar input bilangan bulat akan diberikan. Bilangan bulat ini adalah jumlah detik yang saya tunggu di antara tekanan tombol kontrol yang berurutan.

Keluarkan dua hal:

  • persentase yang menunjukkan keadaan pintu setelah semua tombol ditekan dan pintu telah mencapai kondisi stabil. Output dari %simbol adalah opsional.
  • indikasi yang jelas tentang arah pintu yang akan dituju pada tombol berikutnya. Ini mungkin up/ down, U/ D, +/ -, 1/ 0atau apa pun yang Anda pilih.

Anda dapat mengasumsikan bahwa pintu membutuhkan waktu sangat kurang dari 10 detik untuk menyelesaikan tindakan terbuka atau tertutup.

Input contoh:

<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

Output yang diharapkan sesuai dengan input di atas

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

Contoh tes terakhir yang berhasil

  • Pintu mulai ditutup. Tombol ditekan
  • Tunggu 11 detik. Pintu berakhir sepenuhnya terbuka. Tombol ditekan.
  • Tunggu 10 detik. Pintu berakhir sepenuhnya tertutup. Tombol ditekan.
  • Tunggu 9 detik. Tombol ditekan. Pintu berhenti di 90% terbuka.
  • Tunggu 8 detik. Tombol ditekan. Pintu mulai menutup.
  • Tunggu 7 detik. Tombol ditekan. Pintu berhenti di 20% terbuka. Arah selanjutnya akan naik.
Trauma Digital
sumber
Pintu garasi Anda berhenti setengah terbuka, jika Anda menekan tombol, sambil menutup? Milikku tidak, hanya untuk pembukaan.
Bálint
@ Bálint dua arah untuk tambang.
Trauma Digital
@Maltysen memungkinkan tetap dengan persentase sekarang.
Trauma Digital
Apakah boleh jika angka floating point adalah output jika input juga terdiri dari nomor floating point?
R. Kap
@ R. Ya, itu baik-baik saja.
Digital Trauma

Jawaban:

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

Tidak disatukan

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

Saya tidak melihat bagaimana kasus pengujian Anda bisa benar ...

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 Tetap

Pengobrol
sumber
Saya baru saja menyelesaikan entri saya dan saya setuju dengan hasil Anda juga.
Neil
3

Pyth, 50 45 39 byte

6 byte berkat Sp3000.

J1,*Tu@S[0T+?|!%GTZ+=Z0*H~_J~Z1G)1+QT0J

Suite uji.

Biarawati Bocor
sumber
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")
Neil
sumber
@DigitalTrauma Pasti ada kesalahan pengoptimalan. Saya telah mengoptimalkannya dan entah bagaimana berhasil menghemat 3 byte lebih lanjut saat ini!
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}"}

Kasus uji:

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"
br3nt
sumber
Sebagai catatan tambahan yang menyenangkan, Anda dapat menghapus persyaratan untuk tanda kurung tambahan dengan biaya satu byte, dengan mengubah ->v{ke ->*v{(saya pikir). Juga, apakah Anda memerlukan ruang sebelum itu :serta setelah? Dan apakah Anda yakin itu :a<=0tidak parsing (:a) <= 0?
Dana Gugatan Monica
Tip yang bagus! Akan perlu ditimbang dengan akses ke var sekalipun. Adapun :a<=0, saya akan mendapat ArgumentError: comparison of Symbol with 0 failedjika itu tidak berhasil. Saya pikir karena mem-parsing ?dan tahu itu di operator ternary, itu hanya berfungsi. Aturannya memang aneh. Saya telah meletakkan spasi atau tanda kurung di tempat-tempat yang diperlukan untuk menghindari kesalahan sintaksis seperti SyntaxError: unexpected tLABELdan NoMethodError: undefined method u? ''.
br3nt
Jangan ragu untuk melakukan edit jika Anda dapat melihat peningkatan. Saya berharap untuk dapat menyingkirkan a=u ? a+w : a-wdan mengubahnya ke a=a+w*dmana dmerupakan 1atau -1tergantung pada arah, tapi saya belum bekerja itu belum.
br3nt
Dari apa yang saya mengerti, mengedit untuk membuat kode lebih baik umumnya tidak disarankan; alih-alih, Anda harus berkomentar. Adapun ide Anda untuk perbaikan, saya tidak tahu; sepertinya itu bisa berhasil, tapi aku tidak tahu pasti.
Dana Gugatan 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)

Mengambil input dalam bentuk angka yang dipisah koma, misalnya 1,2,3,4,5atau genap 1.2,3.4,7.8,9.2. Keluaran apakah pintu pada langkah berikutnya naik atau turun dengan Uatau D, masing-masing. Akan golf lebih banyak dari waktu ke waktu.

Cobalah secara Online! (Ideone) (Di sini input diambil dalam bentuk daftar yang terdiri dari angka yang dipisahkan koma, mis [1,2,3,4,5].)

R. Kap
sumber
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];

Kode dibungkus di sini agar sesuai dengan kotak kode. Letakkan semuanya dalam satu baris, letakkan penanda PHP terbuka di depannya dan simpan ke dalam file. Atau jalankan dari baris perintah menggunakan php -d error_reporting=0 -r '...the code...' [arguments].

Kode sumber ungolfed, suite tes dan contoh penggunaan dapat ditemukan di github .

aksioma
sumber