Tìm các số bị thiếu trong Chuỗi thứ tự Fibre Mod K


20

Lấy cảm hứng từ câu hỏi Math.SE này .

Lý lịch

Các dãy số Fibonacci (gọi F) là trình tự, bắt đầu 0, 1như vậy mà mỗi số ( F(n)) (sau khi hai người đầu tiên) là tổng của hai trước khi nó ( F(n) = F(n-1) + F(n-2)).

Một dãy số Fibonacci mod K (gọi M) là chuỗi các con số Fibonacci mod K ( M(n) = F(n) % K).

Có thể chỉ ra rằng mod Fibre Sequence mod K là chu kỳ cho tất cả K, vì mỗi giá trị được xác định bởi cặp trước đó và chỉ có K 2 cặp số nguyên không âm có thể nhỏ hơn cả K. Bởi vì mod thứ tự Fibonacci K là chu kỳ sau cặp thuật ngữ lặp lại đầu tiên của nó, một số không xuất hiện trong chế độ Fibre Sequence mod K trước khi cặp thuật ngữ lặp lại đầu tiên sẽ không bao giờ xuất hiện.

Với K = 4

0 1 1 2 3 1 0 1 ...

Với K = 8

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

Lưu ý rằng đối với K = 8, 4 và 6 không xuất hiện trước khi lặp lại 0 1, do đó, 4 và 6 sẽ không bao giờ xuất hiện trong chế độ Fibre Sequence mod 8.

Thử thách

Với một số nguyên K hoàn toàn lớn hơn 0, xuất ra tất cả các số nguyên không âm nhỏ hơn K không xuất hiện trong mô-đun Fibonacci Sequence K.

Quy tắc

  • Lỗ hổng mặc định bị cấm .

  • I / O mặc định .

  • Các chương trình hoặc chức năng được chấp nhận .

  • Bạn có thể giả sử rằng K sẽ phù hợp với loại số nguyên gốc của bạn ( trong lý do ).

  • Nếu có các số không âm nhỏ hơn K không xuất hiện trong mô-đun Fibre Sequence K, chương trình / hàm của bạn sẽ xuất ra tất cả các số đó theo bất kỳ cách hợp lý nào.

  • Nếu không có số nguyên không âm nào nhỏ hơn K không xuất hiện trong chế độ Fibre Sequence mod K, chương trình / hàm của bạn có thể chỉ ra điều này bằng cách trả về một danh sách trống, không in gì, tạo ra lỗi, v.v.

  • Đặt hàng không quan trọng.

  • Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.

Các trường hợp thử nghiệm

Tạo trường hợp thử nghiệm trực tuyến!

Các trường hợp kiểm tra không trống

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

Các trường hợp kiểm tra trống (không có đầu ra, lỗi, danh sách trống, v.v. là đầu ra chấp nhận được)

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

Liên quan:

Đếm các quỹ đạo Fibonacci

Tìm thời kỳ Pisano


Câu trả lời:



6

Haskell , 70 byte

Một số lượng byte được lưu nhờ vào Esolanging Fruit

8 byte được lưu nhờ Laikoni

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

Hãy thử trực tuyến!


@EsolangingFnut Ah cảm ơn! Tôi chỉ đi đến một kết luận tương tự bản thân mình.
Phù thủy lúa mì

read$showhoạt động thay vì fromIntegertrong trường hợp này và tiết kiệm hai byte.
Laikoni

Sử dụng zip[1..x^2]để cắt ngắn tiết kiệm thêm một số byte: Hãy thử trực tuyến!
Laikoni

@Laikoni Mất một lúc nhưng tôi đã thay đổi. Cảm ơn, đó là một ý tưởng tốt.
Thuật sĩ lúa mì

5

Perl 6 ,  43 42 39  32 byte

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

Kiểm tra nó

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

Kiểm tra nó

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

Kiểm tra nó

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

Kiểm tra nó

Mở rộng:

{  # 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 byte

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

Hãy thử trực tuyến!

Đưa đầu vào qua cờ -v.

In rất nhiều dòng mới, nhưng hoàn thành công việc. Điều này về cơ bản sử dụng dòng đầu tiên để lưu trữ tập hợp các số đã xuất hiện cho đến nay trong chuỗi.

Làm thế nào nó hoạt động:

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


3

MATL , 19 18 byte

0lbU:"yy+]vG\G:qX~

Hãy thử trực tuyến!

-1 byte nhờ Guiseppe.

  bU:"   ]         % Do K^2 (>6K) times.
0l    yy+          %  Fibbonaci
                X~ % Set exclusive difference between
          vG\      %  the fibonacci numbers mod K
             G:q   %  and 0...K-1

18 byte ; sắp xếp lại phục hồi việc sử dụng của bạn X~!
Giuseppe

@Giuseppe Cảm ơn! Vẫn còn rất lâu mặc dù ....
Sanchises


2

Husk , 13 12 10 byte

Cảm ơn @Zgarb cho -2 byte!

-U2m%⁰İfŀ⁰

In một danh sách trống trong trường hợp tất cả các số nguyên xuất hiện, hãy thử trực tuyến!

Giải trình

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

Bạn có thể sử dụng U2để có được tiền tố dài nhất trong đó không có cặp liền kề nào lặp lại.
Zgarb


2

R 92 86 byte

Cảm ơn @Giuseppe lưu 6 byte!

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)}

Hãy thử trực tuyến!

Triển khai khá đơn giản ( phiên bản trước , nhưng cùng một khái niệm):

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


@Giuseppe ah setdiff, ý kiến ​​hay!
plannapus

70 byte chuyển 1:k^2cách tiếp cận mà mọi người khác sử dụng
Giuseppe

2

Python 3, 173 152 143 131 byte

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)})

Cảm ơn đặc biệt đến @ovs.

Dùng thử trực tuyến

Làm thế nào nó hoạt động?

Hàm đầu tiên có hai tham số m và n, và nó trả về số thứ tự Fibre thứ n mod m. Hàm thứ hai lặp qua các số Fibonacci mod k và kiểm tra xem 0 và 1 có được lặp lại không. Nó lưu các số trong một danh sách và so sánh nó với một danh sách chứa các số 1-n. Các số trùng lặp được loại bỏ và các số còn lại được trả lại.


Đây là một phần của tiêu đề và không bắt buộc phải bao gồm trong mã.
Manish Kundu

Được rồi xong. @ovs Cảm ơn bạn đã nói, tôi không biết về nó.
Manish Kundu

1
131 byte bằng cách tạo các bộ có dấu ngoặc nhọn thay vì set()so sánh và xâu chuỗi.
trứng


2

Ruby , 47 byte

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

Hãy thử trực tuyến!

Mặc dù nó sử dụng một số logic tương tự, nhưng điều này không dựa trên Câu trả lời của GB .

Giải trình:

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

Thuốc tiên , 148 144 byte

 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

Hãy thử trực tuyến!

Không phải là một câu trả lời đặc biệt cạnh tranh, nhưng thực sự thú vị khi chơi golf! Elixir là một ngôn ngữ khá dễ đọc, nhưng một lời giải thích cho sự lộn xộn của các nhân vật ở giữa.


Giải thích này có hai phần, mod-Dailymotion và hoạt động trên đó

Mod-xơ:

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

Điều này trả về một dòng vô hạn của MySpace mod x. Nó bắt đầu với một bộ tích lũy {1,1}và áp dụng quảng cáo hoạt động sau đây: bộ tích lũy đã cho {p,n}, đầu ra p mod xcho luồng. Sau đó, đặt bộ tích lũy thành {n,p+n}.

Phần còn lại:

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

Python 3, 76 byte

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

Điều này chỉ đơn giản là xem qua chu kỳ dài nhất của các số Fibonnaci (n ^ 2) và tạo ra một danh sách tất cả các số xảy ra trong thời gian đó. Để đơn giản hóa logic, các số được lưu trữ modulo n.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.