xorspace 탐색


14

xorspace 정수의 집합은 통상 비트 XOR 연산자 출발 정수를 조합함으로써 얻어 질 수있는 모든 정수의 세트이다 ( ^). 예를 들어 xorspace (8, 4)(0, 4, 8, 12): 0은 4 ^ 4, 12는 4 ^ 8이며 다른 숫자는 도달 할 수 없습니다. 이 정의에 따라 시작 번호는 항상 포함됩니다 (예 : 4는 4 ^ 4 ^ 4).

음수가 아닌 정수 목록을 입력으로 사용하고 xorspace의 요소 수를 출력하는 가장 짧은 프로그램을 작성하는 것이 목표입니다.

  • 표준 허점 은 금지되어 있습니다.
  • 입력 및 출력은 일반적인 형식 중 하나 일 수 있습니다 . 입력은 유효하고 비어 있지 않으며 중복되지 않습니다.
  • 코드는 하루 안에 모든 테스트 사례를 처리 할 수 ​​있어야합니다 .

테스트 사례

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.

압축 된 Pyth , 7 바이트

16 진 덤프 :

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 2016

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

두 번째 반복 : 현재의 결과 [0 3 259 256][256 259 3]. 이 중복을 다시 제거하면

0 3 259 256

세 번째 반복 : 다시

0 3 259 256

따라서 결과는 4(결과 항목 수)입니다.


설명해주세요 O (2 ^ n)는 사용할 수 없습니다.
Outgolfer 에릭

어떻게 작동하는지 모르겠지만 확실히 O (2 ^ n)는 아닙니다. 실제로 (1 2 3… 63) 테스트 케이스는 무차별 대입 방식의 최악의 경우에도 매우 빠르게 해결됩니다.
Grimmy

2
어떻게 그렇게 빨리? 나는 거의 젤리에서 동일한 작업을 수행하기 위해 노력했지만, 19 분 ... 첫 번째 시도는 살해 (지금은 더 많은 RAM과 노력.)
데니스

2
나는이 생각 입니다 O (2ⁿ) 최악의 경우; 테스트에서 n 이 15 일 뿐이므로 프로그램은 여전히 ​​상당히 빠르게 실행됩니다.

2
@ ais523 비트 XOR에서 얻은 중간 숫자는 입력의 최대 숫자보다 클 수 없습니다 M. 따라서 중간 결과 벡터의 크기는 절대로 초과하지 않으며 M복잡도는 O ( M*M)입니다. 영업 이익은 말했다 의 정확한 정의는 것을 n나는 정의 그렇다면, 중요하지 않습니다 n로서 M나는 (O가이 주장 할 수있다 n*n).
Luis Mendo 2016 년

8

하스켈 , 64 바이트

f 정수 목록을 가져 와서 정수를 반환합니다.

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

온라인으로 사용해보십시오!

빈 목록을 처리하지 않습니다. 빈 $0:공간 대신 처리 할 수 ​​있습니다.maximum . .

작동 원리

  • 최대 인 경우 m목록 이 0이면 1을 반환합니다.
  • 그렇지 않으면 모든 요소를 ​​최대 값으로 xors합니다.
    • 결과가 요소보다 작 으면 요소가 대체됩니다.
    • 이것은 목록에서 가장 중요한 비트 세트를 반드시 0으로 만듭니다.
    • 그런 다음 결과 목록에서 반복하여 재귀 결과를 두 배로 늘립니다.
  • 이 프로세스는 본질적으로 행이 숫자 목록의 비트 표현 인 행렬에 대해 가우시안 제거 (마지막 행을 0으로 설정하여 0으로 버림) 모듈로 2를 수행합니다. "xorspace"의 비트 표현 세트는이 행렬의 행에 의해 스팬 된 벡터 공간 모듈로 2이며, 요소의 수는 행렬의 행 순위의 거듭 제곱에 2입니다.
  • 이 알고리즘은 다항식 시간이므로 O (2 ^ n)보다 확실히 좋습니다.

이것은 기본적으로 내가 생각했던 알고리즘입니다 (복잡한 경계를 꺾기 위해). 이것은 특히 그것을 나타내는 우아한 방법입니다. 제대로 골프를 치르는 대답으로 보는 것이 좋습니다.

4

매스 매 티카, 52 바이트

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

Pari / GP 답변을 왜 삭제 했습니까? 잘 작동하는 것 같습니다. 편집 : 신경 쓰지 마십시오. 실제로 일부 테스트 사례가 실패했습니다.
Grimmy

@ 그림은 왜 내 대답을 수락 했습니까? 이것은 코드 골프이며, 가장 짧은 코드가 이깁니다.
alephalpha

죄송합니다. 승인 된 답변을 7 바이트 압축 Pyth로 변경했습니다.
Grimmy

3

05AB1E , 8 바이트

vDy^ìÙ}g

온라인으로 사용해보십시오!

모든 테스트 사례는 TIO에서 1 분 안에 완료됩니다.


이것은 마지막 기준을 충족시키지 못한다 :«당신의 코드는 모든 테스트 사례를 하루 안에 처리 할 수 ​​있어야한다 (O (2 ** n)). »
그리미

@ 그림 : 2^n부분을 읽지 않았다 : /
Emigna

@ 그림 : 이제 1 분 안에 (그리고 더 적은 바이트를 사용하여) 모든 테스트 사례를 완료하도록 업데이트되었습니다
Emigna

âü^Ùg내가 당신이 한 번 이상 xor 할 수있는 좋은 해결책을 생각할 때까지 생각하고있었습니다 .
매직 문어 Urn

@ carusocomputing : 바이트를 절약하지만 복잡성은 확실하지 않습니다.
Emigna


2

젤리 , 9 8 바이트

0œ|⁺^¥/L

무시할만한 메모리 요구 사항으로 TIO 에서 8 초 이내에 모든 테스트 사례를 완료합니다 .

온라인으로 사용해보십시오!

작동 원리

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

파이썬, 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 바이트를 세고 있습니다. 내가 뭐 놓친 거 없니?
Grimmy

@totallyhuman 아마도 단일 바이트가 아닌 8 바이트로 테이블을 계산하기 때문일 것입니다.
Grimmy

첫 번째 들여 쓰기가 공백이고, 다음 들여 쓰기가 탭이고, 마지막 들여 쓰기가 탭 + 공백 (또는 2 개의 탭)이면 113 바이트입니다.
daniero

@Grimy 실제로 각 탭은 8이 아닌 4 개의 공간입니다.
Outgolfer Erik

전체 프로그램은 들여 쓰기가 적기 때문에 더 짧을 것입니다. 또한 for 루프는 명령문 u+=[c][c in s:]과 동등한 단일 행으로 압축 될 수 있습니다 if.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.