Escreva um programa em execução indefinidamente que relate quantas instâncias dele estão em execução no momento. Cada instância do programa também deve relatar a ordem em que foi aberto em todas as outras instâncias em execução no momento.
Exemplo
O usuário inicia o programa pela primeira vez - chamaremos isso de Instância 1. A Instância 1 é exibida 1/1
, porque é a primeira instância a ser lançada de um total de 1 instâncias atualmente em execução.
Enquanto a Instância 1 está em execução, o usuário inicia o programa uma segunda vez para se tornar a Instância 2. A Instância 1 agora é exibida 1/2
, sendo a primeira instância de um total de 2 instâncias atualmente em execução. A instância 2 é exibida 2/2
, porque é a segunda instância de um total de 2 instâncias atualmente em execução.
Digamos que o usuário continue gerando mais instâncias até que existam 5 delas. Em ordem de lançamento, os seus resultados são: 1/5
2/5
3/5
4/5
5/5
.
Agora, digamos que o usuário decida encerrar a Instância 3. A Instância 4 se torna a nova Instância 3 e a Instância 5 a nova Instância 4, porque são respectivamente a terceira e a quarta instâncias a serem lançadas do que agora é um total de 4 instâncias. Portanto, a alteração de saída de cada instância seria a seguinte:
1/5
→1/4
2/5
→2/4
3/5
→ (Terminado)4/5
→3/4
5/5
→4/4
Regras
- Você pode emitir os dois números (número da instância, total de instâncias) em qualquer formato razoável.
- Sempre que uma instância é iniciada ou finalizada, todas as outras instâncias devem atualizar suas respectivas saídas em 100 milissegundos.
- Se você optar por atualizar a saída imprimindo para uma nova linha (ou outro formato de saída "anexado"; em vez de substituir), deverá imprimir somente quando o número de instâncias mudar, e não a qualquer outro momento.
- Isso é código de golfe. O programa mais curto em bytes vence.
- Em sua resposta, você deve especificar o que o usuário deve fazer para abrir mais de uma instância e / ou registrar um screencast para demonstrar.
Respostas:
APL (Dyalog Unicode) , SBCS de 39 bytes
Função de prefixo anônimo. Chame gerando o argumento fictício
⍬
(vetor numérico vazio), ief&⍬
. Consulte os tópicos atualmente em execução⎕TNUMS
e elimine um ou mais tópicos com⎕TKILL n
. A saída de threads muda em [número próprio, número total] assim que obtém o tempo do processador, ou seja, instantaneamente.Experimente online!
{
…}
Lambda anônima onde⍵
está o argumento (inicialmente⍬
, o vetor numérico vazio)n[
…]
Índicen
(a ser definido) com:⎕TNUMS~0
todos t hread Num fibras excepto número0
(REPL)n←
armazenar comon
⍋
permutação que classificaria ascendenteagora temos os threads ativos em ordem
⍵≡
se o argumento é idêntico a isso ...:
então:∇⍵
recuar cauda sobre o argumento⋄
outro:⊢/n
o número da rosca mais à direita⎕TID,
este T do hread ID (número fio) anexado ao quen⍳
encontre os ndices desses dois⎕←
imprima isso para STDOUTn⊣
descartar isso em favor den
∇
recuar sobre issofonte
Python 3,
694691 bytesmain.py
s (abreviação de server.py)
Por que demora tanto?
Infelizmente, essa funcionalidade não parece estar embutida no Python. Fiquei tentado a usar o multiprocessamento, mas isso não parecia adequado para o que estamos fazendo (permitindo que um usuário abra um programa de qualquer lugar).
Então, segui o conselho de um post do StackOverflow que vi (extraviei o link) e o implementei usando
bottle
. (Estou aberto a novas sugestões).Eu usei a biblioteca Bottle para executar meu próprio servidor http mini, para que todas as instâncias diferentes possam se comunicar. Suponho que poderia ter usado um soquete, embora não esteja convencido de que teria reduzido a contagem de bytes.
Eu tenho dois arquivos separados
s
emain.py
.s
está com falta de servidor e, como aparece no código, achei que deveria tornar o nome o mais curto possível.API do Communication Web Server
O servidor da Web aceita apenas solicitações POST e responde apenas à entrada dentro do corpo do POST.
Todas as solicitações passam por
/
(oulocalhost/
).Entrada válida:
*
no corpo da postagem solicitará que o servidor retorne um novo ID para atribuir o cliente.-<id>
no corpo da postagem removerá o ID da lista ativa de IDs, diminuindo todos os IDs relevantes e a contagem total.Fechando o programa
Eu implementei o multi-threading, portanto, fechar o programa é tão simples quanto pressionar enter.
Abrindo o programa
Se você não tiver a configuração do Python corretamente dentro de suas variáveis ambientais, basta criar um
.bat
arquivo e colocá-lo na mesma pasta quemain.py
es
com o seguinte código (se você instalou o Python para todos os usuários, ele pode estar em um local diferente):Créditos
De 694 a 691 bytes Adám .
fonte
:8080/
?/
.Ferramentas sh + linux / unix, 128 bytes
se o sono suportar números de ponto flutuante
caso contrário, 159 bytes
ou sleep pode ser substituído por
:
(no-op), mas ativará a espera.fonte
Java 8, (199 + 301 =) 500 bytes
M.jar: (o programa principal)
S.jar: (o servidor para controlar o fluxo do programa)
Explicação do código:
Explicação geral:
Todos os programas manterão um registro de sua própria identificação; o número total de instâncias restantes; se ocorreu uma remoção; e quais programas foram fechados.
O servidor é apenas uma classe de invólucro para iniciar e parar programas. Quando um usuário entra
0
, ele inicia um novo programa. Quando o usado digitar um número inteiro positivo (ou seja2
), fechará o programa com esse ID. (Nota: S.jar possui M.jar como biblioteca para acessá-lo.)Gif para vê-lo em ação:
Pensamentos para jogar ainda mais:
Eu só notei enquanto escrevia a explicação de que eu só uso o
ObservableList
método add / remove-ListChangeListener
e não uso o conteúdo. Remover isso e usar outro tipo de ouvinte estático pode ser mais curto.fonte