В работе Гёделя, Эшера, Баха , Дуглас Хофштадтер вводит целочисленную последовательность, которую обычно называют последовательностью цифр:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Вам может понравиться разработка определения последовательности самостоятельно как часть задачи, но если вы не можете или не хотите выяснить это, вы можете найти его в OEIS как последовательность A030124 и чуть более четкое определение в Википедии .
Напишите программу или функцию, которая, учитывая n
через STDIN, ARGV или аргумент функции, печатает список первых n
чисел последовательности в STDOUT в любом приемлемом формате списка.
Это код гольф, выигрывает самое короткое решение в байтах.
code-golf
number
number-theory
sequence
Мартин Эндер
источник
источник
Haskell,
676160565553 персонажавернуться к первому алгоритму.
это решение вычисляет последовательность дополнения путем суммирования начальных элементов последовательности. затем он вычисляет последовательность как все числа между порядковыми номерами дополнения.
(#)
это функция, которая вычисляет числа между последовательностью дополнения.h
это сама последовательность.g
это функция, которая отвечает на вопрос.функция g определена так, чтобы просто взять необходимое количество элементов из h.
тонкости:
h
на самом деле последовательность фигур фигуры за исключением первых 2 элементов.вычисляется не последовательность дополнения, а последовательность дополнения с добавлением 1 для каждого элемента.
эти две тонкости являются причиной
scanl(+)8h
(которая представляет собой код последовательности дополнения (за исключением первых 2 элементов) с добавленными 1)8
. это для третьего элемента последовательности дополнения с 1 добавленным к нему.причина, по которой вычисления не пропускают первые два элемента, заключается в том, что они добавлены
g
в2:4:h
.пример:
источник
Руби,
5448демонстрация
Изменить: Гольф это немного больше, как только я понял, что мне не нужно держать полную последовательность дополнения в памяти. Вот как это работает сейчас: мы используем
x
для отслеживания наибольшее вычисленное число в последовательности дополнения, иb
это пул кандидатов для последовательности.n
раз мы выводим наименьший оставшийся элементb
и добавляем егоx
для вычисления следующего числа в последовательности дополнения. Затем мы удаляем оба числа из пула кандидатов, поэтому мы всегда выводим наименьшее число, которое еще не было добавлено ни к одной из последовательностей.Трюки с Ruby-гольфом: лямбда-синтаксис Stabby короче, чем определение метода. Требование, чтобы выходные данные передавались в STDOUT, а не как возвращаемое значение, вдохновило меня использовать тот факт, что возвращаемое значение
p(x)
естьx
, что я обычно не помню, потому что это не так в версии Ruby, используемой в Anarchy Golf.источник
2..2*n
. Я должен использовать,n*n
потому что я делаю эффективно,b = [x]^b
поэтому мне нужно, чтобы самый большой элементb
был больше, чем самое большое значениеx
, но вамb -= [x]
просто требуется, чтобы онb
содержал максимально возможное значение выходной последовательности.GolfScript (
2421 байт)Онлайн демо
Это началось совсем по- другому, но в конечном итоге , сходящихся на порт GolfScript из histocrat «s решение Руби перед Денисом сделал несколько предложений , которые принимают его в несколько ином направлении. В частности, печать чисел в том виде, в котором мы их идентифицируем, значительно экономит время, собирая их в массив для печати в конце; причина в том, что это означает, что ни в коем случае нам не нужно беспокоиться о более чем 3 элементах в стеке.
рассечение
источник
^
на\-
, вы можете заменить).*
на3*
. Это не спасет байты, но значительно сократит время выполнения и использование памяти. - Вы должны быть в состоянии сохранить один байт, сохраняя целое число сверху массива. Цикл будет иметь тот же счетчик байтов, но инициализация будет на один байт короче.~.3*,1>\{(\(.p@+\|}*;
J - 28 символов
Функция принимает в
n
качестве аргумента.Мы запускаем функцию с
n
левым аргументом в правый аргумент несколько раз, пока она не производит никаких изменений. Аргумент для начала - это список2 4
.В самой функции мы берем частичные суммы
+/\
и полную сумму+/
, а затем увеличиваем их оба с&:>:
. Затем мы генерируем каждое целое число от 2 до единицы, превышающей полную sum (2+i.
), и устанавливаем subtract (-.
) частичные суммы, оставляя более длинную последовательность цифр по определению. Наконец, мы сокращаем или циклически расширяем список до длиныn
.Результатом является то , что
2 4
становится3 7
, и это удаляется от2..8
ухода2 4 5 6 8
. После очередного раунда2 4 5 6 8
становится3 7 12 18 26
становитсяТаким образом, мы многократно расширяем последовательность цифр.
$
Поведение длины просто нетривиальная экономия характера способ ждет последовательности вырасти до длиныn
или больше, и выводятn
первые значения , когда они перестают меняться. Нам также не нужно долго ждать: мы можем получить до 46336 терминов из четырех применений внутреннего глагола.Та же функция в к:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
источник
Ява -
183158Это было самое лучшее, что я когда-либо играл в гольф, и я горжусь этим! (Хотя это далеко не в верхней части графиков (потому что это Java))
Спасибо Питеру Тейлору за предложения
больше -
источник
Byte.valueOf
сохраняет три, и так как вопрос не определяет диапазон ввода, я думаю, что это должно быть приемлемым. Вне циклов,m
используется только для инициализацииn
, так чтоk++<m
может бытьm-->0
, устранениеk
полностью.int[] n
можно инициализировать какint n[]
и объединить с предыдущим инициализатором.n
никогда не содержит значений, отличных от1
, такn[...]!=0
может бытьn[...]>0
. Инициализатор может затем стать инициализатором первогоfor
цикла.u
и просто используете++w
, нет необходимости устанавливатьn[q]
илиn[w]
. Есть одна ошибка, которая заключается в том, что вы запускаете в концеn
whenm==2
, что лучше всего исправить при инициализацииn=new int[2*m*m]
, но я думаю, что она уменьшается до 157 байтов.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
сохранение точки с запятой.Python 2 - 77 байт
Код:
Работает так же, как и решение @ histocrat, за исключением того, что ввод поступает из stdin.
источник
Python 2 - 68
источник
Желе , 15 байт
Попробуйте онлайн!
Ошибка памяти на входе 6.
Как это устроено
Более эффективная версия, 16 байт
Попробуйте онлайн!
Использует идею из этого J ответа . Обрежьте до нужной длины каждую итерацию и возьмите точку фиксации. Я подумал, используя
S
(сумма) вместоṀ‘
(макс + 1), но я не могу гарантировать его правильность.источник