Premissa:
Para quem está em rede, provavelmente enviou um ping de ou para algum dispositivo para garantir que tudo esteja conectado corretamente. A Cisco, uma empresa popular em rede [citação necessário] , possui um comando em seu IOS que se parece com isso:
( Fonte da imagem )
Seu desafio é recriar graficamente uma parte disso. As partes que estamos pulando são a primeira linha ( Type escape sequence to abort.
) inteiramente, junto com o endereço IP e os tempos de ida e volta.
Você começará emitindo o seguinte:
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
Você simulará as solicitações de eco que saem. Cada solicitação começará aguardando 2 segundos e, em seguida, gerando a resposta. Uma resposta de eco bem-sucedida é representada por a !
, uma falha por .
. Na verdade, não enviaremos pacotes, mas para representar a perda de pacotes, seu programa deve escolher aleatoriamente entre as duas opções com uma chance diferente de zero para cada uma. Esta linha começará vazia e cada marca adicionará outro caractere.
Após o quinto eco, a linha de porcentagem será emitida e o programa deverá terminar. A linha de porcentagem estará no formato de
Success rate is $p percent ($s/5)
onde $p
está na regex 0|20|40|60|80|100
e $s
é o número de ecos bem-sucedidos. A tela deve ser atualizada após cada período de espera, redesenhando o novo estado ou anexando à linha de eco existente. Isso inclui a Sending
linha.
Exemplo de execução: (a contagem de marcações não deve ser exibida e existe para esclarecer como deve ser a saída a cada etapa)
#Tick 0
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
#Tick 1
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.
#Tick 2
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!
#Tick 3
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.
#Tick 4
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!
#Tick 5
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!.
Success rate is 40 percent (2/5)
Entrada:
Nenhuma entrada utilizável fornecida.
Resultado:
Qualquer formato razoável. Um exemplo de saída final é assim:
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5)
Regras:
- Você deve anexar à linha de eco ou redesenhar a tela após cada marca.
!
e.
não precisa ser igualmente provável, apenas os dois possíveis.- Execuções sucessivas devem ser capazes de gerar resultados diferentes
- Gifs ou webms da sua saída seriam legais. Nenhum bônus ou qualquer coisa para isso embora.
- Lacunas padrão proibidas
- Isso é código-golfe
Respostas:
C (gcc) , 172 bytes
Então, eu retirei 6 bytes dessa coisa com alguns truques bastante ridículos. Compile com
-DK=!sleep(2)-putchar(rand()%2?33:46)/46
. Depende dasleep()
função que está sendo definida nas bibliotecas padrão do sistema. Não faz loop ou recursão.Experimente online!
Explicação
Essa solução depende de três detalhes críticos de implementação / tempo de execução. Primeiro,
sleep()
não deve ser interrompido , por exemplo, por um sinal. Segundo, as adições e subtrações sendo resolvidas da esquerda para a direita. Terceiro, os argumentos aprintf()
serem resolvidos da direita para a esquerda.Com isso fora do caminho, vamos resolver isso.
O argumento do compilador
Então, a partir da esquerda (ou seja, como deveria resolver), temos
sleep()
.sleep()
retorna o número de segundos restantes quando retorna, portanto esperamos que o usuário (e outros processos) seja gentil e não interrompa o sono. Tomamos o complemento lógico e, como no nosso casosleep()
sempre retornará0
, o resultado é1
. Mais sobre o significado mais tarde.Em seguida, entramos
putchar()
.putchar()
imprime um único caractere de 1 byte e retorna o valor do byte. Portanto, obtemos um valor aleatório interno, calculamos o módulo-2 para uma boa divisão de 50-50 (embora com entropia horrível) e depois o condicionamos para os caracteres desejados -! (33)
e. (46)
. Depois, dividimos o valor de retorno deputchar()
com46
.Agora, essa divisão retornará
0
para!
e1
para.
- então pegamos 1 (de!sleep()
) e subtraímos o resultado da divisão disso. Presto!Ok, há um pequeno problema. Quando você escreve coisas em um buffer em C (ou seja
stdout
), ele não necessariamente grava imediatamente no destinatário. De fato, quando eu estava executando isso na minha distribuição preferida, descobri que ele só imprimia os pings após o término do programa. No entanto, considerando que todas as outras soluções em C estão deixando de funcionar, e que provavelmente existe pelo menos uma máquina por aí em algum lugar, faz isso e cumpre todos os outros pré-requisitos (e sempre é possível "consertar" isso no kernel). .), Não vou mexer na minha pontuação aofflush()
ingstdout
.fonte
APL (Dyalog Unicode) ,
147138 bytesExperimente online!
Esta é uma grande função direta. Como em outras respostas, o link TIO será emitido somente após a conclusão da execução. Dito isto, o @ Adám criou uma função auxiliar útil para que os carimbos de data e hora possam ser visualizados. Essa versão do código pode ser encontrada aqui .
Esta resposta usos
⎕IO←0
, que define a I NDEX O Rigin de tudo 1-0.Obrigado a @ngn pelos 9 bytes salvos (e por estragar minha explicação! Agora eu tenho que fazê-lo novamente
(ლಠ益ಠ)ლ
)Quão:
A função recebe 1 argumento fixo, que está
⍵
à direita.Como
⍵
nós temos¨1↓¨,\?6⍴2
. Essa expressão escolhe aleatoriamente (?
) entre 0 e 1 6 vezes (6⍴2
cria um vetor de 6 elementos de 2's). Os resultados são concatenados (,\
) para formar um vetor de 6 elementos de 1 a 6 vetores de elementos (por exemplo1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0
:). O primeiro elemento de cada um é descartado (1↓¨
) e, em seguida, cada vetor resultante é passado como⍵
(¨
), executando a função 6 vezes.{5=≢⍵⊣...:...}
é uma declaração condicional. Se⍵
tiver 5 elementos (também conhecido como a última iteração), ele executará o código após o guard (:
). Como⊣
garante que a condição será a última coisa avaliada, o programa sempre imprimirá a corda antes da guarda.{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}
cria um vetor de dois elementos formado pelo vetor indexado'.!'[⍵]
, que produzirá os sucessos e falhas e a própria sequência de ping. Esse vetor é então revertido (monádico⌽
) para a ordem correta e depois misturado (monádico↑
) em uma matriz. Essa matriz é então enviada para stdout (⎕←
) e um D e L ay (⎕DL
) é adicionado. O argumento para⎕DL
é o número de elementos na matriz (≢
), ou seja, 2, criando um atraso de 2 segundos entre as chamadas de função.{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}
cria a última string a ser impressa. Ele somará os elementos do argumento (+/⍵
) e passará o resultado como argumento para a função tácita entre parênteses. Essa função primeiro anexa (diádico,
, seguido por⍨
) o⍕
argumento stringified ( ) à string e'/5)'
, em seguida, anexa à string'percent ('
. Em seguida, anexará a string resultante a 20 vezes o argumento (×∘20
) e, em seguida, anexará ao restante da saída, que será enviada ao stdout via⎕←
.fonte
⎕DL 2⊣⎕←
... ->⎕DL≢⎕←
...Java (JDK) , 227 bytes
Experimente online!
O ping em ação
Explicado
fonte
C # (compilador interativo do Visual C #) , 212 bytes
Experimente online!
fonte
Random
em linha, em vez de salvá-lovar r
. Heres um link para o meu suggestestionJavaScript + HTML, 203 + 9 = 212 bytes
Tente
Se
new Date
não for aleatório o suficiente, adicione 8 bytes para usarMath.random()
(algumas outras modificações foram feitas para permitir que ele seja executado corretamente em um snippet):Mostrar snippet de código
fonte
PowerShell ,
166162158 bytesExperimente online!
Muito parecido com a resposta do Python ao TFeld. O tempo não funciona no TIO (o TIO apenas sai na conclusão do programa), mas funciona localmente.
A primeira linha é apenas uma string colocada no pipeline. A linha do meio faz um loop de
0
para4
, cada iteraçãosleep
por2
segundos e depoiswrite-host
com-no
nova linha. Estamos escrevendo um!
ou.
escolhidoRandom
e armazenado$x
. Em seguida, incrementamos com$d
base em$x
.A última linha é outra string (multilinha) colocada no pipeline, com um pouco de cálculo no meio para chegar à porcentagem.
-1 byte graças a Veskah
-3 bytes graças a Ciaran_McCarthy
fonte
*20
vez de/5*100
?Python 3 ,
221220216209208201 bytesExperimente online!
O tempo não funciona no TIO, mas funciona no console. (TIO sai no final da execução)
-7 bytes, graças a Erik the Outgolfer
fonte
JavaScript,
322268267265 bytesExperimente online!
JavaScript + HTML, 299 bytes
Para atender aos requisitos de formatação de saída
fonte
Limpo , 305 bytes
Experimente online!
fonte
Perl 6 , 154 bytes
Experimente online!
fonte
PHP , 161 bytes
Experimente online!
$ php fakeping.php
fonte
C (gcc) ,
176174 bytesExperimente online!
Economizou 2 bytes graças ao Rogem
Ungolfed:
fonte
33
e em46
vez de'!'
e'.'
, respectivamente.05AB1E , 83 bytes
Experimente online!
fonte
Befunge-98 (PyFunge) , 164 bytes
Experimente online!
Infelizmente, só pude testá-lo no TIO, onde ele retorna tudo após dez segundos, mas deve funcionar conforme o esperado.
fonte