Dây chuyền nhị phân nguyên thủy có thể đảo ngược


8

Giới thiệu - Vòng cổ là gì?

Vòng cổ là thứ mà mọi người OEIS bị ám ảnh. Thử thách OEIS có 5 chuỗi vòng cổ.

Một sợi dây chuyền nhị phân có độ dài nlà một vòng lặp với nhạt đó là một trong hai 0hoặc 1. Hai dây chuyền là như nhau nếu một cái có thể được xoay để trở thành cái kia, và hai dây chuyền có thể đảo ngược là như nhau nếu một cái có thể được xoay, đảo ngược, hoặc đảo ngược và xoay để trở thành cái khác.

Một vòng cổ nguyên thủy là một thứ không thể được thể hiện bằng nhiều hơn một bản sao của chuỗi hạt được xâu chuỗi lại với nhau. Lưu ý rằng các bản sao phải được lắp ráp tất cả theo cùng một thứ tự (không đảo ngược) để vòng cổ được coi là không nguyên thủy.

Ví dụ: chúng ta hãy xem vòng cổ này : 0 1 1 0 1 1. Nó không phải là nguyên thủy bởi vì nó có thể được thể hiện như được 0 1 1lặp lại hai lần. 0 1 0 1 1là nguyên thủy.

0 1 1 0là nguyên thủy bởi vì 0 11 0không được coi là cùng một chuỗi. Vòng cổ này tương đương với 1 1 0 0vì nó có thể được xoay trái một hạt để trở thành hạt này, nhưng không tương đương với 0 1 0 1(không phải là nguyên thủy bằng cách này).

Thử thách

Cho một số nguyên không âm n, trả về số lượng vòng cổ nhị phân nguyên thủy có thể đảo ngược có chiều dài n. Đầu vào và đầu ra dưới dạng một số nguyên duy nhất.

Một vài thuật ngữ đầu tiên của chuỗi này là 1, 2, 1, 2, 3, 6, 8, 16, 24, 42, 69, 124, 208, 378, 668, 1214, 2220, 4110, 0-index.

Đây là OEIS A001371

Tham chiếu thực hiện trong Python 3 - khá chậm


4
Ồ, tôi hiểu rồi, "nguyên thủy" có nghĩa là nó không thể được quay một phần để có được vòng cổ ban đầu, phải không?
Sản xuất ETH

@ETHproductions ... Tôi chưa bao giờ nghĩ về nó theo cách đó. Vâng, đó chắc chắn là một sự hiểu biết chính xác. Đẹp!
HyperNeutrino

Tại sao là 0 1 0 1nguyên thủy? Nó không 0 1lặp lại hai lần sao?
Misha Lavrov

@MishaLavrov Cảm ơn; Tôi có nghĩa là "không nguyên thủy" rất tiếc. Cảm ơn
HyperNeutrino

_ಠ Tôi đang tìm kiếm một chuỗi OEIS để đăng lên như một thử thách và điều tiếp theo tôi thấy là ... đây ... dây chuyền. ._.
hoàn toàn là

Câu trả lời:


6

Python 2 , 178 171 139 137 byte

lambda n:sum(1-any(i>int(b[j::-1]+b[:j:-1],2)or j*(i>=int(b[j:]+b[:j],2))for j in range(n))for i in range(2**n)for b in[bin(i+2**n)[3:]])

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu 7 21 byte nhờ @HalvardHummel.



1
@HalvardHummel Cảm ơn, tôi không thể tìm ra cách tạo tất cả các hoán vị trong 1 lớp lót.
Neil

5

JavaScript (ES6), 198 192 byte

Tôi tò mò muốn biết một câu trả lời toán học đầy đủ sẽ trông như thế nào. Vì vậy, đây là. Khá dài nhưng rất nhanh.

n=>(g=d=>d&&(n%d?0:(q=n/d,C=(a,b)=>b?C(b,a%b):a<2,M=n=>n%++k?k>n?(q%2+3)/4*(1<<q/2)+(R=d=>d&&(q%d?0:(P=k=>k--&&C(q/d,k)+P(k))(q/d)<<d)+R(d-1))(q)/q/2:M(n):n/k%k&&-M(n/k))(d,k=1))+g(d-1))(n)||1

Bản giới thiệu

Làm sao?

Điều này dựa trên các công thức sau:

A000029(n) =
  (n % 2 + 3) / 4 * 2 ** floor(n / 2) +
  sum(φ(n / d) * 2 ** d, for d in divisors(n)) / (2 * n)

A001371(n) =
  1 if n = 0
  sum(μ(d) * A000029(n / d), for d in divisors(n)) if n > 0

Trong trường hợp φPhi hàm EulerμMobius chức năng .

n => (g = d =>
  // if d = 0, stop the recursion of g()
  d && (
    // if d is not a divisor of n, ignore this iteration
    n % d ? 0 :
    (
      // define q = n / d, C = function that tests whether a and b are coprime,
      // M = Möbius function (requires k to be initialized to 1)
      q = n / d,
      C = (a, b) => b ? C(b, a % b) : a < 2,
      M = n => n % ++k ? k > n || M(n) : n / k % k && -M(n / k)
    )(d, k = 1) * ( // invoke M with d
      // first part of the formula for A000029
      (q % 2 + 3) / 4 * (1 << q / 2) +
      // 2nd part of the formula for A000029
      (R = d =>
        // if d = 0, stop the recursion of R()
        d && (
          // if d is not a divisor of q, ignore this iteration
          q % d ? 0 :
          // compute phi(q / d) * 2 ** d
          (P = k => k-- && C(Q, k) + P(k))(Q = q / d) << d
        // recursive call to R()
        ) + R(d - 1)
      )(q) / q / 2 // invoke R with q, and divide the result by q * 2
    )
  // recursive call to g()
  ) + g(d - 1)
)(n) || 1

Lưu ý: Trong phiên bản chơi gôn hiện tại, phần thứ 2 của mã hiện được nhúng trực tiếp bên trong M () . Nhưng điều đó làm cho mã khó đọc hơn.


4

Toán học, 128 125 124 109 99 byte

1~Max~(L=Length)@(U=Union)[U[#,Reverse/@#]&/@MaximalBy[U@Partition[#,L@#,1,1]&/@{0,1}~Tuples~#,L]]&

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

  • {0,1}~Tuples~# tìm thấy tất cả các chuỗi nhị phân có độ dài nhất định
  • U@Partition[#,L@#,1,1]&/@... tìm thấy tất cả các phép quay có thể có của mỗi một trong số chúng
  • MaximalBy[...,L]chọn ra các mục với các góc quay khác biệt nhất; những cái này tương ứng với dây chuyền nguyên thủy.
  • U[#,Reverse/@#]&/@... đặt các phép quay trong mỗi mục và sự đảo ngược của chúng, theo thứ tự chính tắc ...
  • (L=Length)@(U=Union)[...] ... Để chúng ta có thể xóa các vòng cổ nguyên thủy trùng lặp, rồi đếm các yếu tố còn lại.
  • 1~Max~... chúng tôi đảm bảo rằng kết quả là ít nhất 1 để có được thuật ngữ zeroth đúng.

-2 byte nhờ Jonathan Frech và -2 nhờ tôi học hỏi từ anh ấy

-15 thêm byte từ chuyển sang MaximalBy và thay đổi liên quan

-10 từ chuyển sang Partition


1
Tôi nghĩ rằng nếu bạn thay thế Lengthbằng Lvà xác định L=Length;, bạn có thể lưu một byte.
Jonathan Frech


125, vì tôi đã quên chơi golf một trong những trường hợp của Chiều dài. Cảm ơn!
Misha Lavrov

Và bây giờ là 124, vì tôi đã học được từ ví dụ của bạn và biến người khác ==1thành a <2.
Misha Lavrov

3

Husk , 21 byte

Ṡ#▲mLüOmȯṁSe↔U¡ṙ1ΠRḋ2

Hãy thử trực tuyến! Liên kết hiển thị kết quả từ 0 đến 10.

Giải trình

Ṡ#▲mLüOmȯṁSe↔U¡ṙ1ΠRḋ2  Implicit input, say n=4.
                  Rḋ2  The list [1,0] repeated n times: [[1,0],[1,0],[1,0],[1,0]]
                 Π     Cartesian product: [[1,1,1,1],[0,1,1,1],[1,0,1,1],...,[0,0,0,0]]
       mȯ              For each list, say x=[0,1,0,0]:
              ¡ṙ1        Iterate rotation by one step: [[0,1,0,0],[1,0,0,0],[0,0,0,1],[0,0,1,0],[0,1,0,0],...
             U           Take prefix of unique values: [[0,1,0,0],[1,0,0,0],[0,0,0,1],[0,0,1,0]]
         ṁSe↔            After each element, insert its reversal: [[0,1,0,0],[0,0,1,0],[1,0,0,0],[0,0,0,1],[0,0,0,1],[1,0,0,0],[0,0,1,0],[0,1,0,0]]
     üO                Remove duplicates with respect to sorting.
   mL                  Get length of each list of lists.
Ṡ#▲                    Count the number of maximal lengths.


1

Javascript (ES7), 180 byte

n=>[...Array(2**n)].filter((_,m)=>![...m=m.toString(2).padStart(n,0)].some(_=>s[m=m.replace(/(.)(.*)/,"$2$1")]|s[[...m].reverse().join``])&!/^(.+)\1+$/.test(m)&(s[m]=1),s=[]).length

Giải trình:

n=>[...Array(2**n)].filter((_,m)=>(     // For every number m from 0 to 2^n-1
    m=m.toString(2).padStart(n,0),      // Take the binary representation (padded)

    ![...m].some(_=>(                   // Repeat once for every digit in m
        m=m.replace(/(.)(.*)/,"$2$1"),  // Rotate m one step
        s[m]|s[[...m].reverse().join``] // Search for m and the reverse of m in the
    ))                                  // lookup table

    &!/^(.+)\1+$/.test(m)               // Test if m is primitive
    &(s[m]=1)                           // Add m to the lookup table

),s=[]).length                          // Get the length of the list of numbers that
                                        // satisfy the above conditions

f=n=>[...Array(2**n)].filter((_,m)=>![...m=m.toString(2).padStart(n,0)].some(_=>s[m=m.replace(/(.)(.*)/,"$2$1")]|s[[...m].reverse().join``])&!/^(.+)\1+$/.test(m)&(s[m]=1),s=[]).length
<input id=i type=number value=5/><button onclick="o.innerText=f(i.value)">Test</button><br><pre id=o></pre>

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.