Eh bien ... il y a 59 (maintenant 60) questions marquées par tri , mais pas de tri rapide simple.
Cela doit être corrigé.
Pour ceux qui ne connaissent pas QuickSort , voici une ventilation, gracieuseté de Wikipedia-
- Choisissez un élément, appelé pivot , dans le tableau.
- Réorganisez le tableau de sorte que tous les éléments avec des valeurs inférieures au pivot viennent avant le pivot, tandis que tous les éléments avec des valeurs supérieures au pivot viennent après celui-ci (des valeurs égales peuvent aller dans les deux sens). Après ce cloisonnement, le pivot est dans sa position finale. C'est ce qu'on appelle l'opération de partition.
- Appliquer récursivement les étapes ci-dessus au sous-tableau d'éléments avec des valeurs plus petites et séparément au sous-tableau d'éléments avec des valeurs plus élevées.
Règles
Les règles sont simples:
- Implémentez un tri rapide numérique dans le langage de programmation de votre choix.
- Le pivot doit être choisi au hasard ou avec une médiane de trois (1er, dernier et élément central).
- Votre programme peut être un programme ou une fonction complète.
- Vous pouvez obtenir l'entrée à l'aide de STDIN, des arguments de ligne de commande ou des paramètres de fonction. Si vous utilisez une entrée de chaîne, l'entrée est séparée par des espaces.
- L'entrée peut contenir des valeurs décimales et négatives. Cependant, il n'y aura pas de doublons.
- Vous pouvez sortir vers STDOUT ou en revenant de la fonction.
- Pas de fonctions de tri intégrées (ou liées au tri) ni de failles standard.
- La liste peut être d'une longueur arbitraire.
Bonus n ° 1: sur les listes ou sous-listes de longueur <= 5, utilisez le tri par insertion pour accélérer un peu les choses. Récompense: -15%.
Bonus n ° 2: si votre langue prend en charge la simultanéité, triez la liste en parallèle. Si vous utilisez un tri par insertion sur des sous-listes, le tri par insertion final n'a pas besoin d'être en parallèle. Les pools de threads / planification de threads sont autorisés. Récompense: -15%.
Remarque: la médiane de trois déroutait certaines personnes, alors voici une explication, gracieuseté de (encore) Wikipedia:
choix de la médiane du premier, du milieu et du dernier élément de la partition pour le pivot
Notation
C'est du code-golf . Le score de base est en octets. Si vous avez obtenu un bonus, prenez 15% de réduction sur ce nombre. Si vous avez les deux, profitez d'une réduction de 30%. Cela ressemble vraiment à un argumentaire de vente.
Il ne s'agit pas de trouver la réponse la plus courte dans l'ensemble, mais plutôt la plus courte dans chaque langue.
Et maintenant, une copie sans vergogne de l'extrait de classement.
Le classement
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](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>
Réponses:
C ++,
440,3405388 octets518 octets - 15% de bonus pour le tri par insertion = 440,3 octets477 octets - 15% de bonus pour le tri par insertion = 405,45 octets474 octets - 15% de bonus pour le tri par insertion = 402,9 octetsMerci à @Luke pour avoir économisé 3 octets (2 vraiment).
Merci à @ Dúthomhas pour avoir économisé 18 (15 vraiment) octets.
Notez que je suis nouveau ici et c'est mon premier post.
Il s'agit d'un
.h
fichier (en-tête).Code compressé:
Code complet:
la source
#include
.srand(time(NULL));
Vous obtiendrez toujours des nombres pseudo-aléatoiresrand()
.APL,
4942 octetsCela crée une fonction monadique récursive sans nom qui accepte un tableau à droite. Il ne donne pas droit au bonus.
Explication:
Essayez-le en ligne
Correction d'un problème (au coût de 8 octets) grâce à marinus et économisé 7 octets grâce à Thomas Kwa!
la source
C ++ 17,
254199195 octetsAvec espace:
la source
for (y : a)
devrait autrement êtrefor (auto y : a)
oufor (int y : a)
. (En fait,clang++
appelle cela une extension C ++ 1z , mais cela ne semble pas vraiment être C ++ 17? Je ne sais pas et il est trop tard dans la nuit pour aller le chercher.)Pyth, 25 octets
Ceci définit une fonction
y
, qui prend une liste de nombres en entrée.Essayez-le en ligne: Démonstration
Explication
Pyth, 21 octets (probablement invalide)
J'utilise la méthode "group-by", qui utilise en interne un tri. Je l'utilise pour diviser la liste d'origine en trois sous-listes (tous les éléments plus petits que le pivot, le pivot et tous les éléments plus grands que le pivot). Sans le tri en "group-by", il pourrait renvoyer ces 3 listes dans un ordre différent.
Comme je l'ai dit, cela n'est probablement pas valide. Je vais néanmoins le garder ici, car c'est une solution intéressante.
Essayez-le en ligne: Démonstration
Explication
la source
> <> (Poisson),
313309 octetsCela m'a pris très longtemps à écrire. Vous pouvez l'essayer ici , mettez simplement la liste qui doit être triée dans la pile initiale, séparée par des virgules, avant d'exécuter le programme.
Comment ça marche
Le programme saisit le premier, le milieu et le dernier élément de la pile initiale et calcule la médiane de ces trois éléments.
Il change ensuite la pile en:
élément [list 1] [list 2]
où tout dans la liste 1 est plus petit ou égal à l'élément et tout dans la liste 2 est plus grand.
Il répète récursivement ce processus sur la liste 1 et la liste 2 jusqu'à ce que la liste entière soit triée.
la source
CJam, 40 octets
Il s'agit d'une fonction nommée qui attend un tableau sur la pile et en envoie un en retour.
Essayez-le en ligne dans l' interpréteur CJam .
Le code ci-dessus suit la spécification aussi étroitement que possible. Si ce n'est pas nécessaire, 12 octets peuvent être enregistrés:
la source
Python 3,
123, 122.1 octet enregistré grâce à Aaron.
C'est la première fois que je me donne la peine d'écrire un algorithme de tri. C'est en fait un peu plus facile que je ne le pensais.
Non golfé:
la source
<=
comparaison - cela ne garantit pas quep
c'est au bon endroit, vous devez probablement changer cela en une inégalité exclusive, et ajouterp
au milieu indépendamment (je n'ai pas testé / peut teste pas le code).[2, 1, 3]
cela le casserait 1/3 du temps, car lorsqu'il sélectionne le pivot à 2, il aura la liste basse[2, 1]
- je suis désolé, je ne peux pas le tester moi-même pour le moment.Javascript (ES2015), 112
Explication
la source
Rubis,
8760 octetsNon golfé:
Tester:
la source
Octave,
7675 octetsVersion multiligne:
la source
Julia, 83 octets
Cela crée une fonction récursive
Q
qui accepte un tableau et renvoie un tableau. Il n'utilise pas conditionnellement le tri par insertion, donc aucun bonus ne s'applique.Non golfé:
Correction d'un problème et enregistrement de quelques octets grâce à Glen O!
la source
f
lors de votre première utilisationfilter
et en utilisant à laendof
place delength
.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 octets
Cela crée une fonction récursive
Q
qui accepte un vecteur et renvoie un vecteur. Il n'applique pas conditionnellement le tri par insertion, donc pas de bonus.Non golfé:
Essayez-le en ligne
4 octets enregistrés grâce à Flodel!
la source
K, 41 octets
PRENEZ CELA, APL !!! Ne fait aucun des bonus.
la source
Haskell,
137136 octetsLa version non golfée est ci-dessous, avec des noms de variable et de fonction étendus et quelques résultats intermédiaires ajoutés:
Je profite du fait qu'il n'y a pas de doublons pour utiliser deux comparaisons strictes. Je devrai vérifier si
Data.List.partition
cela ne raccourcit pas les choses, même si je dois ajouter une déclaration d'importation. Je ne prends pas le bonus de tri par insertion parce que je considèreData.List.insert
comme une fonction liée au tri - donc interdite - et si vous ne l'utilisez pas, l'ajout du tri par insertion pousse le code à 246 octets, 209,1 avec le bonus, donc cela ne vaut pas la peine.Edit: Merci à RobAu pour leur suggestion de créer un alias à utiliser
f=filter
. Il ne peut enregistrer qu'un seul octet mais tout est utile.la source
f=filter
pourrait raser certains octets.q$f(>n)l
et desq$f(<n)l
appels?Tcl, 138 octets
Il s'agit d'un tri rapide extrêmement standard.
Le pivot est simplement le premier élément de chaque sous-tableau (je soutiens qu'il s'agit d'un nombre aléatoire. Https://xkcd.com/221/ )
Il n'est pas particulièrement efficace en termes d'utilisation de la mémoire, bien qu'il puisse être amélioré avec
tailcall
la deuxième récursivité et un cas de base de n <1 éléments.Voici la version lisible:
Fonctionne sur toutes les entrées et permet les doublons. Oh, c'est aussi stable . Vous pouvez le tester avec quelque chose de simple, comme:
Prendre plaisir! : O)
la source
foreach
parlmap
JavaScript (ES6), 191
la source
Ceylan (JVM seulement),
183170Aucun bonus ne s'applique.
Il semble qu'il n'y ait aucun moyen multiplateforme de produire un nombre aléatoire à Ceylan, c'est donc uniquement JVM. (À la fin, j'ai une version non aléatoire qui fonctionne également en JS et est plus petite.)
Ceci définit une fonction qui prend un itérable de flottants et en retourne une version triée.
Si (contre la spécification) des entrées en double sont passées, celles-ci seront filtrées.
Cela fait 183 octets:
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[];}}
Nous pouvons nous améliorer un peu en utilisant la nouvelle
if
expression (Ceylon 1.2) :C'est 170 octets:
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[];
Voici une version non aléatoire:
Sans espaces, ce serait 107 octets:
{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[];
la source
AutoIt ,
320.45304,3 octetsC'est très rapide (pour AutoIt de toute façon). Admissible au bonus de tri par insertion. Ajoutera une explication après le golf final.
L'entrée est
q(Array, StartingElement, EndingElement)
.Entrée + sortie de test aléatoire:
la source
Java, 346 octets
Code compressé:
Code complet:
la source
Mathematica,
9390 octetsAucun bonus, vous n'avez pas encore de méthode minimale pour trier l'insertion. Quand j'apprenais C ++ récemment, je l'ai fait une comparaison des différents algorithmes de tri ici .
la source
Python2, 120 octets
if[]==a[1:]
est exactement aussi longif len(a)>2
mais semble plus golfé.la source
Lua, 242 octets
Non golfé & Explication
la source
Raquette 121 octets
Non golfé (l = liste, h = tête (premier élément), t = queue (reste ou éléments restants)):
Essai:
Sortie:
la source
Japt , 23 octets
Chaque bonus devrait être de trois octets ou moins pour être rentable dans le score total, donc je n'ai pris aucun bonus.
Essayez-le en ligne!
la source