สร้างเมทริกซ์วอลช์


22

วอลช์เมทริกซ์เป็นชนิดพิเศษของตารางเมทริกซ์ที่มีการใช้งานในควอนตัมคอมพิวเตอร์ (และอาจจะที่อื่น ๆ แต่ฉันจะดูแลเกี่ยวกับควอนตัมคอมพิวเตอร์)

คุณสมบัติของเมทริกซ์วอลช์

ขนาดมีอำนาจเดียวกันของ 2. ดังนั้นเราจึงสามารถอ้างถึงการฝึกอบรมเหล่านี้โดยการยกกำลังสองที่นี่เรียกพวกเขาW(0), W(1), W(2)...

W(0)[[1]]ถูกกำหนดให้เป็น

สำหรับn>0, W(n)รูปลักษณ์ที่ต้องการ:

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

ดังนั้นW(1)คือ:

[[1  1]
 [1 -1]]

และW(2)คือ:

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

รูปแบบต่อไป ...

งานของคุณ

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นจำนวนเต็มnและพิมพ์ / ส่งคืนW(n)ในรูปแบบที่สะดวก นี่อาจเป็นอาร์เรย์ของอาร์เรย์ booleans ที่มี.svgรูปแบนคุณตั้งชื่อมันตราบใดที่มันถูกต้อง

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

สิ่งที่สอง:

สำหรับW(0)ความ1จำเป็นที่จะต้องไม่ถูกห่อหุ้มแม้แต่ครั้งเดียว มันอาจจะเป็นจำนวนเต็มเพียง

คุณได้รับอนุญาตให้ทำดัชนี 1 ผลลัพธ์ - W(1)จะเป็น[[1]]อย่างไร

กรณีทดสอบ

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

นี่คือดังนั้นทางออกที่สั้นที่สุดในแต่ละภาษาชนะ! มีความสุขในการเล่นกอล์ฟ!



ผลลัพธ์สามารถถูกจัดทำดัชนี 1 ตัวได้หรือไม่? (เช่นW(1)ผลตอบแทน[[1]], W(2)ผลตอบแทนที่[[1,1],[1,-1]... )
ลีโอ

@ Leo Yep พวกเขาทำได้ แก้ไขใน.
Khuldraeseth na'Barya

คำตอบ:


7

Perl 6 , 63 44 40 ไบต์

{map {:3(.base(2))%2},[X+&] ^2**$_ xx 2}

ลองออนไลน์!

ไม่ใช่วิธีการเวียนเกิดการใช้ประโยชน์จากความจริงที่ว่าคุ้มค่าที่พิกัด X, Y (-1)**popcount(x&y)คือ ส่งกลับอาร์เรย์แบบบูลแบบแบน

-4 ไบต์ขอบคุณที่XNOR 's บิตพาริตีเคล็ดลับ


10

MATL , 4 ไบต์

W4YL

ลองออนไลน์!

มันทำงานอย่างไร:

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

ไม่มีในตัว: 11 ไบต์

1i:"th1M_hv

ลองออนไลน์!

มันทำงานอย่างไร :

สำหรับ Walsh matrix Wแต่ละเมทริกซ์ถัดไปจะคำนวณเป็น [ W W ; W - W ] ตามที่อธิบายไว้ในการท้าทาย รหัสทำใน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
ฮึ ... kronและที่นี่ฉันพยายามที่จะใช้ ;)
บีกเกอร์


5

ระดับแปดเสียงในตัว18 17 ไบต์

@(x)hadamard(2^x)

ลองออนไลน์!

อ็อกเทฟโดยไม่มีบิวด์อิน, 56 51 47 ไบต์

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

ลองออนไลน์! ขอบคุณ@Luis Mendoสำหรับ -4

อ็อกเทฟกับแลมบ์ดาแบบเรียกซ้ำ54 53 52 48 ไบต์

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

ลองออนไลน์! ขอบคุณคำตอบนี้ และคำถามนี้สำหรับแรงบันดาลใจ


หากฟังก์ชั่นถูกกำหนดไว้ในไฟล์ที่สองendไม่จำเป็นต้องใช้ ดังนั้นคุณสามารถย้ายไปยังส่วนหัวของ TIO และลบออกจากการนับไบต์
Luis Mendo


4

Python 2 , 75 71 ไบต์

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

ลองออนไลน์!

ดูเหมือนว่าเมทริกซ์วอลช์จะเกี่ยวข้องกับตัวเลขชั่วร้าย ถ้าx&y(บิตและพิกัด 0-based) เป็นจำนวนชั่วค่าในเมทริกซ์คือ1, -1สำหรับตัวเลขที่น่าเกลียดชัง การคำนวณความเท่าเทียมกันบิตint(bin(n),13)%2ถูกนำมาจากความคิดเห็นของ Noodle9ในคำตอบนี้


2
สังหรณ์ใจเครื่องหมายที่ (x, y) พลิกหลาย ๆ ครั้งที่มีระดับของการเรียกซ้ำที่ (x, y) อยู่ในด้านล่างขวาของจตุรัสเมทริกซ์ (2 ^ k × 2 ^ k) ซึ่งเกิดขึ้น เมื่อ x และ y ทั้งคู่มี 1 ใน k-th บิต การใช้ข้อเท็จจริงนี้เราสามารถนับ 1 บิตx&yเพื่อกำหนดจำนวนครั้งในการพลิกสัญญาณ
Lynn

4

R , 61 56 53 50 ไบต์

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

ลองออนไลน์!

คำนวณเมทริกซ์ซ้ำ ๆ โดยผลิตภัณฑ์ Kronecker และส่งกลับ 1 สำหรับn=0กรณี (ขอบคุณ Giuseppe สำหรับการชี้เรื่องนี้และ JAD ที่ช่วยในการตีกอล์ฟรุ่นแรก)

ต้องเพิ่มอีก -3 ไบต์อีกครั้งด้วย Giuseppe


Dunno ถ้าการกลับมา1มากกว่าmatrix(1)นั้นถูกต้อง แต่ถ้าเป็นเช่นนั้นคุณสามารถตีมันลงได้และมีReduceวิธีการแบบ 61 ไบต์เช่นกัน: ลองดู!
จูเซปเป้

นอกจากนี้ผมยังไม่แน่ใจเกี่ยวกับรูปแบบของn=0กรณีส่วนใหญ่คำตอบอื่น ๆ ห่อไว้ใน [[1]] แต่ไม่ทั้งหมด ...
คิริลล์ลิตร

1
คุณสามารถแทนที่ด้วยmatrix(1) t(1)
JAD

1
แก้ไขคำถามแล้ว คุณสามารถคืนค่าจำนวนเต็มแทนที่จะเป็นเมทริกซ์
Khuldraeseth na'Barya

1
1-2*!3:0สั้นกว่าc(1,1,1,-1)สามไบต์
Giuseppe


2

JavaScript (ES6), 77 ไบต์

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

การคำนวณไร้เดียงสาเริ่มต้นโดยการใน0 <= X, Y <= 2**N W[N]กรณีง่ายๆคือเมื่อทั้งสองXหรือYน้อยกว่า2**(N-1)ซึ่งในกรณีนี้เรา recurse บนและX%2**(N-1) Y%2**(N-1)ในกรณีของทั้งคู่XและYอย่างน้อย2**(N-1)การเรียกซ้ำจะต้องถูกปฏิเสธ

หากแทนที่การเปรียบเทียบXหรือYน้อยกว่า2**(N-1)บิตX&Y&2**(N-1)มาสค์จะถือว่านี่ไม่ใช่ศูนย์เมื่อการเรียกซ้ำเกิดซ้ำจะต้องถูกทำให้เป็นโมฆะและเป็นศูนย์เมื่อไม่มี 2**(N-1)นอกจากนี้ยังหลีกเลี่ยงการต้องลดโมดูโล

แน่นอนว่าสามารถทดสอบบิตในลำดับย้อนกลับเพื่อให้ได้ผลลัพธ์เดียวกัน จากนั้นแทนที่จะเพิ่ม bitmask เป็นสองเท่าในแต่ละครั้งที่เราประสานงานของเขาสามารถลดลงครึ่งหนึ่งได้แทนที่จะปล่อยให้ผลลัพธ์เป็น XORed โดยผลลัพธ์สุดท้ายของ0วิธีการนี้จะไม่มีการปฏิเสธและ1หมายถึงการปฏิเสธ



2

K (ngn / k) , 18 ไบต์

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

ลองออนไลน์!


อืมทำไมล่ามไม่ได้อยู่ใน GitHub?
Erik the Outgolfer

@EriktheOutgolfer ฉันไม่ต้องการเผยแพร่โค้ดอย่างกว้างขวางเกินไปในขณะนี้
ngn

หืมทำไมคุณจึงเพิ่มลงใน TIO
Erik the Outgolfer

@EriktheOutgolfer ฉันถามอย่างสุภาพ :) มีภาษาที่เป็นกรรมสิทธิ์อื่น ๆ ใน TIO - Mathematica, Dyalog
ngn

1

05AB1E , 16 ไบต์

oFoL<N&b0м€g®smˆ

ลองออนไลน์!

คำอธิบาย

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

ฉันหวังว่าฉันจะรู้วิธีที่สั้นกว่าในการคำนวณ Hamming Weight
1δ¢˜มีความยาวเท่า0м€gกัน


1

Husk , 13 ไบต์

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

ลองออนไลน์!

1 การจัดทำดัชนี

คำอธิบาย

!¡§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

Python 2 , 49 ไบต์

แสดงวิธีการสองสามอย่างโดยใช้ไลบรารีเพิ่มเติม สิ่งนี้อาศัยอยู่ในตัวใน Scipy:

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

ลองออนไลน์!

Python 2 , 65 ไบต์

และอันนี้ใช้ Numpy เท่านั้นและแก้ไขโดยผลิตภัณฑ์ Kronecker คล้ายกับคำตอบ Rของฉัน:

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

ลองออนไลน์!


0

Stax , 20 ไบต์

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

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz!

คิดว่าฉันจะลองด้วยตัวเองหลังจากนั้นสักครู่ วิธีการแบบไม่เรียกซ้ำ ไม่แข่งขันกับภาษากอล์ฟอื่น ๆ เกินไป ...

คลายการแพคข้อมูล (24 ไบต์) และคำอธิบาย

|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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.