Последовательность двоичного треугольника Серпинского - это последовательность чисел, двоичные представления которой дают строки двоичного треугольника Серпинского, которые задаются, начиная с 1 в бесконечном ряду нулей, а затем многократно заменяя каждую пару бит на xor этих битов , вот так:
f(0)= 1 =1
f(1)= 1 1 =3
f(2)= 1 0 1 =5
f(3)= 1 1 1 1 =15
f(4)= 1 0 0 0 1 =17
Дополнительные цифры приведены в OEIS: https://oeis.org/A001317
Ввод: неотрицательное целое число n в любом формате, который вам нравится. (Должно работать для всех n до 30.)
Выходные данные: n-й член (0-индексированный) последовательности в виде десятичного числа.
Это код-гольф, поэтому постарайтесь дать кратчайший ответ в байтах, на который способен ваш язык. Ответ не будет принят. Применяются стандартные лазейки (например, нет жесткого кодирования последовательности), за исключением того, что вы можете использовать язык, созданный / измененный после публикации этого запроса. (Старайтесь не публиковать другое решение на языке, который уже использовался, если ваше решение не короче.)
Leaderboard
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## 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 = 67497; // 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 = 47050; // 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>
n
для которого ничего не переполняется.Ответы:
05AB1E ,
54 байтаЯ с гордостью представляю вам, 05AB1E. Хотя он очень короткий, он, вероятно, очень плохо справляется с длительными испытаниями.
Спасибо ETHproductions за то, что сбрил 1 байт :)
Объяснение:
источник
}
автоматически вставить . Тогда это будет 4 байта. :)Пари / ГП , 27 байт
Функция берет n-ую степень многочлена x + 1 в кольце F 2 [x], поднимает его до Z [x], а затем оценивает его как 2.
Попробуйте онлайн!
источник
Желе , 6 байт
Попробуйте онлайн!
Двоичная версия, которая работает с этой ревизией интерпретатора Jelly, имеет дамп xxd
Как это работает
источник
Haskell, 44 байта
В
((->) r)
монаде(f >>= g) x
равноg (f x) x
.источник
(iterate((2*)>>=xor)1!!)
Matlab, 45 байт
Решение:
Тест:
Объяснение:
pascal
строит треугольник Паскаля, но он начинается с 1, поэтому ввод должен бытьi+1
.fliplr
переворачивает массив слева направо.mod(_,2)
принимает остаток после деления на 2.diag
извлекает основную диагональ. Умножение с использованием2.^[0:i]
вектора преобразует в десятичнуюЯ рад, @flawr, что я нашел здесь конкурента Matlab :)
источник
JavaScript (ES6), 23 байта
На основании первой формулы на странице OEIS. Если вы не возражаете против того, чтобы код вводился почти 30 раз, мы можем сбрить байт:
Вот нерекурсивная версия, использующая
for
цикл вeval
: (32 байта)источник
f(35)
возвращается15
. Кроме того, предупреждение о бомбе-вилке: мне пришлось принудительно закрыть Chromium, чтобы остановитьf(30)
запуск (оригинальная версия). : Pf=x=>x?(y=f(x-(x<31)))^y*2:1
бы сработало.Matlab,
7770 байтЭта функция вычисляет n-ую строку треугольника Паскаля посредством повторяющейся свертки с
[1,1]
(расширение бинома или многократное умножение на бином) и вычисляет число из этого.источник
Рубин, 26 байт
анонимная функция с итерацией.
эта рекурсивная функция на один байт короче, но так как ее нужно называть, чтобы иметь возможность ссылаться на себя, она заканчивается на один байт длиннее.
источник
Рубин, 25 байт
Короче других ответов здесь пока нет. Он строит эту строку:
Затем он устанавливает
n=1
(это фактически происходит во время создания строки) и оценивает приведенную выше строку, возвращая результат.источник
*n=1
спасаетm=1;"m^=2*"*n+?1
Samau , 4 байта
Теперь Samau имеет встроенные функции для умножения XOR и мощности XOR.
Шестнадцатеричный дамп (Samau использует кодировку CP737):
Объяснение:
источник
▌
считывает число из строки. Если мы поменяем первые две команды, он попытается прочитать число3
, которое не является строкой.CJam, 10 байтов
Проверьте это здесь.
Простое итеративное решение с использованием побитового XOR.
источник
Pure Bash (без внешних утилит), 37
Целые числа Bash имеют 64-битную подпись, поэтому это работает для входных данных до 62 включительно:
источник
Python 2.7.6,
3833 байтаСпасибо Деннису за то, что он сбрил несколько байтов!
источник
exec'x^=x*2;'*input()
экономит несколько байтов надfor
подходом.f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Pyth, 7 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
Perl 5 , 23 байта
Попробуйте онлайн!
источник
MIPS, 28 байт
Вход в
$a0
, выход в$v0
.источник
Mathematica,
4024 байтаисточник
k4, 26 байтов
0b\:
преобразует число к булеву вектору (т.е. битовый), исключающий реализована в виде «не равно»,2/:
преобразует битовую обратно к ряду, рассматривая ее как полином для оценки, иx f/y
сx
целым числом будетf
применен кy
первому, а затем к его последовательные выходыx
раз.Образец прогона:
источник
Рубин,
3126 байтРЕДАКТИРОВАТЬ: полностью изменен на другой язык! Все предложения по игре в гольф приветствуются!
Эта программа побитового операцию XOR предыдущий элемент последовательности с дважды самим, то есть
f(n) = f(n-1) ^ 2*f(n-1)
.источник
MATL, 15 bytes
Similar to @flawr's answer:
EDIT (May 20, 2016) Try it online! with
X+
replaced byY+
to conform to version 18.0.0 of the language.Example
Explanation
источник
brainfuck, 87 bytes
Try it online!
Assumes infinite sized cells (otherwise it can’t get past 7, which is conveniently 255). The Pascal’s triangle mod 2 method is actually much longer because of the costly mod 2 operation, while XOR is much easier to implement.
источник
APL, 31 bytes
This is almost certainly awful code, but I'm a complete APL newb. I expect anyone with any skill could get rid of all the D-functions and shorten it considerably. The logic is more or less the same as my
k4
answer -- multiply by1
or2
, convert to bits with⊤
, XOR using not equals, convert back to a number with⊥
, wrap the whole thing in a function and ask for a specific number of iterations using⍣
. I have no idea why the result coming out of the inner product is enclosed, but⊃
cleans that up.источник
~1 2=.
to1 2≠.
{({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1}
[28 bytes]Seriously, 12 bytes
Hex Dump:
Try it online
Since Seriously does not include any means of doing a bitwise xor, this solution takes the challenge completely literally, directly computing the given row of the triangle. This method gives correct answers up to n=1029 (after which there is not enough memory to compute the given row of Pascal's triangle).
Explanation:
источник
Pyt,
4010 bytesExplanation:
Observing that the Binary Sierpinski Triangle is equivalent to Pascal's Triangle mod 2,
Try it online!
источник
Stax, 5 bytes
Run and debug online!
Port of the Jelly answer.
Uses ASCII representation to explain:
источник