Обратите внимание: когда я говорю «отрицание», я имею в виду замену всех единиц нулями (то есть побитовое отрицание)
Последовательность Туэ-Морса имеет вид 01101001
То, как вы генерируете это:
Начните с получения 0. Отрицайте то, что осталось, и добавьте его до конца.
Итак, бери 0
. Отрицайте это и добавьте это к концу -01
Затем возьмите это и отрицайте это и добавьте это к концу - 0110
И так далее.
Еще одним интересным свойством этого является то, что расстояние между нулями создает «иррациональную» и неповторяющуюся строку.
Так:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
Можете ли вы написать программу, которая при вводе n будет выводить первые n цифр строки для печати?
Это код гольф, поэтому выигрывает самое короткое количество байтов!
Ответы:
Желе, 9 байт
Попробуйте онлайн!
Как это работает
источник
Python
32,104928884 байтаЭто довольно элементарное решение, основанное на построении троичной последовательности Туэ-Морса с нуля. Эта последовательность идентична запрашиваемой, хотя кому-то еще придется написать более подробное объяснение, почему это так. Во всяком случае, эта последовательность является лишь тривиальной модификацией этой последовательности, A036580 .
Редактировать: Изменил цикл for в понимание списка, изменил функцию на программу и изменил все это на Python 2. Спасибо Деннису за помощь в игре в гольф.
источник
Юлия,
5650 байтЭто анонимная функция, которая принимает целое число и возвращает массив целых чисел. Чтобы вызвать его, присвойте его переменной.
Мы генерируем последовательность Туэ-Морса с перестановкой битов, начиная с целого числа
m = 1
, а затем добавляем1-m
кm
массивуn+1
времена, гдеn
находится вход. Это создает больше терминов, чем нам нужно. Затем мы находим те, которые используютfind(m)
, получаем разницу между последовательными значениями, используяdiff
, и вычитаем 1 поэлементно. Взятие первыхn
членов полученного массива дает нам то, что мы хотим.Сохранено 6 байт и исправлена ошибка благодаря Деннису!
источник
PowerShell, 102 байта
Немного другой способ вычисления. В PowerShell нет простого способа «получить все индексы в этом массиве, где значение этого индекса равно и тому подобное », поэтому нам нужно проявить немного творчества.
Здесь мы используем A001969 , «числа с четным числом 1 в их двоичном разложении», что полностью совпадает с индексами 0 в последовательности Туэ-Морса. ;-)
filter
Вычисляет это число. Например,x 4
дал бы9
. Затем мы просто возвращаемся0
к нашему вводу$args[0]
, вычитая,1
потому что мы проиндексированы нулями, и каждая итерация цикла выводит разницу между следующим числом и текущим числом. Вывод добавляется в конвейер и неявно выводится с символами новой строки.пример
источник
Haskell, 42 байта
Пример использования:
(`take`l) 7
->[2,1,0,2,0,1,2]
.Это реализация
a036585_list
от A036585 смещена вниз0
,1
и2
. Гольф:concat (map f l)
естьf =<< l
иf 0=[0,1,2]; f 1=[0,2]; f 2=[1]
есть([[0..2],[0,2],[1]]!!)
.Примечание:
l
это бесконечная последовательность. Для реализации функции take-firstn
-elements требуется 10 байтов или около 25% .источник
Mathematica,
796870 байтисточник
n<3
.MATL ,
1411 байтПопробуйте онлайн!
Как указал @TimmyD в своем ответе , желаемая последовательность определяется последовательными отличиями A001969 . Последнее, в свою очередь, может быть получено как последовательность Туэ-Морса плюс 2 * n . Следовательно, желаемая последовательность задается (последовательные различия последовательности Туэ-Морса) плюс один .
С другой стороны, последовательность Туэ-Морса может быть получена как число единиц в двоичном представлении n , начиная с n = 0.
источник
05AB1E ,
1413 байтКод:
Объяснение:
Попробуйте онлайн!
источник
Python, 69 байт
i
Й член этой последовательности1+t(i+1)-t(i)
, гдеt
функция Туэ-Морса. Код реализует его рекурсивно, что корочеисточник
Mathematica, 65 байт
Бьет мой другой ответ, но не бьет
пряныхgolfed версии. Теперь обычно я вставляю свой код в кавычки, затем вытаскиваю его, потому что Mathematica любит добавлять пробелы в ваш код (которые ничего не делают), но он никогда не путается со строками, но это не работает для кода, который сам имеет кавычки ...Как бы то ни было, я просто использую магию, встроенную для этого. Выход - это строка.
источник
Mathematica, 58 байт
источник
1;;#
можно заменить просто;;#
.Position
.)Perl, 45 + 2 = 47 байт
Требуется
-p
и-a
флаг:Порт @ Sherlock9 ответа
Сохранено 9 байтов благодаря Тон
источник
-a
Вариант дает вам бесплатную копию на входе, так$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
с-E
:say$&
в конце, если мы предположим, что Perl> v5.18JavaScript (ES6),
7367 байтПорт ответа @ Sherlock9.
редактирование: сохранено 6 байтов благодаря @WashingtonGuedes.
источник
!s[n]
работать на местеs.length<n
? Или может простоs[n]
с?:
перевернутым?CJam (19 байт)
Онлайн демо
При этом используется подход увеличения последовательных различий между элементами последовательности Туэ-Морса.
Мой кратчайший подход с использованием правил перезаписи составляет 21 байт:
(Предупреждение: медленно). Это кодирует правила переписывания
в виде
источник
Рубин, 57 байт
Порт ответа xnor на Python. Изменения в основном лежат в тройном заявлении в
t
месте из -and
за0
тот truthy в Ruby, и использовать(1..n).map
и1+t[i]-t[i-1]
для сохранения байт против импорта списка понимания непосредственно.источник
0
правда? Как это работает??Mathematica (
почтиневербальный),107110 байтовПоследовательность генерируется путем многократного применения правила замены. Другое правило преобразует его в желаемый результат. Если будет достаточно людей, я объясню подробно.
не буквенно-цифровая версия
как предложено CatsAreFluffy.
источник
$
и заменить0
сx-x
(где х неиспользуемая последовательность$
) (и использовать(x-x)!
для 1 (то же самое)), мы буквенно - цифровые символы бесплатно.{x__}
вместо_[x__]
$[_]:=-/;
(оба с помощью эмуляции счетчика)