ウォルシュ行列を生成する


22

A ウォルシュ行列が持つ正方行列の特別な種類である量子内のアプリケーションは、コンピューティング(そしておそらく他の場所で、私は唯一の量子コンピューティングを気)。

ウォルシュ行列の特性

寸法は、我々は彼らを呼び出し、ここでは2つの指数によってこれらの行列を参照することができ、したがって、2の同じ力ありますW(0)W(1)W(2)...

W(0)として定義され[[1]]ます。

の場合n>0W(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)ます。.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 -> ペーストビン

これはなので、各言語で最も短いソリューションが勝ちです!ハッピーゴルフ!



結果に1のインデックスを付けることはできますか?(例:W(1)返品[[1]]W(2)返品[[1,1],[1,-1]...)
レオ

@レオはい、できます。で編集
Khuldraeseth na'Barya

回答:



10

MATL、4バイト

W4YL

オンラインでお試しください!

使い方:

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

組み込みなし:11バイト

1i:"th1M_hv

オンラインでお試しください!

仕組み

各ウォルシュ行列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

オンラインでお試しください!-4の@Luis Mendoに感謝します。

再帰ラムダ付きのオクターブ54 53 52 48バイト

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

オンラインでお試しください!この答え とインスピレーションのためのこの質問に感謝します。


関数がファイルで定義されている場合、2番目endは必要ありません。あなたはTIOのヘッダに移動し、したがって、バイト数から、それを削除することができるように
ルイスMendo


4

パイソン275の 71バイト

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

オンラインでお試しください!

ウォルシュ行列は悪の数に関連しているようです。場合x&y(ビット単位と、0系の座標)悪番号、行列の値は1-1醜悪番号について。ビットパリティ計算int(bin(n),13)%2は、この回答に関するNoodle9のコメントから取得されます


2
直観的には、(x、y)が(2 ^ k×2 ^ k)行列の右下の象限にある再帰レベルがある回数だけ(x、y)の符号が反転します。 xとyの両方がk番目のビットに1を持っている場合。この事実を使用して、1ビットを数えるだけでx&y、符号を反転する回数を決定できます。
リン

4

R61 56 53 50バイト

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

オンラインでお試しください!

Kronecker積によって行列を再帰的に計算し、n=0ケースに1を返します(これを指摘してくれたGiuseppeと、初期バージョンのゴルフを手伝ってくれたJADに感謝します)。

ジュゼッペのおかげで、再び-3バイトが追加されました。


ダンノは有効では1なく戻る場合matrix(1)ですが、それが可能であれば、これをダウンさせることができ、61バイトのReduceアプローチもあります:試してみてください!
ジュゼッペ

私ものフォーマットが不明だn=0場合、他のほとんどの答えは[[1]]、すべてではない...でそれを包む
キリルL.

1
あなたは置き換えることができmatrix(1)t(1)
JAD

1
質問が編集されました。行列ではなく整数を返すことができます。
クルドラエセスナバルヤ

1
1-2*!3:0c(1,1,1,-1)3バイトより短い。
ジュゼッペ


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**NW[N]。単純な場合は、どちらかXまたはYより小さい2**(N-1)場合です。この場合、X%2**(N-1)およびに再帰しY%2**(N-1)ます。両方の場合においてX、およびY少なくともビーイング2**(N-1)再帰呼び出しがネゲートされる必要があります。

いうよりも比較した場合XまたはY未満2**(N-1)ビットマスクがX&Y&2**(N-1)取られている再帰呼び出しはそれがないときに否定し、ゼロする必要がある場合、これはゼロです。これにより、moduloを減らす必要もなくなり2**(N-1)ます。

もちろん、同じ結果を得るために逆の順序でビットをテストできます。そうすれば、ビットマスクを毎回2倍にする代わりに、座標を半分にすることができ、結果のXORが可能になります。これにより、最終結果は0否定なし、否定を1意味します。



2

ええと、なぜインタープリターはGitHubにないのですか?
エリックアウトゴルファー

@EriktheOutgolfer現時点ではコードをあまり広く公開したくない。
ngn

うーん、それではどうやってTIOに追加しましたか?
エリックアウトゴルファー

@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

ハミング重みを計算するより短い方法を知っていたらいいのにと思います。
1δ¢˜はと同じ長さ0м€gです。


1

、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バイト

追加のライブラリを使用したいくつかのアプローチを紹介します。これは、Scipyの組み込みに依存しています。

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

オンラインでお試しください!

Python 2 2、65バイト

そして、これはNumpyのみを使用し、私のRの答えと同様にKronecker積で解きます

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

オンラインでお試しください!


0

スタックス、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.