Ist das elektrische Garagentor offen?

24

Mein elektrisches Garagentor funktioniert so:

  • Es gibt nur einen Druckknopf, um die Tür zu steuern
  • Wenn die Tür vollständig geschlossen ist und ich auf den Knopf drücke, beginnt sich die Tür zu öffnen. Das vollständige Öffnen dauert 10 Sekunden
  • Wenn die Tür vollständig geöffnet ist und ich auf den Knopf drücke, beginnt sich die Tür zu schließen. Das vollständige Schließen dauert 10 Sekunden
  • Wenn sich die Tür auf halbem Weg öffnet oder schließt und ich auf den Knopf drücke, stoppt die Tür und bleibt teilweise offen.
  • Immer wenn die Tür anhält, entweder aufgrund einer automatischen Beendigung einer Öffnungs- oder Schließaktion oder aufgrund einer manuellen Unterbrechung durch teilweises Drücken des Knopfes, kehrt der Mechanismus um und merkt sich die Richtung für die nächste Aktion.
  • Wenn der Knopf gedrückt wird, während die Tür angehalten, aber teilweise geöffnet ist, beträgt die Zeit, bis die Aktion abgeschlossen ist, einen Bruchteil von 10 Sekunden, proportional zu der Zeit, die erforderlich ist, um die Aktion abzuschließen.

Angenommen, die Tür ist zu Beginn vollständig geschlossen.

Eine Eingabeliste mit ganzen Zahlen wird angezeigt. Diese ganzen Zahlen geben die Anzahl der Sekunden an, die ich zwischen aufeinanderfolgenden Drücken der Steuertaste warte.

Zwei Dinge ausgeben:

  • Ein Prozentsatz, der den Zustand der Tür angibt, sobald alle Tastendrücke abgeschlossen sind und die Tür einen stabilen Zustand erreicht hat. Die Ausgabe des %Symbols ist optional.
  • eine eindeutige Angabe, in welche Richtung die Tür beim nächsten Tastendruck fährt. Dies kann up/ down, U/ D, +/ -, 1/ 0oder was auch immer Sie wählen.

Es kann davon ausgegangen werden, dass die Tür weniger als 10 Sekunden benötigt, um einen Öffnungs- oder Schließvorgang abzuschließen.

Beispieleingaben:

<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

Erwartete Ausgänge entsprechen den obigen Eingängen

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

Gearbeitetes Beispiel für den letzten Test

  • Tür fährt zu. Taste wird gedrückt
  • Warten Sie 11 Sekunden. Die Tür wird vollständig geöffnet. Taste wird gedrückt.
  • Warten Sie 10 Sekunden. Die Tür bleibt vollständig geschlossen. Taste wird gedrückt.
  • Warten Sie 9 Sekunden. Taste wird gedrückt. Tür bleibt zu 90% geöffnet.
  • Warten Sie 8 Sekunden. Taste wird gedrückt. Die Tür beginnt sich zu schließen.
  • Warten Sie 7 Sekunden. Taste wird gedrückt. Tür bleibt bei 20% geöffnet. Die nächste Richtung wird oben sein.
Digitales Trauma
quelle
Ihr Garagentor bleibt halb offen stehen, wenn Sie beim Schließen den Knopf drücken? Meins nicht, nur zum Öffnen.
Bálint
@ Bálint in beide Richtungen für mich.
Digitales Trauma
@Maltysen bleibt jetzt beim Prozentsatz.
Digitales Trauma
Ist es in Ordnung, wenn eine Gleitkommazahl ausgegeben wird, wenn die Eingabe auch aus Gleitkommazahlen besteht?
R. Kap
@ R.Kap ja, das ist gut.
Digitales Trauma

Antworten:

6

Lua, 258 248 242 Bytes

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

Ich verstehe nicht, wie Ihre Testfälle richtig sein können ...

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 behoben

Ausplaudern
quelle
Ich habe gerade meine Eingabe beendet und stimme auch Ihren Ergebnissen zu.
Neil
3

Pyth, 50 45 39 Bytes

6 Bytes dank Sp3000.

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

Testsuite.

Undichte Nonne
quelle
3

JavaScript (ES6), 109 106 Bytes

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
quelle
@DigitalTrauma Muss ein Optimierungsfehler gewesen sein. Ich habe es erneut optimiert und es irgendwie geschafft, dieses Mal 3 weitere Bytes zu sparen!
Neil
3

Ruby, 152 Bytes

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

Testfälle:

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
quelle
Unterhaltsame Nebenbemerkung: Sie können die Anforderung für zusätzliche Klammern auf Kosten eines Bytes aufheben, indem Sie ->v{zu ->*v{(glaube ich) wechseln . Außerdem müssen Sie die Räume vor dem :als auch nach? Und bist du dir sicher, dass das :a<=0nicht passt (:a) <= 0?
Fund Monicas Klage
Schöner Tipp! Müsste allerdings mit dem Zugriff auf die var abgewogen werden. Was :a<=0würde ich eine bekommen , ArgumentError: comparison of Symbol with 0 failedwenn es nicht funktioniert. Ich denke, weil es das analysiert hat ?und weiß, dass es sich um einen ternären Operator handelt, funktioniert es einfach. Die Regeln sind in der Tat seltsam. Ich habe Leerzeichen oder eckige Klammern gesetzt, um Syntaxfehler wie SyntaxError: unexpected tLABELund NoMethodError: undefined method u? Zu vermeiden .
Br3nt
Fühlen Sie sich frei, eine Änderung vorzunehmen, wenn Sie Verbesserungen feststellen. Ich hatte gehofft, es loszuwerden a=u ? a+w : a-wund zu ändern, a=a+w*dwo es dist 1oder -1je nach Richtung, aber ich habe es noch nicht ausgearbeitet.
Br3nt
Soweit ich weiß, wird von der Bearbeitung zur Verbesserung des Codes generell abgeraten. Stattdessen sollten Sie einen Kommentar abgeben. Was Ihre Verbesserungsidee betrifft, weiß ich nicht; es scheint, als könnte es funktionieren, aber ich weiß es nicht genau.
Fund Monicas Klage
2

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

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)

Nimmt Eingaben in Form von durch Kommas getrennten Zahlen vor, zum Beispiel 1,2,3,4,5oder sogar 1.2,3.4,7.8,9.2. Gibt mit Uoder aus D, ob die Tür im nächsten Schritt auf- oder abfährt. Wird im Laufe der Zeit mehr Golf spielen.

Probieren Sie es online! (Ideone) (Hier erfolgt die Eingabe in Form einer Liste, die aus durch Kommas getrennten Zahlen besteht, z [1,2,3,4,5]. B. )

R. Kap
quelle
1

PHP, 128 120 Bytes

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

Der Code wird hier so umgebrochen, dass er in das Code-Feld passt. Setzen Sie alles in eine einzelne Zeile, setzen Sie den PHP Open Marker davor und speichern Sie ihn in einer Datei. Oder starten Sie es von der Kommandozeile mit php -d error_reporting=0 -r '...the code...' [arguments].

Der ungolfed Quellcode, die Testsuite und Anwendungsbeispiele sind auf github zu finden .

Axiac
quelle