Sleep Sort ist ein ganzzahliger Sortieralgorithmus, den ich im Internet gefunden habe. Es öffnet einen Ausgabestream und verzögert für jede parallel eingegebene Nummer die Anzahl der Sekunden und gibt diese Nummer aus. Aufgrund der Verzögerungen wird die höchste Zahl zuletzt ausgegeben. Ich schätze, es hat O (n + m), wobei n die Anzahl der Elemente und m die höchste Zahl ist.
Hier ist der Originalcode in Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Hier ist der 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
Ihre Aufgabe ist es, Sleep Sort als Funktion in der Programmiersprache Ihrer Wahl zu implementieren. Sie können Nebenläufigkeitsfaktoren wie Rennbedingungen vernachlässigen und niemals freigegebene Ressourcen sperren. Der kürzeste Code gewinnt. Die Funktionsdefinition wird auf die Codelänge angerechnet.
Die Eingabeliste ist nur auf nicht negative Ganzzahlen beschränkt, und die Länge der Eingabeliste sollte angemessen lang sein (mindestens 10 Zahlen testen), damit keine Rennbedingungen eintreten. und unter der Annahme, dass die Rennbedingungen niemals eintreten.
Antworten:
Eine Art lahmer Perl- Versuch,
5955523832 Zeichen :map{fork||exit print sleep$_}@a
Barebones: 25 Zeichen:
... wenn Ihnen die Sortierergebnisse als Ausgabe nichts ausmachen:
map{fork||die sleep$_}@a
Mit allen Zutaten:
(für maximale Herausforderung, 44 Zeichen)
sub t{map{fork||exit print sleep$_}@_;wait}
Wenn Sie perl warten lassen, 39 Zeichen:
sub t{map{fork||exit print sleep$_}@_}
Und wieder, wenn es Ihnen nichts ausmacht
die()
, 32 Zeichen ...sub t{map{fork||die sleep$_}@_}
Beachten Sie, dass es in Perl 6 oder bei Deklaration der
print
Funktion 'say' möglich ist, die Funktion durch zu ersetzensay
und jeweils ein Zeichen zu speichern. Dadie
beide den Fork-Prozess beenden und die Ausgabe schreiben, bleibt dies offensichtlich die kürzeste Lösung.quelle
perl-E
, um 5.010 Funktionen wiesay
(fork&&die sleep$_)for@a
funktioniert auchC , 127 Zeichen, eine ziemlich offensichtliche Lösung:
(Kompiliert mit
gcc -std=c99 -fopenmp sort.c
und ignoriert alle Warnungen.)quelle
for(;c>=0;--c){int x=atoi(v[c]);
. Ich bin mir nicht sicher, ob das erlaubt ist.Ruby 1.9, 32 Zeichen
Als eine Funktion:
Wenn wir nur eine vordefinierte Variable verwenden können, wird diese auf 25 Zeichen reduziert:
quelle
Thread.new{p sleep i}
zum Drucken der Ausgabe verwenden.JavaScript , 65 Zeichen (abhängig davon, ob Sie
console.log
für die Ausgabe des Ergebnisses etwas anderes verwenden oder verwenden)Dies setzt voraus, dass
a
es sich um ein Array nicht negativer Ganzzahlen handelt,map()
das auf dem Array-Prototyp (JavaScript 1.6+) vorhanden ist.quelle
1e3
stattdessen verwenden.alert
ist die blockierende Ausgabe vonprompt
JavaScript, die blockierende Eingabe von JavaScript und die blockierende Binäreingabe von JavaScriptconfirm
. Wenn JS in die Befehlszeile geschrieben werden würde, wären dies die Aufrufe, die Sie verwenden würden.APL (
1513)Was es macht:
quelle
⎕DL
Funktion, die sich im Ruhezustand befindet.Vier Versuche in Erlang:
Bei der Ausgabe an die Konsole haben wir uns die Freiheit genommen, dies jeweils zu tun,
9ms * Number
da dies ausreicht, um es zum Laufen zu bringen (getestet auf einem Atom-Embedded-Board = langsam):Benötigt 60 Zeichen
Die Ausgabe auf der Konsole ist vollständig ohne Erlangish, daher senden wir
P
stattdessen eine Nachricht an process :Benötigt 55 Zeichen
Das Senden nach einer bestimmten Zeit kann auch anders erfolgen (dies funktioniert sogar mit
1ms * Number
):Benötigt 41 Zeichen
Tatsächlich ist dies etwas unfair, da die eingebaute Funktion
send_after
spät dran ist und den Namensraum alserlang:
Präfix benötigt, wenn wir diesen Namensraum als importiert betrachten (auf Modulebene):Benötigt 34 Zeichen
quelle
C # - 137 Zeichen
Hier ist eine Antwort in C # (aktualisiert mit Grad der Parallelität wie kommentiert)
quelle
WithDegreeOfParallelism
dass dies funktioniert, analog zu demnum_threads
in meinem OpenMP C-Code.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 @ BiggAls Code, da das das Spiel ist, das wir spielen ...
... oder 97
175mit verzögertem ThreadstartÜbernimmt die Eingabe über die Kommandozeile
Wie bei vielen Python-Golfspielen kommt ein Punkt, an dem der Code so kompakt ist, dass Aliasing-Variablen zum Kürzen von Namen nicht einmal Zeichen speichern.
Dieser ist jedoch irre, weil er sys als Alias verwendet und BEIDES als t einfädelt, sodass sys.argv zu t.argv wird. Kürzer als von foo import * und eine Netto-Charakterersparnis! Allerdings würde sich Guido wohl nicht darüber freuen ...
Beachten Sie, c selbst zu lernen und das Golfen in Python zu beenden.HEILIGE KUH, DAS IST KÜRZER ALS DIE C-LÖSUNG!quelle
daemon
Es ist keine Einstellung erforderlich, es sei denn, Sie starten dies als Dämon, und die Verwendung von Positionsargumenten ist kürzer, insbesondere. Wenn SieNone
N
j
scheintFalse
- ein Nebeneffekt des Versuchs, zu viel in einer Zeile zu tun?as t,s
und danns
fürsys
print
Funktion stattsys.stdout.write
?Zum Spaß ist hier eine ColdFusion (8+) Version ;-) Es hat 109 Zeichen ohne Zeilenumbrüche und Einrückungen, die ich hier zur besseren Lesbarkeit hinzugefügt habe.
Dies setzt voraus, dass dies der Fall
<cfoutput>
ist. Ein paar Zeichen können gespeichert werden, indem alles in eine Zeile geschrieben wird.quelle
Java (aka gewinnt nie bei Codegolf):
234211187 Zeichenungolfed:
quelle
throws Throwable
diecatch
Klausel auch deklarieren und loswerden .Long.parseLong
mitLong.valueOf
.public
undfinal
können entfernt werden;class M{public static void main
kann seininterface M{static void main
(Java 8+);Long.parseLong(a)
kann seinnew Long(a)
(was zu 165 Bytes führt )Javascript - 52 Zeichen
quelle
Scala -
4240 Zeichen (Sonderfall)Wenn Sie einen Thread-Pool haben, der mindestens so groß ist wie die Anzahl der Listenelemente:
Scala - 72 Zeichen (allgemein)
quelle
{}
wenn Sie in einer Zeile bleiben.{}
eine Aussage weglassen , aber Sie brauchen sie immer noch, um Dinge zu gruppieren, die durch;
, eine Zeile oder nein getrennt sind. Und Sie können mehrzeilige Anweisungen{}
in einigen Fällen auch ohne schreiben (if / else zum Beispiel).()
stattdessen für Einzeiler verwendest. da ist es geschmackssache, denke ich. (Ich verstehe nur nicht wirklich, warum sie()
überhaupt unterstützt werden, wenn sie{}
überholt werden. Vielleicht, um Java-Benutzer nicht sofort zu entfremden). Scala ist cool, aber das Definieren von Codeblöcken durch Einrücken ist eindeutig überlegen. (und so kommt es zum Religionskrieg;))()
für einzelne Anweisungen verwenden. Versuchen Sie,(1 to 9).map(i => {val j = i+1; i*j})
die REPL einzugeben, und sehen Sie dann, was passiert, wenn Sie verwenden(1 to 9).map(i => (val j = i+1; i*j))
.Haskell - 143 Zeichen
Dies könnte wahrscheinlich durch Eingabe von stdin verkürzt werden, wenn dies eine Option wäre, aber es ist spät und es sind immer noch 104 Zeichen für die Funktion selbst.
quelle
Befunge-98,
3831 BytesIch weiß, dass dies eine alte Herausforderung ist, aber ich habe vor kurzem sowohl Sleepsort- als auch 2D-Sprachen entdeckt, hatte eine Idee, wie ich sie kombinieren kann, und suchte nach einem Ort, an dem ich sie posten kann. Also sind wir hier.
Die Haupt-IP liest eine Zahl (
&
) und trifft dann die,t
die sie klont: Man fährt in derselben Zeile fort und durchläuft die Zyklen, liest neue Zahlen und erzeugt neue Kinder, bis sie EOF erreichen, was die Sequenz beendet. Alle untergeordneten Prozesse bleiben in einer geschlossenen Schleife (dasv
und^
der dritten Spalte) hängen, bis die Haupt-IP das Lesen der Eingabe beendet und die Befehlssequenz ausführt'<21p
, die das Zeichen<
auf Position (1,2) setzt, das überschreibt^
und alle freigibt Die untergeordneten Prozesse, die gleichzeitig zu zyklisieren beginnen, reduzieren ihre Anzahl bei jeder Iteration um 1. Da die Ausführungsgeschwindigkeit verschiedener IPs in befunge synchronisiert ist, werden sie nacheinander beendet (und drucken ihren Wert) und sortieren die Eingabeliste.quelle
Ein bisschen zu spät zur Party:
Ahorn -
9183 ZeichenIn 91:
In 83:
(Dies benötigt Maple Version 15 und erwartet, dass die Liste in L sortiert wird.)
quelle
C,
7069 ZeichenWartet nicht auf die Rückkehr der untergeordneten Prozesse, sonst funktioniert es.
quelle
PHP 57 Bytes
pcntl_fork () ist nur unter Linux verfügbar.
quelle
Schlag (38):
Bearbeiten: Gleitkomma von Standard, getrennt durch Leerzeichen oder Zeilenumbrüche.
quelle
Haskell, 90
Ich hoffe das erfüllt alle Anforderungen.
quelle
𝔼𝕊𝕄𝕚𝕟 11 Zeichen / 22 Bytes
Try it here (Firefox only).
שĤ⇀ôa
Das sieht cool aus.quelle
Nur ein paar Optimierungen aus @rmckenzies Version:
Python verzögerter Threadstart in
155152114108107Python ohne Verzögerung in
130128969593Verwaltete ein paar weitere Optimierungen mit
Timer
anstelle vonThread
, die einen präziseren Aufruf haben und den Import überflüssig machtentime
. Die Methode für verzögerten Thread-Start profitiert vom Listenverständnis, da die Liste zu Beginn nicht mehr separat initialisiert werden muss, obwohl sie zwei Zeichen länger ist ("["+"]"+" "-":"
) als die for-Schleife, sodass sie ohne verzögerten Start unbrauchbar ist und Sie vorsichtig mit einer Liste umgehen müssen anstatt eines Generators, oder Sie erstellen die Timer-Threads erst dann, wenn Sie den Generator durchlaufen haben.Hat noch jemand irgendwelche Optimierungen?
Der Trick mit
as
Hilfen, aber in 2.7.1 können Sie nur ein Modul in einen Alias importieren, und nach einigem Herumspielen können Sie nicht einmalimport mod1,mod2 as a,b
, müssen Sieimport mod1 as a, mod2 as b
. Es werden immer noch ein paar Zeichen gespeichert, aber es ist nicht ganz das Heilmittel - alles, was ich dachte ... Und in der Tat ist es besser, sys als sys zu belassen. Aliasing Threading hilft trotzdem ...quelle
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
quelle
defn
(Klammern + Argumentliste: von 54 bis 43 chrs) einfügen oderfn
anstelle vondefn
=> len- = 2 verwenden, also würde ich in clj its 43 sagen: DRust - 150 Bytes
Und aus diesem Grund programmieren Sie Golf nicht in Rust, es ist ausführlicher als Java;). Hängt von der äußeren Kiste ab
crossbeam
, ohne wäre es noch schlimmer.Komplettes Testprogramm:
quelle
Irgendwie langweilig, Portierung von C #, nur um wieder mit der Sprache zu beginnen:
F # - 90 Zeichen
quelle
JavaScript, 74
oder 71/65 Zeichen mit Nichtstandardität:
quelle
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
schon 2011 hat es in mindestens einem Browser 60 Bytes gedauert. Natürlich würden Sie heutzutagea=>a.map(v=>setTimeout(console.log,v,v))
stattdessen schreiben .Tcl 8,6, 41 Zeichen
Du musst es mit töten
^C
quelle
VB.NET 100 Bytes
Da in VB.Net einzeilige Lambdas nur eine Anweisung enthalten müssen, muss dieser Code mehrere Zeilen enthalten:
Ungolfed:
Ich bin mir jedoch nicht sicher, ob Sie die Anzahl der importierten Anweisungen in der Byteanzahl angeben, da ich Folgendes schreiben könnte, wenn Sie sie nicht zählen:
VB.NET 71 Bytes
Ungolfed:
quelle
Groovy, 47 Bytes
Angenommen, Zahlen werden in der Befehlszeile angegeben ...
quelle
Mathematica, 34 oder 36 Bytes
Einfach die zu sortierende Liste an das Ende dieses Codes anhängen und auswerten. Wenn es sich um eine gültige Funktionsdefinition handeln muss, sind zwei zusätzliche Bytes erforderlich:
quelle
C ++ 11, 229 Bytes
Ungolfed und Nutzung:
quelle