xorspaceの探索


14

整数セットのxorspaceは、開始整数を通常のビット単位のxor演算子(^)と組み合わせることによって取得できるすべての整数のセットです。たとえば、のxorspace (8, 4)(0, 4, 8, 12)次のとおりです。0は4 ^ 4、12 は4 ^ 8であり、他の数値には到達できません。この定義では、開始番号が常に含まれることに注意してください(たとえば、4は4 ^ 4 ^ 4です)。

あなたの目標は、入力として非負整数のリストを取り、xorspaceの要素数を出力する最短のプログラムを書くことです。

  • 標準的な抜け穴は禁止されています。
  • 入力と出力は、通常の形式のいずれかです。入力は、有効で、空ではなく、重複がないことが保証されています。
  • コードはすべてのテストケースを1日以内に処理できる必要があります

テストケース

Input: 0
Output: 1

Input: 6
Output: 2

Input: 8 4
Ouput: 4

Input: 0 256
Output: 2

Input: 256 259 3
Output: 4

Input: 60 62 94 101 115
Output: 32

Input: 60 62 94 101 115 40 91
Output: 32

Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
Output: 64

Input: 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384
Output: 32768

回答:


2

Pyth、8バイト

lu{+xM*Q

テストスイート

説明:

xorspaceを生成するために、数値のすべてのペアのxorを取得し、すべての数値を加算し、重複排除するという不動点を見つけます。次に、結果の長さを取得します。これは、最終テストケースで20秒(オフラインのみ)で実行されます。

lu{+xM*Q
lu{+xM*QGGQ    Implicit variable introduction
 u        Q    Find the fixed point of the following, starting with the input,
               where the current value is G.
      *QG      Form the Cartesian product of Q (input) and G (current)
    xM         Take the xor of every pair
   +           Add the current values
  {            Deduplicate
l              Output the length of the result.

Packed Pyth、7バイト

Hexdump:

0000000: d9d7 dabf 1355 51                        .....UQ

上記と同じ、7ビットASCIIエンコード。

上記をでファイルに入れ、xxd -r次のように実行します。

py packed-pyth.py xorspace.ppyth '[256, 259, 3]'

あなたにできると思いますl{mxFdy
XNOR

1〜63のyテストケースに適用される@xnor は非常に遅いです。2 ^ 63のメモリがありません。
isaacg

10

MATL、11バイト

t"G!Z~Ghu]n

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

最後のテストケースは、メモリの制限のためにオンラインインタープリターでは実行されませんが、最新のコンピューターでは2秒未満でオフラインで実行されます。

説明

sizeの入力の場合n、これは次のことを行います。

  1. 入力する結果を初期化します。
  2. 繰り返しn回数:
    1. 現在の結果と入力からエントリのすべてのペアにビット単位のXORを適用します。
    2. 入力値を結果に添付します。
    3. 重複排除。
  3. 出力は、最終結果の要素数です。

コメント付きコード。

t      % Implicit input: row vector. Duplicate
"      % For each (i.e. do as many times as the input size)
  G!   %   Push input as a column vector
  Z~   %   Bitwise XOR with broadcast, i.e. for all pairs of entries of the
       %   two arguments. The first argument is the accumulated result
       %   from the previous iteration, the second is the input vector
  G    %   Push input again
  h    %   Postpend
  u    %   Unique values. Gives a row vector
]      % End
n      % Number of entries. Implicitly display

入力の中間結果(ステップ2.1および2.3)[256 259 3]は次のとおりです。

最初の反復:[256 259 3]with [256 259 3]:ビットごとのXORのすべてのペアを計算すると、行列が得られます

  0   3 259
  3   0 256
259 256   0

接続[256 259 3]と重複排除

0 3 259 256

2回目の反復:現在の結果[0 3 259 256][256 259 3]。重複排除後、これは再び与えます

0 3 259 256

3回目の繰り返し:再び

0 3 259 256

したがって、出力は4(結果のエントリ数)です。


説明してください?O(2 ^ n)は使用できません。
エリックアウトゴルファー

どのように機能するかはわかりませんが、O(2 ^ n)ではありません。ブルートフォース法では最悪のケースですが、実際には(1 2 3…63)テストケースをかなり迅速に解決します。
グリムミー

2
どうしてこんなに速いの?私はかなりゼリーで同じことをやろうとしてきたが、19分後に...最初の試みは、殺されてしまった(今、より多くのRAMをしようとしています。)
デニス

2
これ O(2ⁿ)最悪のケースだと思います。それを実行するテストでは、nはわずか15であるため、プログラムはかなり高速に実行されます。

2
@ ais523 bitwise-XORから取得した中間数は、入力の最大数を超えることはありません。それを呼び出しますM。したがって、中間結果のベクトルのサイズは決して超えませんM、複雑さはO(M*M)です。OPは述べているの正確な定義があることn、私が定義している場合は、問題ではないnM私は、これはO(あると主張することができますn*n)。
ルイスメンドー

8

Haskell、64バイト

f 整数のリストを取り、整数を返します。

import Data.Bits
f l|m<-maximum l,m>0=2*f(min<*>xor m<$>l)|0<1=1

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

これは空のリストを処理しません。$0:そのため、後のスペースの代わりにできますmaximum

使い方

  • mリストの最大値がゼロの場合、1を返します。
  • それ以外の場合、すべての要素を最大値でxorsします。
    • 結果が要素よりも小さい場合、要素はそれに置き換えられます。
    • これにより、リスト内の任意の場所で設定された最上位ビットが必ずゼロになります。
    • 次に、結果のリストを再帰的に処理し、再帰の結果を2倍にします。
  • このプロセスは基本的に、行が数値リストのビット表現である行列に対して、2を法としてガウス除去(最終行を0に設定することで破棄します)を実行します。「xorspace」のビット表現のセットは、この行列の行がまたがる2を法とするベクトル空間であり、その要素数は2の行列の行ランクの累乗です。
  • このアルゴリズムは多項式時間であるため、O(2 ^ n)よりも確実に優れているはずです。

これは基本的に私が考えていたアルゴリズムです(複雑さの限界を破るため)。これは特にエレガントな表現方法です。適切なゴルフの答えでそれを見るのは素晴らしいことです。

4

Mathematica、52バイト

2^MatrixRank[PadLeft@IntegerDigits[#,2],Modulus->2]&

Pari / GPの回答を削除したのはなぜですか?それはうまく機能しているように見えました。編集:気にしないで、実際にいくつかのテストケースに失敗しました。
グリムミー

@Grimyなぜ私の答えを受け入れたのですか?これはコードゴルフであり、最短のコードが勝ちます。
alephalpha

申し訳ありませんが、受け入れられた回答を7バイトのPythパックに変更しました。
グリムミー

3

05AB1E、8バイト

vDy^ìÙ}g

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

すべてのテストケースは、TIOで1分以内に終了します。


これは最後の基準を満たしていません。«コードはすべてのテストケースを1日以内に処理できる必要があります(O(2 ** n)なし)。»
グリムミー

@Grimy:2^n一部を読みませんでした:/
Emigna

@Grimy:すべてのテストケースを1分未満で完了するように更新されました(使用バイト数を減らして)
Emigna

âü^Ùg私はあなたが二度以上、良い解決策をXORできることを見るまで考えていました。
魔法のタコUr

@carusocomputing:1バイト節約できますが、複雑さについてはわかりません。
エミグナ


2

ゼリー9 8バイト

0œ|⁺^¥/L

8歳未満のすべてのテストケースを終了しますTIO秒ます。メモリ要件はごくわずかです。

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

使い方

0œ|⁺^¥/L  Main link. Argument: A (array)

0œ|       Perform multiset union with 0, prepending 0 if A doesn't contain it.
      /   Reduce A by the link to the left.
     ¥      Combine the previous two links into a dyadic chain.
            Left argument: V (array). Right argument: n (integer)
    ^           Bitwise XOR each element in V with n.
   ⁺            This quick refers to the previous link, making it a shorthand for
                the link 'œ|'. Thus, it performs multiset union on V and the array
                of bitwise XORs.
       L  Compute the length of the result.

1

Python、113バイト

def f(x):
 u,s=[0],{0}
 while u:
	a=u.pop()
	for b in x:
	 c=a^b
	 if c not in s:u+=[c]
	 s.add(c)
 return len(s)

動作しますが、113バイトをカウントしています。私は何か見落としてますか?
グリムミー

@totallyhumanこれはおそらく、集計を1バイトではなく8バイトとしてカウントしているためです。
グリムミー

最初のインデントがスペース、次のインデントがタブ、最後のインデントがタブ+スペース(または2つのタブ)の場合、113バイトです
-daniero

@Grimy実際には、各タブは8スペースではなく4スペースです。
Erik the Outgolfer

完全なプログラムは、少数のインデントを節約するため、短くなります。また、forループはu+=[c][c in s:]ifステートメントと同じように1行に凝縮できます。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.