/* Configuration */
var QUESTION_ID = 107050; // 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 = 47650; // 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+)(?=[^\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>
all the numbers from 1....n
. Я не знаю, как перефразировать это простым способом.Ответы:
Желе ,
1413 байтовПопробуйте онлайн!
Как это работает
источник
d`
трюк - кое-что еще ...Python 2 ,
106102100 байтПопробуйте онлайн!
Задний план
Чтобы определить простые числа, мы используем следствие теоремы Вильсона :
Как это работает
Мы начнем с инициализации k и m как 1 и p как множества {0} . Обратите внимание, что m = 1 = 0! ² = (k - 1)! ² . Сразу после этого следующий код выполняется n раз, где n - целое число, считанное из стандартного ввода.
По следствию m% k будет 1, если k простое, и 0 в противном случае. Таким образом,
{m%k*k,0}
вернет множество {k, 0}, если k простое, а множество {0} в противном случае.Если (и только если) k простое, поскольку p не может содержать k в этой точке, симметричная разность на месте
p^={m%k*k,0}
добавит k к множеству p . Кроме того, p будет содержать 0 после обновления, если и только если он не содержит 0 до этого, поэтому 0 ∊ p тогда и только тогда, когда k является четным.В той же строке мы определяем функцию c via
c=bin(k).count
, которая будет подсчитывать вхождения своего аргумента в двоичном представлении k .Вторая строка выдает фактический результат.
{k,c('1'),c('0')-1}
возвращает набор, состоящий из самого k , количества установленных битов в k и количества неустановленных битов в k . Так как выводbin(k)
начинается с 0b , мы должны уменьшить,c('0')
чтобы учесть ведущий 0 .Если все они являются простыми, они все будут принадлежать p , которое к настоящему времени содержит все простые числа вплоть до k (и, возможно, 0 ). Если k - число Мерсенна (т. Е. Если оно имеет только установленные биты), то
c('0')-1
получится 0 . Поскольку числа Мерсенна нечетны, p не будет содержать 0 , поэтому условие не выполнится.После (потенциально) печати k мы умножаем m на k² . Поскольку m = (k-1)! ² до обновления, m = k! ² после него. После увеличения k соотношение m = (k-1)! ² снова сохраняется, и мы готовы к следующей итерации.
источник
Mathematica,
806854 байтаобъяснение
источник
JavaScript (ES6),
12311811511110496 байтСохранено 4 байта благодаря @Arnauld
Сочетание трех типичных рекурсивных функций. Предупреждает последовательность в обратном порядке и завершается с ошибкой «слишком много рекурсии».
Тестовый фрагмент
(изменено для вывода на страницу)
Показать фрагмент кода
Основная функция может возвращать массив размером 104 байта:
Он также может быть нерекурсивным за счет другого байта:
Вот тот, с которого я начал: (Сохранено 6 байтов благодаря @Arnauld)
Я попытался сыграть в гольф дальше и сумел сделать это в 104 байта, а затем понял, что уже нашел это решение (оно в нижней части ответа). Разве ты не ненавидишь, когда это происходит? :П
Нерекурсивная попытка главной функции (опять же, тот же счетчик байтов):
Этот простой способ подсчета количества 0 и 1 в двоичном представлении:
То же самое с пониманием массива:
Этот путь немного сложнее, чтобы сделать то же самое:
И этот выбирает еще один связанный маршрут, такой же короткий, как и оригинал:
Опять же, вы можете сыграть в гольф 8 байт, сделав предупреждение в последовательности в обратном порядке:
источник
a
. Просто инициализируйте его при первом вызовеG
. (Это должно сэкономить 4 байта.)Желе ,
1716 байтПопробуйте онлайн!
Как?
источник
ẠBÇЀfĠ...
LƵ;P
бит всегда смущает меня.05AB1E , 14 байтов
Попробуйте онлайн!
объяснение
источник
.¡
, этот вызов показался полезным, но он дольше:FNb{.¡€gpONp+3QiN}})
05AB1E ,
1715 байтИспользует кодировку CP-1252 . Попробуйте онлайн!
источник
LDpÏvybSD_)OpP—
для 15 байтов должно работать.MATL ,
1615 байтПопробуйте онлайн!
источник
Perl, 101 байт
99 байт кода +
-nl
флаги.Чтобы запустить это:
Некоторые краткие пояснения
$r
содержат классическое регулярное выражение регулярного выражения (q/^1?$|^(11+)\1+$/
).Для всех чисел от 2 до ввода
(1x$@)!~$r
проверяет, является ли число простым,y/01/1/dr!~$r
проверяет, является ли число0
в двоичном представлении простым,s/0//gr!~$r
проверяет, является ли число1
в двоичном представлении простым.(если выполнены 3 условия,
print$@
напечатайте его).источник
Python,
129125123 байтаЕсли бы только ноль был простым ...
Попробуйте онлайн
Функция
p
- это функция первичной проверки, которая имеет>0
в конце так, что она работает и для нуля, который в противном случае возвратился бы-1
. Анонимная лямбда - это лямбда, которая проверяет все необходимые условия.Вот немного другой метод, использующий понимание набора. Результатом будет множество. ( 124 байта ):
источник
Perl 6 , 65 байт
Попытайся
Expanded:
источник
Октава, 73 байта
Попробуйте онлайн!
источник
CJam ,
2627 байтовПростой алгоритм, дальше будет гольф.
РЕДАКТИРОВАТЬ: Забыли N было включено.
Попробуйте онлайн!
Для забавы это очень похоже, а также 27 байтов:
объяснение
источник
Желе , 14 байт
Попробуйте онлайн!
К сожалению, я мог связать только с @Dennis, но алгоритм, кажется, несколько отличается, поэтому я все равно публикую это.
объяснение
Вспомогательная функция (удаляет элементы списка, у которых нет простого числа вхождений данного бита):
Основная программа:
источник
Haxe,
169171 байтНичего сумасшедшего. По сути, это модифицированное сито Эратосфена, которое оценивает первичность числа 0/1 в той же итерации, что и вычеркивание более высоких простых чисел. С некоторыми пробелами:
Но сегодня я узнал, что могу поставить
continue
троичного оператора, и Хэйкс даже не возражает.Редактировать: +2, потому что
n
это верхняя граница!источник
n
это включено.Утилиты Bash + GNU,
129126123114111109 байтПопробуйте онлайн!
Заметил комментарий, что выходные данные не должны быть в порядке возрастания - сбрасывать 3 байта путем обратного отсчета, а не отсчета.
Заменили grep на wc, чтобы сохранить 3 дополнительных байта.
Исключил переменную (еще 9 байтов).
Изменен способ использования коэффициента - еще 3 байта.
Сделано в гольф с секвенсом (2 байта).
источник
Python,
172170168159154133130 байтИспользование: вызов анонимной лямбда-функции
Метод
p
проверяет, является ли число простымСохранено 2 + 2 + 9 = 13 байт благодаря Gurupad Mamadapur.
Сохранено 5 байт благодаря mbomb007.
источник
v
-def v(n):a=bin(n)[2:];return p(n)and(p(a.count('1'))and p(a.count('0')))
v=lambda a:p(a)and all(p(bin(a)[2:].count(x))for x in['1','0'])
for x in'01'
.Пайк, 21 байт
Попробуй это здесь!
источник
Groovy, 120 байт
Это безымянное закрытие.
Попробуй это здесь!
источник
Pyth , 18 байт
Попробуйте это онлайн здесь .
источник
U
наS
eS
Python 3 , 97 байт
Это тот же алгоритм, что и в моем ответе на Python 2 , но реализация совсем другая. Функция печатает в STDOUT и завершается с ошибкой.
Попробуйте онлайн!
источник
JavaScript (ES6), 110 байт
Показать фрагмент кода
источник
MATLAB, 50 байтов
источник
Haxe,
158147 байтВыводит в STDOUT и завершается ошибкой «слишком много рекурсии»; звонить с напр
f(1000);
. Вы можете использоватьwhile
цикл без ошибок для 156 байтов:Использование диапазона оказалось на три байта длиннее:
Проверьте это онлайн!
источник
Ржавчина, 147 байт
ссылка на игровую площадку
count_ones
,count_zeros
иleading_zeros
методы пригодились.Отформатированная версия
источник
Perl 6 , 50 байт
Вариация ответа b2gills , используя
&
соединение оператора для большого эффекта.Попробуйте онлайн!
Как это работает
источник