Nun ... es gibt 59 (jetzt 60) Fragen mit Tags zum Sortieren , aber keine einfachen QuickSorts.
Das muss behoben werden.
Für diejenigen, die mit Quicksort nicht vertraut sind , hier eine Aufschlüsselung mit freundlicher Genehmigung von Wikipedia-
- Wählen Sie aus dem Array ein Element aus, das als Pivot bezeichnet wird.
- Ordnen Sie das Array neu an, sodass alle Elemente mit Werten, die kleiner als der Pivot sind, vor dem Pivot stehen, während alle Elemente mit Werten, die größer als der Pivot sind, nach dem Pivot stehen (gleiche Werte können in beide Richtungen gehen). Nach dieser Unterteilung befindet sich der Zapfen in seiner Endposition. Dies wird als Partitionsoperation bezeichnet.
- Wenden Sie die obigen Schritte rekursiv auf das Unterarray von Elementen mit kleineren Werten und separat auf das Unterarray von Elementen mit größeren Werten an.
Regeln
Die Regeln sind einfach:
- Implementieren Sie eine numerische Kurzübersicht in einer Programmiersprache Ihrer Wahl.
- Der Drehpunkt sollte zufällig oder im Median von drei (1., letztes und mittleres Element) gewählt werden.
- Ihr Programm kann ein vollständiges Programm oder eine Funktion sein.
- Sie können die Eingabe über STDIN, Befehlszeilenargumente oder Funktionsparameter abrufen. Bei Verwendung einer Zeichenfolge wird die Eingabe durch Leerzeichen getrennt.
- Die Eingabe kann dezimale und negative Werte enthalten. Es gibt jedoch keine Duplikate.
- Sie können auf STDOUT ausgeben oder von der Funktion zurückkehren.
- Keine eingebauten (oder sortierungsbezogenen) Sortierfunktionen oder Standardlücken.
- Die Liste kann eine beliebige Länge haben.
Bonus Nr. 1: Verwenden Sie bei Listen oder Unterlisten mit einer Länge <= 5 die Einfügesortierung , um die Dinge etwas zu beschleunigen. Belohnung: -15%.
Bonus Nr. 2: Wenn Ihre Sprache Parallelität unterstützt, sortieren Sie die Liste parallel. Wenn Sie eine Einfügesortierung für Unterlisten verwenden, muss die endgültige Einfügesortierung nicht parallel sein. Eingebaute Thread Pools / Thread Scheduling sind erlaubt. Belohnung: -15%.
Hinweis: Der Median von drei verwirrte einige Leute, daher hier eine Erklärung mit freundlicher Genehmigung von Wikipedia:
Auswahl des Medians des ersten, mittleren und letzten Elements der Partition für den Drehpunkt
Wertung
Das ist Code-Golf . Die Basisbewertung wird in Byte angegeben. Wenn Sie einen Bonus erhalten haben, erhalten Sie 15% Rabatt auf diese Nummer. Wenn Sie beides haben, erhalten Sie 30% Rabatt. Das klingt wirklich nach einem Verkaufsgespräch.
Es geht nicht darum, die kürzeste Antwort insgesamt zu finden, sondern die kürzeste in jeder Sprache.
Und jetzt eine schamlose Kopie des Leaderboard-Snippets.
Das Leaderboard
Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wobei N die Größe Ihrer Einreichung ist. Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 62476; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 41505; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "http://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+(?:.\d+)?)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
Antworten:
C ++,
440,3405388 Bytes518 Bytes - 15% Bonus für Einfügesortierung = 440,3 Bytes477 Bytes - 15% Bonus für Einfügesortierung = 405,45 Bytes474 Bytes - 15% Bonus für Einfügesortierung = 402,9 BytesVielen Dank an @Luke für das Speichern von 3 Bytes (2 wirklich).
Vielen Dank an @ Dúthomhas für das Speichern von 18 (wirklich 15) Bytes.
Beachten Sie, dass ich neu hier bin und dies mein erster Beitrag ist.
Dies ist eine
.h
(Header-) Datei.Komprimierter Code:
Vollständiger Code:
quelle
#include
.srand(time(NULL));
Sie erhalten weiterhin Pseudozufallszahlen vonrand()
.APL,
49-42BytesDadurch wird eine unbenannte rekursive monadische Funktion erstellt, die ein Array auf der rechten Seite akzeptiert. Es ist nicht für den Bonus qualifiziert.
Erläuterung:
Probieren Sie es online aus
Behebung eines Problems (zu Lasten von 8 Bytes) durch Marinus und Speicherung von 7 Bytes durch Thomas Kwa!
quelle
C ++ 17,
254199195 BytesMit Leerzeichen:
quelle
for (y : a)
müsste sonst seinfor (auto y : a)
oderfor (int y : a)
. ( Nenntclang++
dies eigentlich eine C ++ 1z-Erweiterung , aber es scheint nicht wirklich C ++ 17 zu sein? Ich weiß es nicht und es ist zu spät nachts, um nachzuschlagen.)Pyth, 25 Bytes
Dies definiert eine Funktion
y
, die eine Liste von Zahlen als Eingabe akzeptiert.Probieren Sie es online aus: Demonstration
Erläuterung
Pyth, 21 Bytes (wahrscheinlich ungültig)
Ich verwende die "group-by" -Methode, die intern eine Sortierung verwendet. Ich verwende es, um die ursprüngliche Liste in drei Unterlisten aufzuteilen (alle Elemente kleiner als der Pivot, der Pivot und alle Elemente größer als der Pivot). Ohne die Sortierung in "Gruppieren nach" könnten diese 3 Listen in einer anderen Reihenfolge zurückgegeben werden.
Wie gesagt, das ist wahrscheinlich ungültig. Trotzdem behalte ich es hier, weil es eine interessante Lösung ist.
Probieren Sie es online aus: Demonstration
Erläuterung
quelle
> <> (Fisch),
313309 BytesIch habe sehr lange gebraucht, um zu schreiben. Sie können es hier ausprobieren , indem einfach die Liste, die sortiert werden soll, in den Anfangsstapel, der durch Kommas getrennt ist, einfügen, bevor Sie das Programm ausführen.
Wie es funktioniert
Das Programm erfasst das erste, mittlere und letzte Element im Anfangsstapel und berechnet den Median dieser drei Elemente.
Es ändert dann den Stapel in:
[Liste 1] Element [Liste 2]
Dabei ist alles in Liste 1 kleiner oder gleich dem Element und alles in Liste 2 größer.
Dieser Vorgang wird in Liste 1 und Liste 2 rekursiv wiederholt, bis die gesamte Liste sortiert ist.
quelle
CJam, 40 Bytes
Dies ist eine benannte Funktion, die ein Array auf dem Stapel erwartet und eins zurückschiebt.
Probieren Sie es online im CJam-Interpreter aus .
Der obige Code folgt der Spezifikation so genau wie möglich. Wenn dies nicht erforderlich ist, können 12 Bytes gespeichert werden:
quelle
Python 3,
123, 122.1 Byte dank Aaron gespeichert.
Dies ist das erste Mal, dass ich mir die Mühe gemacht habe, einen Sortieralgorithmus zu schreiben. Es ist eigentlich ein bisschen einfacher als ich dachte.
Ungolfed:
quelle
<=
Vergleichs möglicherweise nicht funktionieren - es garantiert nicht, dassp
es an der richtigen Stelle ist. Wahrscheinlich müssen Sie dies in eine exklusive Ungleichung ändern undp
in der Mitte unabhängig hinzufügen (ich habe es nicht getestet / kann) den Code nicht testen).[2, 1, 3]
das 1/3 der Zeit kaputt gehen würde, denn wenn der Pivot auf 2 gesetzt wird, wird die niedrige Liste lauten[2, 1]
- es tut mir leid, dass ich das jetzt selbst nicht testen kann.Javascript (ES2015), 112
Erläuterung
quelle
Rubin,
8760 BytesUngolfed:
Prüfung:
quelle
Oktave,
7675 BytesMehrzeilige Version:
quelle
Julia, 83 Bytes
Dies erzeugt eine rekursive Funktion
Q
, die ein Array akzeptiert und ein Array zurückgibt. Es wird keine bedingte Einfügesortierung verwendet, sodass kein Bonus angewendet wird.Ungolfed:
Ein Problem wurde behoben und dank Glen O einige Bytes gespart!
quelle
f
indem Sie bei der ersten Verwendung zuweisenfilter
undendof
anstelle von verwendenlength
.Q(x)=endof(x)<2?x:(p=rand(x);[Q((f=filter)(i->i<p,x));p;Q(f(i->i>p,x))])
R, 78 Bytes
Dadurch wird eine rekursive Funktion erstellt
Q
, die einen Vektor akzeptiert und einen Vektor zurückgibt. Es wird keine bedingte Einfügesortierung angewendet, daher kein Bonus.Ungolfed:
Probieren Sie es online aus
4 Bytes gespart dank flodel!
quelle
K, 41 Bytes
NEHMEN SIE DAS, APL !!! Tut keinen der Boni.
quelle
Haskell,
137136 BytesDie ungolfed Version ist hierunter, mit erweiterten Variablen- und Funktionsnamen und einigen Zwischenergebnissen, die hinzugefügt wurden:
Ich nutze die Tatsache, dass es keine Duplikate gibt, um zwei strenge Vergleiche durchzuführen. Ich muss prüfen, ob
Data.List.partition
die Dinge nicht kürzer werden, auch wenn ich eine Import-Anweisung hinzufügen müsste. Ich nehme den Einfügesortierbonus nicht an, weil ich ihn alsData.List.insert
sortierungsbezogene Funktion betrachte - daher verboten - und wenn ich ihn nicht benutze, wird der Code durch Hinzufügen der Einfügesortierung auf 246 Byte erhöht (209,1 mit dem Bonus), es lohnt sich also nicht.Bearbeiten: Vielen Dank an RobAu für den Vorschlag, einen Alias für die Verwendung zu erstellen
f=filter
. Es kann nur ein Byte speichern, aber alles hilft.quelle
f=filter
könnte einige Bytes abschneiden.q$f(>n)l
undq$f(<n)l
aufgerufenen Daten verarbeitet.Tcl, 138 Bytes
Dies ist eine sehr übliche Quicksorte.
Der Pivot ist einfach das erste Element eines jeden Subarrays (ich behaupte, dass dies eine Zufallszahl ist. Https://xkcd.com/221/ )
Es ist im Hinblick auf die Speichernutzung nicht besonders effizient, obwohl es zum Teil durch
tailcall
die zweite Rekursion und einen Basisfall von n <1 Elementen verbessert werden könnte .Hier ist die lesbare Version:
Funktioniert mit allen Eingaben und erlaubt Duplikate. Oh, es ist auch stabil . Sie können es mit etwas Einfachem testen, wie:
Genießen! :O)
quelle
foreach
durchlmap
JavaScript (ES6), 191
quelle
Ceylon (JVM nur),
183170Es gelten keine Boni.
Es scheint, dass es in Ceylon keine plattformübergreifende Möglichkeit gibt, eine Zufallszahl zu erzeugen. Dies ist also nur JVM. (Am Ende habe ich eine nicht zufällige Version, die auch in JS funktioniert und kleiner ist.)
Dies definiert eine Funktion, die eine Iteration von Floats annimmt und eine sortierte Version davon zurückgibt.
Wenn (entgegen der Spezifikation) doppelte Einträge übergeben werden, werden diese herausgefiltert.
Dies sind 183 Bytes:
import ceylon.math.float{r=random}{Float*}q({Float*}l){if(exists p=l.getFromFirst((r()*l.size).integer)){return q(l.filter((e)=>e<p)).chain{p,*q(l.filter((e)=>p<e))};}else{return[];}}
Mit dem neuen
if
Ausdruck (Ceylon 1.2) können wir uns ein wenig verbessern :Das sind 170 Bytes:
import ceylon.math.float{r=random}{Float*}q({Float*}l)=>if(exists p=l.getFromFirst((r()*l.size).integer))then q(l.filter((e)=>e<p)).chain{p,*q(l.filter((e)=>p<e))}else[];
Hier ist eine nicht zufällige Version:
Ohne Leerzeichen wären das 107 Bytes:
{Float*}r({Float*}l)=>if(exists p=l.first)then r(l.filter((e)=>e<p)).chain{p,*r(l.filter((e)=>p<e))}else[];
quelle
AutoIt ,
320.45 304.3BytesDas geht recht schnell (für AutoIt sowieso). Qualifiziert sich für den Einfügungssortierbonus. Wird eine Erklärung hinzufügen, nachdem das endgültige Golfen stattgefunden hat.
Eingabe ist
q(Array, StartingElement, EndingElement)
.Zufallstest Eingabe + Ausgabe:
quelle
Java, 346 Bytes
Komprimierter Code:
Vollständiger Code:
quelle
Mathematica,
93-90BytesKein Bonus, es gibt noch keine minimale Möglichkeit, Einfügungen zu sortieren. Als ich kürzlich C ++ lernte, habe ich hier verschiedene Sortieralgorithmen verglichen .
quelle
Python2, 120 Bytes
if[]==a[1:]
ist genauso langif len(a)>2
, sieht aber besser aus.quelle
Lua, 242 Bytes
Ungolfed & Explination
quelle
Schläger 121 Bytes
Ungolfed (l = Liste, h = Kopf (erstes Element), t = Schwanz (Rest oder verbleibende Elemente)):
Testen:
Ausgabe:
quelle
Japt , 23 Bytes
Jeder Bonus müsste drei Bytes oder weniger umfassen, um sich in der Gesamtpunktzahl auszahlen zu können, also habe ich keine Boni genommen.
Probieren Sie es online!
quelle