Premisa:
Para aquellos en redes, lo más probable es que haya enviado un ping ao desde algún dispositivo para asegurarse de que todo esté conectado correctamente. Cisco, una compañía popular en redes [cita requerida] , tiene un comando para ello en su IOS que se ve así:
Su desafío es recrear gráficamente una parte de esto. Las partes que estamos omitiendo son la primera línea ( Type escape sequence to abort.
) por completo, junto con la dirección IP y los tiempos de ida y vuelta.
Comenzará generando lo siguiente:
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
Luego simulará las solicitudes de eco que salen. Cada solicitud comenzará esperando 2 segundos y luego generará la respuesta. Una respuesta de eco exitosa está representada por a !
, una fallida por .
. En realidad no enviaremos paquetes, pero para representar la pérdida de paquetes, su programa debe elegir aleatoriamente entre las dos opciones con una probabilidad distinta de cero para cada una. Esta línea comenzará vacía y cada marca agregará otro carácter.
Después del quinto eco, se emitirá la línea de porcentaje y el programa debería terminar. La línea de porcentaje tendrá el formato de
Success rate is $p percent ($s/5)
donde $p
está en regex 0|20|40|60|80|100
y $s
es el número de ecos exitosos. La pantalla debe actualizarse después de cada período de espera redibujando el nuevo estado o agregando a la línea de eco existente. Esto incluye la Sending
línea.
Ejemplo de ejecución: (El recuento de ticks no debe mostrarse y está ahí para aclarar cómo debería verse la salida en cada paso de tiempo)
#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:
No se proporcionan datos utilizables.
Salida:
Cualquier formato razonable. Un resultado final de ejemplo se ve así:
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5)
Reglas:
- Debe agregar a la línea de eco o volver a dibujar la pantalla después de cada marca.
!
y.
no tiene que ser igualmente probable, solo ambas posibles.- Las ejecuciones sucesivas deben ser capaces de generar resultados diferentes.
- Los gifs o webms de tu salida serían geniales. Sin embargo, no hay bonificación ni nada por ello.
- Lagunas estándar prohibidas
- Esto es código golf
Respuestas:
C (gcc) , 172 bytes
Entonces, eliminé 6 bytes de esta cosa con un truco bastante ridículo. Compilar con
-DK=!sleep(2)-putchar(rand()%2?33:46)/46
. Depende de lasleep()
función que se defina en las bibliotecas estándar del sistema. No se repite ni se repite.Pruébalo en línea!
Explicación
Esta solución depende de tres detalles críticos de implementación / tiempo de ejecución. Primero,
sleep()
no se debe interrumpir , por ejemplo, mediante una señal. En segundo lugar, las sumas y restas se resuelven en orden de izquierda a derecha. Tercero, los argumentosprintf()
deben resolverse de derecha a izquierda.Con eso fuera del camino, analicemos esto.
El argumento del compilador
Entonces, comenzando desde la izquierda (es decir, como debería resolverse), tenemos
sleep()
.sleep()
devuelve el número de segundos restantes cuando regresa, por lo que esperamos que el usuario (y otros procesos) sean amables y no interrumpan nuestro sueño. Tomamos el complemento lógico, y porque en nuestro casosleep()
siempre regresará0
, el resultado es1
. Más sobre el significado más adelante.A continuación, entramos
putchar()
.putchar()
imprime un solo carácter de 1 byte y devuelve el valor del byte. Entonces, obtenemos un valor aleatorio en el interior, calculamos el módulo-2 para una buena división 50-50 (aunque con una entropía horrible), y luego lo condicionamos ternariamente en nuestros caracteres deseados -! (33)
y. (46)
. Luego dividimos el valor de retorno deputchar()
con46
.Ahora, esa división regresará
0
por!
y1
para.
- entonces tomamos 1 (de!sleep()
) y restamos el resultado de la división de eso. ¡Presto!De acuerdo, hay un pequeño problema. Cuando escribe cosas en un búfer en C (es decir
stdout
), no necesariamente escribe en el extremo receptor inmediatamente. De hecho, cuando estaba ejecutando esto en mi distribución de elección, descubrí que solo imprimiría los pings después de que finalizara el programa. Sin embargo, dado que todas las otras soluciones en C están dejando que eso se deslice, y que probablemente exista al menos una máquina en algún lugar que lo haga y cumpla con todos los demás requisitos previos (y uno siempre podría "arreglarlo" en el núcleo ... .), No voy a meterme con mi puntajefflush()
ingstdout
.fuente
APL (Dyalog Unicode) ,
147138 bytesPruébalo en línea!
Esta es una gran función directa. Al igual que con otras respuestas, el enlace TIO solo se generará una vez completada la ejecución. Dicho esto, @ Adám ha creado una útil función auxiliar para poder visualizar las marcas de tiempo. Esa versión del código se puede encontrar aquí .
Esta respuesta usos
⎕IO←0
, que establece el I ndice O rigin de todo lo que de 1 a 0.Gracias a @ngn por los 9 bytes guardados (¡y por arruinar mi explicación! Ahora tengo que volver a hacerlo
(ლಠ益ಠ)ლ
)Cómo:
La función recibe 1 argumento fijo, que está
⍵
a la derecha.Como
⍵
, tenemos¨1↓¨,\?6⍴2
. Esta expresión elige aleatoriamente (?
) entre 0 y 1 6 veces (6⍴2
crea un vector de 6 elementos de 2). Los resultados se concatenan (,\
) para formar un vector de 6 elementos de 1 a 6 vectores de elementos (por ejemplo:)1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0
. El primer elemento de cada uno se descarta (1↓¨
), y luego cada vector resultante se pasa como⍵
(¨
), ejecutando la función 6 veces.{5=≢⍵⊣...:...}
Es una declaración condicional. Si⍵
tiene 5 elementos (es decir, si es la última iteración), ejecutará el código después de la protección (:
). Esto⊣
asegura que la condición será la última cosa evaluada, por lo que el programa siempre imprimirá la cadena antes de la protección.{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}
crea un vector de dos elementos formado por el vector indexado'.!'[⍵]
, que generará los éxitos y fracasos, y la propia cadena de ping. Ese vector se invierte (monádico⌽
) en el orden correcto, luego se mezcla (monádico↑
) en una matriz. Esa matriz se envía a stdout (⎕←
), y se agrega un D e L ay (⎕DL
). El argumento para⎕DL
es el número de elementos en la matriz (≢
), a saber, 2, creando un retraso de 2 segundos entre las llamadas a funciones.{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}
crea la última cadena que se generará. Sumará los elementos del argumento (+/⍵
) y pasará el resultado como argumento a la función tácita dentro del paréntesis. Esa función antecede primero (diádico,
, seguido de⍨
) el⍕
argumento stringified ( ) con la cadena'/5)'
, luego lo agrega a la cadena'percent ('
. A continuación, agregará la cadena resultante a 20 veces el argumento (×∘20
), y luego la agregará al resto de la salida, que se envía a stdout a través de⎕←
.fuente
⎕DL 2⊣⎕←
... ->⎕DL≢⎕←
...Java (JDK) , 227 bytes
Pruébalo en línea!
El ping en acción
Explicado
fuente
C # (compilador interactivo de Visual C #) , 212 bytes
Pruébalo en línea!
fuente
Random
en línea en lugar de guardarlovar r
. Heres un enlace a mi sugerenciaJavaScript + HTML, 203 + 9 = 212 bytes
Intentalo
Si
new Date
no es lo suficientemente aleatorio, agregue 8 bytes para usarMath.random()
en su lugar (se han realizado otras modificaciones para permitir que se ejecute correctamente en un fragmento):Mostrar fragmento de código
fuente
PowerShell ,
166162158 bytesPruébalo en línea!
Realmente similar a la respuesta de Python a TFeld. El tiempo no funciona en TIO (TIO solo sale al finalizar el programa), pero funciona localmente.
La primera línea es solo una cadena colocada en la tubería. La línea media recorre de
0
a4
, cada iteraciónsleep
por2
segundos, luegowrite-host
con-no
nueva línea. Estamos escribiendo una!
o.
elegidaRandom
y almacenada en$x
. Luego incrementamos$d
según$x
.La última línea es otra cadena (multilínea) colocada en la tubería, con un poco de cálculo en el medio para obtener el porcentaje.
-1 byte gracias a Veskah
-3 bytes gracias a Ciaran_McCarthy
fuente
*20
lugar de/5*100
?Python 3 ,
221220216209208201 bytesPruébalo en línea!
La sincronización no funciona en TIO, pero funciona en la consola. (TIO sale al final de la ejecución)
-7 bytes, gracias a Erik the Outgolfer
fuente
JavaScript,
322268267265 bytesPruébalo en línea!
JavaScript + HTML, 299 bytes
Para cumplir con el requisito de formato de salida
fuente
Limpio , 305 bytes
Pruébalo en línea!
fuente
Perl 6 , 154 bytes
Pruébalo en línea!
fuente
PHP , 161 bytes
Pruébalo en línea!
$ php fakeping.php
fuente
C (gcc) ,
176174 bytesPruébalo en línea!
Guardado 2 bytes gracias a Rogem
Sin golf:
fuente
33
y en46
lugar de'!'
y'.'
, respectivamente.05AB1E , 83 bytes
Pruébalo en línea!
fuente
Befunge-98 (PyFunge) , 164 bytes
Pruébalo en línea!
Desafortunadamente, solo pude probarlo en TIO, donde devuelve todo después de diez segundos, pero debería funcionar como se esperaba.
fuente