見えない数字を生成する


15

部分文字列は、元の文字列の連続したセクションであるとしましょう。たとえばcat、の部分文字列ですconcatenate適切な部分文字列は、元の文字列と等しくない部分文字列であると言います。たとえばconcatenate、サブストリングはサブストリングですconcatenateが、適切なサブストリングではありません。(単一の文字列には適切な部分文字列はありません)

これらの用語を使用してシーケンスを定義します。このシーケンスのn番目の用語は、そのバイナリ表現の適切なサブストリングがシーケンス内の以前の用語のサブストリングではないような最小数になります。最初の用語は10です。

演習として、最初の5つの用語を生成します。私は物事を簡単にするためにバイナリで作業します。

最初の用語は10です。ので、11次の最小数は、唯一の適切なサブ有し、1またのサブストリングである1011配列ではありません。 100しかし、適切なストリング含まない00のストリングではありません10ので100、私たちの次の用語です。次は、シーケンスに追加101する固有の適切なサブストリング01110含み、次にシーケンスに11追加する新しい適切なサブストリングを含みます。

今、私たちは持っています

10, 100, 101, 110

111次のアップですが、それは唯一のサブストリングが含ま111用語を、それをしていないし。 1000ただし000、シーケンスへの追加が含まれます。

10進数の最初のカップルの用語を次に示します

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索引付けされた)を、この順序で番目の用語を

  • シーケンスの継続的な用語の出力

これは、回答がバイト単位で記録され、バイト数が少ないほど良いことです。


出力は10進数または2進数のどちらですか?またはどちらか?
AdmBorkBork

@AdmBorkBork私はそれが整数であるべきだと思う。
エリックアウトゴルファー

100番目の用語(または他の大きなn)を追加できますか?
ロッド

@AdmBorkBork許可されている標準形式で出力する必要があります。
ポストロックガーフハンター

@Rod 36は十分な大きさですか?a(36)47(1インデックス付き)です。
ポストロックガーフハンター

回答:


5

Pythonの388の 80 78 75バイト

Wheat Wizardのおかげで-6バイト
-RootTwoのおかげで2バイト-notjaganの
おかげで-3バイト

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-
ロッド

Python 3.6では、に置き換えることbin(n)[2:]でさらに2つ節約できますf"{n:b}"
-RootTwo

-3バイトといくつかの本当に奇妙な変更。
notjagan


1

Mathematica、116 110バイト

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]&

fFunction整数を取り、Subsequencesそのベース2表現(空のリスト{}IntegerDigitsそれ自体の完全なリストを含む)のすべてを返します。

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

評価...の値をnから2

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

...isの場合FalseAnd&&)の2番目の引数は評価されません。...isの場合TrueEcho@n出力してリストnを返します。AppendTox

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,∞}]


シーケンスの継続的な用語の出力

-15バイトの@ngenisisへの特別な感謝


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使用できます、これは不要で、ほとんどの場合よりも短いです:AndIfUnionDoFors={};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をバイナリ形式で書きましょう:

  • 番号がで始まる場合10nは次の順序である必要があります。
    • nがそのような文字列を含む可能性のある最小数であるため、最初の1文字列を削除し、残りのバイナリ文字列が表示されないようにする
  • 番号がで始まる場合11
    • その中の最初の1バイナリ文字列を削除することにより、残りのバイナリ文字列(以下に示すように寄付し1xます:
      • 番号1xがシーケンス内にある、または
      • 番号1x0は、一意のサブ文字列を含むため、シーケンス内にあります1x
    • 奇数(1で終わる)の場合、シーケンスに含まれてはなりません。
      • n -1)/ 2シーケンス、または
      • n -1)シーケンス内。一意のサブ文字列(n -1)/ 2を含むため
    • 偶数(0で終わる)の場合、n / 2がシーケンスにない場合はシーケンスにあります
      • 同じ考えで、n / 2が奇数の場合、またはn / 4がシーケンス内にある場合、n / 2はシーケンス内にありません

結論:

数値のバイナリ形式は、で始まる101、奇数で終わるで終わり0ます。または、regex:x matchで記述し/^10|10(00)*$/ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.