Это перепост старой проблемы , чтобы приспособить требования ввода / вывода к нашим недавним стандартам. Это сделано для того, чтобы позволить большему количеству языков принять участие в соревновании об этой популярной последовательности. Смотрите этот мета-пост для обсуждения репоста.
Последовательность Колакоски представляет собой забавную самоссылочную последовательность, которая имеет честь быть последовательностью OEIS A000002 (и ее гораздо легче понять и реализовать, чем A000001). Последовательность начинается с 1 , состоит только из 1 с и 2 с, а элемент последовательности a (n) описывает длину n- го цикла 1 с или 2 с в последовательности. Это однозначно определяет последовательность (с визуализацией прогонов внизу):
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,...
= === === = = === = === === = === === = = === = = === === = === =
1, 2, 2, 1,1, 2, 1, 2, 2, 1, 2, 2, 1,1, 2, 1,1, 2, 2, 1, 2, 1,...
Ваша задача, конечно, реализовать эту последовательность. Для этого вы можете выбрать один из трех форматов:
- Возьмите вход n и выведите n- й член последовательности, где n начинается с 0 или 1 .
- Возьмем вход н и выход термины вплоть до и включая п - й член последовательности, где п начинается либо от 0 или 1 (т.е. либо напечатать первую п или первый N + 1 терминов).
- Выводить значения из последовательности бесконечно.
Во втором и третьем случае вы можете выбрать любой разумный, однозначный формат списка. Хорошо, если между элементами нет разделителя, поскольку по определению они всегда однозначные.
В третьем случае, если ваше представление является функцией, вы также можете вернуть бесконечный список или генератор на языках, которые их поддерживают.
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода. Обратите внимание, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Ответы:
Желе , 7 байт
Это полная программа, которая печатает первые n терминов.
Попробуйте онлайн!
Как это устроено
Пример запуска
Пусть n = 5 .
Первый вызов цепочки повторяется 1, 2 циклически, чтобы достичь длины 5 , затем каждый элемент 5 раз, и, наконец, обрезает результат до длины 5 .
Это дает список длиной 5 . Первый элемент является первым элементом последовательности Колакоски.
Второй вызов цепочки повторяется 1, 2 циклически для достижения длины 5 , затем повторяется k- й элемент j раз, где j - это k- й элемент предыдущего списка, и, наконец, усекает результат до длины 5 .
Это дает другой список длиной 5 . Первые два элемента являются первыми двумя элементами последовательности Колакоски.
Процесс продолжается еще три итерации.
Это первые пять элементов последовательности Колакоски.
источник
Python 2 , 51 байт
Печатает до бесконечности. Создает список по
l
мере его повторения. Для каждой записиx
изl
, добавляетx
копии1
или2
, в зависимости от того находится напротив текущего последнего элемента.Основная трудность связана с исходным фрагментом самоссылки
[1,2,2]
. Этот код просто печатает инициал1,2
и продолжает оттуда. Дополнительная печать стоит 12 байт. Без этого:39 байтов , отсутствуют первые две записи:
Другой подход заключается в специальной инициализации первых двух записей. Мы инициализируем ,
l
как[0,0,2]
так , что первые две записи не вызывают добавления, ноprint x or n
делает их напечатать какn
.51 байт
Другое исправление - инициализация
l=[1]
, отслеживание чередования вручнуюn
и исправление печати:51 байт
Без
(l==[1,1])+
, все работает, кроме печатных последовательностей, начинается1,1,2
вместо1,2,2
. Должен быть лучший способ понять, что мы на втором этапе.И еще одно странное исправление, также как-то такое же количество байтов:
51 байт
источник
Wumpus ,
1311 байтПопробуйте онлайн!
Печатает последовательность бесконечно без разделителей.
Я искренне удивлен тем, насколько это коротко.
объяснение
Основная идея состоит в том, чтобы сохранить последовательность в стеке и многократно использовать самый нижний элемент, чтобы сгенерировать другой прогон, а затем распечатать его. Мы эффективно используем стек как очередь здесь. Мы также можем сохранить пару байтов, работая
0
и1
(увеличивая только для вывода) вместо1
и2
, потому что таким образом нам не нужно явно инициализировать стек с помощью a,1
и мы можем использовать логическое отрицание для переключения между двумя значениями.источник
Brachylog ,
30 26 25 23 17 1614 байтВыводит первые n значений. Использует «выходную переменную»
.
для ввода и выводит во «входную переменную»?
. Попробуйте онлайн!объяснение
Я очень доволен тем, как это оказалось декларативным: программа представляет собой высокоуровневое описание списка вывода и его отношение к вводу.
Поскольку
{1|2}ᵐ
списки проверяются в лексикографическом порядке, вывод начнется с 1.источник
Шелуха , 10 байт
Возвращает первые n значений. Попробуйте онлайн!
объяснение
Для ввода 20 процесс идет так:
источник
Java 10,
15510810510097 байтПечатает до бесконечности без разделителя.
-3 байта после косвенной подсказки от @Neil .
-5 байт благодаря @MartinEnder .
-3 байта, преобразовывающие Java 8 в Java 10.
Объяснение:
Попробуйте онлайн (время ожидания 60 секунд на TIO).
источник
[1,2,2]
и последующим ), и я написал 155-байтовый ответ (который теперь обрабатывается с помощью строки вместо списка).(3-i)
вместо(1+i%2)
?i
это не 1 или 2, это строковый индекс.Желе , 10 байт
Возвращает n- й член.
Попробуйте онлайн!
Как это устроено
источник
Haskell , 33 байта
Попробуйте онлайн!
Эрджан Йохансен сохранил 7 байтов, используя неопровержимый шаблон для принудительного использования префикса.
источник
n:
в начале выражения, вам не нужно знать, чтоx
есть, чтобы произвести первоеn
. Но вам нужно, чтобы шаблон был ленивым, чтобы функция не проверяла его перед тем, как перейти кn:
.Gol> <> ,
87 байтПопробуйте онлайн!
объяснение
Это порт моего ответа от Wumpus . Gol> <> - это в основном язык, который обладает всеми необходимыми функциями для переноса ответа Wumpus (в частности, неявных нулей в нижней части стека, «дублирующихся» реализованных «pop, push, push» и командой вращения стека), но :
00.
чтобы вернуться к началу.K
«pop N, затем дублирует следующий элемент N раз», который можно заменить?=
, сохранив еще один байт.Таким образом, отображение от Wumpus к Gol> <> становится:
источник
Язык программирования Шекспира ,
594 583572 байтаСпасибо Эд Винн за -10 байтов!
Попробуйте онлайн!
Это отличная версия решения Эд Уинна для гольфа , начиная с 828-байтового решения, которое он связал в комментариях, и немного сходя с ума.
Объяснение:
источник
> <> ,
1312 байтПопробуйте онлайн!
Порт Мартена Эндера Wumpus ответ . К сожалению,
><>
не имеет команды приращения или инвертирования, а также не имеет неявных нулей в нижней части стека, поэтому в итоге получается немного длиннее.источник
JavaScript,
67666058525150 байтНу, это заставило мой мозг чесаться больше, чем следовало! Возвращает
n
0-й член, индексируется 0.5 + 1 байт сэкономлено благодаря царапинам моего зудящего мозга!
Проверь это
Фрагмент ниже выведет первые 50 членов.
Показать фрагмент кода
объяснение
Это один из тех редких случаев, когда мы можем объявить некоторые переменные вне области нашей функции, изменить их внутри функции и по-прежнему иметь возможность повторно использовать их при последующих вызовах функции.
источник
n=>(g=s=>s[n]||g(s+(++x%2+1)*(10*s[x]-9)))('122',x=1)
s='122',x=1,g=n=>s[n]||g(n,s+=(++x%2+1)*(10*s[x]-9))
считается действительным представлением?s[n]||
был явный случай не видя дрова за деревьями! Ваше второе предложение не будет действительным, так как функция может быть вызвана только один раз;s
&x
должны быть инициализированы с каждым вызовом.s
иx
не трогали другие коды между каждым вызывает (что по умолчанию).s[x]+0-9
довольноPython (2 и 3),
6560 байтВозвращает n- ую запись с 0 индексами.
Альтернатива (65 байт):
источник
[1,2,2]
качестве начального значения вsum
Haskell , 48 байтов
-1 байт благодаря Ними. -2 байта благодаря Линн.
Попробуйте онлайн!
Повторите каждый элемент его положение мод 2 + 1 раз.
источник
c=1:2:c
мозговой трах , 61 байт
Попробуйте онлайн!
Печатает числа в виде кодов символов бесконечно. Для ясности, вот версия, которая печатается в цифрах (за исключением первых двух элементов, которые достаточно легко проверить).
Как это устроено:
источник
05AB1E ,
129 байтСохранено 3 байта благодаря Грими
Печатает первые n элементов.
Попробуйте онлайн!
объяснение
источник
2L[2LÞsÅΓ
.∞[2LÞsÅΓ
.Δ2LÞsÅΓI∍
для версии, которая печатает первые n элементов с заданным значением input n.05AB1E , 15 байтов
Попробуйте онлайн! или с пределом итерации
объяснение
источник
¸«
,=
напечатает их на 2 байта сохранены.ƵLS[NÌ©èF®É>=
, не нужно обманывать, если вы не потребляете.Python 3 ,
5554 байтаПопробуйте онлайн!
источник
J , 12 байт
Функция с одним аргументом, принимающая n и производящая первые n членов. Попробуйте онлайн!
Просто приведу в порядок мой старый ответ на старый вопрос.
I.
это глагол, который берет массив чисел и выплевывает список индексов, так что если k-й элемент в массиве равен n , то индекс k появляется n раз. Мы будем использовать его для начальной загрузки последовательности Колаковского из исходного семени. Каждый шаг будет выполняться следующим образом:Если мы выполним эту операцию (
1+2|I.
) снова и снова, начиная с 10, это будет выглядеть примерно так:Обратите внимание, как мы получаем все больше и больше правильных терминов каждый раз, и через некоторое время фиксируются первые n терминов. Трудно точно описать количество итераций, необходимых для установления, но оно выглядит примерно логарифмическим по n , поэтому, если мы просто запустим его n раз (
^:]
), все будет хорошо. (Проверьте эти другие последовательности OEIS для получения дополнительной информации: длины генерации , частичные суммы .)Как только мы это сделаем, все, что нам нужно сделать, это взять первые n терминов, используя
$
. Конструкция$v
для любого глаголаv
является примером ловушки, и приведение его вn
качестве аргумента будет выполненоn $ (v n)
.Вот старый 13-байтовый версия , которая является гораздо менее расточительно времени и пространства:
($1+2|I.)^:_~
. Он усекает входные данные на каждом шаге, поэтому мы можем выполнять ровно столько раз, сколько необходимо для расчета, а не линейно много раз.источник
I.
. Я всегда хотел, чтобы функция копирования использовалась в каком-то гольфе.Fueue , 30 байт
Fueue - это основанный на очереди esolang, в котором запущенная программа и ее данные находятся в одной и той же очереди, выполнение циклически обходит очередь, а программирование требует много синхронизации, чтобы предотвратить выполнение чего-либо в неподходящее время.
Попробуйте онлайн!
Выше напечатан бесконечный список цифр в качестве управляющих кодов. Для 34 байтов он может печатать действительные цифры:
Попробуйте онлайн!
Остальная часть объяснения использует последнюю версию.
Сводка элементов Fueue
Очередь Fueue может содержать следующие виды элементов:
)
функция не разблокирует их, и~
(замена двух следующих элементов),:
(дублирование следующего элемента) и)
(деблокирование следующего блока).Обзор высокого уровня
Во время основного цикла программы очередь состоит из:
[49]
и[50:]
, соответственно.Низкий уровень трассировки первых 10 команд
Прохождение полной итерации основного цикла
Необязательные пробелы были вставлены для разделения команд.
Цикл 1:
49
печать1
.)
неактивен, ожидает объединения с блоком основного цикла.50
отпечатки2
.:
дублирует блок основного цикла (для саморепликации требуется копия)Цикл 2:
)
деблокирует первый блок основного цикла, заставляя его начать выполнение следующего цикла.Цикл 3:
[50:]
представляет первую цифру в цепочке, еще2
не деблокированную. Следующее в)
конечном итоге сделает это после того, как остальная часть основного цикла пройдет его.~)~:~
является задержкой в один цикл (с использованием свопа и копии)~)~~
.[[49]:~))~:~~]
неактивен~
меняет следующий блок основного цикла за блоком[50:]
цифр.Цикл 4:
)
все еще ждет,~)~
производит~)
,~
свопы[[49]:~))~:~~]
мимо[50:]
значного блока.Цикл 5:
~
переключается)
мимо[50:]
блока цифр.Цикл 6: первый
)
теперь деблокирует[50:]
блок цифр, следующий)
деблокирует подпрограмму[[49]:~))~:~~]
.Цикл 7:
50
печатает2
,:
дублирует только что созданный[49]
блок цифр, создавая серию из двух1
с.:~))~:~
задержка один цикл~~))~:
.~
переставляет оставшийся блок основного цикла после первого[49]
.Цикл 8:
~~))
задержка одного цикла)~)
.~
свопы:
мимо пройденного в данный момент[49]
.Цикл 9:
~
свопы)
прошлое[49]
.:
дублирует основной блок цикла.Цикл 10: первый
)
деблокирует[49]
только что пройденный блок цифр, второй)
перезапускает основной цикл для прохождения следующего (выше показано в начале очереди).источник
x86,
4137353328 байтМне было очень весело возиться с разными инструкциями по x86, так как это мой первый «нетривиальный» ответ по x86. Сначала я изучил x86-64 и сэкономил много байтов, просто преобразовав свою программу в 32-разрядную.
Оказывается, алгоритм, который я использовал из OEIS, переносит значения в массив, что делает его доступным для x86 и хранит значения в стеке (заметьте, MIPS не имеет инструкций стека).
В настоящее время программа принимает
N
значения в качестве входных данныхecx
и возвращает адресebp
массива с n-ным элементом, представляющим n-е значение в последовательности. Я предполагаю, что возврат в стек и вычисление дополнительных значений допустимо (мы все равно считаем, что за пределами массива мусор).Изменения
-4 байта вычисляя
x = 2 - n%2
сxor
каждой итерацией-2 байта, используя do-while вместо цикла while.
-2 байта путем нажатия начальных значений 1, 2, 2 с помощью
eax
-5 байт, не сохраняя
n
явно и вместо этого запустивN
время циклаObjdump:
источник
C (gcc) ,
7271656462 байта-9 байт благодаря @ceilingcat
Попробуйте онлайн!
Генерирует значения последовательности бесконечно (вариант 3 из вызова)
источник
for($x=$y=-1;;$y=$y+1|$f&.5*$x^=$f=$y&-$y-2)echo$x&1?:2;
. 2)50-x%2
должен сохранить один байт для вас. 3) Я пытался запустить егоx=y=1
; но до сих пор не смог правильно провести операции. Ты можешь?Perl 5 , 36 байт
Еще тривиальная модификация классического решения TPR (0,3):
Выводит серию из
0
вn
Попробуйте онлайн!
источник
Javascript ES6 -
717068 байт1 бит спасен благодаря Нилу
Танки Шегги за исправление моей ошибки, а также за сохранение 1 бита.
источник
x=0
вместоx=1
), но @Shaggy действительно прав: это не работает в его текущей форме (я добавил,i=100;i-->0
временно, чтобы просто увидеть первые 100 элементов, вместо того, чтобы подождите 60 секунд, прежде чем увидеть результат). Не знаю, почему это не работает, хотя. JS это не мое.1.
инициализацияx
0 вместо 1 (как упомянуто @KevinCruijssen) и2.
проверка, является лиx
th-й символ в строке, который может быть только 1 или 2, больше 49.(_[x]*10-9)
чем(_[x]>1?11:1)
Яблочное семя , 89 байт
Определяет функцию,
K
которая не принимает аргументов и возвращает последовательность Колакоски в виде бесконечного списка. Попробуйте онлайн!Этот подход был вдохновлен ответом Haskell от полностью человека . Мой оригинальный подход был длиннее и, вероятно, был O (2 ^ n). : ^ P
Ungolfed
Список возврата начинается с
(1 2)
. После этого, чтобы сгенерировать остальную часть (чтение изнутри):(kolakoski)
для получения списка последовательности Колакоски (из-за ленивых вычислений не имеет значения, что список еще не был полностью сгенерирован)(cycle (list 1 2))
создает бесконечный список(1 2 1 2 1 2 ...)
repeat-val
. Это будет повторять1
или2
изcycle
списка один или два раза в зависимости от связанного значения в списке Колакоски. Результат:((1) (2 2) (1 1) ...)
flatten
этот список в(1 2 2 1 1 ...)
(concat (list 1 2)
, поэтомуdrop
первые два сгенерированы из списка, чтобы избежать дублирования.источник
Stax , 12 байт
Запустите и отладьте его
Это представление ascii той же программы.
Это расширяет последовательность x раз, где x является входом. Затем он выводит x- й элемент с 0 индексами.
Вот бонусное 12-байтовое решение, которое производит вывод в виде бесконечного потока. Нажмите Run, чтобы начать.
источник
R, 63 байта или 61 байт
Реализация 1: печатает n- й член последовательности.
Реализация 2: печатает первые n членов последовательности.
(Разница только в последней строке.)
Да, да, вы можете жаловаться, что мое решение неэффективно, что оно вычисляет действительно больше терминов, чем необходимо, но все же ...
Обновление: спасибо @Giuseppe за удаление 9 байтов.
источник
a=c(a,rep(2-n%%2,a[n]))
вместо второгоfor
цикла, чтобы сбрить некоторые байты.Язык программирования Шекспира, 575 байтов (но с дефектом), или 653 или 623 байта
В горячо оспариваемой категории SPL это побьет текущую запись Джо Кинга (583 байта), за исключением того, что она дефектна: во-первых, она не работает в версии TIO (реализует сайт SPL) - но она работает в Perl версия , так что, возможно, это не серьезный дефект. Во-вторых, он не печатает первые две цифры. Если бы мы допустили этот дефект в решении Джо Кинга, то это дефектное решение составило бы 553 байта, опередив мое дефектное решение.
Мое решение не работает на TIO по двум причинам: мы пытаемся опираться на пустой стек, возвращающий ноль при извлечении; и мы идем в первую сцену с «[Введите Ford и Puck]», хотя никто не покинул сцену. Это всего лишь предупреждения в версии Perl. Если я исправлю эти ошибки и введу первые две цифры, я получу 653 байта:
Попробуйте онлайн!
Я могу сгенерировать полную последовательность в реализации Perl, используя 623 байта:
Тем не менее, я хотел бы отметить, что это решение быстро по сравнению со многими другими решениями и использует логарифмические объемы памяти, а не сохраняет весь список. (Это похоже на C-решение vazt, с которым оно связано отдаленно.) Это не имеет значения для гольфа, но я доволен этим, несмотря на это. Вы можете генерировать миллион цифр примерно за минуту в Perl (например, если вы отправляете по конвейеру sed и wc, чтобы получить счетчик цифр), где другое решение может дать вам несколько тысяч цифр.
объяснение
Мы сохраняем последовательность переменных в следующем порядке: стек Пака (снизу вверх), значение Пака, значение Форда, стек Форда (сверху вниз). Помимо нулевых значений на концах (с нулем слева, возможно, от выталкивания пустого стека), каждое значение - это цифра, сгенерированная следующим в этом поколении, с 2 добавленными, если у следующего поколения должен быть другой дочерний элемент от этого родителя. Когда у нас есть N ненулевых значений в последовательности, мы генерируем все дочерние элементы вплоть до N-го поколения и включаем его в своего рода обход дерева в глубину. Мы печатаем значения только из N-го поколения. Когда N-е поколение полностью сгенерировано, сохраненные значения фактически являются начальными значениями для поколений 2 - (N + 1), поэтому мы добавляем слева 2 и начинаем снова, на этот раз генерируя (N + 1) ) -го поколения.
Итак, набросок: Сцена X: Когда мы достигаем здесь, это начало нового обхода. Puck == 0. При желании мы помещаем этот ноль в стек Puck и устанавливаем Puck = 2. Сцена L: Если Ford == 0, мы достигли печатного поколения. Если нет, перейдите к V. Для печати, если для значения в Puck добавлено 2, удалите 2 и напечатайте его дважды; если нет, распечатайте его один раз. Сцена M: Это цикл, в котором мы неоднократно переключаем значение Puck и возвращаемся к последовательности. Мы повторяем, пока либо не достигнем конца (Puck == 0), в этом случае перейдем к X, либо мы достигнем значения, которому нужен другой дочерний элемент (Puck> 2), и в этом случае вычтем лишние 2 и пойдем вперед в V. Сцена V: Здесь мы идем вперед. Если Puck равен 2 или 4, следующее поколение будет содержать двух дочерних элементов от текущего родителя, поэтому Ford + = 2. Шаг вперед по последовательности. Перейти к L, чтобы проверить прекращение.
источник
аксо , 13 байт
Попробуйте онлайн!
объяснение
Это началось как порт альтернативного решения в моем ответе Wumpus :
Это привело к 18 байтов. Я закончил игру с 13 байтами, которые вы видите выше, чтобы настроить его так, как работает Axo. Затем эта 13-байтовая версия вдохновила улучшение на 11 байт в Wumpus, так что теперь она фактически ближе к этой версии.
Как и в Wumpus, в итерации i нижняя часть стека содержит a (i) -1, а верхняя часть содержит первый элемент i- го цикла, но мы работаем с 0 и 1 , кроме печати.
источник
Рубин ,
4539 байтпечатает до бесконечности
Попробуйте онлайн!
Попробуйте это с перегруженной функцией печати, которая позволяет вам выбрать разделитель и количество напечатанных элементов
источник