Você mora dentro de um terminal com 80 caracteres de largura. Você está entediado e decide jogar dominó. Não, não o tipo chato que se parece com Scrabble, o tipo divertido em que você passa uma hora ajustando-os para vê-los cair em um segundo.
Nos terminais, o dominó fica assim:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Como todos sabemos, se um dominó inclinado toca um vertical, o segundo dominó também é inclinado. A única exceção é se dois dominós inclinados o tocarem:
|\ --> \\ /| --> // /|\ --> /|\
Ajuste a constante gravitacional do seu terminal para que essa transição leve 100 ms.
Se um dominó inclinado é suportado por outro dominó ou pelas paredes do terminal, sua jornada termina.
Nenhum dos dominós inclinados em
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 caracteres) se moverá, pois os dois dominós mais inclinados são suportados pelas paredes do terminal e todos os outros são suportados por outros dominós.
No entanto, se o espaço na direção de inclinação estiver vazio, o dominó cai:
| \\ --> |__\ // | --> /__|
Terminal. Constante gravitacional. Você entendeu…
Finalmente, há um leve vento da esquerda, de modo que os dominós inclinados para a direita caem mais rapidamente do que os dominados para a esquerda:
|/ \| --> |__\|
Tarefa
Escreva um programa / função que mostre uma animação de jogar dominó em um terminal.
Seu código deve fazer o seguinte:
Leia uma sequência de caracteres de entrada, representando o estado inicial dos dominós.
Essa sequência não conterá mais de 80 caracteres e consistirá apenas nos dominós descritos acima e em espaços vazios.
Imprima o estado e aguarde 100 ms.
Transforme o estado conforme explicado acima.
Se o estado mudou, volte para 2.
Regras adicionais
O comprimento da sequência de entrada não afeta a largura do terminal; mesmo que a cadeia tenha menos de 80 caracteres, as paredes do terminal ainda terão 80 caracteres.
Cada vez que a etapa 2 é executada, o estado deve ser impresso no mesmo local, substituindo o estado anterior.
Como alguns idiomas não conseguem esperar exatamente 100 ms, fique à vontade para aguardar qualquer quantidade entre 50 e 1000 ms.
Aplicam-se as regras padrão de código de golfe .
Exemplos
Para o estado inicial
||\/||
imprima o seguinte (um sobre o outro):
||\/|| |\\//| \\\/// __\\//__
Para o estado inicial
/||||\
imprima o seguinte
/||||\ //||\\ ///\\\
Para o estado inicial
/|||\
imprima o seguinte
/|||\ //|\\
Para o estado inicial
|/ \|/ \|/ \|/ \|
imprima o seguinte:
|__\|__\|__\|__\|
Para o estado inicial (80 caracteres)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
imprima o seguinte
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
ou/|
e você verá que o bloco não cai completamente como deveria.\033
por um byte ESC literal, economizando 3 bytes.Perl 5,
154146Teve que usar um caractere temporário para manter o estado entre 2 regexes.
Para lidar com o risco de algo como / | | | \ acabaria como / / / \ \ em vez de / / | \ \.
Teste
fonte
s, \\|/ ,__,g
vez des/ \\|\/ /__/g
.ES6 ,
220218195 bytesMinificado
Mais legível
fonte
() = > {
e}()
pode simplesmente ser removido do seu código. 2. Não acho que caixas de alerta sejam um formato de saída aceitável para uma animação. Você pode incorporar seu JS em HTML ou fazer as alterações necessárias para que funcionem na linha de comandos. 3. Em qualquer um dos casos, seu código deve aguardar aprox. 100 ms entre a impressão de um estado e o seguinte.console.log("^[c"+d)
, onde^[
está o caractere ESC (um byte)..replace
para[R='replace']
, então cada um subsequente para[R]
, isso reduzirá bastante. Você também pode salvar alguns bytes usandosetTimeout(f,100,d)
no lugar da configuração atual.C #, 335 bytes
Não é uma ótima escolha de idioma.
Eu abusei do atraso permitido entre 50 e 1000 para selecionar um número de dois dígitos.
Novas linhas e recuo adicionados para maior clareza:
fonte
PHP, 175 bytes
Não minificado:
Basicamente regex golf. Primeiro aplaina qualquer dominó em queda que tenha espaço (e devido à ordem de correspondência da esquerda para a direita, o "vento" sopra). Então vem a parte feia (amaldiçoa você corta!)
/|\
e depois pule.(/)|
e substitua por//
|(\)
e substitua por\\
Isso faz com que os dominós caiam. Por fim, aguarde 100 ms pela próxima etapa.
Usar
()
como delimitadores na regex significa que os/
s não precisam escapar, o que ajuda minimamente!fonte
Shell POSIX + sed, 144
Isso está em duas partes. O principal trabalho de derrubar os dominós é a
sed
substituição padrão de padrões , acumulando linhas no espaço de espera. Nós temporariamente nos transformamos/|\
em/:\
protegê-lo, recuperando no final.Como
sed
não há como inserir atrasos (consultei terminfo / termcap, mas não consegui encontrar nenhuma maneira padrão), envolvo cada linha emprintf "...\r"; sleep .1
para imprimir uma linha a cada 100 ms. Na verdade, eu faço isso primeiro, quando temos apenas uma linha, pois os caracteres no comando não serão tocados por nenhuma das substituições de tombamento.Todos testados usando
dash
e GNUcoreutils
, comPOSIXLY_CORRECT
conjunto no ambiente.fonte