На этом сайте довольно много задач, которые просят вас распечатать последовательность, и это не исключение.
(Следующее объяснение последовательности для этого вызова предполагает, что символы в последовательности являются 0
и 1
.)
Рекурсивное определение последовательности Туэ-Морса таково , что
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Более прямое определение является то , что последовательность из , 0
чтобы 2**m-1
и 2**m to 2**(m+1)-1
бинарные комплементы. Так 0
следует 1
, 01
следует 10
, 0110
следует 1001
, и, пропустив вперед немного, 0110100110010110
следует 1001011001101001
.
Задача состоит в том, чтобы написать программу или функцию, которая печатает последовательность Туэ-Морса для первых n
элементов, где n
любое неотрицательное целое число. Выходные данные могут использовать любые два символа, как показано в примерах ниже.
Примеры
>>> tm_01(20)
01101001100101101001
>>> tm_ab(42)
abbabaabbaababbabaababbaabbabaabbaababbaab
>>> tm_paren(37)
())()(())(()())()(()())(())()(())(()(
>>> tm_space_star(12)
** * ** *
>>> tm_01(0)
# to show that this is a valid input
правила
На входе будет любое неотрицательное целое число. Вы можете предположить, что все входные данные действительны.
Выходными данными должны быть первые
n
элементы последовательности Туэ-Морса с использованием любых удобных символов. Если вам нравится, вы также можете добавить разделитель. В моих примерах у меня нет. Примечание. Это правило разрешает списки (например, списки Python), так как,
это допустимый разделитель, и я не против начальных или конечных символов, таких как[
и]
в выходных данных.Это код гольф, поэтому выигрывает наименьшее количество байтов.
Как всегда, если проблема неясна, пожалуйста, дайте мне знать. Удачи и хорошего гольфа!
Каталог
var QUESTION_ID=65549;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;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.toLowerCase(),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>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)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:700}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>
Ответы:
Pyth, 6 байт
Попробуйте онлайн: демонстрация
Основано на решении @ThomasKwa и вариации @FryAmTheEggman.
Он использует следующий формуляр:
i
-м цифра в последовательности Туэ-Морса:xor(digits of i in base 2)
.Объяснение:
источник
CJam,
179 байтовили
Проверьте это здесь.
объяснение
Это использует альтернативное определение, данное в Википедии, основанное на четности числа
1
s в двоичном представленииn
.Альтернативные виды использования решений ,
,
чтобы превратить вn
явном виде в диапазон[0 ... n-1]
перед использованием операторов инфиксных для вычисления двоичных представлений и XOR без необходимости блока.Бонусные Решения
Вот некоторые решения, основанные на других определениях. Если есть два решения, более короткое из них очень быстро взорвет память (потому что предварительное вычисление генерирует
2^n
биты перед усечениемn
).Как L-система с
0 --> 01
и1 --> 10
:Отрицая и добавляя предыдущую часть:
Используя рекуррентное отношение, данное в задаче, используйте
divmod
XOR для различения двух рекурсивных определений:(Хотя, конечно, это рекуррентное отношение - это просто другой способ выразить последовательность Туэ-Морса как четность 1 бита в двоичном представлении
n
.)источник
42
(при условии набора битов) было бы довольно неразумно.:^
делает меня счастливым. С другой стороны, черт возьми, это крутой алгоритм.:^}
?Дьялог АПЛ,
87 байтЭто монадическая последовательность, которая ожидает начало индекса 0 (
⎕IO←0
). Эквивалентная функция , не поезд{≠⌿(⍵⍴2)⊤⍳⍵}
.Объяснение:
Выход - разделенный пробелами список
0
и1
. Попробуй это здесь .источник
Mathematica,
3521 байтMathematica имеет встроенную последовательность Туэ-Морса!
Оригинальный ответ:
источник
LabVIEW, 15 примитивов LabVIEW
сейчас как супер модный гиф с зондом
источник
J,
1211 байт@ MartinBüttner сохранил байт.
Это монадическая (то есть унарная) функция, используемая следующим образом:
объяснение
Я использую альтернативное определение, что T n - это четность числа 1-бит в двоичном представлении n.
источник
{.(,-)^:]
работает на 9 байт с некоторым правилом растяжения ( что было разрешено ). Например, для5
этого выходы5 _5 _5 5 _5
. (Добавлен только как комментарий из-за растяжения правила.)Pyth,
1110 байтВыходы в виде списка в стиле Python.
источник
F
потому что я искал «уменьшить». Вы можетеJapt ,
2911 байтПопробуйте онлайн!
Выводится напрямую как массив, который сохраняет около 4 байтов.
Неуправляемый и объяснение
Редактировать: теперь вы можете использовать следующий 8-байтовый код (недействительно; функция опубликована после этого вызова):
источник
Haskell,
393635 байтПопробуйте онлайн!
Как это работает: начните с
[0]
и примените времяx ++ invert x
-функцииn
. Возьмите первыеn
элементы из полученного списка. Благодаря лени Хаскелла наn
самом деле рассчитываются только первые элементы. Примечание: первый<*>
находится в контексте функции, второй - в контексте списка.С GHC v8.4 (который не был доступен во время испытания) есть 34-байтовое решение:
Изменить: -3 соотв. -4 байта благодаря @Laikoni. -1 байт благодаря @ Örjan Johansen.
источник
(\x->x++map(1-)x)
может быть сокращен до([id,(1-)]<*>)
или(id<>map(1-))
с GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 байта
Менее компактный, чем решение nimi, но я не хотел отказывать вам в этой части функциональной путаницы в коде. Работает на любую пару объектов; например, вы можете заменить
(f 0.f 1)
на(f 'A'.f 'B')
.На основании определения, что первые 2 n цифр следуют той же последовательности цифр в обратном порядке. Что мы делаем, это строим два списка бок о бок; один для последовательности, один для обратной. Мы постоянно добавляем все более длинные части одного списка в другой.
Реализация состоит из трех определений:
Функция
t
принимает любое число и возвращает последовательность Туэ-Морса этой длины. Две другие функции являются помощниками.f
представляет собой любой список;f 0
для последовательности,f 1
для обратного.g
заботится о добавлении все более длинных повторений одного списка в другой.Скрипка: http://goo.gl/wjk9S0
источник
Пари / ГП , 33 байта
Попробуйте онлайн!
источник
Бурлеск, 21 байт
Примеры:
Объяснение:
Без
jri.+
части вам не хватит памяти (потому что она вычислит последовательность Морзе с невероятно большим числом длины ). Но так как Бурлеск ленив, просто попросить первый n-элемент будет работать в любом случае.источник
K5,
2713 байтВычислить последовательность довольно просто, проблема состоит в том, чтобы избежать слишком большого количества вычислений. Мы можем признать, что простое расширение последовательности дает нам последовательность строк, которые являются последовательными степенями длины два. Взяв логарифмическую базу 2 для ввода и округления, мы получим достаточно для работы, а затем мы можем сократить ее до соответствующего размера:
Редактировать:
Решение на основе четности:
В бою:
Обратите внимание, что поскольку K5 не имеет произвольного примитива преобразования в двоичный код, я должен указать, например, 64-битное декодирование. K5 не использует математику произвольной точности, поэтому будет ограничение на количество входов, с которыми мы можем иметь дело в любом случае.
источник
Октава,
3331 байтСохранено 2 байта благодаря Томасу Ква.
источник
Perl 5,
6249 байтДа, не лучший язык для этого, но мне все еще нравится, как он вышел. Требуется 5.14+ для
/r
иsay
.Используя определение четности, требуется 5.12+ для
say
:источник
Пролог (SWI), 115 байт
Код:
Разъяснение:
Пример:
Попробуйте онлайн здесь
источник
Сетчатка ,
7069 байтИспользуя определение как L-систему с начальным словом
0
и продукцией0 --> 01
и1 --> 10
.Ввод принимается в одинарном .
Вы можете запустить код из одного файла с помощью
-s
флагом. Или просто попробуйте онлайн.объяснение
Зависит
0;
от ввода, где0
находится начальное слово и;
является просто разделителем.(
Указывает на то, что это начало цикла (который повторяется до тех пор , пока цикл прекращает изменение строки). Эта стадия сама превращается0
и1
вa
иb
соответственно (потому чтоd
расширяется до0-9
). Это происходит до тех пор, пока текущее слово (длина которого измеряется с помощью(.)+
короче, чем входное значение (т. Е. До тех пор, пока мы не можем прочитать конец строки, сопоставив столько1
s, сколько мы имеем в слове).Заменить
a
( заменить0
) на01
.Заменить
b
( заменить1
) на10
. Это также конец цикла. Цикл завершается, когда условие на этапе транслитерации не выполняется, потому что тогда все0
s и1
s останутся неизменными, а на двух других этапах ничего не будет найдено.Последний шаг - обрезать слово до длины ввода. На этот раз мы измеряем длину ввода с
(.)+
предвкушением. Затем мы сопоставляем столько символов в начале строки.источник
Руби, 33
Звоните так:
Использует тот факт, что четность двоичных чисел образует последовательность thue-morse.
Символ разделителя - перевод строки. Преобразует число
i
в двоичную строку, затем вычисляет сумму всех кодов ASCII по модулю 2.Если символ новой строки не является допустимым разделителем, следующий не имеет разделителя для дополнительных 2 байтов:
источник
MATL , 9 байт
Этот язык был разработан после испытания .
Подход 1: 13 байтов
Это создает последовательность путем объединения отрицательных копий блоков увеличивающегося размера.
пример
объяснение
Подход 2: 9 байт
Это использует тот же подход, что и ответ Алефальфы .
пример
объяснение
источник
C
8883 байтаРассчитывает паритет для каждой отдельной позиции.
Скрипка: http://goo.gl/znxmOk
источник
Желе , 4 байта
Обратите внимание, что этот вызов старше, чем желе.
Попробуйте онлайн!
Как это работает
источник
Матлаб, 42
Я использую тот факт, что это то же самое, что и начало,
0
а затем повторение шага добавления дополнения к текущей серии,n
раз.источник
𝔼𝕊𝕄𝕚𝕟, 11 символов / 23 байта (неконкурентные)
Try it here (Firefox only).
Круги сильны с этим.
источник
Баш,
7166 байтНа основании определения, что первые 2 n цифр следуют той же последовательности цифр в обратном порядке.
$1
В качестве параметра указывается желаемое количество цифр.Скрипка: http://goo.gl/RkDZIC
источник
Пакетный, 115 + 2 = 117 байт
На основании ответа Bash.
Нуждается в дополнительном
/V
вызове, чтобы разрешить использование!
s.источник
ES6, 53 байта
Рекурсия казалась проще, чем цикл.
источник
Par , 8 байт
Объяснение:
Выводит что-то вроде:
источник
Математика ++ , 86 байт
Использует
0.0\n
для 0 и1.0\n
для 1источник
Arcyóu ,
5055 байтМне пришлось добавить 5 байт, чтобы заставить его работать правильно :(
Пояснение (с псевдокодом Pythonesque вдоль стороны:
источник
Common Lisp , 50 байт
Попробуйте онлайн!
источник