보이지 않는 숫자 생성


15

부분 문자열은 원래 문자열의 연속 섹션이라고 가정하겠습니다. 예를 들어 cat의 하위 문자열입니다 concatenate. 적절한 부분 문자열은 원래 문자열과 다른 부분 문자열 이라고 말할 것입니다 . 예를 들어 concatenate(A)의 서브 스트링 concatenate이 아닌 적당한 문자열. (단일 문자열에는 적절한 하위 문자열이 없습니다)

이제이 용어를 사용하여 순서를 정의하겠습니다. N 이 순서 용어 번째 시퀀스의 모든 이전 기간의 일부가 아니 이진 표현의 적절한 문자열이되도록 작은 수있을 것이다. 첫 번째 용어는 10입니다.

연습으로 처음 5 개의 항을 생성 할 수 있습니다. 나는 일을 더 쉽게하기 위해 바이너리로 작업 할 것입니다.

첫 번째 용어는 10입니다. 이후 11다음의 최소 수, 하나의 적당한 문자열 가지고 1도의 문자열이며 10, 11순서가 아니다. 100그러나 하위 문자열 00이 아닌 적절한 하위 문자열 을 포함 10하므로 100다음 용어입니다. 다음은 시퀀스에 추가 101하는 고유 한 적절한 하위 문자열 01110포함하고 시퀀스에 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 (0 또는 1 인덱스)을이 순서로 제 용어

  • 시퀀스의 연속 출력 항

이것은 응답이 바이트 단위로 점수가 적을수록 좋습니다.


출력은 10 진수 또는 2 진수로되어 있습니까? 아니면?
AdmBorkBork

@ AdmBorkBork 정수라고 생각합니다.
아웃 골퍼 에릭

100 번째 항을 추가 할 수 n있습니까?
Rod

@AdmBorkBork 표준 허용 형식으로 출력해야합니다.
Post Rock Garf Hunter

@로드 36은 충분합니까? a(36)47 (1 인덱스)입니다.
Post Rock Garf Hunter

답변:


5

파이썬 3 , 88 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
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]&

fFunction정수를 취하고 모든 Subsequences기본 2표현 (빈 목록 {}및 전체 목록 포함)을 반환합니다IntegerDigits .

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

에서 까지의 ...가치 평가n2 .

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

...is False인 경우 And( &&)에 대한 두 번째 인수 는 평가되지 않습니다. 경우 ...이며 True, 다음 Echo@n인쇄 및 반환 n, 이는 우리가 다음 AppendTo목록x .

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

올바른 하위 문자열 중 일부 n가 시퀀스에서 이전 용어의 하위 문자열이 아닌지 확인하려고합니다 . Most@f@n적절한 하위 목록은 n어떤 문자열이 있는지, 그리고 나서 검사 s_A는 MemberQ리스트 것을 그리스트 등의 f/@x이전 기간의 하위 목록의 시퀀스가된다 FreeQ으로는s 수준이 2.


1

매스 매 티카, 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, And대신 사용할 수 있고 If, Union불필요하고 Do거의 항상보다 짧다 For:s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]
ngenisis

3를 사용하여 더 많은 바이트 Most:s={};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의 이진 표현 반환 IntA와를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

자바 스크립트, 57 바이트

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

주어진 숫자 n 을 이진 형식으로 작성해 보자 .

  • 숫자가로 시작 10하면 n 은 다음 순서로 있어야합니다.
    • n 은 그러한 문자열을 포함 할 수있는 가장 작은 숫자 1이므로 첫 번째 를 제거하면 나머지 이진 문자열을 볼 수 없습니다.
  • 숫자가 다음으로 시작하는 경우 11:
    • 그중 첫 번째를 제거함으로써 1, 나머지 바이너리 문자열 (다음 1x부터보아야 할 것처럼 기부하도록하자 :
      • 숫자 1x가 순서대로 있거나
      • 숫자 1x0는 고유 한 하위 문자열을 포함하므로 시퀀스에 있습니다.1x
    • 홀수 인 경우 (1로 끝남) 다음과 같은 이유로 시퀀스에 포함되지 않아야합니다.
      • 순서대로 ( n -1) / 2 또는
      • ( N 순서 - 1)는 (고유의 서브 문자열을 포함 이후 N / 2 - 1)
    • 짝수 인 경우 (0으로 끝남) 시퀀스에 있음 iff n / 2가 시퀀스에없는 경우
      • 같은 생각으로 n / 2는 시퀀스에 없습니다 iff n / 2가 홀수이거나 n / 4가 시퀀스에 있습니다

결론:

숫자의 이진 형식은 홀수의로 시작 10하거나 끝납니다 . 또는 정규식에서 설명하십시오 : x match .10/^10|10(00)*$/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.