PowerShell v4, 144 bytes
$d=date;gjb|rjb
1..20|%{sajb{$x=date;sleep 3;((date)-$x).Ticks/1e7}>$null}
while(gjb -s "Running"){}(gjb|rcjb)-join'+'|iex
((date)-$d).Ticks/1e7
Establece $d
igual a Get-Date
, y borra cualquier historial de trabajo existente con Get-Job | Remove-Job
. Luego realizamos un ciclo 1..20|%{...}
y cada iteración se ejecuta Start-Job
pasándole el bloque de script {$x=date;sleep 3;((date)-$x).ticks/1e7}
para el trabajo (lo que significa que cada trabajo ejecutará ese bloque de script). Canalizamos esa salida para >$null
suprimir la retroalimentación (es decir, nombre del trabajo, estado, etc.) que se devuelve.
El bloque de secuencia de comandos se establece $x
en Get-Date
, luego Start-Sleep
durante 3
segundos, luego toma una nueva Get-Date
lectura, resta $x
, obtiene el .Ticks
y divide por 1e7
para obtener los segundos (con precisión).
De vuelta en el hilo principal, siempre y cuando cualquier trabajo siga siendo -S
tatus "Running"
, giramos dentro de un while
bucle vacío . Una vez hecho esto, debemos Get-Job
extraer los objetos para todos los trabajos existentes, canalizar aquellos a los Receive-Job
que extraerá el equivalente de STDOUT (es decir, lo que generan), -join
los resultados junto con +
, y canalizarlo a iex
( Invoke-Expression
y similar a eval
). Esto generará el tiempo de suspensión resultante más los gastos generales.
La línea final es similar, ya que obtiene una nueva fecha, resta el sello de fecha original $d
, obtiene el .Ticks
y divide por 1e7
para generar el tiempo total de ejecución.
nótese bien
Bien, esto es un poco incómodo con las reglas. Aparentemente, en la primera ejecución, PowerShell necesita cargar un conjunto de ensamblados .NET desde el disco para las diversas operaciones de subproceso, ya que no se cargan con el perfil de shell predeterminado. Las ejecuciones posteriores , debido a que los ensamblados ya están en la memoria, funcionan bien. Si deja la ventana de shell inactiva el tiempo suficiente, obtendrá la recolección de basura incorporada de PowerShell y descargará todos esos ensamblajes, lo que hará que la próxima ejecución tarde mucho tiempo ya que los vuelve a cargar. No estoy seguro de una forma de evitar esto.
Puede ver esto en los tiempos de ejecución en las siguientes ejecuciones. Comencé un nuevo shell, navegué a mi directorio de golf y ejecuté el script. La primera ejecución fue horrenda, pero la segunda (ejecutada inmediatamente) funcionó bien. Luego dejé el shell inactivo durante unos minutos para dejar pasar la recolección de basura, y luego esa ejecución es nuevamente larga, pero las ejecuciones posteriores nuevamente funcionan bien.
Ejecuciones de ejemplo
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.
PS H:\> c:
PS C:\> cd C:\Tools\Scripts\golfing
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
63.232359
67.8403415
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.0809705
8.8991164
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
62.5791712
67.3228933
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.1303589
8.5939405
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.3210352
8.6386886
PS C:\Tools\Scripts\golfing>