生成看不见的数字


15

假设子字符串是原始字符串的任何连续部分。例如cat是的子字符串concatenate。我们将说适当的子字符串是不等于原始字符串的子字符串。例如,concatenate是一个子串,concatenate但不是正确的子串。(单个字符串没有正确的子字符串)

现在,我们将使用这些术语定义一个序列。此序列中的第n个术语将是最小的数字,以使其二进制表示形式存在适当的子字符串,而不是该序列中任何较早术语的子字符串。第一项是10

作为练习,让我们生成前5个项。我将使用二进制文件来简化事情。

第一项是10。由于11,下一个最小的数字只有一个适当的子字符串,1它也是的子字符串1011不在序列中。 100但是确实包含适当的子字符串00,而不是的子字符串,10因此100我们的下一个术语也是如此。下一步是101包含01将其添加到序列中的唯一正确子字符串,然后110包含11是新的将其添加到序列中的正确子字符串。

现在我们有

10, 100, 101, 110

111接下来是,但它仅包含子字符串111而不是一个术语。 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)

  • 连续输出序列项

这是答案,以字节计分,字节越少越好。


输出应该是十进制还是二进制?还是其中之一?
AdmBorkBork

@AdmBorkBork我认为应该是整数。
暴民埃里克(Erik the Outgolfer)

可以加上第100个学期(或其他任何大数n)吗?
罗德

@AdmBorkBork您应该以任何标准允许的格式输出。
发布Rock Garf Hunter

@Rod 36够大吗?a(36)是47(索引为1)。
发布Rock Garf Hunter

Answers:


5

Python 3中88 80 78 75个字节

-6字节归功于Wheat Wizard
-2字节归功于RootTwo
-3字节归功于notjagan

s={0}
n=1
while 1:n+=1;b=f"{n:b}";p={b[1:],b[:-1]};s|=p-s and{b,print(n)}|p

在线尝试!




@WheatWizard ninja'd
Rod

在Python 3.6,您可以通过更换更节省2 bin(n)[2:]f"{n:b}"
RootTwo

-3个字节有一些非常奇怪的变化。
notjagan


1

Mathematica,116110字节

x={};f=Subsequences[#~IntegerDigits~2]&;Do[MemberQ[Most@f@n,s_/;FreeQ[f/@x,s,2]]&&x~AppendTo~Echo@n,{n,2,∞}]

无限输出序列项。

说明

x={};

x 是到目前为止序列的术语列表。

f=Subsequences[#~IntegerDigits~2]&

f是一个Function采用整数并返回Subsequences其所有基本2表示形式(包括其空列表{}和完整列表IntegerDigits)的。

Do[...,{n,2,∞}]

评估从到的...值。n2

...&&x~AppendTo~Echo@n

如果...False,则永远不会评估And&&)的第二个参数。如果...True,则Echo@n打印并返回n,然后我们AppendTo列出该列表x

MemberQ[Most@f@n,s_/;FreeQ[f/@x,s,2]]

我们要检查的某个适当子串n是否不是序列中任何先前术语的子串。Most@f@n是适当的子串的名单n,我们再检查是否有子s_这是MemberQ该列表,使得列表f/@x序列的旧条款子的名单是FreeQs,在级别2


1

Mathematica,109 94个字节

s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]


连续输出序列项

@ngenisis的特殊thanx,为-15个字节


Mathematica,123个字节

(s=r={};For[i=2,i<2#,i++,If[!ContainsAll[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]],s=s~Join~t;r~AppendTo~i]];r[[#]])&


以n为输入并按此顺序生成第n个项(已索引1个)

输入

[1000]

输出

1342


跟踪到目前为止已出现的子字符串是个好主意!我监视至少15可以去的字节:SubsetQ小于和等于ContainsAll,可以使用And代替IfUnion不需要,并且Do几乎总是小于Fors={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]
ngenisis

3通过使用更多字节Mosts={};Do[!SubsetQ[s,Most[t=Subsequences@IntegerDigits[i,2]]]&&(s=s~Join~t;Echo@i),{i,2,∞}]
ngenisis

0

Pyth,20个字节

u+G
fP-Fm.:.Bd)+TG1Y

这将无限打印该序列。因此只能离线使用。

说明(空格是换行符):

u+G fP-Fm.:.Bd)+TG1Y
u                  Y    Apply the following function to the previous output
                        until it stops changing (or forever, in this case),
                        starting with the empty list
    f             1     Find the first positive integer where
               +TG      The integer prepended to the current list
        m               Map to
           .Bd          Convert to binary
         .:   )         Form all subsequences
      -F                Fold the filter-out function over the list
                        This iteratively removes all subsequences already seen
                        from the candidate
     P                  Remove the last subsequence which is the whole number.
   (newline)            Print that first integer
 +G                     Prepend that first integer to the list


0

哈斯克尔, 172字节

import Data.List
b 0=""
b n=b(n`div`2)++(show$n`mod`2)
s=nub.(tails=<<).inits
p x=s x\\[x]
n(_,l)x|(p.b)x\\l/=[]=(x,l++(s.b)x)|1<2=(0,l)
filter(>1)$fst<$>scanl n(1,[])[1..]

在线尝试。

说明

该代码连续生成序列。

  • b返回的一个二进制表示Int作为String
  • s 返回字符串的所有子字符串
  • p 返回字符串的所有正确子字符串
  • n 是一个迭代应用的函数,返回一个包含以下内容的元组:
    • 当前元素(如果它是序列的成员),否则为0
    • 要检查以下所有数字的所有子串的列表
  • 最后,scanl用于n一遍又一遍地调用,并且其输出被过滤为仅包含大于1的元素

在打高尔夫球之前,这是一个更具可读性的版本:

import Data.List

binary :: Int -> String
binary 0=""
binary n|(d,r)<-divMod n 2=binary d++["01"!!r]

substrings :: String -> [String]
substrings xs = nub$inits xs>>=tails

properSubstrings :: String -> [String]
properSubstrings xs = substrings xs\\[xs]

sb  = substrings.binary
psb = properSubstrings.binary

g = scanl step (1,[]) [1..]
  where step (_,l) x | psb x \\ l /= [] = (x,l++sb x)
                     | otherwise        = (0,l)

f=filter(>1)$fst<$>g

0

JavaScript,57个字节

for(x=1;;x++)/^10|10(00)*$/.test(x.toString(2))&&alert(x)

让我们以二进制形式写给定数字n,然后:

  • 如果数字以开头10,则n必须按以下顺序:
    • 删除其中的第一个1字符串,因为二进制数n可能是包含该字符串的最小数字,所以必须看不到其余的二进制字符串
  • 如果数字以11: 开头
    • 通过删除其中的第一个1字符串,剩下的二进制字符串(让我们捐赠它,因为1x必须这样做,因为:
      • 数字1x按顺序排列,或者
      • 数字1x0在序列中,因为它包含唯一的子字符串1x
    • 如果它是奇数(以1结尾),则它不能按顺序出现,因为:
      • n -1)/ 2,或
      • n -1),因为它包含唯一的子字符串(n -1)/ 2
    • 如果是偶数(以0结尾),则它在序列中iff n / 2不在序列中
      • 出于相同的想法,当n / 2为奇数或n / 4在序列中时,n / 2 不在序列中

结论:

数字的二进制形式以101以奇数开头或结束0。或在正则表达式中描述:x match /^10|10(00)*$/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.