สำรวจ xorspace


14

xorspaceชุดของจำนวนเต็มคือชุดของจำนวนเต็มทั้งหมดที่สามารถรับได้โดยการรวมจำนวนเต็มเริ่มต้นกับผู้ประกอบการ xor บิตปกติ ( ^) ตัวอย่างเช่น xorspace ของ(8, 4)คือ(0, 4, 8, 12): 0 คือ 4 ^ 4, 12 คือ 4 ^ 8 และไม่สามารถเข้าถึงหมายเลขอื่นได้ โปรดทราบว่าตัวเลขเริ่มต้นรวมอยู่เสมอโดยคำจำกัดความนี้ (ตัวอย่างเช่น 4 คือ 4 ^ 4 ^ 4)

เป้าหมายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดที่รับรายการจำนวนเต็มที่ไม่เป็นลบและป้อนข้อมูลจำนวนองค์ประกอบใน xorspace

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • input และ output สามารถในการใด ๆ ของรูปแบบปกติ อินพุตรับประกันว่าถูกต้องไม่ว่างเปล่าและไม่มีการซ้ำซ้อน
  • รหัสของคุณควรจะสามารถที่จะดำเนินการกรณีทดสอบทั้งหมดในน้อยกว่าวัน

กรณีทดสอบ

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 เราจะหา fixpoint ในการรับ 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 ไบต์

hexdump:

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

เหมือนกับข้างต้นด้วยการเข้ารหัส ASCII 7 บิต

วางข้างบนในไฟล์ด้วยxxd -rและเรียกใช้ดังนี้:

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

l{mxFdyผมคิดว่าคุณสามารถทำได้
xnor

@xnor yใช้กับกรณีทดสอบ 1 ถึง 63 ช้าเกินไป ฉันไม่มีหน่วยความจำ 2 ^ 63
isaacg

10

MATL 11 ไบต์

t"G!Z~Ghu]n

ลองออนไลน์!

กรณีทดสอบครั้งสุดท้ายไม่ได้ทำงานในล่ามออนไลน์เนื่องจากข้อ จำกัด ด้านหน่วยความจำ แต่ทำงานแบบออฟไลน์ในเวลาน้อยกว่า 2 วินาทีในคอมพิวเตอร์ที่ทันสมัย

คำอธิบาย

สำหรับขนาดที่ป้อนnให้ทำสิ่งต่อไปนี้:

  1. เริ่มต้นผลลัพธ์ให้อินพุต
  2. ทำซ้ำ nครั้ง:
    1. ใช้ XOR bitwise กับรายการทั้งหมดจากผลลัพธ์และอินพุตปัจจุบัน
    2. แนบค่าอินพุตกับผลลัพธ์
    3. deduplicate
  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]ด้วย[256 259 3]: การคำนวณ bitwise-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)
Erik the 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) OP ได้กล่าวว่าคำจำกัดความที่แน่นอนของnไม่สำคัญดังนั้นหากฉันกำหนดnตามที่Mฉันสามารถอ้างได้ว่าเป็น O ( n*n)
Luis Mendo

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 ทุกองค์ประกอบที่มีค่าสูงสุด
    • หากผลลัพธ์มีขนาดเล็กกว่าองค์ประกอบองค์ประกอบนั้นจะถูกแทนที่ด้วย
    • นี่จำเป็นต้องเลขศูนย์ที่สำคัญที่สุดที่ตั้งไว้ที่ใดก็ได้ในรายการ
    • จากนั้นเรียกใช้รายการผลลัพธ์ซ้ำอีกครั้งเพิ่มผลลัพธ์ของการสอบถามซ้ำเป็นสองเท่า
  • กระบวนการนี้จะทำการกำจัดแบบเกาส์ (โดยการทิ้งแถวสุดท้ายด้วยการตั้งค่าเป็น 0) แบบโมดูโล 2 บนเมทริกซ์ซึ่งแถวเป็นบิตแทนรายการตัวเลข ชุดของการเป็นตัวแทนบิตของ "xorspace" คือเวกเตอร์สเปซโมดูโล 2 ที่ทอดโดยแถวของเมทริกซ์นี้และจำนวนองค์ประกอบคือ 2 ต่อกำลังของแถวแถวของเมทริกซ์
  • อัลกอริทึมนี้เป็นเวลาพหุนามดังนั้นควรจะดีกว่า O (2 ^ n) อย่างแน่นอน

นี่เป็นอัลกอริทึมที่ฉันคิด (เพื่อเอาชนะขอบเขตความซับซ้อน) แม้ว่านี่จะเป็นวิธีที่ยอดเยี่ยมในการเป็นตัวแทนของมัน มันดีที่ได้เห็นมันในคำตอบที่ถูกต้อง

4

Mathematica ขนาด 52 ไบต์

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

ทำไมคุณลบคำตอบ Pari / GP ของคุณ? ดูเหมือนว่าจะทำงานได้ดี แก้ไข: ไม่เป็นไรมันล้มเหลวในบางกรณีทดสอบจริง ๆ
Grimmy

@Grimy ทำไมคุณถึงยอมรับคำตอบของฉัน นี่คือรหัสกอล์ฟซึ่งเป็นรหัสที่สั้นที่สุดชนะ
alephalpha

ขออภัยฉันเปลี่ยนคำตอบที่ยอมรับเป็น 7 ไบต์ที่บรรจุ Pyth one แล้ว
Grimmy

3

05AB1E , 8 ไบต์

vDy^ìÙ}g

ลองออนไลน์!

การทดสอบทั้งหมดเสร็จสิ้นในเวลาไม่ถึง 1 นาทีใน TIO


สิ่งนี้ล้มเหลวในเกณฑ์สุดท้าย: «รหัสของคุณควรจะสามารถประมวลผลกรณีทดสอบทั้งหมดในเวลาน้อยกว่าหนึ่งวัน (ไม่มีสิ่งของ O (2 ** n)) »
กริมมี่

@Grimy: อ่าน2^nส่วนไม่ได้: /
Emigna

@Grimy: ปรับปรุงในขณะนี้ที่จะเสร็จสิ้น Allt ทดสอบในกรณีที่อายุต่ำกว่า 1 นาที (และไบต์น้อยใช้)
Emigna

กำลังคิดâü^Ùgจนกระทั่งฉันเห็นว่าคุณทำได้มากกว่าหนึ่งครั้งทางออกที่ดี
Magic Octopus Urn

@carusocomputing: บันทึกไบต์ แต่ฉันไม่แน่ใจเกี่ยวกับความซับซ้อน
Emigna

3

Python 2 , 55 ไบต์

r={0}
for n in input():r|={x^n for x in r}
print len(r)

ลองออนไลน์!

เอาชนะฟังก์ชั่น:

f=lambda l,r={0}:l and f(l[1:],r|{x^l[0]for x in r})or len(r)
f=lambda l:len(reduce(lambda r,n:r|{x^n for x in r},l,{0}))

Ørjan Johansen วิธีกำจัดแถวที่สวยงามนั้นสั้นกว่าหนึ่งไบต์

Python 2 , 54 ไบต์

f=lambda l:1-any(l)or 2*f([min(x,x^max(l))for x in l])

ลองออนไลน์!


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 ไบต์; ฉันพลาดอะไรไปหรือเปล่า
Grimmy

@tallyallyhuman อาจเป็นเพราะคุณนับจำนวนตารางเป็น 8 ไบต์แทนที่จะเป็นหนึ่งไบต์
Grimmy

หากการเยื้องครั้งแรกคือการเว้นวรรคอันถัดไปคือแท็บและอันสุดท้ายคือแท็บ + ช่องว่าง (หรือ 2 แท็บ) แสดงว่ามีขนาด 113 ไบต์
daniero

@Grimy จริง ๆ แล้วแต่ละแท็บคือ 4 ช่องว่างไม่ใช่ 8
Erik the Outgolfer

โปรแกรมเต็มรูปแบบจะสั้นลงเนื่องจากช่วยประหยัดการย่อหน้าเพียงเล็กน้อย นอกจากนี้การวนรอบสำหรับสามารถย่อลงในบรรทัดเดียวเช่นเดียวu+=[c][c in s:]กับifคำสั่งของคุณ
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.