Допустим, подстрока - это любое непрерывное сечение исходной строки. Например cat
, это подстрока concatenate
. Мы скажем, что правильная подстрока - это подстрока, которая не равна исходной строке. Например concatenate
, это подстрока, concatenate
но не правильная подстрока. (односимвольные строки не имеют правильных подстрок)
Теперь мы определим последовательность, используя эти термины. П - й член этой последовательности будет наименьшее число такое , что существует правильная подстрока его двоичное представление , которое не является подстрока любой более ранний срок в последовательности. Первый термин есть 10
.
В качестве упражнения давайте сгенерируем первые 5 терминов. Я буду работать в двоичном формате, чтобы сделать вещи проще.
Первый термин есть 10
. Поскольку 11
следующее наименьшее число имеет только одну правильную подстроку, 1
которая также является подстрокой 10
, 11
отсутствует в последовательности. 100
Однако все же содержит правильную подстроку , 00
которая не является подстрока 10
так 100
это наш следующий срок. Далее, 101
которая содержит уникальную правильную подстроку, 01
добавляющую ее в последовательность, затем 110
содержит правильную подстроку, 11
которая является новой и добавляет ее в последовательность.
Теперь у нас есть
10, 100, 101, 110
111
следующий, но он содержит только подстроки 1
и 11
делает его не термом. 1000
однако содержит 000
добавление его в последовательность.
Вот первая пара терминов в десятичном виде
2, 4, 5, 6, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 54, 56, 58
задача
Или
Возьмите n в качестве входных данных и сгенерируйте n- й член в этой последовательности (либо 0, либо 1 проиндексированный)
Непрерывно выводим члены последовательности
Это код-гольф ответы оцениваются в байтах с меньшим количеством байтов, тем лучше.
n
)?a(36)
47 (1 проиндексировано).Ответы:
Python 3 ,
88807875 байт-6 байт благодаря Wheat Wizard
-2 байт благодаря RootTwo
-3 байт благодаря notjagan
Попробуйте онлайн!
источник
bin(n)[2:]
наf"{n:b}"
.Желе , 22 байта
Попробуйте онлайн!
источник
Mathematica,
116110 байтБесконечно выводит члены последовательности.
объяснение
x
список терминов последовательности до сих пор.f
a,Function
который принимает целое число и возвращает всеSubsequences
его базовое2
представление (включая пустой список{}
и полный список самогоIntegerDigits
себя).Оценить
...
по стоимостиn
от2
до∞
.Если
...
естьFalse
, то второй аргументAnd
(&&
) никогда не оценивается. Если...
естьTrue
, тоEcho@n
печатает и возвращаетn
, что мы тогдаAppendTo
списокx
.Мы хотим проверить, что некоторая правильная подстрока
n
не является подстрокой какого-либо предыдущего члена последовательности.Most@f@n
список соответствующих подстрокn
, мы затем проверить , есть ли подстроки ,s_
который являетсяMemberQ
в этот список , так что списокf/@x
списков подстрок предыдущих членов последовательности находитсяFreeQ
наs
на уровне2
.источник
Mathematica,
10994 байтаНепрерывно выводим члены последовательности
Специальное спасибо @ngenisis за -15 байтов
Mathematica, 123 байта
Возьмите n в качестве входных данных и сгенерируйте n-й член в этой последовательности (1 проиндексирован)
вход
выход
источник
15
байтов, которые могут идти:SubsetQ
короче и эквивалентноContainsAll
, вы можете использоватьAnd
вместоIf
,Union
ненужно, иDo
почти всегда короче чемFor
:s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]
3
больше байтов с помощьюMost
:s={};Do[!SubsetQ[s,Most[t=Subsequences@IntegerDigits[i,2]]]&&(s=s~Join~t;Echo@i),{i,2,∞}]
Pyth , 20 байтов
Это печатает последовательность бесконечно. Как следствие, его можно использовать только в автономном режиме.
Пояснение (пробел является новой строкой):
источник
Pyth , 20 байтов
Попробуйте онлайн!
источник
Haskell,
172 байтаПопробуйте онлайн.
объяснение
Код генерирует последовательность непрерывно.
b
возвращает двоичное представлениеInt
в видеString
s
возвращает все подстроки строкиp
возвращает все правильные подстроки строкиn
это функция, которая применяется итеративно и возвращает кортеж, содержащий:scanl
используется для вызоваn
снова и снова, и его выходные данные фильтруются, чтобы содержать только элементы больше 1Вот немного более читаемая версия перед игрой в гольф:
источник
JavaScript, 57 байт
Показать фрагмент кода
Пусть запишем данное число n в двоичном виде, тогда:
10
, n должно быть в последовательности:1
в нем, оставшаяся двоичная строка не должна быть видна, так как n - наименьшее число, которое может содержать такую строку11
:1
в нем, оставшуюся двоичную строку (давайте пожертвуем ее, как1x
должно быть видно, так как:1x
в последовательности, или1x0
в последовательности, так как оно содержит уникальную подстроку1x
Вывод:
двоичная форма числа начинается с
10
или заканчивается с1
последующим нечетным числом0
. Или опишите в регулярном выражении: х совпадают/^10|10(00)*$/
.источник