aviso Legal
Embora eu saiba que existe essa pergunta relacionada específica , minha pergunta usa duas portas de garagem, um componente aleatório, e também estou baseando isso em eventos da vida real, vendo meu filho acidentalmente abaixar uma das referidas portas de garagem enquanto eu estava saindo da sala. garagem na semana passada ... Nada como um golpe na cabeça para fazer fluir os sucos criativos! ;)
O fundo
Lucas (meu filho de 15 meses) gosta de brincar com o controle remoto da garagem. Existem dois botões neste controle remoto, um para a porta esquerda da garagem e outro para a porta direita da garagem. Ambos os botões funcionam da mesma maneira; pressione uma vez para abrir a porta, pressione novamente para parar, pressione novamente para começar a fechar, pressione novamente para parar novamente e assim por diante.
Lucas adora esse controle remoto, ele pressiona aleatoriamente um dos botões, ou ambos, ou nenhum. Se os dois forem pressionados, nenhum sinal será enviado, mas pressionar um botão enviará um sinal.
Portanto, o desafio do código-golfe é dividido em duas partes:
Parte um
Gere uma cadeia de 60 caracteres que representa o pressionamento aleatório do botão Lucas por um minuto. "Aleatório" neste caso significa "com uma chance igual de cada entrada a cada marca". Os caracteres são os seguintes:
- 0: Lucas não pressionou nenhum botão ou pressionou os dois botões. De qualquer maneira, nenhum sinal foi enviado.
- 1: O botão da porta esquerda da garagem foi pressionado por Lucas
- 2: O botão da porta direita da garagem foi pressionado por Lucas
Parte dois
Usando a corda gerada na Parte Um, simule a abertura e o fechamento da garagem para dois carros usando os números como gatilhos para abrir, parar e fechar essas portas.
Minhas portas da garagem são bem rápidas (consulte o Aviso acima sobre o motivo). Depois de pressionar o botão, leva quatro segundos para ser totalmente aberto ou fechado.
Então, se fechado:
- 0 s: 0% aberto (fechado); quando o botão é pressionado, a porta começa a abrir
- 1 s: 25% aberto
- 2 s: 50% aberto
- 3 s: 75% aberto
- 4 s: 100% aberto, batentes de porta
E, portanto, se aberto:
- 0 s: 100% aberto; quando o botão é pressionado, a porta começa a fechar
- 1 s: 75% aberto
- 2 s: 50% aberto
- 3 s: 25% aberto
- 4 s: 0% aberto (fechado), batentes de porta
Se uma porta específica estiver em movimento, um sinal para a mesma porta a interromperá. O próximo sinal enviado para a mesma porta depois enviará o movimento na direção oposta. Se uma porta for parada quando estiver em movimento e agora estiver totalmente aberta ou totalmente fechada quando o sinal de "parada" for recebido, a porta será registrada como "parada" no estado totalmente aberto ou totalmente fechado, pronta para mova na direção oposta quando receber um novo sinal.
Com esta simulação, as duas portas da garagem estarão inicialmente na posição fechada. Então, vejamos uma lista de comandos de 10 segundos e vejamos o que acontece se Lucas executá-los no controle remoto:
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Resultado
A primeira parte da saída requer a exibição da cadeia longa de 60 caracteres dos caracteres aleatórios "0", "1" e "2" gerados a partir da Parte Um. por exemplo.
212022112021202211202120221120212022112021202211202120221120
Abaixo dessa sequência, está o processamento desses "sinais", de acordo com as regras mencionadas acima, sobre como as portas da garagem se comportarão com cada caractere respectivo (segundo a segundo). Você deve terminar com 60 linhas como resultado abaixo da sequência de exibição inicial.
Cada uma dessas linhas processadas terá a forma de:
N: (L:X% XXXXXXX, R:Y% YYYYYYY)
where:
- N é o enésimo caractere da respectiva sequência aleatória, que terá a forma de 0, 1 ou 2.
- X% é a porcentagem de abertura da porta esquerda (não há preenchimento zero)
- XXXXXXX é o status da porta esquerda. Se a porta não estiver em movimento (ou seja, não abrir ou fechar), o status "parado" será aplicado, o que significa que foi interrompido em movimento (apenas possível a 25%, 50% ou 75%) ou parado quando totalmente aberto (100% ) ou totalmente fechado (0%). Caso contrário, a porta estará "abrindo" ou "fechando".
- Y% é a porcentagem de abertura da porta direita (não há preenchimento zero)
- AAAAAA é o status da porta direita. Se a porta não estiver em movimento (ou seja, não abrir ou fechar), o status "parado" será aplicado, o que significa que foi interrompido em movimento (apenas possível a 25%, 50% ou 75%) ou parado quando totalmente aberto (100% ) ou totalmente fechado (0%). Caso contrário, a porta estará "abrindo" ou "fechando".
Exemplo mostrado abaixo usando 10 "sinais" e 10 linhas processadas
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Isso é código-golfe, então o código mais curto será o vencedor. Facilitei um pouco isso usando frases como "abertura", "parada" e "fechamento", que são todas as sete letras ... portanto, você pode incluir isso em sua estratégia.
Boa sorte!
1
comando não está parando a porta esquerda em 75% no seu exemplo?Respostas:
Pitão,
156149145 bytesUma tradução direta da minha resposta em Python .
Experimente online!
Explicação:
fonte
Javascript (ES6),
277275263253250247234 bytesUngolfed e comentou
Demo
fonte
112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]
(novas linhas após a vírgula e entre parênteses)v^=(c-i-1?0:v&8||24)
para economizar dois bytes.Python 2,
377370361357345335326316312306304 bytesO segundo nível de recuo é uma guia bruta (
\t
), que joga muito mal com o Markdown, então foi substituída por dois espaços.Estou quase certo de que isso pode ser jogado ainda mais.
Ungolfed, com comentários:
Guardado
41415 bytes graças a @TheBikingViking!Guardado 6 bytes graças a @ValueInk!
fonte
range(60)
para[0]*60
.'p'[1::3]
(substituir apóstrofos por retângulos) em vez de''.join(map(str,p))
.(4,0)[q<0]==c[i]and q
->((4,0)[q<0]==c[i])*q
n
essa string.n
é usado na linha final para extrairclosing
,stopped
,opening
a partir desse string.Ruby,
263261260254 bytesComo a resposta do JavaScript ficou tão curta ??? Ele ultrapassou o meu enquanto eu estava fora e ainda está ganhando atualmente ...
fonte
C,
420433424374 bytesNão propaga o gerador aleatório, mas usa aleatório para uma melhor distribuição. Porém, deve haver uma maneira melhor de jogar golfe nessa lógica ...
Versão anterior 1:
Versão anterior 2:
fonte
PHP,
254247246245235230226 bytesbatendo ES novamente!
desses 311 (a primeira versão completa, já tinha algum golfe):
demolir
fonte
Java 8 lambda, 500 caracteres
Eu fiz o meu melhor, aqui está o que eu vim com:
Ungolfed em uma classe completa:
Bem direto. As variáveis stepLeft / stepRight circulam de 0 a 3. Ao realizar algumas matemáticas simples, changeLeft / changeRight mantenha as respectivas alterações relativas por etapa, que serão adicionadas a leftDoor / rightDoor. Muitas declarações para pegar quando a porta tem que parar por conta própria.
Sinta-se à vontade para me ajudar a reduzir isso, acho que há muito o que fazer.
fonte
Haskell (lambdabot) - 409 bytes
fonte
imports
, por exemplo, para orandoms
seu código (e contagem de bytes). Se houver um intérprete importado por padrão, consulte-o no nome do idioma.