Tạo ma trận Walsh


22

Một Walsh ma trận là một loại đặc biệt của ma trận vuông với các ứng dụng trong máy tính lượng tử (và có lẽ ở nơi khác, nhưng tôi chỉ quan tâm đến lượng tử tính toán).

Tính chất của ma trận Walsh

Các kích thước là sức mạnh tương tự của 2. Do đó, chúng ta có thể tham khảo các ma trận bằng mũ hai ở đây, gọi họ W(0), W(1), W(2)...

W(0)được định nghĩa là [[1]].

Đối với n>0, W(n)trông giống như:

[[W(n-1)  W(n-1)]
 [W(n-1) -W(n-1)]]

Vậy W(1)là:

[[1  1]
 [1 -1]]

W(2)là:

[[1  1  1  1]
 [1 -1  1 -1]
 [1  1 -1 -1]
 [1 -1 -1  1]]

Mô hình tiếp tục ...

Nhiệm vụ của bạn

Viết chương trình hoặc hàm lấy đầu vào là số nguyên nvà in / trả về W(n)ở bất kỳ định dạng thuận tiện nào. Đây có thể là một mảng các mảng, một mảng booleans phẳng, một .svghình ảnh, bạn đặt tên cho nó, miễn là nó chính xác.

Sơ hở tiêu chuẩn bị cấm.

Một vài điều:

Đối với W(0), 1không cần phải được bọc dù chỉ một lần. Nó có thể là một số nguyên đơn thuần.

Bạn được phép 1-index results- W(1)sau đó sẽ là [[1]].

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

0 -> [[1]]
1 -> [[1  1]
      [1 -1]]
2 -> [[1  1  1  1]
      [1 -1  1 -1]
      [1  1 -1 -1]
      [1 -1 -1  1]]
3 -> [[1  1  1  1  1  1  1  1]
      [1 -1  1 -1  1 -1  1 -1]
      [1  1 -1 -1  1  1 -1 -1]
      [1 -1 -1  1  1 -1 -1  1]
      [1  1  1  1 -1 -1 -1 -1]
      [1 -1  1 -1 -1  1 -1  1]
      [1  1 -1 -1 -1 -1  1  1]
      [1 -1 -1  1 -1  1  1 -1]]

8 -> Quá khứ

Đây là , vì vậy giải pháp ngắn nhất trong mỗi ngôn ngữ sẽ thắng! Chúc bạn chơi golf vui vẻ!



Kết quả có thể được lập chỉ mục 1? (ví dụ: W(1)trả lại [[1]], W(2)trả lại [[1,1],[1,-1]...)
Leo

@Leo Yep, họ có thể. Đã chỉnh sửa.
Khuldraeseth na'Barya

Câu trả lời:



10

MATL , 4 byte

W4YL

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

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

W       % Push 2 raised to (implicit) input
4YL     % (Walsh-)Hadamard matrix of that size. Display (implicit)

Không có tích hợp: 11 byte

1i:"th1M_hv

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

Cách thức hoạt động :

Đối với mỗi ma trận Walsh W , ma trận tiếp theo được tính là [ W W ; W - W ], như được mô tả trong thử thách. Mã thực hiện nlần đó , bắt đầu từ ma trận 1 × 1 [1].

1       % Push 1. This is equivalent to the 1×1 matrix [1]
i:"     % Input n. Do the following n times
  t     %   Duplicate
  h     %   Concatenate horizontally
  1M    %   Push the inputs of the latest function call
  _     %   Negate
  h     %   Concatenate horizontally
  v     %   Concatenate vertically
        % End (implicit). Display (implicit)

2
Ugh ... và ở đây tôi đang cố gắng sử dụng kron. ;)
cốc


5

Octave với nội dung, 18 17 byte

@(x)hadamard(2^x)

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

Octave không có nội dung, 56 51 47 byte

function r=f(x)r=1;if x,r=[x=f(x-1) x;x -x];end

Hãy thử trực tuyến! Cảm ơn @Luis Mendo cho -4.

Octave với lambda đệ quy, 54 53 52 48 byte

f(f=@(f)@(x){@()[x=f(f)(x-1) x;x -x],1}{1+~x}())

Hãy thử trực tuyến! Nhờ câu trả lời nàycâu hỏi này cho cảm hứng.


Nếu chức năng được xác định trong một tập tin endthì không cần thứ hai . Vì vậy, bạn có thể di chuyển nó đến tiêu đề của TIO và do đó loại bỏ nó khỏi số byte
Luis Mendo


4

Python 2 , 75 71 byte

r=range(2**input())
print[[int(bin(x&y),13)%2or-1for x in r]for y in r]

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

Ma trận Walsh dường như có liên quan đến những con số xấu xa. Nếu x&y(bitwise và, tọa độ dựa trên 0) là một số ác, giá trị trong ma trận là 1, -1đối với các số có mùi. Tính toán chẵn lẻ bit int(bin(n),13)%2được lấy từ nhận xét của Noodle9 về câu trả lời này .


2
Theo trực giác, dấu tại (x, y) được lật nhiều lần vì có các mức đệ quy trong đó (x, y) nằm trong góc phần tư phía dưới bên phải của ma trận (2 ^ k × 2 ^ k), xảy ra khi x và y đều có 1 trong bit thứ k. Sử dụng thực tế này, chúng ta chỉ cần đếm 1 bit x&yđể xác định số lần lật dấu hiệu.
Lynn

4

R , 61 56 53 50 byte

w=function(n)"if"(n,w(n-1)%x%matrix(1-2*!3:0,2),1)

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

Tính toán đệ quy ma trận theo sản phẩm Kronecker và trả về 1 cho n=0trường hợp (cảm ơn Giuseppe đã chỉ ra điều này, và cũng cho JAD vì đã giúp chơi golf phiên bản ban đầu).

Bổ sung -3 byte một lần nữa nhờ Giuseppe.


Nếu bạn quay trở lại 1chứ không phải matrix(1)là hợp lệ, nhưng nếu đó là bạn có thể đánh gôn xuống và cũng có một Reducecách tiếp cận 61 byte : hãy thử nó!
Giuseppe

Tôi cũng không chắc về định dạng cho n=0trường hợp, hầu hết các câu trả lời khác đều gói nó trong [[1]], nhưng không phải tất cả ...
Kirill L.

1
Bạn có thể thay thế matrix(1)bằng t(1).
JAD

1
Câu hỏi đã được chỉnh sửa. Bạn có thể trả về một số nguyên chứ không phải là một ma trận.
Khuldraeseth na'Barya

1
1-2*!3:0ngắn hơn c(1,1,1,-1)ba byte.
Giuseppe


2

JavaScript (ES6), 77 byte

n=>[...Array(1<<n)].map((_,i,a)=>a.map((_,j)=>1|-f(i&j)),f=n=>n&&n%2^f(n>>1))

Tính toán ngây thơ bắt đầu bằng cách đưa 0 <= X, Y <= 2**Nvào W[N]. Trường hợp đơn giản là khi một Xhoặc Yít hơn 2**(N-1), trong trường hợp đó chúng ta tái diễn X%2**(N-1)Y%2**(N-1). Trong trường hợp của cả hai XYít nhất 2**(N-1)là cuộc gọi đệ quy cần phải được phủ định.

Nếu thay vì so sánh Xhoặc Yít hơn 2**(N-1)một bitmask X&Y&2**(N-1)thì đây không phải là 0 khi cuộc gọi đệ quy cần được phủ định và bằng 0 khi không thực hiện. Điều này cũng tránh phải giảm modulo 2**(N-1).

Các bit tất nhiên có thể được kiểm tra theo thứ tự ngược lại cho cùng một kết quả. Sau đó, thay vì tăng gấp đôi bitmask mỗi lần chúng ta tọa độ có thể giảm một nửa, cho phép kết quả được XOR, theo đó kết quả cuối cùng 0có nghĩa là không có phủ định và 1có nghĩa là phủ định.



2

K (ngn / k) , 18 byte

{x{(x,x),'x,-x}/1}

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


Ừm, tại sao trình thông dịch không có trên GitHub?
Erik the Outgolfer

@EriktheOutgolfer Tôi không muốn xuất bản mã quá rộng rãi vào thời điểm này.
ngn

Hừm, vậy bạn đã thêm nó vào TIO như thế nào?
Erik the Outgolfer

@EriktheOutgolfer Tôi đã hỏi một cách lịch sự :) Có những ngôn ngữ độc quyền khác trên TIO - Mathematica, Dyalog.
ngn

1

05AB1E , 16 byte

oFoL<N&b0м€g®smˆ

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

Giải trình

oF                 # for N in 2**input do:
  oL<              # push range [1..2**input]-1
     N&            # bitwise AND with N
       b           # convert to binary
        0м         # remove zeroes
          €g       # length of each
            ®sm    # raise -1 to the power of each
               ˆ   # add to global array

Tôi ước tôi biết một cách ngắn hơn để tính Trọng lượng Hamming.
1δ¢˜có cùng độ dài với 0м€g.


1

Husk , 13 byte

!¡§z+DS+†_;;1

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

1 chỉ mục.

Giải trình

!¡§z+DS+†_;;1
 ¡        ;;1    Iterate the following function starting from the matrix [[1]]
  §z+              Concatenate horizontally
     D               The matrix with its lines doubled
      S+†_           and the matrix concatenated vertically with its negation
!                Finally, return the result after as many iterations as specified
                 by the input (where the original matrix [[1]] is at index 1)



0

Con trăn 2 , 49 byte

Giới thiệu một vài cách tiếp cận bằng cách sử dụng các thư viện bổ sung. Điều này dựa trên một tích hợp trong Scipy:

lambda n:hadamard(2**n)
from scipy.linalg import*

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

Python 2 , 65 byte

Và cái này chỉ sử dụng Numpy và giải quyết bằng sản phẩm Kronecker, tương tự như câu trả lời R của tôi :

from numpy import*
w=lambda n:0**n or kron(w(n-1),[[1,1],[1,-1]])

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


0

Stax , 20 byte

àΩ2┤â#╣_ê|ª⌐╦è│╞►═∞H

Chạy và gỡ lỗi nó tại staxlang.xyz!

Nghĩ rằng tôi sẽ thử thách bản thân sau một thời gian. Cách tiếp cận không đệ quy. Không quá cạnh tranh với các ngôn ngữ chơi gôn khác ...

Giải nén (24 byte) và giải thích

|2c{ci{ci|&:B|+|1p}a*d}*
|2                          Power of 2
  c                         Copy on the stack.
   {                  }     Block:
    c                         Copy on stack.
     i                        Push iteration index (starts at 0).
      {           }           Block:
       ci                       Copy top of stack. Push iteration index.
         |&                     Bitwise and
           :B                   To binary digits
             |+                 Sum
               |1               Power of -1
                 p              Pop and print
                   a          Move third element (2^n) to top...
                    *         And execute block that many times.
                     d        Pop and discard
                       *    Execute block (2^n) times
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.