Một chuỗi xoắn ốc


29

Lý lịch

Trình tự OEIS A272573 mô tả hình xoắn ốc trên lưới hình lục giác như sau:

Bắt đầu một vòng tròn số trên một lát hình lục giác, với hình lục giác ban đầu là a (1) = 1. a (n) là số nguyên dương nhỏ nhất không bằng hoặc liền kề với các lân cận của nó.

Trình tự bắt đầu

1, 2, 3, 4, 5, 6, 7, 4, 6, 8, 5, 9, 8, 10, 2, 11, ...

Dưới đây là một minh họa về mô hình xoắn ốc: nhập mô tả hình ảnh ở đây

  • a(11) != 1bởi vì sau đó 31sẽ liền kề ở hai nơi.
  • a(11) != 2bởi vì sau đó 32sẽ liền kề ở hai nơi.
  • a(11) != 3bởi vì sau đó 3sẽ liền kề với chính nó.
  • a(11) != 4bởi vì sau đó 34sẽ liền kề ở hai nơi.
  • Do đó a(11) = 5.

Thử thách

Thách thức là viết một chương trình tính toán A272573 . Đây là , vì vậy mã ngắn nhất sẽ thắng.


Tôi không thể nhìn thấy hình ảnh như nó bị chặn ở đây, vì vậy có lẽ tôi đang thiếu cái gì, nhưng ví dụ của bạn hiển thị một (11) = 4, nhưng trong danh sách chuỗi của bạn một (11) là 5.
Geobits

Chỉ là một lỗi lầm cảm ơn vì đã bắt nó.
Peter Kagey

7
Trình tự OEIS này đã được gửi bởi chính bạn, rõ ràng. Tốt đẹp. :)
Arnauld

giới hạn cho n là gì? co giơi hạn thơi gian không ?
Setop

5
Đang chờ câu trả lời của Hexagony ...
Jonathan Allan

Câu trả lời:


23

JavaScript (ES6),  267 .. 206  199 byte

Trả về một mảng chứa N điều khoản đầu tiên của chuỗi.

n=>(F=v=>++i<n?F([...v,(A=N[i]=[1,!j++||d+1,j%L?d:(j%=L*6)?++d:L++&&d++].map(k=>N[k=i-k].push(i)&&k),g=k=>v[E='every']((V,x)=>V-k|N[x][E](y=>A[E](z=>v[y]-v[z])))?k:g(-~k))()]):v)([L=1],N=[[i=j=d=0]])

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

Làm sao?

Định nghĩa

Theo quy ước, chúng ta sẽ gọi ô góc là một ô chỉ có một cạnh chung với lớp trước của hình xoắn ốc và ô bên là một ô có hai cạnh chung với lớp trước. Theo đề xuất của Ourous, chúng ta cũng có thể nghĩ về chúng như các ô thứ tự 1 và ô thứ tự 2 tương ứng.

Các ô góc được hiển thị màu vàng bên dưới. Tất cả các ô khác là các ô phụ (trừ ô trung tâm là trường hợp đặc biệt).

loại tế bào

Về hàng xóm di động

Chúng tôi thực sự không cần phải theo dõi tọa độ của các ô trên lưới. Điều duy nhất mà chúng ta cần biết là danh sách các ô lân cận cho mỗi ô trong vòng xoắn ốc tại bất kỳ thời điểm nào.

Trong các sơ đồ sau, các lân cận trong lớp trước được hiển thị trong bóng râm và các lân cận bổ sung trong lớp hiện tại trong bóng tối hơn.

Một ô có 2 lân cận trong số các ô trước nếu:

  • đó là ô phụ đầu tiên của một lớp mới (như 8 )
  • hoặc đó là một ô góc, nhưng không phải là ô cuối cùng (như 9 )

2 hàng xóm

Một ô có 3 lân cận trong số các ô trước nếu:

  • nó là một tế bào phụ, nhưng không phải là lớp đầu tiên của lớp (như 10 )
  • hoặc đó là ô góc cuối cùng của lớp hiện tại (như 19 )

3 hàng xóm

Thực hiện hàng xóm di động

1tôinMột[n]

1-1

[                    //
  1,                 // the previous cell is always a neighbor of the current cell
  !j++ || d + 1,     // if this is not the first cell of the layer, the cell at -(d + 1)
                     // is a neighbor (otherwise, we insert 1 twice; doing it that way
                     // saves bytes and having duplicate neighbors is not a problem)
  j % L ?            // if this is a side-cell:
    d                //   the cell at -d is a neighbor
  :                  // else (corner-cell):
    (j %= L * 6) ?   //   if this is not the last cell:
      ++d            //     insert the dummy duplicate neighbor at -(d + 1); increment d
    :                //   else (last cell):
      L++ && d++     //     the cell at -d is a neighbor; increment L; increment d
]                    //

Trong đoạn mã trên:

  • L1
  • j16×L
  • d

map()ktôi-k

.map(k =>
  N[k = i - k].push(i) && k
)

Tìm thuật ngữ tiếp theo của chuỗi

k

nv[n]

( g =                 // g = recursive function taking
  k =>                // the candidate value k
    v.every((V, x) => // for each previous cell of value V at position x, make sure that:
      V - k           //   V is not equal to k
      |               //   OR
      N[x].every(y => //   for each neighbor y of x:
        A.every(z =>  //     for each neighbor z of the current cell:
          v[y] - v[z] //       the value of y is not equal to the value of z
        )             //     end
      )               //   end
    )                 // end
    ?                 // if the above conditions are fulfilled:
      k               //   stop recursion and return k
    :                 // else:
      g(-~k)          //   try again with k + 1
)()                   // initial call to g with k undefined (this will cause V - k to be
                      // evaluated as NaN and force the 1st iteration to fail)

Giải thích tuyệt vời. Một cải tiến có thể có: làm cho các giải thích trong các khối mã hiển thị đầy đủ mà không cần phải cuộn ngang (không quan trọng đối với mã được đánh gôn). Xem trong Firefox, có 5 cột ẩn trong khối mã giải thích đầu tiên và 6 cột ẩn trong thứ hai.
trichoplax

@trichoplax Cảm ơn bạn đã bình luận và đề nghị của bạn. Bạn có thể chỉ định phiên bản Firefox nào bạn đang sử dụng và trên nền tảng nào không? Tôi luôn cố gắng định dạng các khối giải thích để không cần cuộn ngang. Tôi đang sử dụng Firefox 65 / Win10 và tôi không có cột nào bị ẩn.
Arnauld

Sẽ kiểm tra phiên bản Firefox khi tôi về nhà, nhưng có thể là do tôi đang ở trên Fedora. Sẽ kiểm tra trên một hệ điều hành khác và cho bạn biết
trichoplax

1
Nó dường như thay đổi bởi hệ điều hành. Sẽ nêu lên điều này trên MSE khi tôi có cơ hội thu thập một số bằng chứng (nếu nó chưa có)
trichoplax

1
Tôi đã nêu ra điều này trên MSE . Vui lòng chỉnh sửa nếu bất kỳ ai nhìn thấy các kết hợp hệ điều hành / trình duyệt khác hiển thị các thanh cuộn ngang.
trichoplax

7

Sạch sẽ , 284 279 272 262 byte

import StdEnv
l=[0,-1,-1,0,1,1]
c(u,v)(p,q)=(u-p)^2+(v-q)^2<2||(u-p)*(q-v)==1
$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]

$(scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]])[]

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

Tạo chuỗi mãi mãi.

Ánh xạ lục giác

Hầu hết các mã đi vào ánh xạ các hình lục giác duy nhất theo (x,y)tọa độ sao cho có một hàm đơn giản, đơn giản để xác định tính phụ thuộc cho tất cả các ánh xạ điểm.

Các điểm được ánh xạ trông như thế này:

              ---
        --- < 2,-2> ---       x-axis ___.X'
  --- < 1,-2> === < 2,-1> ---  /__.X'
< 0,-2> === < 1,-1> === < 2, 0>'
  === < 0,-1> === < 1, 0> ===
<-1,-1> === < 0, 0> === < 1, 1>
  === <-1, 0> === < 0, 1> ===
<-2, 0> === <-1, 1> === < 0, 2>.__
  --- <-2, 1> === <-1, 2> ---  \  'Y.___
        --- <-2, 2> ---       y-axis    'Y.
              ---

Từ đó, việc xác định kề là không đáng kể và xảy ra khi một trong:

  • x1 == x2abs(y1-y2) == 1
  • y1 == y2abs(x1-x2) == 1
  • y1 == y2 - 1x2 == x1 - 1
  • y1 == y2 + 1x2 == x1 + 1
  • x1 == x2y1 == y2

Thế hệ điểm

Lưu ý rằng khi đi qua hình lục giác theo hình xoắn ốc, sự khác biệt sẽ tái diễn cho mỗi lớp n:

  1. n các bước của (1,0)
  2. n-1 các bước của (1,-1)
  3. n các bước của (0,-1)
  4. n các bước của (-1,0)
  5. n các bước của (-1,1)
  6. n các bước của (0,1)

Điều này tạo ra các điểm theo đúng thứ tự bằng cách lấy tổng các tiền tố của chuỗi này:

scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]]

Mang nó lại với nhau

Mã thực sự tìm thấy chuỗi từ câu hỏi chỉ là:

$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]

Mà lần lượt chủ yếu là lọc bởi and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]

Bộ lọc này lấy điểm từ m(danh sách các điểm đã được ánh xạ) theo:

  • Bỏ qua các số tự nhiên bằng với bất kỳ j
  • Đối với mọi (i,j)nơi iliền kềp
  • Đối với mọi (p,q)nơi mà giá trị qbằngv
  • Đối với mọi (u,v)nơi uliền kề với điểm hiện tại
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.