Bueno ... hay 59 (ahora 60) preguntas etiquetadas ordenando , pero no hay respuestas rápidas simples.
Eso debe ser arreglado.
Para aquellos que no están familiarizados con la clasificación rápida , aquí hay un desglose, cortesía de Wikipedia:
- Elige un elemento, llamado pivote , de la matriz.
- Reordene la matriz para que todos los elementos con valores menores que el pivote estén antes del pivote, mientras que todos los elementos con valores mayores que el pivote vienen después (los valores iguales pueden ir en cualquier dirección). Después de esta partición, el pivote está en su posición final. Esto se llama la operación de partición.
- Aplique recursivamente los pasos anteriores a la submatriz de elementos con valores más pequeños y separadamente a la submatriz de elementos con valores más grandes.
Reglas
Las reglas son simples:
- Implemente una selección rápida numérica en el lenguaje de programación que elija.
- El pivote debe elegirse al azar o con una mediana de tres (1er, último y medio elemento).
- Su programa puede ser un programa o función completa.
- Puede obtener la entrada utilizando STDIN, argumentos de línea de comando o parámetros de función. Si usa una entrada de cadena, la entrada está separada por espacios.
- La entrada puede contener valores decimales y negativos. Sin embargo, no habrá duplicados.
- Puede enviar a STDOUT o regresando de la función.
- Sin funciones de clasificación incorporadas (o relacionadas con la clasificación) o lagunas estándar.
- La lista puede tener una longitud arbitraria.
Bonificación n. ° 1: en las listas o sublistas de longitud <= 5, utilice la ordenación por inserción para acelerar un poco las cosas. Recompensa: -15%.
Bono # 2: si su idioma admite concurrencia, ordene la lista en paralelo. Si está utilizando una ordenación por inserción en sublistas, la ordenación por inserción final no necesita estar en paralelo. Se permiten agrupaciones de subprocesos / programación de subprocesos incorporados. Recompensa: -15%.
Nota: La mediana de tres confundía a algunas personas, así que aquí hay una explicación, cortesía de (nuevamente) Wikipedia:
elegir la mediana del primer, medio y último elemento de la partición para el pivote
Tanteo
Este es el código de golf . La puntuación base está en bytes. Si tienes una bonificación, obtén un 15% de descuento en ese número. Si tiene ambos, obtenga un 30% de descuento. Eso realmente suena como un argumento de venta.
No se trata de encontrar la respuesta más corta en general, sino la más corta en cada idioma.
Y ahora, una copia descarada del fragmento de la tabla de clasificación.
La tabla de posiciones
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
donde N es el tamaño de su envío. Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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>
Respuestas:
C ++,
440.3405388 bytes518 bytes - 15% de bonificación por clasificación de inserción = 440.3 bytes477 bytes - 15% de bonificación por clasificación de inserción = 405.45 bytes474 bytes - 15% de bonificación por clasificación de inserción = 402.9 bytesGracias a @Luke por guardar 3 bytes (2 realmente).
Gracias a @ Dúthomhas por guardar 18 (15 realmente) bytes.
Tenga en cuenta que soy nuevo aquí y esta es mi primera publicación.
Este es un
.h
archivo (encabezado).Código comprimido:
Código completo:
fuente
#include
.srand(time(NULL));
. Aún obtendrá números pseudoaleatoriosrand()
.APL,
4942 bytesEsto crea una función monádica recursiva sin nombre que acepta una matriz a la derecha. No califica para el bono.
Explicación:
Pruébalo en línea
¡Se solucionó un problema (al costo de 8 bytes) gracias a marinus y se guardaban 7 bytes gracias a Thomas Kwa!
fuente
C ++ 17,
254199195 bytesCon espacios en blanco:
fuente
for (y : a)
de lo contrario necesitaría serfor (auto y : a)
ofor (int y : a)
. (En realidad,clang++
llama a esto una extensión de C ++ 1z , pero en realidad no parece ser C ++ 17. No lo sé y es demasiado tarde por la noche para buscarlo.)Pyth, 25 bytes
Esto define una función
y
, que toma una lista de números como entrada.Pruébalo en línea: demostración
Explicación
Pyth, 21 bytes (probablemente no válido)
Utilizo el método "agrupar por", que internamente utiliza una ordenación. Lo uso para dividir la lista original en tres sublistas (todos los elementos más pequeños que el pivote, el pivote y todos los elementos más grandes que el pivote). Sin la clasificación en "agrupar", podría devolver estas 3 listas en un orden diferente.
Como se dijo, esto probablemente no sea válido. Sin embargo, lo mantendré aquí, porque es una solución interesante.
Pruébelo en línea: demostración
Explicación
fuente
> <> (Fish),
313309 bytesEsto me llevó mucho tiempo escribir. Puedes probarlo aquí , simplemente coloque la lista que debe clasificarse en la pila inicial, separada por comas, antes de ejecutar el programa.
Cómo funciona
El programa toma el primer, medio y último elemento en la pila inicial y calcula la mediana de estos tres.
Luego cambia la pila a:
Elemento [lista 1] [lista 2]
donde todo en la lista 1 es más pequeño o igual al elemento y todo en la lista 2 es más grande.
Repite este proceso de forma recursiva en la lista 1 y la lista 2 hasta que toda la lista esté ordenada.
fuente
CJam, 40 bytes
Esta es una función con nombre que espera una matriz en la pila y empuja una a cambio.
Pruébelo en línea en el intérprete de CJam .
El código anterior sigue la especificación lo más cerca posible. Si eso no es necesario, se pueden guardar 12 bytes:
fuente
Python 3,
123, 122.Guardado 1 byte gracias a Aaron.
Esta es la primera vez que me he molestado en escribir un algoritmo de clasificación. En realidad es un poco más fácil de lo que pensé que sería.
Sin golf:
fuente
<=
comparación: no garantiza quep
esté en el lugar correcto, probablemente deba cambiarlo a una desigualdad exclusiva y agregarlop
en el medio de forma independiente (no he probado / puedo No pruebe el código).[2, 1, 3]
lo rompería 1/3 de las veces, ya que cuando selecciona el pivote para que sea 2, tendrá la lista baja[2, 1]
, lo siento, no puedo probar esto por mí mismo en este momento.Javascript (ES2015), 112
Explicación
fuente
Rubí,
8760 bytesSin golf:
Prueba:
fuente
Octava,
7675 bytesVersión multilínea:
fuente
Julia, 83 bytes
Esto crea una función recursiva
Q
que acepta una matriz y devuelve una matriz. No utiliza condicionalmente el orden de inserción, por lo que no se aplica ninguna bonificación.Sin golf:
Se solucionó un problema y se guardaban algunos bytes gracias a Glen O!
fuente
f
cuándo los usa por primera vezfilter
, y usando enendof
lugar 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 bytes
Esto crea una función recursiva
Q
que acepta un vector y devuelve un vector. No aplica condicionalmente el orden de inserción, por lo que no hay bonificación.Sin golf:
Pruébalo en línea
¡Guardado 4 bytes gracias a flodel!
fuente
K, 41 bytes
TOMA ESO, APL !!! No hace ninguna de las bonificaciones.
fuente
Haskell
137136 bytesA continuación se incluye la versión no protegida, con nombres de variables y funciones expandidos y algunos resultados intermedios agregados:
Aprovecho el hecho de que no hay duplicados para usar dos comparaciones estrictas. Sin
Data.List.partition
embargo, tendré que verificar si no acorta las cosas, incluso teniendo en cuenta que tendría que agregar una declaración de importación. No estoy tomando el bono de clasificación de inserción porque lo consideroData.List.insert
como una función relacionada con la clasificación, por lo tanto prohibido, y si no lo uso, agregar el orden de inserción empuja el código a 246 bytes, 209.1 con el bono, por lo que no vale la pena.Editar: Gracias a RobAu por su sugerencia de crear un alias para usar
f=filter
. Puede guardar solo un byte, pero todo ayuda.fuente
f=filter
podría reducir algunos bytes.q$f(>n)l
y lasq$f(<n)l
llamadas?Tcl, 138 bytes
Este es un quicksort extremadamente estándar.
El pivote es simplemente el primer elemento de cada subconjunto (sostengo que este es un número aleatorio. Https://xkcd.com/221/ )
No es particularmente eficiente en términos de uso de memoria, aunque podría mejorarse algunos con
tailcall
la segunda recursión y un caso base de n <1 elementos.Aquí está la versión legible:
Funciona en todas las entradas y permite duplicados. Oh, también es estable . Puedes probarlo con algo simple, como:
¡Disfrutar! : O)
fuente
foreach
porlmap
JavaScript (ES6), 191
fuente
Ceilán (solo JVM),
183170No se aplican bonificaciones.
Parece que no hay una forma multiplataforma para producir un número aleatorio en Ceilán, por lo que esto es solo para JVM. (Al final tengo una versión no aleatoria que también funciona en JS y es más pequeña).
Esto define una función que toma un iterativo de flotantes y devuelve una versión ordenada de la misma.
Si (contra la especificación) se pasan entradas duplicadas, se filtrarán.
Estos son 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[];}}
Podemos mejorar un poco usando la nueva
if
expresión (Ceylon 1.2) :Esto es 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[];
Aquí hay una versión no aleatoria:
Sin espacios esto sería 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[];
fuente
AutoIt ,
320.45304.3 bytesEsto es bastante rápido (para AutoIt de todos modos). Califica para la bonificación por clasificación de inserción. Agregará una explicación después de que ocurrió el golf final.
Entrada es
q(Array, StartingElement, EndingElement)
.Prueba aleatoria entrada + salida:
fuente
Java, 346 bytes
Código comprimido:
Código completo:
fuente
Mathematica,
9390 bytesSin bonificación, todavía no tengo una forma mínima de ordenar la inserción. Cuando estaba aprendiendo C ++ recientemente, hice una comparación de varios algoritmos de clasificación aquí .
fuente
Python2, 120 bytes
if[]==a[1:]
es exactamente tan largo comoif len(a)>2
pero parece más golfizado.fuente
Lua, 242 bytes
Sin Golf y Explicación
fuente
Raqueta 121 bytes
Sin golf (l = lista, h = cabeza (primer elemento), t = cola (resto o elementos restantes)):
Pruebas:
Salida:
fuente
Japt , 23 bytes
Cada bono tendría que ser de tres bytes o menos para pagar el puntaje total, por lo que no tomé ningún bono.
Pruébalo en línea!
fuente