Görünmeyen sayılar üretin


15

Diyelim ki bir alt dize orijinal dizginin herhangi bir sürekli bölümüdür. Örneğin cat, bir alt dizesidir concatenate. Uygun bir alt dizenin, orijinal dizeye eşit olmayan bir alt dize olduğunu söyleyeceğiz . Örneğin concatenate, uygun bir alt dizeye ait bir alt dizedir, concatenateancak uygun bir alt dizedir. (tek karakter dizelerinin uygun alt dizeleri yoktur)

Şimdi bu terimleri kullanarak bir dizi tanımlayacağız. N Bu dizide vadede inci dizisindeki herhangi bir önceki dönem bir alt dize değil onun ikili bir temsil düzgün alt dize vardır, öyle ki en küçük sayı olacaktır. İlk terim 10.

Bir egzersiz olarak ilk 5 terimi üretelim. İşleri kolaylaştırmak için ikili olarak çalışacağım.

İlk terim 10. Yana 11küçük bir sonraki numara, sadece bir adet alt dize sahip 1, aynı zamanda, bir alt olup 10, 11sırayla değildir. 100Ancak uygun alt dize içermiyor 00bir alt dize değildir 10bu yüzden 100bir sonraki terimdir. Sırada diziye ekleyen 101benzersiz uygun alt dize 01, daha sonra diziye yeni ekleyen 110uygun alt dize 11bulunur.

Şimdi elimizde

10, 100, 101, 110

111Sıradaki, ancak yalnızca alt dizeleri içeriyor 1ve 11bir terim değil. 1000ancak 000diziye eklemeyi içerir .

İşte ondalık sayıdaki ilk çift terimler

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

Görev

ya

  • Al , n girdi olarak alır ve elde N (ya da 0 ya da 1 endeksli) bu sırayla inci terimi

  • Dizinin sürekli çıkış terimleri

Bu cevapları daha az bayt daha iyi ile bayt olarak puanlanır olduğunu.


Çıktının ondalık veya ikili olması mı gerekiyor? Ya da?
AdmBorkBork

@AdmBorkBork Tam sayı olması gerektiğini düşünüyorum.
Outgolfer Erik

100. terimi (veya başka bir büyük kelimeyi) ekleyebilir misiniz n?
Rod

@AdmBorkBork Herhangi bir standart izin verilen biçimde çıktı almalısınız.
Rock Garf Hunter Post

@ Çubuk 36 yeterince büyük mü? a(36)(47 indekslenmiştir).
Rock Garf Hunter Post

Yanıtlar:


5

Python 3 , 88 80 78 75 bayt

Buğday Sihirbazı sayesinde -6 bayt sayesinde
RootTwo
-3 bayt sayesinde notjagan sayesinde

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

Çevrimiçi deneyin!




@WheatWizard ninja'd
Rod

Python 3.6 bin(n)[2:]ile değiştirerek 2 tane daha tasarruf edebilirsiniz f"{n:b}".
RootTwo

Bazı tuhaf değişikliklerle -3 bayt .
notjagan


1

Mathematica, 116110 bayt

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

Dizinin koşullarını sonsuz olarak verir.

açıklama

x={};

x şu ana kadar dizinin terimler listesidir.

f=Subsequences[#~IntegerDigits~2]&

fa, Functionbir tam sayıyı alır ve tüm döndürür Subsequencestabanı arasında 2(boş listesi de dahil olmak üzere temsil {}ve tam listesi IntegerDigitskendiliğinden).

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

Değerlendirmek ...değeri için ngelen 2için .

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

Eğer ...bir False, daha sonra ikinci argüman And( &&) değerlendirilir asla. Eğer ...bir True, daha sonra Echo@nyazdırır ve iadeler n, biz o zaman AppendToliste x.

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

Uygun alt ndizesinin dizideki önceki herhangi bir terimin bir alt dizesi olmadığını kontrol etmek istiyoruz . Most@f@nuygun alt dizelerinin listesidirn , o zaman herhangi bir altdizgelerin olup olmadığını kontrol etmek s_a, MemberQlistesi, bu listenin f/@xdizisinin önceki terimlerin altdizgelerin listelerinin olan FreeQbir sseviyede 2.


1

Mathematica, 109 94 bayt

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


Dizinin sürekli çıkış terimleri

-15 bayt için @ngenisis'e özel thanx


Mathematica, 123 bayt

(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'yi girdi olarak al ve bu sırayla n. Terimi oluştur (1 dizinli)

giriş

[1000]

çıktı

1342


Şimdiye kadar ortaya çıkan alt dizeleri takip etmek iyi bir fikir! En azından casus 15gidebilir bayt: SubsetQiçin daha kısa ve eşdeğerdir ContainsAllkullanabileceğiniz Andyerine If, Uniongereksiz olduğunu ve Dohemen hemen daima daha kısadır For:s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]
ngenisis

3kullanarak daha fazla bayt Most:s={};Do[!SubsetQ[s,Most[t=Subsequences@IntegerDigits[i,2]]]&&(s=s~Join~t;Echo@i),{i,2,∞}]
ngenisis

0

Pyth , 20 bayt

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

Bu işlem diziyi sonsuz şekilde yazdırır. Sonuç olarak yalnızca çevrimdışı kullanılabilir.

Açıklama (Alan yeni bir satırdır):

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

Haskell, 172 bayt

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

Çevrimiçi deneyin.

açıklama

Kod diziyi sürekli olarak oluşturur.

  • bBir ikili gösterimi döner Intbir şekildeString
  • s bir dizenin tüm alt dizelerini döndürür
  • p bir dizenin tüm uygun alt dizelerini döndürür
  • n yinelemeli olarak uygulanan ve aşağıdakileri içeren bir demet döndüren bir işlevdir:
    • geçerli eleman, dizinin bir üyesiyse, aksi takdirde 0
    • aşağıdaki tüm numaralar için kontrol edilecek tüm alt dizelerin listesi
  • Son olarak, tekrar tekrar scanlaramak için kullanılır nve çıktısı sadece 1'den büyük elemanlar içerecek şekilde filtrelenir

İşte golf oynamadan önce biraz daha okunabilir bir versiyon:

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 bayt

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

Verilen n sayısını ikili biçimde yazalım , sonra:

  • Sayı ile başlıyorsa 10, n sırayla olmalıdır:
    • içindeki ilkini kaldırın, 1kalan ikili dize görülmemelidir, çünkü n bu dizeyi içerebilecek en küçük sayıdır
  • Sayı şununla başlarsa 11:
    • İçindeki ilk 1diziyi kaldırarak, kalan ikili dize (aşağıdaki gibi 1xgörülmesi gereken şekilde bağışlayalım :
      • sayı 1xsırayla veya
      • 1x0benzersiz dizgi içerdiğinden sayı dizide1x
    • Tuhafsa (1 ile bitiyorsa), sırayla olmamalıdır, çünkü:
      • sırayla ( n - 1) / 2 veya
      • ( n - 1), benzersiz alt dize içerdiğinden ( n - 1) / 2
    • Eşitse (0 ile biterse), iff n / 2 dizisinde değil
      • aynı fikirde, n / 2 dizide değil iff n / 2 garip veya n / 4 dizide

Sonuç:

sayının ikili şekli tek sayı 10ile başlar veya biter . Veya normal ifade: x eşleşmesinde açıklayın .10/^10|10(00)*$/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.