Ну ... есть 59 (сейчас 60) вопросов с тегами сортировки , но нет простых быстрых сортировок.
Это должно быть исправлено.
Для тех, кто не знаком с быстрой сортировкой , здесь приведена разбивка, любезно предоставленная Wikipedia-
- Выберите элемент, называемый сводной , из массива.
- Переупорядочьте массив таким образом, чтобы все элементы со значениями, меньшими, чем сводка, предшествовали сводной точке, а все элементы со значениями, превышающими сводную, - после нее (равные значения могут идти в любом случае). После этого разделения шарнир находится в своем окончательном положении. Это называется операцией с разделами.
- Рекурсивно примените вышеуказанные шаги к подмножеству элементов с меньшими значениями и отдельно к подмножеству элементов с большими значениями.
правила
Правила просты:
- Реализуйте числовую быструю сортировку на выбранном вами языке программирования.
- Точка должна быть выбрана случайным образом или с медианой из трех (1-й, последний и средний элемент).
- Ваша программа может быть полной программой или функцией.
- Вы можете получить ввод, используя STDIN, аргументы командной строки или параметры функции. Если используется строковый ввод, ввод разделяется пробелом.
- Входные данные могут содержать десятичные и отрицательные значения. Однако дубликатов не будет.
- Вы можете вывести на STDOUT или вернувшись из функции.
- Нет встроенных функций сортировки (или связанных с сортировкой) или стандартных лазеек.
- Список может быть произвольной длины.
Бонус # 1: В списках или подсписках длиной <= 5 используйте сортировку вставкой, чтобы немного ускорить процесс. Вознаграждение: -15%.
Бонус # 2: Если ваш язык поддерживает параллелизм, сортируйте список параллельно. Если вы используете сортировку вставки в подсписках, окончательная сортировка вставки не обязательно должна быть параллельной. Встроенные пулы потоков / планирование потоков разрешены. Вознаграждение: -15%.
Примечание: Медиана трех из них сбивала с толку некоторых людей, поэтому вот объяснение, любезно предоставленное (опять же) Википедией:
выбирая медиану первого, среднего и последнего элемента раздела для оси
счет
Это код-гольф . Базовая оценка в байтах. Если у вас есть один бонус, снимите 15% с этого числа. Если у вас есть оба, получите скидку 30%. Это действительно звучит как коммерческое предложение.
Дело не в том, чтобы найти самый короткий ответ в целом, а скорее в самом коротком для каждого языка.
А теперь бесстыдная копия фрагмента списка лидеров.
Таблица лидеров
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N - размер вашей заявки. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](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>
Ответы:
C ++,
440,3405388 байт518 байт - 15% бонус за вставку сортировки = 440,3 байт.477 байт - 15% бонус за вставку сортировки = 405,45 байт474 байта - 15% бонус за вставку сортировки = 402,9 байтаСпасибо @Luke за сохранение 3 байта (реально 2).
Спасибо @ Dúthomhas за сохранение 18 (15 действительно) байтов.
Обратите внимание, что я новичок здесь, и это мой первый пост.
Это
.h
(заголовочный) файл.Сжатый код:
Полный код:
источник
#include
.srand(time(NULL));
Вы по-прежнему будете получать псевдослучайные числаrand()
.APL,
4942 байтаЭто создает безымянную рекурсивную монадическую функцию, которая принимает массив справа. Это не претендует на бонус.
Объяснение:
Попробуйте онлайн
Исправлена проблема (стоимостью 8 байт) благодаря Marinus и сэкономлено 7 байт благодаря Thomas Kwa!
источник
C ++ 17,
254199195 байтС пробелами:
источник
for (y : a)
в противном случае должно бытьfor (auto y : a)
илиfor (int y : a)
. (На самом деле,clang++
это называется расширением C ++ 1z , но на самом деле это не похоже на C ++ 17? Я не знаю, и уже слишком поздно, чтобы искать его.)Pyth, 25 байт
Это определяет функцию
y
, которая принимает список чисел в качестве входных данных.Попробуйте онлайн: демонстрация
объяснение
Pyth, 21 байт (вероятно, неверно)
Я использую метод group-by, который внутренне использует сортировку. Я использую его, чтобы разделить исходный список на три подсписка (все элементы меньше, чем сводка, сводка и все элементы, больше, чем сводка). Без сортировки в «group-by» он мог бы вернуть эти 3 списка в другом порядке.
Как сказано, это, вероятно, неверно. Тем не менее, я оставлю это здесь, потому что это интересное решение.
Попробуйте онлайн: демонстрация
объяснение
источник
> <> (Рыба),
313309 байтЭто заняло у меня очень много времени, чтобы написать. Вы можете попробовать это здесь , просто поместите список, который должен быть отсортирован в начальный стек, разделенный запятыми, перед запуском программы.
Как это работает
Программа захватывает первый, средний и последний элемент в начальном стеке и вычисляет медиану этих трех.
Затем он изменяет стек на:
[список 1] элемент [список 2]
где все в списке 1 меньше или равно элементу, а все в списке 2 больше.
Он рекурсивно повторяет этот процесс в списке 1 и списке 2, пока весь список не будет отсортирован.
источник
CJam, 40 байт
Это именованная функция, которая ожидает массив в стеке и возвращает его в ответ.
Попробуйте онлайн в интерпретаторе CJam .
Приведенный выше код следует спецификации как можно точнее. Если это не требуется, можно сохранить 12 байтов:
источник
Python 3,
123, 122.Сохранено 1 байт благодаря Аарону.
Я впервые потрудился написать алгоритм сортировки. На самом деле это немного проще, чем я думал.
Ungolfed:
источник
<=
сравнения - это не гарантирует, что оноp
находится в нужном месте, вам, вероятно, нужно изменить это на исключительное неравенство и добавитьp
в середину независимо (я не проверял / могу не тестируй код).[2, 1, 3]
это сломает его в 1/3 времени, так как когда он выбирает пивот равным 2, у него будет нижний список:[2, 1]
извините, я не могу проверить это сам сейчас.Javascript (ES2015), 112
объяснение
источник
Рубин,
8760 байтUngolfed:
Тест:
источник
Октава,
7675 байтМногострочная версия:
источник
Юлия, 83 байта
Это создает рекурсивную функцию,
Q
которая принимает массив и возвращает массив. Условно не используется сортировка вставки, поэтому бонус не применяется.Ungolfed:
Исправлена проблема и сохранены некоторые байты благодаря Glen O!
источник
f
при первом использованииfilter
и используяendof
вместоlength
.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 байт
Это создает рекурсивную функцию,
Q
которая принимает вектор и возвращает вектор. Условно не применяется вставка сортировки, поэтому бонусов нет.Ungolfed:
Попробуйте онлайн
Сохранено 4 байта благодаря flodel!
источник
К, 41 байт
ПРИНЯТЬ ЭТО, APL !!! Не делает никаких бонусов.
источник
Haskell,
137136 байтНиже приведена версия без заглавных букв с расширенными именами переменных и функций и некоторыми промежуточными результатами:
Я пользуюсь тем фактом, что нет двух дубликатов для двух строгих сравнений. Я должен проверить
Data.List.partition
, не делает ли это вещи короче, хотя, учитывая, что мне придется добавить оператор импорта. Я не беру бонус вставки за сортировку, потому что считаюData.List.insert
ее функцией, связанной с сортировкой - то есть запрещенной - и, если она не используется, добавление сортировки вставкой приводит к увеличению кода до 246 байт, с бонусом 209,1, поэтому оно того не стоит.Изменить: Спасибо RobAu за их предложение создать псевдоним для использования
f=filter
. Это может сохранить только один байт, но все помогает.источник
f=filter
может сбрить некоторые байты.q$f(>n)l
иq$f(<n)l
вызовов?Tcl, 138 байт
Это чрезвычайно стандартная быстрая сортировка.
Сводка - это просто первый элемент каждого подмассива (я утверждаю, что это случайное число. Https://xkcd.com/221/ )
Это не особенно эффективно с точки зрения использования памяти, хотя может быть улучшено с
tailcall
помощью второй рекурсии и базового случая с n <1 элементами.Вот читаемая версия:
Работает на всех входных данных и разрешает дубликаты. О, это также стабильно . Вы можете проверить это с помощью чего-то простого, например:
Наслаждайтесь! : О)
источник
foreach
наlmap
JavaScript (ES6), 191
источник
Цейлон (только JVM),
183170Бонусы не применяются.
Кажется, что на Цейлоне нет кроссплатформенного способа получения случайного числа, так что это только для JVM. (В конце у меня есть неслучайная версия, которая работает и в JS, и меньше.)
Это определяет функцию, которая принимает итерируемое число с плавающей точкой и возвращает отсортированную версию.
Если (против спецификации) будут переданы повторяющиеся записи, они будут отфильтрованы.
Это 183 байта:
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[];}}
Мы можем немного улучшить, используя новое
if
выражение (Ceylon 1.2) :Это 170 байт:
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[];
Вот неслучайная версия:
Без пробелов это будет 107 байтов:
{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[];
источник
AutoIt ,
320,45 304,3байтаЭто достаточно быстро (для AutoIt в любом случае). Право на получение бонуса сортировки вставки. Добавлю объяснения после того, как произошла финальная игра в гольф.
Вход есть
q(Array, StartingElement, EndingElement)
.Случайный тестовый вход + выход:
источник
Java, 346 байт
Сжатый код:
Полный код:
источник
Mathematica,
9390 байтНет бонуса, пока нет минимального способа сделать вставку сортировки. Когда я учился на C ++ в последнее время , я сделал сравнение различных алгоритмов сортировки здесь .
источник
Python2, 120 байт
if[]==a[1:]
ровно столько, сколькоif len(a)>2
выглядит, но выглядит более гольфом.источник
Луа, 242 байта
Ungolfed & Объяснение
источник
Ракетка 121 байт
Необработанный (l = список, h = голова (первый элемент), t = хвост (остальные или оставшиеся элементы)):
Тестирование:
Выход:
источник
Japt , 23 байта
Каждый бонус должен составлять три байта или меньше, чтобы рассчитать общий счет, поэтому я не взял никаких бонусов.
Попробуйте онлайн!
источник