ประตูโรงรถไฟฟ้าเปิดหรือไม่


24

ประตูโรงรถไฟฟ้าของฉันทำงานดังนี้:

  • มีปุ่มกดเพียงปุ่มเดียวเพื่อควบคุมประตู
  • หากประตูปิดสนิทและฉันกดปุ่มประตูก็จะเปิดขึ้น ใช้เวลาเปิด 10 วินาที
  • หากประตูเปิดเต็มและฉันกดปุ่มประตูก็จะปิดลง ใช้เวลาปิด 10 วินาที
  • หากประตูเป็นส่วนหนึ่งผ่านการเปิดหรือปิดและฉันกดปุ่มประตูจะหยุดและเปิดทิ้งไว้บางส่วน
  • เมื่อใดก็ตามที่ประตูหยุดเคลื่อนที่ไม่ว่าจะเป็นการเปิดหรือปิดโดยอัตโนมัติหรือจากการขัดจังหวะด้วยตนเองโดยการกดปุ่มครึ่งหนึ่งผ่านการกระทำกลไกจะย้อนกลับและจดจำทิศทางของการกระทำต่อไป
  • หากกดปุ่มเมื่อประตูหยุดลง แต่เปิดบางส่วนจำนวนเวลาที่ใช้ในการดำเนินการให้เสร็จสมบูรณ์จะเป็นเพียงเสี้ยววินาทีในสัดส่วน 10 วินาทีตามสัดส่วนที่ต้องการเพื่อดำเนินการให้เสร็จสิ้น

สมมติว่าประตูปิดสนิทเมื่อเริ่มต้น

รายการอินพุตของจำนวนเต็มจะได้รับ จำนวนเต็มเหล่านี้คือจำนวนวินาทีที่ฉันรอระหว่างการกดปุ่มควบคุมอย่างต่อเนื่อง

เอาท์พุทสองสิ่ง:

  • เปอร์เซ็นต์ที่ระบุสถานะของประตูเมื่อกดปุ่มทั้งหมดเสร็จสิ้นและประตูถึงสถานะคงที่ เอาท์พุทของ%สัญลักษณ์เป็นตัวเลือก
  • สิ่งบ่งชี้ที่ชัดเจนว่าประตูจะไปทางไหนเมื่อกดปุ่มถัดไป นี่อาจเป็นup/ down, U/ 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

@ Bálintทั้งสองทางสำหรับฉัน
Digital Trauma

@Maltysen ช่วยให้ติดกับร้อยละตอนนี้
Digital Trauma

มันโอเคไหมถ้าเลขทศนิยมเป็นเอาท์พุทถ้าอินพุตนั้นประกอบด้วยเลขทศนิยมด้วย?
R. Kap

@ R.Kap ใช่มันไม่เป็นไร
Digital Trauma

คำตอบ:


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

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

ฉันไม่เห็นว่ากรณีทดสอบของคุณเหมาะสมหรือไม่ ...

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 คงที่


ฉันเพิ่งจบผลงานของฉันและฉันก็เห็นด้วยกับผลลัพธ์ของคุณเช่นกัน
Neil


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 ไบต์ต่อไปในเวลานี้!
Neil

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{(ฉันคิดว่า) นอกจากนี้คุณไม่จำเป็นต้องเว้นวรรคก่อน:เช่นเดียวกับหลัง? และคุณแน่ใจว่า:a<=0จะไม่แยกไป(:a) <= 0?
คดีของกองทุนโมนิกา

คำแนะนำที่ดี! จะต้องมีการชั่งน้ำหนักด้วยการเข้าถึง var แม้ว่า สำหรับ:a<=0ฉันฉันจะได้รับArgumentError: comparison of Symbol with 0 failedถ้ามันไม่ทำงาน ฉันคิดว่าเพราะมันแยกวิเคราะห์?และรู้ว่ามันอยู่ในผู้ประกอบการที่สามจึงใช้งานได้ กฎกติกาแปลก ๆ ฉันได้ใส่ช่องว่างหรือวงเล็บในสถานที่ที่จำเป็นเพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์เช่นSyntaxError: unexpected tLABELและNoMethodError: undefined method คุณ?
br3nt

อย่าลังเลที่จะทำการแก้ไขหากคุณสามารถเห็นการปรับปรุงใด ๆ ผมก็หวังว่าจะสามารถที่จะได้รับการกำจัดa=u ? a+w : a-wและเปลี่ยนเป็นa=a+w*dที่dเป็น1หรือ-1ขึ้นอยู่กับทิศทาง แต่ฉันไม่ได้ทำงานออกยัง
br3nt

จากสิ่งที่ฉันเข้าใจการแก้ไขเพื่อทำให้โค้ดดีขึ้นนั้นเป็นสิ่งที่ท้อแท้ คุณควรแสดงความคิดเห็นแทน สำหรับความคิดของคุณสำหรับการปรับปรุงฉันดันโนะ ดูเหมือนว่ามันจะทำงานได้ แต่ฉันก็ไม่แน่ใจ
คดีฟ้องร้องกองทุนโมนิก้า

2

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

รหัสถูกห่อที่นี่เพื่อให้พอดีกับกล่องรหัส วางทุกอย่างไว้ในบรรทัดเดียวใส่ PHP open marker ไว้ข้างหน้าแล้วบันทึกลงในไฟล์ php -d error_reporting=0 -r '...the code...' [arguments]หรือเรียกใช้จากบรรทัดคำสั่งโดยใช้

รหัสที่มา ungolfed, ชุดทดสอบและตัวอย่างของการใช้งานที่สามารถพบได้บนGitHub

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.