피보나치 수열 Mod K에서 빠진 숫자 찾기


20

이 Math.SE 질문에서 영감을 얻었습니다 .

배경

피보나치 시퀀스 (전화가 F)부터 순서이다 0, 1각 숫자 (하도록 F(n)(처음 두 후)의) 그 전에 두개의 합이다 ( F(n) = F(n-1) + F(n-2)).

피보나치 시퀀스 모드 K ( M)는 피보나치 수 모드 K ( M(n) = F(n) % K) 의 시퀀스입니다 .

피보나치 시퀀스 모드 K는 각각의 값이 이전 쌍에 의해 결정되기 때문에 모든 K에 대해 주기적이며, K 보다 작은 음이 아닌 정수의 K 2 가능한 쌍만 존재한다는 것을 알 수 있습니다. 피보나치 시퀀스 모드 K 는 첫 번째 반복되는 용어 쌍 뒤에 순환 적이며, 첫 번째 반복되는 단어 쌍이 나타나기 전에 피보나치 시퀀스 모드 K에 나타나지 않는 숫자입니다.

K = 4의 경우

0 1 1 2 3 1 0 1 ...

K = 8의 경우

0 1 1 2 3 5 0 5 5 2 7 1 0 1 ...

K = 8, 4 및 6은 반복 전에 나타나지 0 1않으므로 4와 6은 피보나치 시퀀스 모드 8에 나타나지 않습니다.

도전

K가 0보다 큰 정수 를 지정하면 피보나치 시퀀스 모드 K에 나타나지 않는 K보다 작은 음이 아닌 정수를 모두 출력합니다 .

규칙

  • 기본 허점은 금지되어 있습니다.

  • I 기본 / O를 .

  • 프로그램이나 기능이 허용 됩니다.

  • K 가 네이티브 정수 유형에 적합 하다고 가정 할 수 있습니다 ( 이유 내 ).

  • K보다 작은 음수가 아닌 숫자가 피보나치 시퀀스 모드 K에 나타나지 않으면, 프로그램 / 기능은 그러한 모든 숫자를 합리적인 방식으로 출력해야합니다.

  • 피보나치 시퀀스 모드 K에 나타나지 않는 K보다 작은 음이 아닌 정수가 없으면 프로그램 / 함수는 빈 목록을 반환하거나 아무것도 인쇄하지 않고 오류를 생성하는 등으로이를 나타낼 수 있습니다.

  • 순서는 중요하지 않습니다.

  • 이것은 이므로 각 언어에서 가장 짧은 대답이 이깁니다.

테스트 사례

온라인으로 테스트 사례를 생성하십시오!

비어 있지 않은 테스트 사례

  8 [4, 6]
 11 [4, 6, 7, 9]
 12 [6]
 13 [4, 6, 7, 9]
 16 [4, 6, 10, 12, 14]
 17 [6, 7, 10, 11]
 18 [4, 6, 7, 9, 11, 12, 14]
 19 [4, 6, 7, 9, 10, 12, 14]
 21 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 19]
 22 [4, 6, 7, 9, 15, 17, 18, 20]
 23 [4, 7, 16, 19]
 24 [4, 6, 9, 11, 12, 14, 15, 18, 19, 20, 22]
 26 [4, 6, 7, 9, 17, 19, 20, 22]
 28 [10, 12, 14, 16, 18, 19, 23]
 29 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27]
 31 [4, 6, 9, 12, 14, 15, 17, 18, 19, 22, 25, 29]
 32 [4, 6, 10, 12, 14, 18, 20, 22, 26, 28, 30]
 33 [4, 6, 7, 9, 15, 17, 18, 20, 24, 26, 27, 28, 29, 31]
 34 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28, 30]
 36 [4, 6, 7, 9, 10, 11, 12, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32]
 37 [9, 10, 14, 17, 20, 23, 27, 28]
 38 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 36]
 39 [4, 6, 7, 9, 15, 17, 19, 20, 22, 24, 30, 32, 33, 35]
...
200 [4, 6, 12, 14, 20, 22, 28, 30, 36, 38, 44, 46, 52, 54, 60, 62, 68, 70, 76, 78, 84, 86, 92, 94, 100, 102, 108, 110, 116, 118, 124, 126, 132, 134, 140, 142, 148, 150, 156, 158, 164, 166, 172, 174, 180, 182, 188, 190, 196, 198]
...
300 [6, 18, 30, 42, 54, 66, 78, 90, 102, 114, 126, 138, 150, 162, 174, 186, 198, 210, 222, 234, 246, 258, 270, 282, 294]
...
400 [4, 6, 10, 12, 14, 20, 22, 26, 28, 30, 36, 38, 42, 44, 46, 52, 54, 58, 60, 62, 68, 70, 74, 76, 78, 84, 86, 90, 92, 94, 100, 102, 106, 108, 110, 116, 118, 122, 124, 126, 132, 134, 138, 140, 142, 148, 150, 154, 156, 158, 164, 166, 170, 172, 174, 180, 182, 186, 188, 190, 196, 198, 202, 204, 206, 212, 214, 218, 220, 222, 228, 230, 234, 236, 238, 244, 246, 250, 252, 254, 260, 262, 266, 268, 270, 276, 278, 282, 284, 286, 292, 294, 298, 300, 302, 308, 310, 314, 316, 318, 324, 326, 330, 332, 334, 340, 342, 346, 348, 350, 356, 358, 362, 364, 366, 372, 374, 378, 380, 382, 388, 390, 394, 396, 398]
...

테스트 케이스 비우기 (출력, 오류, 비어있는 목록 등이 허용되지 않는 출력)

1, 2, 3, 4, 5, 6, 7, 9, 10, 14, 15, 20, 25, 27, 30, 35 ... 100 ...

관련 :

피보나치 궤도 계산

피사노 시대 찾기


답변:



6

하스켈 , 70 바이트

Esolanging Fruit 덕분에 일정량의 바이트 절약

Laikoni 덕분에 8 바이트 절약

a=1:scanl(+)1a
f x=[u|u<-[2..x-1],and[mod b x/=u|(_,b)<-zip[1..x^2]a]]

온라인으로 사용해보십시오!


@EsolangingFruit 아 감사합니다! 나는 방금 비슷한 결론을 내렸다.
위트 마법사

read$showfromInteger이 경우 대신 작동 하고 2 바이트를 저장합니다.
Laikoni

zip[1..x^2]잘라내기에 사용하면 바이트가 더 절약됩니다. 온라인에서 사용해보십시오!
Laikoni

@Laikoni 시간이 걸렸지 만 변경했습니다. 고마워, 좋은 생각이야
밀 마법사

5

펄 6 ,  43 42 39  32 바이트

{^$_ (-)(1,1,(*+*)%$_...->\a,\b{!a&&b==1})}

그것을 테스트

{^$_∖(1,1,(*+*)%$_...->\a,\b{!a&&b==1})}

그것을 테스트

{^$_∖(1,1,(*+*)%$_...{!$^a&&$^b==1})}

그것을 테스트

{^$_∖(1,1,(*+*)%$_...!*&*==1)}

그것을 테스트

넓히는:

{  # bare block lambda with implicit parameter 「$_」

  ^$_               # Range upto and excluding the input

                   # set minus (U+2216)

  (                 # generate the Fibonacci sequence mod k

    1, 1,           # seed the sequece (can't be 0,1)

    ( * + * ) % $_  # add two values and modulus the input (lambda)

    ...             # keep doing that until

                    # it matches 0,1
    !*              #   negate the first param (1 when 0)
    &               #   and Junction
    *               #   second param
    == 1            #   both match 1

  )
}

3

> <> , 48 바이트

01\
?!\:&+{:}%:1$0p&$:
v0\~:1=?
>?!;1-::0g?!nao:

온라인으로 사용해보십시오!

-v 플래그를 통해 입력을받습니다.

초과 줄 바꿈을 많이 인쇄하지만 작업을 완료합니다. 기본적으로 첫 번째 줄을 사용하여 지금까지 시퀀스에 나타난 숫자 세트를 저장합니다.

작동 방식 :

01\    Input is already on the stack
...... Initialises the sequence with 1 and 0
...... Goes to the second line
......

......
..\:&+{:}% Gets the next number in the modded Fibonacci sequence while preserving the previous number
......
......

......
..........:1$0p&$: Puts a 1 at that cell number on the first line
.......
.......

......             If the number is a 0 go to the third line
?!\..............: Check if the next number is a 1, meaning we've reached the end of the sequence
v0\~:1=?           Go to the fourth line if so
>.....             Re-add the 0 and go back to the second line if not

......           While input:
......             Get the cell from the first line
......             If not 0: print the number
>?!;1-::0g?!nao:   Finally, print a newline and decrement the input




2

껍질 , 13 12 10 바이트

-2 바이트를위한 @Zgarb에게 감사합니다!

-U2m%⁰İfŀ⁰

모든 정수가 나타나면 빈 목록을 인쇄하고 온라인으로 시도하십시오!

설명

-U2m%⁰İfŀ⁰  -- named argument ⁰, example with: 8
-           -- difference of
        ŀ⁰  -- | lowered range: [0,1,2,3,4,5,6,7]
            -- and
      İf    -- | Fibonacci sequence: [1,1,2,3,5,8,13,21,34,55,89,144,233,377…
   m%⁰      -- | map (modulo ⁰): [1,1,2,3,5,0,5,5,2,7,1,0,1,1…
 U2         -- | keep longest prefix until 2 adjacent elements repeats: [1,1,2,3,5,0,5,5,2,7,1,0,1]
            -- : [4,6]

U2인접한 쌍이 반복되지 않는 가장 긴 접두사를 얻는 데 사용할 수 있습니다 .
Zgarb


2

R, 92 86 바이트

6 바이트를 절약 한 @Giuseppe 에게 감사드립니다 !

function(k,n=!!0:2){while(any((z=tail(n,2))-n[1:2]))n=c(n,sum(z)%%k);setdiff(1:k-1,n)}

온라인으로 사용해보십시오!

매우 간단한 구현 ( 이전 버전 이지만 동일한 개념) :

function(k,
         K=1:k-1,      #Uses default arguments to preset variables for legibility 
         n=c(0,1,1)){  #(wouldn't change byte-count to put them in the body of the function)
    while(any((z=tail(n,2))!=n[1:2])) #Do as long as first 2 elements are not identical to last 2 elements
        n=c(n,sum(z)%%k) #Built the fibonacci mod k sequence
    K[!K%in%n] #Outputs integers < k if not in sequence.
}


@ 주세페 아 setdiff, 좋은 생각!
plannapus

1:k^2모든 사람이 사용 하는 접근 방식을 포팅하는 70 바이트
Giuseppe

2

파이썬 3 173 152 143 131 바이트

f=lambda n,m,a=0,b=1:a%m if n<=0else f(n-1,m,b,a+b)
p=lambda n,i=2,y={0}:y^{*range(n)}if f(i,n)==1>f(i-1,n)else p(n,i+1,y|{f(i,n)})

@ovs에게 감사드립니다.

온라인으로 사용해보십시오

어떻게 작동합니까?

첫 번째 함수는 두 개의 매개 변수 m과 n을 취하고 n 번째 피보나치 수 mod m을 반환합니다. 두 번째 함수는 피보나치 수 mod k를 반복하고 0과 1이 반복되는지 확인합니다. 숫자를 목록에 저장하고 숫자 1-n을 포함하는 목록과 비교합니다. 중복 번호가 제거되고 나머지 번호가 반환됩니다.


헤더의 일부이며 코드에 반드시 포함되어야하는 것은 아닙니다.
Manish Kundu

알았어 @ovs 말해 주셔서 감사합니다.
Manish Kundu

1
set()체인 비교 대신 중괄호를 사용하여 세트를 작성하여 131 바이트 .
ovs


2

루비 , 47 바이트

->n{a=b=1;[*1...n]-(1..n*n).map{a,b=b,a+b;a%n}}

온라인으로 사용해보십시오!

동일한 논리 중 일부를 사용하지만 GB의 Answer를 기반으로하지는 않습니다 .

설명:

->n{
  a=b=1;   # start sequence with 1,1
  [*1...n] # all the numbers from 1 to n-1 as an array
           # 0 is excluded as it should never be in the final answer 
  -  # set operation; get all items in the first set and not in the second
  (1..n*n).map{ # n squared times
    a,b=b,a+b;  # assign next fibonacci numbers 
    a%n         # return a fibonacci number mod n
  }    # Map to an array
}



1

엘릭서 , 148144 바이트

 fn x->Enum.to_list(1..x-1)--List.flatten Enum.take_while Stream.chunk(Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end),2),&Enum.sum(&1)!=1end

온라인으로 사용해보십시오!

특히 경쟁적인 답변은 아니지만 골프에 정말 재미있었습니다! 엘릭서는 꽤 읽기 쉬운 언어이지만 중간에 등장하는 인물의 혼란에 대한 설명은 다음과 같습니다.


이 설명은 모드 피보나치와 그 작동에 관한 두 섹션으로 구성되어 있습니다

Mod-fib :

Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end)

이것은 무한한 피보나치 mod 스트림을 반환합니다 x. accumulator로 시작하여 {1,1}주어진 accumulator {p,n}라는 출력 p mod x을 스트림에 출력 합니다. 그런 다음 누산기를로 설정하십시오 {n,p+n}.

나머지:

fn x->                              Define a fxn f(x) that returns
  Enum.to_list(1..x-1)--            The numbers from 1..x-1 that are not in
  List.flatten                      The flattened list constructed by
    Enum.take_while                 Taking from mod-fib until
      Stream.chunk(                 A 2-size chunk
        Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end) (of mod fib)
        ,2)
      ,&Enum.sum(&1)!=1             sums to 1, representing [0,1] or [1,0]
end



1

자바 스크립트 (ES6), 84 바이트

f=(n,a=0,b=1,q=[...Array(n).keys()])=>a*b+a-1?f(n,b,(a+b)%n,q,q[b]=0):q.filter(x=>x)

1

파이썬 3, 76 바이트

def t(n,r=[1]):
 while n*n>len(r):r+=[sum(r[-2:])%n]
 return{*range(n)}-{*r}

이것은 단순히 피보나치 수의 가장 긴주기 (n ^ 2)를 살펴보고 해당 시간에 발생하는 모든 숫자의 목록을 만듭니다. 논리를 단순화하기 위해 숫자는 모듈로 n으로 저장됩니다.

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