Tarefa
Usando qualquer tipo de paralelização, aguarde vários períodos, para um tempo total de sono de pelo menos um minuto (mas menos de um minuto e meio).
O programa / função deve terminar em 10 segundos e retornar (por qualquer meio e em qualquer formato) dois valores: o tempo total decorrido e o tempo total de suspensão executado. Ambos os valores de tempo devem ter uma precisão de pelo menos 0,1 segundos.
Isso é semelhante ao conceito de horas de trabalho: um trabalho que leva 60 horas pode ser concluído em apenas 6 horas se 10 trabalhadores estiverem dividindo o trabalho. Aqui podemos ter 60 segundos de tempo de suspensão, por exemplo, em 10 threads paralelos, exigindo apenas 6 segundos para que todo o trabalho seja concluído.
Exemplo
O programa MyProgram cria 14 threads, cada thread dorme por 5 segundos:
MyProgram
→ [5.016,70.105]
O tempo de execução é maior que 5 segundos e o tempo total de suspensão é maior que 70 segundos devido a sobrecarga.
Respostas:
Dyalog APL,
65272321 bytesOu seja:
Explicação:
⎕DL&¨9/7
: desmonte 9 threads, cada um deles aguardando 7 segundos.⎕DL
retorna a quantidade real de tempo gasto em espera, em segundos, que será o mesmo que seu argumento em alguns milissegundos.⎕TSYNC
: aguarde a conclusão de todos os threads e obtenha o resultado para cada thread.(⌈/,+/)
: retorna o tempo de execução mais longo de um único encadeamento (durante a execução em que todos os outros encadeamentos terminaram, portanto esse é o tempo de execução real), seguido pela soma do tempo de execução de todos os encadeamentos.Experimente online!
fonte
Python 2, 172 bytes
Isso requer um sistema operacional com precisão de tempo maior que 1 segundo para funcionar corretamente (em outras palavras, qualquer sistema operacional moderno). São criados 8 threads que dormem por 9 segundos cada, resultando em um tempo de execução em tempo real de ~ 9 segundos e em um tempo de execução paralelo de ~ 72 segundos.
Embora a documentação oficial diga que o
Thread
construtor deve ser chamado com argumentos de palavra-chave, atento ao vento e uso argumentos posicionais de qualquer maneira. O primeiro argumento (group
) deve serNone
e o segundo argumento é a função de destino.nneonneo apontou nos comentários que atribuir acesso (por exemplo
f.t
) é menor que o acesso ao índice de lista (por exemplot[0]
). Infelizmente, na maioria dos casos, os poucos bytes obtidos com isso seriam perdidos pela necessidade de criar um objeto que permita a criação de atributos definidos pelo usuário em tempo de execução. Felizmente, as funções suportam atributos definidos pelo usuário em tempo de execução, então eu exploro isso economizando o tempo total not
atributo def
.Experimente online
Graças à DenkerAffe por -5 bytes com o
exec
truque.Graças ao kundor por -7 bytes, apontando que o argumento do thread é desnecessário.
Graças a nneonneo por -7 bytes de melhorias diversas.
fonte
f()
, e os dois últimos argumentos paraThread
(assim removendo 7 caracteres) e usandot.append(m()-n)
para evitar a atribuição de uma variável localt
(usando 5 mais personagens do que+=
.)t
comt=[0]
, substitua o anexo port[0]+=m()-n
e substituasum(t)
port[0]
.import threading as H,time as t
; salve mais dois bytes usandoz=H.Thread
emap(z.join,r)
; salvar mais dois bytes por stashing o tempo total como um atributo (por exemploT.z+=m()-n
)Utilitários Bash + GNU, 85
Força o uso do
time
executável em vez do shell incorporado, prefixando com a\
.Anexa a um arquivo
j
, que deve estar vazio ou inexistente no início.fonte
if [ $1 -lt 9 ];then { ./a $(( $1 + 1 )) &};sleep 7;fi
ou algo assim? Isso seria contra as regras, ou algo que eu não estou entendendo sobre as especificações? [editar; Perdi o requisito de saída. Ooh, que o torna interessante]!(($1<9))&&$0 $[$1+1]&sleep 7
Ir - 189 bytes
Obrigado @cat!
Saídas (ms): 160.9939ms, 60001 (160ms para aguardar 60.001 segundos)
fonte
@Rob In some languages the obvious solution is already (close to) the shortest. Besides, one way to view code-golf challenges is finding the shortest solution in EACH language. Otherwise Jelly will win most of the time... So: go ahead.
,, não significa que você não deve tentar dar um tapa na sua resposta, mas que tudo bem se não vencer. Você pode adicionar uma solução de golfe?tot
para algo comoq
.Bash
19611711493 bytesAtualizado para oferecer melhor precisão do tempo, integrando sugestões do @manatwork e do @Digital Trauma, além de algumas outras otimizações de espaço:
Observe que isso pressupõe que o
j
arquivo está ausente no início.fonte
function s
→s()
,b=`date +%s`
→b=$SECONDS
,expr $t + $i
→$[t+i]
,`cat j`
→$(<j)
e geralmente consulte Dicas para jogar golfe no Bash sobre como reduzi-lo a isso: pastebin.com/DDqUaDug5↵5↵5↵…
escrever+5+5+5…
- carregue tudo diretamente na avaliação aritmética e poupe o segundo loop: pastebin.com/LB0BjDMZb=`date +%s`
→b=$SECONDS
.bash
aritmética inteira, toda a solução precisa ser reescrita para usar uma ferramenta externa para cálculo. Normalmentebc
: pastebin.com/eYFEVUuzJavaScript (ES6), 148 bytes
Promete esperar 9 vezes por 7 segundos, durante um total de 63 segundos (na verdade 63,43 quando tento), mas na verdade leva apenas 7,05 segundos em tempo real quando tento.
fonte
C, 127 bytes (gira a CPU)
Essa solução gira a CPU em vez de dormir e conta o tempo usando a
times
função POSIX (que mede o tempo da CPU consumido pelo processo pai e em todos os filhos esperados).Ele realiza 7 processos, que são girados por 9 segundos cada, e imprime os tempos finais nos relógios C (na maioria dos sistemas, 100 tiques = 1 segundo).
Saída de amostra:
ou seja, 9,06 segundos em tempo real e 63,47 segundos no tempo total da CPU.
Para obter melhores resultados, compile com
-std=c90 -m32
(force o código de 32 bits em uma máquina de 64 bits).fonte
PowerShell v4, 144 bytes
Define
$d
igual aGet-Date
e limpa todos os históricos de trabalhos existentesGet-Job | Remove-Job
. Em seguida, fazemos um loop1..20|%{...}
e cada iteração é executadaStart-Job
passando o bloco de scripts{$x=date;sleep 3;((date)-$x).ticks/1e7}
para o trabalho (o que significa que cada trabalho executará esse bloco de script). Canalizamos essa saída para>$null
suprimir o feedback (nome do trabalho, status etc.) que é retornado.O bloco de script define
$x
comoGet-Date
, então,Start-Sleep
por3
segundos, em seguida, recebe uma novaGet-Date
leitura, subtrai$x
, obtém o.Ticks
e divide por1e7
para obter os segundos (com precisão).De volta à thread principal, desde que qualquer trabalho ainda seja
-S
obrigatório"Running"
, giramos dentro de umwhile
loop vazio . Uma vez feito isso,Get-Job
puxamos objetos para todos os trabalhos existentes, canalizamos aqueles para osReceive-Job
quais o equivalente a STDOUT (ou seja, o que eles produzem),-join
os resultados juntos+
, e canalizamosiex
(Invoke-Expression
e semelhante aeval
). Isso produzirá o tempo de suspensão resultante mais a sobrecarga.A linha final é semelhante, na medida em que obtém uma nova data, subtrai o carimbo de data original
$d
, obtém o.Ticks
e divide por1e7
para gerar o tempo total de execução.NB
OK, então isso é um pouco flexível das regras. Aparentemente, na primeira execução, o PowerShell precisa carregar vários assemblies .NET do disco para as várias operações de encadeamento, pois elas não são carregadas com o perfil de shell padrão. Execuções subseqüentes , porque os assemblies já estão na memória, funcionam bem. Se você deixar a janela do shell inativa por tempo suficiente, você fará com que a coleta de lixo interna do PowerShell apareça e descarregue todos esses assemblies, fazendo com que a próxima execução demore muito tempo enquanto ela é carregada novamente. Eu não tenho certeza de uma maneira de contornar isso.
Você pode ver isso nos tempos de execução nas execuções abaixo. Comecei um novo shell, naveguei para o meu diretório de golfe e executei o script. A primeira corrida foi horrenda, mas a segunda (executada imediatamente) funcionou bem. Em seguida, deixei o shell inativo por alguns minutos para permitir a coleta de lixo e, em seguida, essa execução é novamente demorada, mas as execuções subseqüentes novamente funcionam bem.
Execuções de exemplo
fonte
Javascript (ES6),
212203145 bytesEsse código cria 10 imagens com um intervalo de tempo de exatamente 6 segundos cada, após o carregamento.
O tempo de execução vai um pouco acima dele (devido à sobrecarga).
Este código substitui tudo no documento!
Isso pressupõe que você use uma codificação de byte único para os backticks, necessária para o mecanismo Javascript não desarmar.
Como alternativa, se você não quiser esperar 6 segundos, aqui está uma solução de 1 byte a mais que termina em menos de um segundo:
A diferença é que esse código espera 600ms em 100 imagens. Isso dará uma enorme quantidade de sobrecarga.
Versão antiga (203 bytes):
Esse código cria 10 iframes com um intervalo de tempo de exatamente 6 segundos cada, em vez de criar 10 imagens.
Versão original (212 bytes):
fonte
Ruby, 92
fonte
Javascript (ES6),
10892 bytesEstou fazendo uma nova resposta, pois isso usa uma abordagem um pouco diferente.
Ele gera uma quantidade enorme de
setTimeout
s, que são quase todos executados com 4ms entre eles.Cada intervalo é de 610 milissegundos, em um total de 99 intervalos.
Geralmente, é executado em 610ms, para um tempo total de execução de cerca de 60,5 segundos.
Isso foi testado no Google Chrome versão 51.0.2704.84 m, no Windows 8.1 x64.
Versão antiga (108 bytes):
fonte
Scratch - 164 bytes (16 blocos)
Veja em ação aqui .
Usa uma variável chamada 't' e um sprite chamado 's'. O sprite cria clones de si mesmo, cada um deles aguardando 8 segundos, e incrementa uma variável com o tempo inteiro de espera. No final, indica o tempo total de execução e o tempo total de espera (por exemplo
65.488 8.302
).fonte
Clojure,
135120111109 bytesVersão formatada com variáveis nomeadas:
saída (em nanossegundos):
Formato alterado. Obrigado Adám, eu poderia ter perdido essa especificação de formato na pergunta quando a li.
Alterado para nanoTime para habilidades de golfe.
Obrigado, cliffroot, esqueci completamente a notação científica e não acredito que não vi
apply
. Acho que usei isso em algo que jogava golfe ontem, mas nunca postei. Você me salvou 2 bytes.fonte
7e3
em vez de7000
e usarapply
em vez dereduce
Ferrugem,
257, 247 bytesUso os mesmos tempos da resposta Python do Mego.
Realmente, o único bit um pouco inteligente é usar ii para obter uma duração de 0 segundos.
Impressões:
Ungolfed:
Edit: bom velho para loop é um pouco mais curto
fonte
JavaScript (ES6, usando WebWorkers),
233215 bytesUPD: substituiu a maneira como um trabalhador é executado a partir de uma string por um mais compacto e entre navegadores, no aspecto das políticas de origem. Não funcionará no Safari, se ele ainda tiver um
webkitURL
objeto em vez deURL
no IE.fonte
{ "message": "Uncaught SecurityError: Failed to construct 'Worker': Script at 'data:application/javascript,a%3Dnew%20Date()%3BsetTimeout(()%3D%3EpostMessage(new%20Date()-a)%2C5e3)' cannot be accessed from origin 'null'.", "filename": "http://stacksnippets.net/js", "lineno": 13, "colno": 45 }
Python 2, 130 bytes
Esta é uma derivação da resposta de Mego, mas é suficientemente diferente que eu pensei que deveria ser uma resposta separada. Foi testado para funcionar no Windows.
Basicamente, ele obtém 9 threads, que dormem por 7 segundos enquanto o pai dorme por 8 anos. Depois, imprime as horas. Saída de amostra:
No Windows,
time.clock
mede o tempo de parede desde a primeira chamada.fonte
time.clock()
se comporta de maneira diferente entre as plataformas Windows e UNIX / Linux .Perl 6,
7271 bytesPode haver uma maneira mais curta de fazer isso
isso gera
fonte
Mathematica, 109 bytes
Função anônima. Requer uma licença com mais de 7 sub-kernels para executar. Leva 9 segundos em tempo real e 63 segundos em tempo de kernel, sem levar em conta a sobrecarga. Certifique-se de executar apenas as instruções anteriores uma vez (para não tentar reiniciar os kernels). Testando:
fonte
Javascript (ES6), 105 bytes
Versão atualizada: 106 bytes Emprestado do @Ismael Miguel, pois ele teve a ótima idéia de diminuir o tempo de sono e aumentar os intervalos.
Javascript Ungolfed, 167 bytes
fonte
d+=t()-s;if(!c)alert([t()-i,d])
, você pode escreverd+=t()-s;c||alert([t()-i,d])
, o que economizará alguns bytes. Além disso, se você remover a função e reescrever tudo, você pode competir com a minha solução de longo 92-byte:for(c=8,i=(t=Date.now)(d=0);c--;)setTimeout((c,s)=>{d+=t()-s;c||alert([t()-i,d])},8e3,c,t())
. E sim, este também tem 92 bytes.Java,
358 343 337 316313 bytese ungolfed
não tente em casa, pois esta solução não é segura para threads.
Editar:
Peguei as sugestões de @A Boschman e @ Adám, e agora meu programa leva menos de 10 segundos para ser executado, e é mais curto em 15 bytes.
fonte
Thread.
chamadas do método sleep () estático? Além disso, este programa não será encerrado em pouco mais de 10 segundos, desqualificando-o?static long t
. Só mencionei isso porque a especificação diz "Ambos os valores de tempo precisam ter uma precisão de pelo menos 0,1 segundo".long
antes dos
e adicionar,s
aostatic long t,i,s;
para salvar alguns bytes.C (com pthreads),
339336335 bytesfonte
C90 (OpenMP), 131 bytes (+ 17 para a variável env) = 148 bytes
Saída de exemplo:
Notas:
7091 está em ciclos (100 / s), portanto, o programa foi executado por 70 segundos
Poderia ser muito mais curto se eu descobrisse uma maneira de fazer com que um cronômetro funcionasse além de omp_get_wtime (), porque então eu poderia remover a instrução include também.
Execute com OMP_NUM_THREADS = 9
fonte
Lisp comum (SBCL) 166 bytes:
Isso gera threads que dormem e aumentam atomicamente o tempo gasto, com um loop externo que gira esperando que o tempo total seja superior a 60000 ticks (ou seja, 60s no sbcl). O contador é armazenado em uma lista devido a limitações nos tipos de locais que o atomic-incf pode modificar. Isso pode ficar sem espaço antes de terminar em máquinas mais rápidas.
Ungolfed:
fonte
Perl, 101 bytes
Garfo 7 processos filho, cada um dos quais espera 9 segundos.
Saída de amostra:
fonte
Groovy,
158143 caracteresExemplo de execução:
fonte
Elixir, 168 bytes
Exemplo de execução:
A saída é o tempo total esperado, seguido pelo tempo em que o programa foi executado, em microssegundos.
O programa gera 14
Task
segundos e aguarda cada um deles mapeando-os e depois encontra a soma do tempo decorrido. Ele usa o Erlangtimer
para medir o tempo.fonte
Haskell,
278271262246 bytes!
mede o tempo gasto pela açãoa
(segundo argumento) e aplica-seb
(primeiro argumento) ao resultado.w
é a função do sono.main
é medido em si e o resultado é impresso (print!...
).#
éreplicateM
repetir a ação especificada N vezes (e retornart
porque joga golfe).Dentro da peça medida, 9 threads (
replicate 9 $ forkIO ...
) dormem por5^10
milissegundos (9.765625 segundos) e postam o resultado (writeChan
) em um tubo criado pelo thread principal (newChan
), que soma os 9 resultados e imprime o total (getChanContents >>= print . sum . take 9
).Resultado:
fonte
Python 2, 132 bytes
Usa um pool de processos para gerar 9 processos e deixar cada um dormir por 7 segundos.
Imprime o total de sono acumulado primeiro, depois o tempo de execução real:
fonte
Ruby (com
parallel
gema),123116 bytesEdit: Adicionada a referência "Time.now" da resposta Ruby do histocrat.
fonte
Matlab, 75 bytes
Explicação rápida:
parfor
cria um loop for paralelo, distribuído pelo conjunto de trabalhadores.tic
etoc
medir o tempo decorrido (e, na minha opinião, é uma das funções mais bem nomeadas do MATLAB). A última linha (uma matriz com o tempo total gasto e o tempo real decorrido) é gerada, pois não é finalizada com ponto e vírgula.Observe, no entanto, que isso cria 9 processos MATLAB completos. As chances são de que esse programa em particular não seja concluído nos 10 segundos alocados em sua máquina. No entanto, acho que com uma instalação do MATLAB que não possui caixas de ferramentas, exceto a caixa de ferramentas Parallel Computing instalada - instalada em um sistema high-end com SSD - pode ser concluída em 10 segundos. Se necessário, você pode ajustar os parâmetros para que menos processos durmam mais.
fonte
b
provavelmente é apenas porque você já tinha algo em seu espaço de trabalho. Eu não tenho problemas em 2015b usandoparfor q=b