Bir Walsh Matrisi Oluştur


22

Bir Walsh matrisi , kuantum hesaplamada (ve muhtemelen başka bir yerde, ama sadece kuantum hesaplamalarını önemsiyorum) uygulamalara sahip özel bir kare matris türüdür .

Walsh matrislerinin özellikleri

Boyutlar biz onları çağıran, burada ikinin üs bu matrisleri başvurabilirsiniz nedenle 2'nin aynı güç vardır W(0), W(1), W(2)...

W(0)olarak tanımlanır [[1]].

İçin n>0, W(n)bakışlar gibi:

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

Yani W(1):

[[1  1]
 [1 -1]]

Ve W(2):

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

Desen devam ediyor ...

Senin görevin

Tamsayı girişi yapan nve W(n)uygun herhangi bir formatta basan / geri dönen bir program veya fonksiyon yazın . Bu, bir dizi dizisi, düzleştirilmiş bir boole dizisi, bir .svgresim olabilir, doğru olduğu sürece adlandırabilirsiniz.

Standart boşluklar yasaktır.

Birkaç şey:

İçin W(0), 1ihtiyaç kez bile sarılmış edilemez. Sadece bir tamsayı olabilir.

1 indeksli sonuçlara izin verilir - W(1)o zaman olur [[1]].

Test durumları

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

Bu , yani her dilde en kısa çözüm kazanıyor! Mutlu golf!



Sonuçlar 1 indekslenebilir mi? (örneğin W(1)iadeler [[1]], W(2)iadeler [[1,1],[1,-1]...)
Leo

@ Leo Yep, yapabilirler. Düzenlendi.
Khuldraeseth na'Barya

Yanıtlar:


7

Perl 6 , 63 44 40 bayt

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

Çevrimiçi deneyin!

Özyinelemeli olmayan yaklaşım, x, y koordinatlarındaki değerin olduğu gerçeğinden yararlanarak (-1)**popcount(x&y). Düzleştirilmiş bir Boole dizisini döndürür.

-4 sayesinde bayt XNOR 'ın parite biti hile .


10

MATL , 4 bayt

W4YL

Çevrimiçi deneyin!

Nasıl çalışır:

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

Yerleşik olmadan: 11 bayt

1i:"th1M_hv

Çevrimiçi deneyin!

Nasıl çalışır :

Her Walsh matris için W , aşağıdaki matris olarak hesaplanır: [ B W ; W - W ], mücadelede tanımlandığı gibi. Kod n, 1 × 1 matrisinden [1] başlayan o zamanları yapar .

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 ... ve burada kullanmaya çalışıyorum kron. ;)
beher


5

Yerleşik , 18 17 bayt

@(x)hadamard(2^x)

Çevrimiçi deneyin!

Yerleşik olmayan Octave , 56 51 47 bayt

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

Çevrimiçi deneyin! Sayesinde-4 @Luis Mendo'ya .

Özyinelemeli lambda ile oktav , 54 53 52 48 bayt

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

Çevrimiçi deneyin! Bu cevap ve ilham için bu soru için teşekkürler .


İşlev bir dosyada tanımlanmışsa, ikincisi endgerekli değildir. Böylece onu TIO'nun başlığına taşıyabilir ve böylece bayt sayısından çıkarabilirsin
Luis Mendo


4

Python 2 , 75 71 bayt

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

Çevrimiçi deneyin!

Walsh Matrisi, kötü sayılarla ilişkili görünüyor. Eğer x&y(0 tabanlı koordinatlar, bit ve) kötü bir sayıdır, matris içinde bir değerdir 1, -1iğrenç sayılar için. Bit paritesi hesaplaması int(bin(n),13)%2, Noodle9'un bu cevap üzerine yaptığı yorumdan alınmıştır. .


2
Sezgisel olarak, (x, y) 'deki işaret, (x, y)' nin meydana gelen (2 ^ k × 2 ^ k) matrisinin sağ alt çeyreğinde olduğu tekrarlama seviyelerinin olduğu kadar çok sayıda döndürülür. x ve y'nin ikisi de k-th biti 1 olduğunda. Bu gerçeği kullanarak x&y, işareti kaç kere çevireceğinizi belirlemek için sadece 1-bitleri sayarız .
Lynn

4

R , 61 56 53 50 bayt

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

Çevrimiçi deneyin!

Matrisini Kronecker ürünü ile tekrarlı bir şekilde hesaplar ve n=0vaka için 1 değerini döndürür (bunu işaret ettiği için Giuseppe ve ilk sürümü golf oynamak için JAD'a teşekkürler).

Giuseppe sayesinde tekrar -3 bayt daha.


Dunno geçerli 1olmaktan ziyade geri dönüyorsa matrix(1), ancak eğer öyleyse golf oynayabilirsin ve 61 baytlık bir Reduceyaklaşım da var: dene!
Giuseppe

n=0Dava formatından da emin değilim , diğer çoğu cevap [[1]] 'de
Kirill L.

1
Sen yerini alabilir matrix(1)ile t(1).
JAD

1
Soru düzenlendi. Bir matris yerine bir tamsayı döndürebilirsiniz.
Khuldraeseth na'Barya

1
1-2*!3:0c(1,1,1,-1)üç bayttan daha kısa .
Giuseppe


2

JavaScript (ES6), 77 bayt

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

Naif hesaplama alarak başlar 0 <= X, Y <= 2**Niçinde W[N]. Basit durum, ya ondan küçük olduğunda ya Xda Ydaha küçük olduğunda 2**(N-1), bu durumda nüksederiz X%2**(N-1)ve Y%2**(N-1). Her ikisi de Xve Yen azından 2**(N-1)özyinelemeli çağrı olması durumunda ihmal edilmesi gerekir.

Karşılaştırma yapmak yerine Xveya bir bit maskesi Ydaha az alınırsa, özyinelemeli aramanın reddedilmesi gerektiğinde bu sıfır, sıfır olmadığında sıfır olur. Bu aynı zamanda modüloyu azaltmak zorunda kalmaz .2**(N-1)X&Y&2**(N-1)2**(N-1)

Bitler elbette aynı sonuç için ters sırada test edilebilir. Ardından, her seferinde bit maskesini ikiye katlamak yerine, sonuçların XOR'lu olmasına izin vererek yarı yarıya azaltılabilir, böylece sonuç 0hiçbir olumsuzlama ve olumsuzlama anlamına gelmez 1.




1

05AB1E , 16 bayt

oFoL<N&b0м€g®smˆ

Çevrimiçi deneyin!

açıklama

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

Keşke Hamming Ağırlığını hesaplamanın daha kısa bir yolunu bilseydim.
1δ¢˜ile aynı uzunluktadır 0м€g.


1

Kabuğu , 13 bayt

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

Çevrimiçi deneyin!

1 endeksli.

açıklama

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

Ek kütüphaneler kullanarak birkaç yaklaşım sergiliyor. Bu, Scipy'deki yerleşik bir bilgisayara dayanıyor:

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

Çevrimiçi deneyin!

Python 2 , 65 bayt

Ve bu sadece Numpy kullanıyor ve Kronecker ürünü tarafından R cevabına benzer şekilde çözüyor :

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

Çevrimiçi deneyin!


0

Stax , 20 bayt

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

Koşun ve staxlang.xyz de hata ayıklayın!

Bir süre sonra kendi mücadelemi deneyeyim dedim. Özyinelemeli olmayan yaklaşım. Diğer golf dillerine karşı çok da rekabetçi değil ...

Ambalajsız (24 bayt) ve açıklama

|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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.