Sleep Sort est un algorithme de tri de nombres entiers que j'ai trouvé sur Internet. Il ouvre un flux de sortie et, pour chaque numéro d'entrée en parallèle, retarde le nombre de secondes et génère ce nombre. En raison des retards, le nombre le plus élevé sera affiché en dernier. J’estime qu’il a O (n + m), où n est le nombre d’éléments et m le nombre le plus élevé.
Voici le code original dans Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Voici le pseudocode
sleepsort(xs)
output = []
fork
for parallel x in xs:
sleep for x seconds
append x to output
wait until length(output) == length(xs)
return output
Votre tâche consiste à implémenter Sleep Sleep en tant que fonction dans le langage de programmation de votre choix. Vous pouvez négliger les facteurs de concurrence tels que les conditions de concurrence et ne jamais verrouiller les ressources partagées. Le code le plus court gagne. La définition de la fonction compte pour la longueur du code.
La liste de saisie est limitée à des entiers non négatifs uniquement, et la longueur de la liste de saisie devrait être raisonnablement longue (testez au moins 10 nombres), de sorte que des conditions de concurrence ne se produisent jamais. et en supposant que les conditions de course ne se produisent jamais.
Réponses:
Une sorte de tentative boiteuse de Perl ,
5955523832 caractères :map{fork||exit print sleep$_}@a
Barebones: 25 personnages:
... si les résultats de tri comme sortie ne vous dérangent pas:
map{fork||die sleep$_}@a
Avec tous les accompagnements:
(pour une conformité maximale des défis, 44 caractères)
sub t{map{fork||exit print sleep$_}@_;wait}
Si vous laissez perl faire l'attente, 39 caractères:
sub t{map{fork||exit print sleep$_}@_}
Et encore une fois, si cela ne vous dérange pas
die()
, 32 personnages ...sub t{map{fork||die sleep$_}@_}
Notez que dans Perl 6, ou lorsque la fonction 'say' est déclarée, il est possible de remplacer la
print
fonction parsay
, en sauvegardant un caractère dans chaque instance. Évidemment, puisque lesdie
deux terminent le processus forké et écrivent la sortie, cela reste la solution la plus courte.la source
perl-E
à activer les fonctionnalités de la versionsay
(fork&&die sleep$_)for@a
travaille aussiC , 127 caractères, une solution plutôt évidente:
(Compilé avec
gcc -std=c99 -fopenmp sort.c
et en ignorant tous les avertissements.)la source
for(;c>=0;--c){int x=atoi(v[c]);
. Je ne sais pas si c'est autorisé.Ruby 1.9, 32 caractères
En tant que fonction:
Si nous pouvons simplement utiliser une variable prédéfinie, elle se réduit à 25 caractères:
la source
Thread.new{p sleep i}
pour imprimer le résultat.JavaScript , 65 caractères (selon que vous utilisez
console.log
ou autre chose pour afficher le résultat)Cela suppose qu'il
a
s'agit d'un tableau d'entiers non négatifs et quimap()
existe sur le prototype de tableau (JavaScript 1.6+).la source
1e3
place.alert
est la sortie bloquante deprompt
JavaScript, l'entrée bloquante deconfirm
JavaScript et l'entrée binaire bloquante de JavaScript. Si JS devait être écrit sur la ligne de commande, ce seraient les appels que vous utiliseriez.APL (
1513)Ce qu'il fait:
la source
⎕DL
fonction qui est en veille.Quatre essais à Erlang:
Sortie sur la console, ont pris la liberté de le faire chacun
9ms * Number
puisque c'est assez pour le faire fonctionner (testé sur une carte intégrée Atom = lente):Nécessite 60 caractères
La sortie vers la console est totalement un-Erlangish, nous envoyons donc un message à traiter
P
:Nécessite 55 caractères
L'envoi après un délai peut également être effectué différemment (cela fonctionne même avec
1ms * Number
):Nécessite 41 caractères
En fait, c'est un peu injuste car la fonction intégrée
send_after
est un retardataire et nécessite leerlang:
préfixe d' espace de nom , si on considère cet espace de nom importé (effectué au niveau du module):Nécessite 34 caractères
la source
C # - 137 caractères
Voici une réponse en C # (mise à jour avec des degrés de parallélisme commentés)
la source
WithDegreeOfParallelism
pour que cela fonctionne, de la même manière que dans lenum_threads
code OpenMP C.void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
Python - 81
93148150153Tweaking le code de BiggAl, puisque c'est le jeu auquel nous jouons ....
... ou 97
175avec départ différé du filPrend la saisie via la ligne de commande
Comme avec beaucoup de golfs python, il arrive un moment où le code est suffisamment compact pour que les variables qui aliasent pour raccourcir les noms n'enregistrent même pas les caractères.
Celui-ci est génial, car il alias sys et en enfilant BOTH en tant que t, donc sys.argv devient t.argv. Plus court que de foo import *, et une économie nette de caractère! Cependant, je suppose que Guido ne serait pas content ...
Note pour apprendre par vous-même et arrêter de jouer au python.La vache sainte est plus courte que la solution C!la source
daemon
ne nécessite pas de paramétrage à moins que vous ne commenciez ceci en tant que démon, et il est plus court d'utiliser des arguments de positionnement, en particulier. si vous aliasNone
deN
j
semble finir par êtreFalse
un effet secondaire d'essayer de faire trop dans une ligne?as t,s
, puis à utilisers
poursys
print
fonction au lieu desys.stdout.write
?Pour le plaisir, voici une version ColdFusion (8+) ;-) Elle compte 109 caractères, sans compter les retours à la ligne et les indentations que j'ai ajoutés pour la lisibilité ici.
Cela suppose que
<cfoutput>
c'est en vigueur. Quelques caractères pourraient être sauvegardés en écrivant le tout sur une seule ligne.la source
Java (aka ne gagne jamais à codegolf):
234211187 caractèresungolfed:
la source
throws Throwable
et supprimer l’catch
article.Long.parseLong
parLong.valueOf
.public
etfinal
peut être enlevé;class M{public static void main
peut êtreinterface M{static void main
(Java 8+);Long.parseLong(a)
peut êtrenew Long(a)
(résultant en 165 octets )Javascript - 52 caractères
la source
Scala -
4240 caractères (cas particulier)Si vous avez un pool de threads au moins égal à la taille du nombre d'éléments de la liste:
Scala - 72 caractères (général)
la source
{}
lorsque vous restez sur une seule ligne.{}
une déclaration , mais vous en avez toujours besoin pour regrouper les éléments séparés par;
une ligne ou non. Et vous pouvez écrire des instructions sur plusieurs lignes sans,{}
dans certains cas (if / else par exemple).()
pour des doublures. Je pense que c'est une question de goût. (Je ne comprends vraiment pas pourquoi ils()
sont supportés du tout quand{}
ils sont superseed. peut-être pour ne pas aliéner les utilisateurs java instantanément). Scala est cool, mais définir des blocs de code par indentation est clairement supérieur. (et ainsi, la guerre religieuse s'ensuit;))()
pour des déclarations simples. Essayez d'entrer(1 to 9).map(i => {val j = i+1; i*j})
dans le REPL et ensuite voir ce qui se passe si vous utilisez(1 to 9).map(i => (val j = i+1; i*j))
.Haskell - 143 caractères
Cela pourrait probablement être raccourci en prenant l'entrée sur stdin si c'était une option, mais il est tard et de toute façon, il reste encore 104 caractères pour la fonction elle-même.
la source
Befunge-98,
3831 octetsJe sais que c’est un vieux défi, mais j’ai récemment découvert les langages 2D et le trio de sommeil, je savais comment les combiner et je cherchais un endroit pour les poster. Nous y sommes donc.
L’IP principale lit un nombre (
&
), puis appuie sur celuit
qui le clone: on continue sur la même ligne et cycle, lisant de nouveaux numéros et générant de nouveaux enfants jusqu’à atteindre EOF qui termine la séquence. Tous les processus enfants restent bloqués dans une boucle fermée (lev
et^
de la troisième colonne) jusqu'à ce que l'adresse IP principale termine la lecture de l'entrée et exécute la séquence de commandes'<21p
, ce qui met le caractère<
à la position (1,2), écrasant le tout^
et libérant tout. les processus enfants, qui commencent à cycler simultanément, réduisent de 1 leur nombre à chaque itération. Étant donné que la vitesse d'exécution de différentes adresses IP est synchronisée dans befunge, elles se termineront (et afficheront leur valeur) dans l'ordre, en triant la liste des entrées.la source
Un peu tard pour la fête:
Maple -
9183 caractèresEn 91:
En 83:
(Cela nécessite la version 15 de Maple et attend que la liste soit triée en L)
la source
C,
7069 caractèresN'attend pas le retour des processus enfants, sinon fonctionne.
la source
PHP 57 octets
pcntl_fork () est uniquement disponible sous linux.
la source
Bash (38):
Edit: virgule flottante à partir de stdin, séparés par des espaces ou des nouvelles lignes.
la source
Haskell, 90
J'espère que cela répond à toutes les exigences.
la source
, 11 caractères / 22 octets
Try it here (Firefox only).
שĤ⇀ôa
, ça a l'air cool.la source
Quelques modifications de la version de @rmckenzie:
Python retardé thread commence dans
155152114108107:Python sans délai en
130128969593:Géré quelques optimisations supplémentaires, en utilisant à la
Timer
place deThread
, qui a un appel plus concis et supprime le besoin d'importertime
. La méthode de démarrage différée des threads bénéficie de la compréhension de liste car elle évite d'avoir à initialiser la liste séparément au début, bien qu'elle soit plus longue de deux caractères ("["+"]"+" "-":"
) que la boucle for, elle est donc inutile sans démarrage différé et vous devez faire attention à utiliser une liste. au lieu d’un générateur, ou si vous ne créez pas les threads du minuteur tant que vous n’avez pas utilisé le générateur.Est-ce que quelqu'un d'autre a des optimisations?
Le truc avec
as
aide, mais dans la version 2.7.1, vous ne pouvez importer qu'un seul module dans un alias, et après quelques jeux à propos de vousimport mod1,mod2 as a,b
, vous ne pouvez même pas , vous devez le faireimport mod1 as a, mod2 as b
. Il sauve toujours quelques caractères, mais ce n’est pas tout à fait le remède que je pensais ... Et en fait, il vaut mieux laisser sys en tant que sys. L'aliasing threading aide toujours bien ...la source
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
la source
defn
(ses crochets + sa liste d'arguments: de 54 à 43 chrs), ou en utilisant à lafn
place dedefn
=> len- = 2, je dirais donc que son 43: DRouille - 150 octets
Et c’est pourquoi vous ne codez pas le golf dans Rust, c’est plus bavard que Java;). Dépend de caisse externe
crossbeam
, ce serait encore pire sans elle.Programme de test complet:
la source
Un peu ennuyeux, port du C #, juste pour recommencer avec le langage:
F # - 90 caractères
la source
JavaScript, 74
ou 71/65 caractères non standard:
la source
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
avoir travaillé dans au moins un navigateur pour 60 octets. Bien sûr, ces jours-ci, vous écririez à laa=>a.map(v=>setTimeout(console.log,v,v))
place.Tcl 8.6, 41 caractères
Vous devez le tuer avec
^C
la source
VB.NET 100 octets
Parce que VB.Net exige que les lambdas sur une seule ligne ne contiennent qu'une seule instruction, ce code doit comporter plusieurs lignes:
Ungolfed:
Cependant, je ne sais pas si vous comptez les déclarations imports dans les comptes d'octets, car si vous ne les comptez pas, je pourrais écrire ceci:
VB.NET 71 octets
Ungolfed:
la source
Groovy, 47 octets
Suppose que les numéros sont donnés sur la ligne de commande ...
la source
Mathematica, 34 ou 36 octets
Il suffit d’ajouter la liste à trier à la fin de ce code et d’évaluer. Si la définition de la fonction doit être valide, deux octets supplémentaires sont nécessaires:
la source
C ++ 11, 229 octets
Ungolfed et utilisation:
la source