¿Está abierta la puerta del garaje eléctrico?

24

La puerta de mi garaje eléctrico funciona así:

  • Solo hay un botón para controlar la puerta
  • Si la puerta está completamente cerrada y presiono el botón, la puerta comienza a abrirse. Tarda 10 segundos en abrirse completamente
  • Si la puerta está completamente abierta y presiono el botón, la puerta comienza a cerrarse. Tarda 10 segundos en cerrarse completamente
  • Si la puerta está a medio abrir o cerrarse y presiono el botón, entonces la puerta se detiene y se deja parcialmente abierta.
  • Cada vez que la puerta deja de moverse, ya sea por la finalización automática de una acción de apertura o cierre, o por la interrupción manual presionando el botón a la mitad de una acción, el mecanismo se revertirá y recordará su dirección para la siguiente acción.
  • Si se presiona el botón cuando la puerta está detenida pero parcialmente abierta, la cantidad de tiempo para que complete su acción será una fracción de 10 segundos en proporción a la cantidad que necesita moverse para completar la acción.

Suponga que la puerta está completamente cerrada al comienzo.

Se dará una lista de entrada de enteros. Estos enteros son la cantidad de segundos que espero entre pulsaciones sucesivas del botón de control.

Salida dos cosas:

  • un porcentaje que indica el estado de la puerta una vez que se completan todos los botones y la puerta ha alcanzado un estado estable. La salida del %símbolo es opcional.
  • Una indicación inequívoca de en qué dirección se desplazará la puerta en el siguiente botón. Esto puede ser up/ down, U/ D, +/ -, 1/ 0o lo que elija.

Puede suponer que la puerta tarda infinitamente menos de 10 segundos para completar una acción de abrir o cerrar.

Entradas de ejemplo:

<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

Salidas esperadas correspondientes a las entradas anteriores

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

Ejemplo trabajado de la última prueba

  • La puerta comienza cerrada. Se presiona el botón
  • Espera 11 segundos. La puerta termina completamente abierta. Se presiona el botón.
  • Espera 10 segundos La puerta termina completamente cerrada. Se presiona el botón.
  • Espera 9 segundos Se presiona el botón. La puerta se detiene al 90% abierta.
  • Espera 8 segundos Se presiona el botón. La puerta comienza a cerrarse.
  • Espera 7 segundos. Se presiona el botón. La puerta se detiene al 20% abierta. La siguiente dirección estará arriba.
Trauma digital
fuente
¿La puerta del garaje se detiene a medio abrir, si presiona el botón, mientras se cierra? El mío no, solo por abrir.
Bálint
@ Bálint en ambos sentidos para el mío.
Trauma digital
@Maltysen permite seguir con el porcentaje ahora.
Trauma digital
¿Está bien si se emite un número de coma flotante si la entrada también consta de números de coma flotante?
R. Kap
@ R.Kap sí, está bien.
Trauma digital

Respuestas:

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

Sin golf

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

No veo cómo tus casos de prueba pueden ser correctos ...

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 fijo

Cotilla
fuente
Acabo de terminar mi entrada y también estoy de acuerdo con sus resultados.
Neil
3

Pyth, 50 45 39 bytes

6 bytes gracias a Sp3000.

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

Banco de pruebas.

Monja permeable
fuente
3

JavaScript (ES6), 109106 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
fuente
@DigitalTrauma Debe haber sido un error de optimización. ¡Lo reoptimicé y de alguna manera logré ahorrar 3 bytes más esta vez!
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}"}

Casos de prueba:

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
fuente
Como nota al margen divertida, puede eliminar el requisito de paréntesis adicionales al costo de un byte, cambiando ->v{ a ->*v{(creo). Además, no se necesitan los espacios antes de la :, así como después? ¿Y estás seguro de que :a<=0no funciona (:a) <= 0?
Financia la demanda de Mónica
Buen consejo! Sin embargo, tendría que ser pesado con acceso a la var. En cuanto a :a<=0, obtendría un ArgumentError: comparison of Symbol with 0 failedsi no funcionara. Creo que porque analizó ?y sabe que está en un operador ternario, simplemente funciona. Las reglas son realmente extrañas. He puesto espacios o corchetes en lugares que son necesarios para evitar errores de sintaxis como SyntaxError: unexpected tLABELy NoMethodError: undefined method u? ''.
br3nt
Siéntase libre de hacer una edición si puede ver alguna mejora. Tenía la esperanza de poder deshacerme a=u ? a+w : a-wy cambiarlo a a=a+w*ddonde destá 1o -1dependiendo de la dirección, pero aún no lo he resuelto.
br3nt
Por lo que entiendo, la edición para mejorar el código generalmente se desaconseja; en su lugar, deberías comentar. En cuanto a su idea de mejora, no sé; parece que podría funcionar, pero no lo sé con seguridad.
Financia la demanda de Mónica
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)

Toma entrada en forma de números separados por comas, por ejemplo 1,2,3,4,5o incluso 1.2,3.4,7.8,9.2. Muestra si la puerta en el siguiente paso sube o baja con Uo D, respectivamente. Jugará más golf con el tiempo.

¡Pruébelo en línea! (Ideone) (Aquí la entrada se toma en forma de una lista que consiste en números separados por comas, por ejemplo [1,2,3,4,5]).

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

El código se envuelve aquí para caber en el cuadro de código. Ponga todo en una sola línea, coloque el marcador abierto de PHP frente a él y guárdelo en un archivo. O ejecútelo desde la línea de comando usando php -d error_reporting=0 -r '...the code...' [arguments].

El código fuente no protegido, el conjunto de pruebas y ejemplos de uso se pueden encontrar en github .

axiac
fuente