Tâche
En utilisant n'importe quel type de parallélisation, attendez plusieurs périodes, pour une durée totale de sommeil d'au moins une minute (mais inférieure à une minute et demie).
Le programme / la fonction doit se terminer dans les 10 secondes et renvoyer (par n'importe quel moyen et dans n'importe quel format) deux valeurs: le temps total écoulé et le temps total de sommeil exécuté. Les deux valeurs de temps doivent avoir une précision d'au moins 0,1 seconde.
Ceci est similaire au concept d' heures de travail : un travail de 60 heures peut être achevé en seulement 6 heures si 10 travailleurs se séparent. Ici, nous pouvons disposer de 60 secondes de temps de repos, par exemple dans 10 threads parallèles, ne nécessitant que 6 secondes pour que le travail complet soit terminé.
Exemple
Le programme MyProgram crée 14 threads, chaque thread dort pendant 5 secondes:
MyProgram
→ [5.016,70.105]
Le temps d'exécution est supérieur à 5 secondes et le temps total de veille est supérieur à 70 secondes en raison de la surcharge.
Réponses:
Dyalog APL,
65272321 octetsC'est à dire:
Explication:
⎕DL&¨9/7
: essore 9 fils, chacun attend 7 secondes.⎕DL
renvoie le temps réel passé en attente, en secondes, qui sera identique à son argument donner ou prendre quelques millisecondes.⎕TSYNC
: attendez que tous les threads soient terminés et obtenez le résultat pour chaque thread.(⌈/,+/)
: renvoie le temps d'exécution le plus long d'un seul thread (pendant l'exécution de tous les autres threads, il s'agit donc du temps d'exécution réel), suivi de la somme du temps d'exécution de tous les threads.Essayez-le en ligne!
la source
Python 2, 172 octets
Cela nécessite un système d'exploitation avec une précision temporelle supérieure à 1 seconde pour fonctionner correctement (en d'autres termes, tout système d'exploitation moderne). On crée 8 threads qui dorment chacun pendant 9 secondes, ce qui donne un temps d'exécution en temps réel d'environ 9 secondes et un temps d'exécution parallèle d'environ 72 secondes.
Bien que la documentation officielle indique que le
Thread
constructeur devrait être appelé avec des arguments de mot-clé, je jette la prudence au vent et utilise quand même des arguments de position. Le premier argument (group
) doit êtreNone
, et le deuxième argument est la fonction cible.Nneonneo a souligné dans les commentaires que l'attribut access (eg
f.t
) est plus court que l'accès list index (egt[0]
). Malheureusement, dans la plupart des cas, les quelques octets générés par cette opération seraient perdus s'il était nécessaire de créer un objet permettant de créer des attributs définis par l'utilisateur au moment de l'exécution. Heureusement, les fonctions supportent les attributs définis par l'utilisateur au moment de l'exécution. Je l'exploite donc en enregistrant le temps total dans l't
attribut def
.Essayez-le en ligne
Merci à DenkerAffe pour -5 octets avec le
exec
truc.Merci à kundor pour -7 octets en soulignant que l'argument du fil n'est pas nécessaire.
Merci à nneonneo pour -7 octets de diverses améliorations.
la source
f()
et les deux derniers argumentsThread
(en supprimant ainsi 7 caractères) et en utilisantt.append(m()-n)
pour éviter d'attribuer une variable localet
(avec 5 caractères de plus que+=
.)t
avect=[0]
, remplacer l'ajout part[0]+=m()-n
, et remplacersum(t)
part[0]
.import threading as H,time as t
; enregistrer deux autres octets en utilisantz=H.Thread
etmap(z.join,r)
; économiser deux autres octets en stockant la durée totale sous forme d'attribut (par exempleT.z+=m()-n
)Utilitaires Bash + GNU, 85
Force l'utilisation de l'
time
exécutable au lieu du shell intégré en préfixant avec un\
.S'ajoute à un fichier
j
qui doit être vide ou inexistant au début.la source
if [ $1 -lt 9 ];then { ./a $(( $1 + 1 )) &};sleep 7;fi
ou quelque chose? Cela irait-il à l'encontre des règles ou de quelque chose que je ne comprends pas au sujet de la spécification? [modifier; J'ai raté l'exigence de sortie. Ooh, ça le rend intéressant!](($1<9))&&$0 $[$1+1]&sleep 7
Go - 189 octets
Merci @cat!
Sorties (ms): 160.9939ms, 60001 (160ms à attendre 60.001 secondes)
la source
@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.
ne signifie pas que vous ne devriez pas essayer de jouer au golf avec votre réponse, mais que ce n’est pas grave si elle ne gagne pas. Pouvez-vous s'il vous plaît ajouter une solution de golf?tot
pour quelque chose commeq
.Bash
19611711493 octetsMise à jour pour permettre une meilleure précision temporelle en intégrant les suggestions de @manatwork et de @Digital Trauma, ainsi que quelques autres optimisations d'espace:
Notez que cela suppose que le
j
fichier est absent au début.la source
function s
→s()
,b=`date +%s`
→b=$SECONDS
,expr $t + $i
→$[t+i]
,`cat j`
→$(<j)
et voyez généralement des astuces pour jouer au golf à Bash sur la façon de le réduire à ceci: pastebin.com/DDqUaDug5↵5↵5↵…
écrire+5+5+5…
- chargez le tout directement dans l'évaluation arithmétique et épargnez la deuxième boucle: pastebin.com/LB0BjDMZb=`date +%s`
→b=$SECONDS
suggestion.bash
arithmétique entière, la solution entière doit être réécrite pour utiliser un outil externe de calcul. Typiquementbc
: pastebin.com/eYFEVUuzJavaScript (ES6), 148 octets
Promet d'attendre 9 fois pendant 7 secondes pour un total de 63 secondes (en fait 63,43 lorsque j'essaie), mais ne prend en réalité que 7,05 secondes de temps réel lorsque j'essaie.
la source
C, 127 octets (tourne le processeur)
Cette solution permet au processeur de tourner au lieu de s’endormir et de comptabiliser le temps à l’aide de la
times
fonction POSIX (qui mesure le temps de traitement consommé par le processus parent et dans tous les enfants en attente).Il supprime 7 processus qui tournent chacun pendant 9 secondes et imprime les temps finaux en horloge C (sur la plupart des systèmes, 100 signaux d'horloge = 1 seconde).
Exemple de sortie:
ce qui signifie 9,06 secondes en temps réel et 63,47 secondes de temps CPU total.
Pour de meilleurs résultats, compilez avec
-std=c90 -m32
(forcez du code 32 bits sur une machine 64 bits).la source
PowerShell v4, 144 octets
Définit
$d
égal àGet-Date
, et efface tous les historiques de travaux existants avecGet-Job | Remove-Job
. Nous effectuons ensuite une boucle1..20|%{...}
et chaque exécution exécute en luiStart-Job
passant le bloc de script{$x=date;sleep 3;((date)-$x).ticks/1e7}
pour le travail (ce qui signifie que chaque travail exécutera ce bloc de script). Nous dirigeons cette sortie vers>$null
afin de supprimer le retour (c.-à-d. Nom du travail, statut, etc.) qui est renvoyé.Le bloc de script se met
$x
àGet-Date
, puisStart-Sleep
pendant des3
secondes, puis effectue une nouvelleGet-Date
lecture, soustrait$x
, obtient le.Ticks
, et divise par1e7
pour obtenir les secondes (avec précision).De retour dans le thread principal, tant que tout travail est toujours
-S
actif"Running"
, nous tournons à l' intérieur d'unewhile
boucle vide . Une fois que cela est fait, nous devonsGet-Job
extraire des objets pour tous les travaux existants, diriger ceux versReceive-Job
lesquels sera extrait l'équivalent de STDOUT (c.-à-d. Ce qu'ils produisent),-join
les résultats ainsi que+
, et diriger versiex
(Invoke-Expression
et similaireeval
). Cela produira le temps de sommeil résultant plus les frais généraux.La dernière ligne est similaire, en ce sens qu'elle obtient une nouvelle date, soustrait l'estampille de date d'origine
$d
, récupère le.Ticks
et divise par1e7
pour afficher le temps total d'exécution.NB
OK, donc c'est un peu flou des règles. Apparemment, lors de la première exécution, PowerShell doit charger un groupe d'assemblys .NET à partir du disque pour les différentes opérations de thread, car ils ne sont pas chargés avec le profil de shell par défaut. Les exécutions ultérieures , car les assemblys sont déjà en mémoire, fonctionnent correctement. Si vous laissez la fenêtre du shell inactive suffisamment longtemps, vous obtiendrez la récupération de place intégrée de PowerShell et déchargerez tous ces assemblages, ce qui retardera l'exécution de la prochaine exécution. Je ne suis pas sûr d'un moyen de contourner cela.
Vous pouvez le voir dans les temps d'exécution dans les exécutions ci-dessous. J'ai commencé un nouveau shell, j'ai navigué dans mon répertoire de golf et exécuté le script. La première manche a été horrible, mais la seconde (exécutée immédiatement) a bien fonctionné. J'ai ensuite laissé le shell inactif pendant quelques minutes pour permettre à la récupération de place de se faire, puis l'exécution est à nouveau longue, mais les exécutions suivantes fonctionnent à nouveau correctement.
Exemple fonctionne
la source
Javascript (ES6),
212203145 octetsCe code crée 10 images avec un intervalle de temps d’exactement 6 secondes lors du chargement.
Le temps d'exécution passe un peu au dessus (à cause des frais généraux).
Ce code écrase tout dans le document!
Cela suppose que vous utilisiez un codage sur un octet pour les backticks, ce qui est nécessaire pour que le moteur Javascript ne se déclenche pas.
Alternativement, si vous ne voulez pas attendre 6 secondes, voici une solution plus longue d'un octet qui se termine en moins d'une seconde:
La différence est que ce code attend 600 ms sur 100 images. Cela donnera une quantité énorme de frais généraux.
Ancienne version (203 octets):
Ce code crée 10 iframes avec un intervalle de temps de 6 secondes chacun au lieu de créer 10 images.
Version originale (212 octets):
la source
Ruby, 92
la source
Javascript (ES6),
10892 octetsJe fais une nouvelle réponse car elle utilise une approche légèrement différente.
Il génère une quantité massive de
setTimeout
s, qui sont presque tous exécutés à 4 ms les uns des autres.Chaque intervalle est de 610 millisecondes, sur un total de 99 intervalles.
Il s'exécute généralement dans un délai de 610 ms, pour un temps total d'exécution d'environ 60,5 secondes.
Cela a été testé sur Google Chrome version 51.0.2704.84 m, sur Windows 8.1 x64.
Ancienne version (108 octets):
la source
Scratch - 164 octets (16 blocs)
Voir en action ici .
Utilise une variable appelée 't' et un sprite appelé 's'. Le sprite crée des clones de lui-même, qui attendent chacun 8 secondes, et incrémente une variable chronométrant tout le temps d'attente. À la fin, il indique le temps total d'exécution et le temps total d'attente (par exemple,
65.488 8.302
).la source
Clojure,
135120111109 octetsVersion formatée avec des variables nommées:
sortie (en nanosecondes):
Format modifié. Merci Adám, j'ai peut-être manqué cette spécification de format dans la question lorsque je l'ai lue.
Changé en nanoTime pour les capacités de golf.
Merci cliffroot, j'ai totalement oublié la notation scientifique et n'arrive pas à croire que je n'ai pas vu
apply
. Je pense que je l'ai utilisé dans quelque chose que je golfais hier mais que je n'ai jamais posté. Tu m'as sauvé 2 octets.la source
7e3
au lieu de7000
et utiliserapply
au lieu dereduce
Rouille,
257, 247 octetsJ'utilise les mêmes temps que la réponse Python de Mego.
Vraiment le seul bit légèrement intelligent utilise ii pour obtenir une durée de 0 secondes.
Impressions:
Ungolfed:
Edit: bon vieux pour la boucle est un peu plus courte
la source
JavaScript (ES6, utilisant WebWorkers),
233215 octetsUPD: a remplacé la façon dont un opérateur est exécuté à partir d'une chaîne par une chaîne plus compacte et multi-navigateurs, sous l'aspect de stratégies d'origine croisée. Ne fonctionnera pas dans Safari s'il a toujours un
webkitURL
objet à la place deURL
et dans IE.la source
{ "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 octets
Ceci est une dérivation de la réponse de Mego, mais elle est suffisamment différente pour que je pense que cela devrait être une réponse séparée. Il a été testé pour fonctionner sous Windows.
En gros, il supprime 9 threads, qui dorment pendant 7 secondes, tandis que le parent dort pendant 8 heures. Il affiche ensuite les heures. Exemple de sortie:
Sous Windows,
time.clock
mesure le temps écoulé depuis le premier appel.la source
time.clock()
se comporte différemment entre les plates-formes Windows et UNIX / Linux .Perl 6,
7271 octetsIl pourrait y avoir un moyen plus court de le faire
cette sortie
la source
Mathematica, 109 octets
Fonction anonyme. Nécessite une licence avec 7+ sous-noyaux à exécuter. Cela prend 9 secondes en temps réel et 63 secondes au noyau, sans tenir compte des frais généraux. Assurez-vous de n'exécuter qu'une seule fois les instructions précédentes (afin d'éviter de relancer les noyaux). Essai:
la source
Javascript (ES6), 105 octets
Version mise à jour: 106 octets Emprunté à @Ismael Miguel, qui a eu la bonne idée de réduire le temps de sommeil et de relever les intervalles.
Javascript non codé, 167 octets
la source
d+=t()-s;if(!c)alert([t()-i,d])
, vous pouvez écrired+=t()-s;c||alert([t()-i,d])
, ce qui économisera quelques octets. En outre, si vous supprimez la fonction et réécrire tout, vous pouvez rivaliser avec ma solution à long 92 octets:for(c=8,i=(t=Date.now)(d=0);c--;)setTimeout((c,s)=>{d+=t()-s;c||alert([t()-i,d])},8e3,c,t())
. Et oui, celui-ci fait également 92 octets de long.Java,
358 343 337 316313 octetset ungolfed
veuillez ne pas l'essayer chez vous, car cette solution n'est pas thread-safe.
Modifier:
J'ai pris en compte les suggestions de @A Boschman et de @ Adam, et maintenant, mon programme nécessite moins de 10 secondes pour s'exécuter et il est plus court de 15 octets.
la source
Thread.
appels à la méthode statique sleep ()? En outre, ce programme ne se terminera-t-il pas en un peu plus de 10 secondes, le disqualifiant?static long t
. Je mentionne cela uniquement parce que la spécification indique que "les deux valeurs de temps doivent avoir une précision d'au moins 0,1 seconde".long
avants
et ajouter,s
àstatic long t,i,s;
pour sauvegarder quelques octets.C (avec pthreads),
339336335 octetsla source
C90 (OpenMP), 131 octets (+ 17 pour la variable env) = 148 octets
Exemple de sortie:
Remarques:
7091 est en cycles (100 / sec), donc le programme a duré 70 secondes
Cela pourrait être beaucoup plus court si je trouvais un moyen de faire fonctionner un minuteur autre que omp_get_wtime (), car je pourrais alors supprimer l'instruction include également.
Exécuter avec OMP_NUM_THREADS = 9
la source
Common Lisp (SBCL) 166 octets:
Cela génère simplement des threads qui dorment puis incrémente le temps pris de manière atomique, avec une boucle externe qui tourne en attendant que le temps total dépasse 60000 ticks (c'est-à-dire 60s sur sbcl). Le compteur est stocké dans une liste en raison de limitations relatives aux types d’endroits que atomic-incf peut modifier. Cela peut manquer d'espace avant de se terminer sur des machines plus rapides.
Ungolfed:
la source
Perl, 101 octets
Forks 7 processus enfants, chacun attendant 9 secondes.
Exemple de sortie:
la source
Groovy,
158143 caractèresÉchantillon échantillon:
la source
Elixir, 168 octets
Échantillon échantillon:
La sortie correspond au temps total d'attente suivi du temps d'exécution du programme, en microsecondes.
Le programme génère 14 secondes
Task
et attend chacune d’elles en les cartographiant, puis trouve la somme de leur temps écoulé. Il utilise Erlangtimer
pour mesurer le temps.la source
Haskell,
278271262246 octets!
mesure le temps pris par l'actiona
(deuxième argument) et appliqueb
(premier argument) au résultat.w
est la fonction de sommeil.main
est mesurée elle-même et le résultat est imprimé (print!...
).#
estreplicateM
, répéter l'action donnée N fois (et revenirt
parce que jouer au golf).À l'intérieur de la pièce mesurée, 9 threads (
replicate 9 $ forkIO ...
) dorment pendant quelques5^10
millisecondes (9,765625 secondes) et enregistrent le résultat (writeChan
) sur un tuyau créé par le thread principal (newChan
), qui totalise les 9 résultats et affiche le total (getChanContents >>= print . sum . take 9
).Sortie:
la source
Python 2, 132 octets
Utilise un pool de processus pour générer 9 processus et laisser chacun en veille pendant 7 secondes.
Affiche le temps de sommeil total accumulé en premier, puis le temps d’exécution réel:
la source
Ruby (avec
parallel
gemme),123116 octetsEdit: Ajout de la référence "Time.now" à partir de la réponse Ruby de histocrat.
la source
Matlab, 75 octets
Explication rapide:
parfor
crée une boucle parallèle parallèle, répartie sur le pool de travailleurs.tic
ettoc
mesurez le temps écoulé (et sont à mon avis l’une des fonctions les mieux nommées de MATLAB). La dernière ligne (un tableau avec le temps total écoulé et le temps réel écoulé) est sortie car elle ne se termine pas par un point-virgule.Notez cependant que cela crée un total de 9 processus MATLAB à part entière. Il est donc probable que ce programme ne se termine pas dans les 10 secondes allouées sur votre ordinateur. Cependant, je pense qu’avec une installation MATLAB qui n’a pas de boîte à outils, à l’exception de la boîte à outils de Parallel Computing installée - installée sur un système haut de gamme avec SSD -, elle ne peut que terminer dans les 10 secondes. Si nécessaire, vous pouvez modifier les paramètres pour que moins de processus dorment davantage.
la source
b
est probablement parce que vous avez déjà quelque chose dans votre espace de travail. Je n'ai pas de problèmes sur 2015b en utilisantparfor q=b