A porta da garagem elétrica está aberta?


24

Minha porta da garagem elétrica funciona assim:

  • Há apenas um botão para controlar a porta
  • Se a porta estiver totalmente fechada e eu apertar o botão, a porta começará a abrir. Leva 10 segundos para abrir totalmente
  • Se a porta estiver totalmente aberta e eu apertar o botão, a porta começará a fechar. Demora 10 segundos para fechar completamente
  • Se a porta estiver abrindo ou fechando parcialmente e eu apertar o botão, a porta para e fica parcialmente aberta.
  • Sempre que a porta parar de se mover, seja pela conclusão automática de uma ação de abertura ou fechamento ou pela interrupção manual pressionando o botão parcialmente, uma ação, o mecanismo será revertido e lembrará sua direção para a próxima ação.
  • Se o botão for pressionado quando a porta estiver parada, mas parcialmente aberta, a quantidade de tempo para concluir sua ação será uma fração de 10 segundos na proporção da quantidade necessária para se mover para concluir a ação.

Suponha que a porta esteja totalmente fechada no início.

Uma lista de entrada de números inteiros será fornecida. Esses números inteiros são o número de segundos que eu espero entre toques sucessivos no botão de controle.

Saída duas coisas:

  • uma porcentagem indicando o estado da porta quando todos os botões forem pressionados e a porta atingir um estado estável. A saída do %símbolo é opcional.
  • uma indicação inequívoca de qual direção a porta seguirá no próximo pressionamento de botão. Pode ser up/ down, U/ D, +/ -, 1/ 0ou o que você escolher.

Você pode assumir que a porta leva infinitamente menos de 10 segundos para concluir uma ação de abrir ou fechar.

Exemplo de entradas:

<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

Saídas esperadas correspondentes às entradas acima

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

Exemplo resolvido do último teste

  • A porta começa fechada. O botão é pressionado
  • Aguarde 11 segundos. A porta acaba totalmente aberta. O botão é pressionado.
  • Aguarde 10 segundos. A porta acaba totalmente fechada. O botão é pressionado.
  • Aguarde 9 segundos. O botão é pressionado. A porta para com 90% de abertura.
  • Aguarde 8 segundos. O botão é pressionado. A porta começa a fechar.
  • Aguarde 7 segundos. O botão é pressionado. A porta para com 20% de abertura. A próxima direção será ativada.

A porta da garagem para a metade da abertura, se você pressionar o botão enquanto fecha? O meu não, apenas para abertura.
Bálint

@ Bálint nos dois sentidos para o meu.
Digital Trauma

@ Maltysen vamos ficar com porcentagem agora.
Digital Trauma

Tudo bem se um número de ponto flutuante for emitido, se a entrada também consistir em número (s) de ponto flutuante?
R. Kap

@ R.Kap sim, tudo bem.
Digital Trauma

Respostas:


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

Não vejo como seus casos de teste podem estar certos ...

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 Fixed


Acabei de terminar minha inscrição e concordo com seus resultados também.
Neil


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

@DigitalTrauma Deve ter sido um erro de otimização. Eu o otimizei novamente e, de alguma forma, consegui salvar mais 3 bytes desta vez!
1111 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 teste:

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"

Como uma observação divertida, você pode remover o requisito de colchetes extras ao custo de um byte, alterando ->v{para ->*v{(eu acho). Além disso, você precisa os espaços antes o :, bem como depois? E você tem certeza que o :a<=0não analisa (:a) <= 0?
Fund Monica's Lawsuit

Boa dica! Teria de ser pesado com acesso ao var embora. Quanto a :a<=0, eu receberia um ArgumentError: comparison of Symbol with 0 failedse não funcionasse. Eu acho que porque ele analisou ?e sabe que está em um operador ternário, simplesmente funciona. As regras são realmente estranhas. Eu coloquei espaços ou suportes em lugares que são necessários para evitar erros de sintaxe como SyntaxError: unexpected tLABELe NoMethodError: undefined method u? `.
Br3nt # 11/16

Sinta-se livre para fazer uma edição, se você puder ver alguma melhoria. Eu esperava poder me livrar a=u ? a+w : a-we mudar para a=a+w*donde dé 1ou -1dependendo da direção, mas ainda não o resolvi.
Br3nt # 11/16

Pelo que entendi, a edição para melhorar o código geralmente é desencorajada; em vez disso, você deve comentar. Quanto à sua ideia de melhoria, não sei; parece que poderia funcionar, mas não sei ao certo.
Fund Monica's Lawsuit

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)

Recebe entrada na forma de números separados por vírgula, por exemplo 1,2,3,4,5ou mesmo 1.2,3.4,7.8,9.2. Mostra se a porta na próxima etapa está subindo ou descendo com Uou D, respectivamente. Golf mais com o tempo.

Experimente Online! (Ideona) (Aqui, a entrada é obtida na forma de uma lista que consiste em números separados por vírgula, por exemplo [1,2,3,4,5]).


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

O código é agrupado aqui para caber na caixa de código. Coloque tudo em uma única linha, coloque o marcador aberto PHP na frente dele e salve-o em um arquivo. Ou execute-o na linha de comando usando php -d error_reporting=0 -r '...the code...' [arguments].

O código fonte não-protegido, a suíte de testes e exemplos de uso podem ser encontrados no github .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.