Xorspace'i keşfetmek


14

Xorspace tamsayılar bir dizi her zaman bit-bazında XOR operatörü ile başlayan tamsayılar birleştirilmesiyle elde edilebilir tüm tamsayılar grubu olan ( ^). Örneğin, öğesinin xorspace (8, 4)değeri (0, 4, 8, 12): 0, 4 ^ 4, 12, 4 ^ 8'dir ve başka sayıya ulaşılamaz. Başlangıç ​​numaralarının her zaman bu tanıma dahil edildiğini unutmayın (örneğin, 4, 4 ^ 4 ^ 4'tür).

Hedefiniz negatif olmayan tamsayıların bir listesini girdi olarak alan ve xorspace'deki eleman sayısını çıkaran en kısa programı yazmaktır.

Test senaryoları

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

Yanıtlar:


2

Pyth, 8 bayt

lu{+xM*Q

Test odası

Açıklama:

Xorspace'i oluşturmak için, her sayı çiftinin xor'unu alma, her sayıya ekleme ve tekilleştirme işlemlerinin sabit noktasını buluruz. Sonra sonucun uzunluğunu alıyoruz. Bu, son test durumunda 20 saniye içinde (yalnızca çevrimdışı) çalışır.

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.

Paketlenmiş Pyth , 7 bayt

HexDump:

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

7 bitlik ASCII kodlamasıyla yukarıdakiyle aynı.

Yukarıdakini bir dosyaya koyun ve xxd -raşağıdaki gibi çalıştırın:

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

Bence yapabilirsin l{mxFdy.
xnor

y1 ila 63 test senaryosuna uygulanan @xnor çok yavaş. 2 ^ 63 belleğim yok.
isaacg

10

MATL , 11 bayt

t"G!Z~Ghu]n

Çevrimiçi deneyin!

Son test durumu, bellek sınırlamaları nedeniyle çevrimiçi yorumlayıcıda çalışmaz, ancak modern bir bilgisayarda 2 saniyeden daha kısa sürede çevrimdışı çalışır.

açıklama

Boyut girişi niçin aşağıdakileri yapar:

  1. Girdi sonucunu başlatın.
  2. Tekrarlama nsüreleri:
    1. Geçerli sonuç ve girişteki tüm giriş çiftlerine bit şeklinde XOR uygulayın.
    2. Sonuca giriş değerleri ekleyin.
    3. Deduplicate.
  3. Çıktı, nihai sonucun öğe sayısıdır.

Yorumlanan kod.

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

Misal

Girdi için ara sonuçlar (adım 2.1 ve 2.3) [256 259 3]:

İlk yineleme: [256 259 3]ile [256 259 3]: tüm bitwise-XOR çiftlerinin hesaplanması matrisi verir

  0   3 259
  3   0 256
259 256   0

Takma [256 259 3]ve tekilleştirme

0 3 259 256

İkinci yineleme: Geçerli sonuç [0 3 259 256]ile [256 259 3]. Tekilleştirmeden sonra tekrar verir

0 3 259 256

Üçüncü yineleme: tekrar

0 3 259 256

Yani çıktı 4(sonuç giriş sayısı).


Açıklama lütfen? O (2 ^ n) kullanamazsınız.
Outgolfer Erik

Nasıl çalıştığı hakkında hiçbir fikrim yok, ama kesinlikle O (2 ^ n) değil. Aslında kaba kuvvet yöntemi için en kötü durum olmasına rağmen (1 2 3… 63) test durumunu oldukça hızlı bir şekilde çözer.
Grimmy

2
Bu nasıl bu kadar hızlı? Jelly'de hemen hemen aynı şeyi yapmaya çalışıyordum, ancak ilk deneme 19 dakika sonra öldürüldü ... (Şimdi daha fazla RAM ile çalışıyor.)
Dennis

2
Ben buna inanıyorum olan O (2ⁿ) kötü durum; sadece bunu testte, n sadece 15, bu yüzden program hala oldukça hızlı çalışıyor.

2
@ ais523 Bitwise-XOR'dan elde edilen ara sayılar hiçbir zaman girişteki maksimum sayıdan daha büyük olamaz, bunu çağırın M. Dolayısıyla, ara sonuç vektörünün boyutu asla geçmez Mve karmaşıklık O ( M*M) ' dur . OP söyledi tam tanımı bu ntanımlamam bu durumda, önemli değil nolarak MI (O olmasını İstem olabilir n*n).
Luis Mendo

8

Haskell , 64 bayt

f bir tamsayı listesi alır ve bir tamsayı döndürür.

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

Çevrimiçi deneyin!

Bu, boş bir listeyi işlemez, bunun için yapabileceğiniz ancak $0:sonraki boşluk yerine maximum.

Nasıl çalışır

  • mListenin maksimum değeri sıfırsa 1 değerini döndürür.
  • Aksi takdirde, her öğeyi maksimuma çıkarır.
    • Sonuç öğeden daha küçükse, öğe onunla değiştirilir.
    • Bu, listede herhangi bir yerde ayarlanan en önemli biti mutlaka sıfırlar.
    • Ardından, sonuç listesinde bulunan özyinelemeler, özyineleme sonucunu iki katına çıkarır.
  • Bu işlem esasen Gauss eleminasyonunu (son satırları 0 olarak ayarlayarak atmakla birlikte) modulo 2'yi, satırları sayı listesinin bit temsili olan matris üzerinde gerçekleştirir. "Xorspace" in bit temsili kümesi, bu matrisin satırları tarafından yayılan ve eleman sayısı 2 olan matrisin sıra sırasının gücüne sahip olan vektör uzay modülo 2'dir.
  • Bu algoritma polinom zamanıdır, bu yüzden kesinlikle O (2 ^ n) 'den daha iyi olmalıdır.

Bu temelde düşündüğüm algoritma (karmaşıklık sınırlarını yenmek için), ancak bu onu temsil etmenin özellikle zarif bir yolu. Düzgün bir golf cevabında görmek güzel.

4

Mathematica, 52 bayt

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

Pari / GP yanıtınızı neden sildiniz? İyi çalışıyor gibi görünüyordu. EDIT: nevermind, aslında bazı test durumlarda başarısız oldu.
Grimmy

@Grimy Cevabımı neden kabul ettin? Bu bir kod golfü, en kısa kod kazanıyor.
alephalpha

Maalesef kabul edilen cevabı 7 baytlık Pyth'le değiştirdim.
Grimmy

3

05AB1E , 8 bayt

vDy^ìÙ}g

Çevrimiçi deneyin!

Tüm test senaryoları TIO'da 1 dakikadan kısa sürede sona erer.


Bu son ölçütte başarısız olur: «Kodunuz tüm test senaryolarını bir günden daha kısa sürede işleyebilmelidir (O ​​(2 ** n) malzeme yok). »
Grimmy

@Grimy: Bölümü okumadım 2^n: /
Emigna

@Grimy: Artık allt test vakalarını 1 dakikadan kısa sürede bitirmek için güncellendi (ve daha az bayt kullanıldı)
Emigna

Bir âü^Ùgkereden fazla xor yapabileceğinizi düşünene kadar, güzel bir çözüm düşünüyordum.
Sihirli Ahtapot Urn

@carusocomputing: Bu bir bayt tasarrufu sağlar, ancak karmaşıklıktan emin değilim.
Emigna


2

Jöle , 9 8 bayt

0œ|⁺^¥/L

Tüm test senaryolarını ihmal edilebilir bellek gereksinimleriyle TIO'da 8 saniyenin altında tamamlar.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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)

Çalışıyor, ama 113 bayt sayıyorum; Bir şey mi kaçırdım?
Grimmy

@totallyhuman, muhtemelen tabloları tek bir bayt yerine 8 bayt olarak saydığınız için.
Grimmy

İlk girinti bir boşluksa, bir sonraki sekme ve sonuncusu bir sekme + bir boşluk (veya 2 sekme) ise, o zaman 113 bayt
daniero

@Grimy Aslında her sekme 8 değil 4
boşluktur

Tam bir program daha kısadır, çünkü bir avuç dolusu girintiyi kurtarır. Ayrıca for döngüsü, ifadenize u+=[c][c in s:]eşdeğer olduğu gibi tek bir satıra ifdaraltılabilir.
Dennis
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.