La porta del garage elettrico è aperta?


24

La mia porta del garage elettrico funziona così:

  • C'è solo un pulsante per controllare la porta
  • Se la porta è completamente chiusa e premo il pulsante, la porta inizia ad aprirsi. Ci vogliono 10 secondi per aprirsi completamente
  • Se la porta è completamente aperta e premo il pulsante, la porta inizia a chiudersi. Sono necessari 10 secondi per la chiusura completa
  • Se la porta è a metà dell'apertura o della chiusura e premo il pulsante, la porta si ferma e viene lasciata parzialmente aperta.
  • Ogni volta che la porta smette di muoversi, sia dal completamento automatico di un'azione aperta o chiusa, sia dall'interruzione manuale premendo il pulsante a metà di un'azione, il meccanismo si inverte e ricorda la sua direzione per l'azione successiva.
  • Se il pulsante viene premuto quando la porta è ferma ma parzialmente aperta, il tempo necessario per completare l'azione sarà di una frazione di 10 secondi in proporzione alla quantità che deve muoversi per completare l'azione.

Supponiamo che la porta sia completamente chiusa all'inizio.

Verrà fornito un elenco di input di numeri interi. Questi numeri interi sono il numero di secondi che aspetto tra le successive pressioni del pulsante di controllo.

Uscita due cose:

  • una percentuale che indica lo stato della porta una volta completati tutti i pulsanti e la porta ha raggiunto uno stato stabile. L'output del %simbolo è facoltativo.
  • un'indicazione inequivocabile di quale direzione percorrerà la porta alla successiva pressione del pulsante. Questo può essere up/ down, U/ D, +/ -, 1/ 0o qualunque cosa tu scelga.

Si può presumere che la porta impieghi infinitamente meno di 10 secondi per completare un'azione di apertura o chiusura.

Input di esempio:

<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

Uscite previste corrispondenti agli ingressi precedenti

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

Esempio funzionante dell'ultimo test

  • La porta inizia chiusa. Il pulsante è premuto
  • Attendi 11 secondi. La porta finisce completamente aperta. Viene premuto il pulsante.
  • Attendi 10 secondi. La porta finisce completamente chiusa. Viene premuto il pulsante.
  • Attendi 9 secondi. Viene premuto il pulsante. La porta si ferma al 90% aperta.
  • Attendi 8 secondi. Viene premuto il pulsante. La porta inizia a chiudersi.
  • Aspetta 7 secondi. Il pulsante è premuto. La porta si ferma al 20% aperta. La prossima direzione sarà in alto.

La porta del garage si ferma a metà aperto, se si preme il pulsante, mentre si chiude? Il mio no, solo per l'apertura.
Bálint,

@ Bálint in entrambi i modi per il mio.
Trauma digitale

@Maltysen ora si attacca con percentuale.
Trauma digitale

Va bene se viene emesso un numero in virgola mobile se l'ingresso è composto anche da numeri in virgola mobile?
R. Kap,

@ R.Kap sì, va bene.
Digital Trauma,

Risposte:


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

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

Non vedo come i tuoi casi di test possano essere giusti ...

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 risolto


Ho appena finito la mia iscrizione e sono d'accordo anche con i tuoi risultati.
Neil,


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

@DigitalTrauma Deve essere stato un errore di ottimizzazione. L'ho ripreso e in qualche modo sono riuscito a salvare altri 3 byte questa volta!
Neil,

3

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

Casi test:

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"

Come nota a margine divertente, puoi rimuovere il requisito per parentesi extra al costo di un byte, cambiando ->v{in ->*v{(credo). Inoltre, avete bisogno gli spazi prima della :e dopo? E sei sicuro che :a<=0non ci riesca (:a) <= 0?
Finanzi la causa di Monica l'

Bel consiglio! Dovrebbe essere valutato con l'accesso al var però. Per quanto riguarda :a<=0, otterrei un ArgumentError: comparison of Symbol with 0 failedse non funzionasse. Penso che perché ha analizzato ?e sa che si trova in un operatore ternario, funziona e basta. Le regole sono davvero strane. Ho inserito spazi o parentesi nei punti necessari per evitare errori di sintassi come SyntaxError: unexpected tLABELe NoMethodError: undefined method tu? ''.
br3nt,

Sentiti libero di fare una modifica se riesci a vedere qualche miglioramento. Speravo di riuscire a sbarazzarmi a=u ? a+w : a-we cambiarlo a=a+w*ddove si dtrova 1o in -1base alla direzione, ma non l'ho ancora capito.
br3nt,

Da quanto ho capito, la modifica per migliorare il codice è generalmente sconsigliata; invece, dovresti commentare. Per quanto riguarda la tua idea di miglioramento, non so; sembra che potrebbe funzionare, ma non lo so per certo.
Fondi Monica's Lawsuit

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)

Accetta input sotto forma di numeri separati da virgola, ad esempio 1,2,3,4,5o pari 1.2,3.4,7.8,9.2. Emette se la porta nel passaggio successivo va su o giù con Uo D, rispettivamente. Golferà di più nel tempo.

Provalo online! (Ideone) (Qui l'input è preso sotto forma di un elenco composto da numeri separati da virgola, ad es [1,2,3,4,5].)


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

Il codice è racchiuso qui per adattarsi alla casella del codice. Metti tutto su una sola riga, metti il ​​marcatore aperto PHP davanti e salvalo in un file. Oppure eseguilo dalla riga di comando utilizzando php -d error_reporting=0 -r '...the code...' [arguments].

Il codice sorgente non registrato, la suite di test ed esempi di utilizzo sono disponibili su github .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.