สร้างตาราง XOR


19

บทนำ

แฮคเกอร์เป็นดิจิตอลลอจิกเกตที่ใช้ระบบเอกสิทธิ์หรือ ^ส่วนใหญ่เวลานี้จะแสดงให้เห็นว่า ผลลัพธ์ที่เป็นไปได้ทั้งสี่ในไบนารี:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

สิ่งนี้สามารถเห็นได้ว่าเป็นการเพิ่มโมดูโล 2 ในไบนารี่ ในทศนิยมเราต้องแปลงทศนิยมให้เป็นไบนารี35 = 100011และ25 = 11001ในการคำนวณค่า XOR เราวางมันไว้บนสุดของกันและกัน:

100011
 11001 ^
--------
111010  = 58 in decimal

ภารกิจ : เมื่อได้รับค่าจำนวนเต็ม N มากกว่า 1 ให้ส่งออกตาราง XOR ที่มีขนาด N + 1 ตัวอย่างเช่น N = 5:

 0 1 2 3 4 5
 1 0 3 2 5 4
 2 3 0 1 6 7
 3 2 1 0 7 6
 4 5 6 7 0 1
 5 4 7 6 1 0

คุณจะเห็นได้ว่ามีช่องว่างหนึ่งด้านหน้าของแต่ละหมายเลขเนื่องจากจำนวนสูงสุดในตารางมีความยาว 1 อย่างไรก็ตามถ้าเราใช้ N = 9 เราจะได้ตารางต่อไปนี้

  0  1  2  3  4  5  6  7  8  9
  1  0  3  2  5  4  7  6  9  8
  2  3  0  1  6  7  4  5 10 11
  3  2  1  0  7  6  5  4 11 10
  4  5  6  7  0  1  2  3 12 13
  5  4  7  6  1  0  3  2 13 12
  6  7  4  5  2  3  0  1 14 15
  7  6  5  4  3  2  1  0 15 14
  8  9 10 11 12 13 14 15  0  1
  9  8 11 10 13 12 15 14  1  0

ค่าสูงสุดมีความยาว 2 ดังนั้นค่าจะถูกจัดชิดขวาเป็นความยาว 3 (ความยาวสูงสุด + 1)

กฎ:

  • ช่องว่างนำไม่ได้บังคับถ้าใช้ (หรือไม่) อย่างสม่ำเสมอ
  • คุณต้องส่งออกตารางในแบบฟอร์มที่แสดงด้านบน
  • การขยายระหว่างคอลัมน์ควรเล็กที่สุดเท่าที่จะทำได้
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

อนุญาตให้มีช่องว่างระหว่างคอลัมน์ได้เท่าใด จำนวนเงินที่น้อยที่สุดเท่าที่จะเป็นไปได้?
Martin Ender

@ MartinBüttnerใช่จำนวนที่น้อยที่สุดเท่าที่จะเป็นไปได้ ฉันจะเพิ่มเข้าไปในคำอธิบาย
Adnan


ดูตัวอย่างoutput an XOR table with the size N+1
edc65

ค่าสูงสุดสำหรับ N คืออะไร? ... (สำหรับ N == 1000000 ขนาดของตารางจะอยู่ใกล้กับ 10 Terabyte)
edc65

คำตอบ:


12

MATL 10 ไบต์

0i2$:tXgZ~

คอมไพเลอร์ (และโดยเฉพาะอย่างยิ่งโปรแกรมนี้) ตอนนี้ดูเหมือนว่าจะทำงานใน Octave แม้ว่ามันจะยังคงต้องมีการปรับแต่ง คุณสามารถใช้GitHub นี้เป็นการชั่วคราวได้

แก้ไข (30 มีนาคม '16) : ลองออนไลน์!

ตัวอย่าง

>> matl 0i2$:tXgZ~
> 9
0  1  2  3  4  5  6  7  8  9
1  0  3  2  5  4  7  6  9  8
2  3  0  1  6  7  4  5 10 11
3  2  1  0  7  6  5  4 11 10
4  5  6  7  0  1  2  3 12 13
5  4  7  6  1  0  3  2 13 12
6  7  4  5  2  3  0  1 14 15
7  6  5  4  3  2  1  0 15 14
8  9 10 11 12 13 14 15  0  1
9  8 11 10 13 12 15 14  1  0

คำอธิบาย

0i2$:       % vector 0, 1, 2, ... up to input number
t           % duplicate
Xg          % nd-grid
Z~          % bitxor

คอมไพเลอร์กำลังทำงานใน Octave เร็ว ๆ นี้ ...
Luis Mendo

... ดีหวังว่า มีความคิดเกี่ยวกับเรื่องนี้ใครบ้าง?
Luis Mendo

5
เป็นเครื่องมือที่เหมาะสมสำหรับงานนี้อย่างแน่นอน +1
ปาเก็ตตี้

1
หลังจากปรับแต่งคอมไพเลอร์ดูเหมือนว่าจะทำงานใน Octave (4.0.0) ฉันต้องทำการทดสอบเพิ่มเติม แต่โปรแกรมทั้งหมดที่ฉันได้ลองใช้รวมถึงอันนี้ใช้ได้ ในขณะที่ฉันโพสต์รุ่นใหม่นี่คือลิงค์ไปยัง GitHub ปัจจุบันมุ่งมั่นที่จะเรียกใช้รหัสนี้ในระดับแปดเสียง ภาษายังไม่เปลี่ยนแปลง (ยังคงเป็นรุ่น 5.0.0) ดังนั้นจึงเร็วกว่าความท้าทายนี้
Luis Mendo

5

Bash + BSD utils, 45

eval echo \$[{0..$1}^{0..$1}]|rs -jg1 $[$1+1]

rsฉันได้รับการรอเป็นเวลานานในการหาการใช้งานเป็น ดูเหมือนว่าจะเป็นสิ่งที่ดี rsอาจจำเป็นต้องติดตั้งบนระบบ Linux แต่มันจะออกมานอกกรอบบน OS X

  • $1ขยายเป็น N จึงecho \$[{0..$1}^{0..$1}]ขยายเป็นecho $[{0..N}^{0..N}]
  • นี่คือevaled:
  • วงเล็บปีกกาขยายตัวเป็น $[0^0] $[0^1] $[0^2] ... $[0^N] ... $[N^N]
  • นี่คือชุดของการขยายเลขคณิตของ xor ซึ่งขยายออกไปเป็นหนึ่งบรรทัดคำศัพท์
  • rs(ปรับรูปร่างใหม่) เปลี่ยนบรรทัดนี้เป็น N + 1 แถว -jจัดชิดขวาและ-g1ให้ความกว้างของรางน้ำเท่ากับ 1 เพื่อให้แน่ใจว่าตารางผลลัพธ์สุดท้ายมีความกว้างน้อยที่สุดระหว่างคอลัมน์

ฉันทดสอบถึง N = 1,000 ซึ่งใช้เวลา 3.8 วินาที N ขนาดใหญ่เป็นไปได้ในทางทฤษฎีแม้ว่าทุบตีจะหมดหน่วยความจำในบางจุดด้วยการใช้หน่วยความจำ (N + 1) ²ของการขยายรั้ง


3

JavaScript (ES6) 120 122

แก้ไข 2 ไบต์บันทึก thx ETHproductions

ฟังก์ชั่นที่ไม่ระบุชื่อ หมายเหตุ: หมายเลขในตารางมี จำกัด เพียง 7 หลักซึ่งเกินความสมเหตุสมผลเนื่องจากขนาดโดยรวมของตารางที่อนุญาตให้มีจำนวนที่มากกว่า

ตอนนี้ฉันควรหาวิธีที่สั้นกว่าเพื่อให้ได้ขนาดคอลัมน์สูงสุดโดยหลีกเลี่ยงลอการิทึม

n=>(a=Array(n+1).fill(-~Math.log10(2<<Math.log2(n)))).map((m,i)=>a.map((z,j)=>`       ${i^j}`.slice(~m)).join``).join`
`

ทดสอบ

f=n=>(a=Array(n+1).fill(-~Math.log10(2<<Math.log2(n)))).map((m,i)=>a.map((z,j)=>`       ${i^j}`.slice(~m)).join``).join`\n`

function update() {
  var v=+I.value
  O.textContent = f(v)
}  

update()
N: <input id=I type=number value=9 oninput='update()'>
<pre id=O></pre>


เจ๋งชอบการใช้~mเพื่อจับภาพพื้นที่พิเศษ การใช้สตริงแม่แบบสามารถบันทึกสองไบต์:(z,j)=>`(7 spaces)${i^j}`.slice(~m)
ETHproductions

@ETHproductions 1) คำแนะนำที่ดีขอบคุณ 2) คุณจัดการใส่ยังไง ... (ฉันไม่สามารถถามได้) ... ตัวละคร (96) ภายใน 2 ตัวอักษร (96)?
edc65

Aha, คุณเพียงใช้ backticks หลายตัวเช่น: (ignore this padding) ``abc`def`` (ignore this too)แสดงแบบนี้:abc`def
ETHproductions

3

C, 114 128 152

แก้ไขการนับพื้นที่แบบง่ายขึ้นซึ่งได้แรงบันดาลใจจากงานของ Khaled A Khunaifer

ฟังก์ชั่น AC ที่เป็นไปตามข้อกำหนด

T(n){int i=0,j,x=1,d=0;while(x<=n)x+=x,++d;for(;i<=n;i++)for(j=0;j<=n;j++)printf("%*d%c",d*3/10+1,i^j,j<n?32:10);}

ลองใช้การแทรก n เป็นอินพุตโดยค่าเริ่มต้น 9

น้อย golfed

T(n)
{
   int i=0, j, x=1,d=0;
   while(x<=n) x+=x,++d; // count the digits
   // each binary digit is approximately 0.3 decimal digit
   // this approximation is accurate enough for the task
   for(;i<=n;i++)
     for(j=0;j<=n;j++)
       printf("%*d%c",d*3/10+1,
              i^j,
              j < n ? 32:10); // space between columns, newline at end
}

3

C, 103 ไบต์

Y(n){int i,j=n++;char*f="%2u";while(j/=8)++f[1];for(;j<n;++j,puts(""))for(i=0;i<n;++i)printf(f,i^j);}

1
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! สำหรับสิ่งที่ฉันเห็นคำตอบของคุณในที่นี้น่าเสียดายที่คนอื่น ๆ ที่นี่พลาดจุดจัดแนวคอลัมน์
edc65

ลองใช้ด้วยอินพุต 5 (ช่องว่างระหว่างคอลัมน์มากเกินไป) หรือ 65 (น้อยเกินไป)
edc65

นี่จะโอเคจนถึง 512 ที่ผ่านมาที่นี่ ...
ชมพู

3

เยลลี่ไม่ใช่การแข่งขัน

7 bytes คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากใช้ฟีเจอร์ที่โพสต์ความท้าทาย

0r©^'®G

ลองออนไลน์!

มันทำงานอย่างไร

0r©^'®G  Main link. Input: n (integer)

0r       Range; yield [0, ..., n].
  ©      Save the range in the register.

     ®   Yield the range from the register.
   ^'    XOR each integer in the left argument with each integer in the right one.
      G  Grid; separate rows by newlines, columns by spaces, with a fixed width for
         all columns. Since the entries are numeric, align columns to the right.

2
ขอแสดงความยินดีกับคำตอบที่ 1,000 ของคุณ :)
Adnan

3

R, 38 ไบต์

โดยปกติแล้ว R ต้องใช้จำนวนมากในการฟอร์แมตเอาต์พุต ในกรณีนี้มันค่อนข้างตรงข้าม outerซึ่งมักจะหมายถึงผลิตภัณฑ์ชั้นนอกของสองอาร์เรย์สามารถเมื่อให้ฟังก์ชั่นการดำเนินการนี้ในระยะขอบของเวกเตอร์ bitwXorในกรณีนี้เราใช้ฟังก์ชั่นบิตแฮคเกอร์

names(x)=x=1:scan();outer(x,x,bitwXor)

2

CJam, 29 27 ไบต์

ri:X),_ff{^s2X2b,#s,)Se[}N*

ทดสอบที่นี่

คำอธิบาย

ri      e# Read input and convert to integer.
:X      e# Store in X.
),      e# Get range [0 1 ... X].
_ff{    e# Nested map over all repeated pairs from that range...
  ^     e#   XOR.
  s     e#   Convert to string.
  2     e#   Push 2.
  X2b,  e#   Get the length of the base-2 representation of X. This is the same as getting
        e#   getting the base-2 integer logarithm and incrementing it.
  #     e#   Raise 2 to that power. This rounds X up to the next power of 2.
  s,    e#   Convert to string and get length to determine column width.
  )     e#   Increment for additional padding.
  Se[   e#   Pad string of current cell from the left with spaces.
}
N*      e# Join with linefeeds.

นั่นมันเร็วฮ่าฮ่า
Adnan

2

MathCAD, 187 ไบต์

ป้อนคำอธิบายรูปภาพที่นี่

MathCAD จัดการกับตารางที่สร้างขึ้นได้อย่างง่ายดาย - แต่ไม่มี Xor แบบ bitwise หรือทศนิยมเป็น binary หรือ binary เป็นตัวแปลงทศนิยม ฟังก์ชั่นสำหรับวนซ้ำผ่านค่าที่เป็นไปได้ สถานที่ i, a2, Xa และ Xb ห่วงในขณะที่แปลงเป็นเลขฐานสองอย่างแข็งขันและในขณะที่การแปลงเป็นเลขฐานสองยังดำเนินการฟังก์ชั่น xor (กากบาทเล็ก ๆ กับวงกลมรอบ ๆ มัน) มันเก็บเลขฐานสองในจำนวนฐาน 10 ซึ่งประกอบด้วย 0 และ 1 นี่จะถูกแปลงก่อนที่จะถูกเก็บไว้ในเมทริกซ์ M ผ่านฟังก์ชั่นการรวม

สิ่งนี้สามารถลงสนามได้อย่างง่ายดาย (ถ้าเพียงแค่เปลี่ยนตำแหน่งของตัวยึดให้สั้นลง) แต่ฉันคิดว่าฉันโพสต์ไว้และดูว่ามีใครสามารถตีเลขฐานสองเป็นตัวแปลงทศนิยมมากกว่าอะไรก็ได้


2

k4, 50 ไบต์

{-1@" "/:'(-|//#:''x)$x:$2/:''~x=/:\:x:0b\:'!1+x;}

เช่น:

  {-1@" "/:'(-|//#:''x)$x:$2/:''~x=/:\:x:0b\:'!1+x;}9
 0  1  2  3  4  5  6  7  8  9
 1  0  3  2  5  4  7  6  9  8
 2  3  0  1  6  7  4  5 10 11
 3  2  1  0  7  6  5  4 11 10
 4  5  6  7  0  1  2  3 12 13
 5  4  7  6  1  0  3  2 13 12
 6  7  4  5  2  3  0  1 14 15
 7  6  5  4  3  2  1  0 15 14
 8  9 10 11 12 13 14 15  0  1
 9  8 11 10 13 12 15 14  1  0

2

C, 149 ไบต์

int i=0,j,n,k=2;char b[256];scanf("%d",&n);while((k*=2)<=n);k^=k-1;while(i++<=n&&putchar(10))for(j=0;j<=n;j++)printf(" %*d",sprintf(b,"%d",k),i-1^j);
---------

รายละเอียด

#include <stdio.h>

int main()
{
    int i=0, j, n, k=2;
    char b[256] = { 0 };

    scanf("%d", &n);

    // find max xor value in the table
    while((k*=2)<=n); k^=k-1;

    printf("> %d ~ %d", k, sprintf(b,"%d",k));

    while(i++ <= n && putchar(10))
    {
        for(j = 0; j <= n;j++)
        {
            printf(" %*d", sprintf(b,"%d",k), (i-1)^j);
        }
    }

    return 0;
}

1
เช่นเดียวกับโพสต์ java ของคุณไม่มีความพยายามที่จะจัดเรียงคอลัมน์อย่างถูกต้อง นั่นเป็นเพียงส่วนที่ยากของการท้าทายนี้ รหัสนี้ให้ผลลัพธ์ที่ไม่ถูกต้องเมื่ออินพุต <8 หรือ> 64
edc65

@ edc65 ฉันพบวิธีจัดตำแหน่งค่าสูงสุดของ xor คือเลขฐานสอง11..1กับค่านัยสำคัญในค่าอินพุตnสามารถทำได้โดยการค้นหากำลังที่ใกล้เคียงที่สุดเป็น 2 จากนั้น xor กับหมายเลขก่อนหน้า0001 xor 1110 = 1111
Khaled.K

ดีคุณอยู่ในเส้นทางที่ถูกต้องแล้ว ถึงกระนั้นคุณควรทดสอบเพิ่มเติม: ลูปที่มี k ให้ผลลัพธ์ที่ผิดสำหรับ n = 8 (และคำตอบสั้น ๆ ของคุณไม่ได้กำหนดค่าเริ่มต้นของตัวแปรโลคอล i ถึง 0)
edc65

การวนซ้ำที่ง่ายกว่านี้ควรทำอย่างไร: for(k=1;k<=n;)k*=2;k--;. ตอนนี้ฉันเห็นแล้วว่าสั้นกว่าความพยายาม C ของฉันไปมากเหมือนกัน (ของฉันดีกว่าสำหรับการทำงาน แต่ประสิทธิภาพไม่สำคัญสำหรับความท้าทายนี้)
edc65

@ edc65 ที่คุณต้องทำ2^k xor 2^k -1สำหรับmax{2^k<=n}หรือสำหรับ2^k -1 min{2^k>=n}เพื่อรับทั้งหมด11..1ในนั้น
Khaled.K

2

Python 3, 133 131 ไบต์

import math
n=int(input())
r,p=range(n+1),print
for y in r:[p(end='%%%dd '%len(str(2**int(math.log2(n)+1)-1))%(x^y))for x in r];p()

1

Mathematica, 108 ไบต์

StringRiffle[Thread[Map[ToString,a=Array[BitXor,{#,#}+1,0],{2}]~StringPadLeft~IntegerLength@Max@a],"
"," "]&

ไม่สนใจข้อผิดพลาดมันแค่Threadไม่รู้ว่ากำลังทำอะไรอยู่


1

Emacs Lisp, 193 ไบต์

(defun x(n)(set'a 0)(set'n(1+ n))(while(< a n)(set'b 0)(while(< b n)(princ(format(format"%%%ss "(ceiling(log(expt 2(ceiling(log n 2)))10)))(logxor a b)))(set'b(1+ b)))(set'a(1+ a))(message"")))

Ungolfed:

(defun x(n)
  (set'a 0)
  (set'n(1+ n))
  (while(< a n)
    (set'b 0)
    (while(< b n)
      (princ
        (format
          ;; some format string magic to get the length of the longest
          ;; possible string as a format string
          (format "%%%ss " (ceiling(log(expt 2(ceiling(log n 2)))10)))
          (logxor a b)))
      (set'b(1+ b)))
    (set'a(1+ a))
    ;; new line
    (message"")))

เอาท์พุทถูกส่งไปยัง*Message*บัฟเฟอร์ซึ่งจะเป็นstdoutถ้าxถูกนำมาใช้ภายในสคริปต์

(x 9)
 0  1  2  3  4  5  6  7  8  9 
 1  0  3  2  5  4  7  6  9  8 
 2  3  0  1  6  7  4  5 10 11 
 3  2  1  0  7  6  5  4 11 10 
 4  5  6  7  0  1  2  3 12 13 
 5  4  7  6  1  0  3  2 13 12 
 6  7  4  5  2  3  0  1 14 15 
 7  6  5  4  3  2  1  0 15 14 
 8  9 10 11 12 13 14 15  0  1 
 9  8 11 10 13 12 15 14  1  0

1

Python 2, 114 ไบต์

มันต้องหาวิธีที่จะเติมความกว้างของตัวแปรใน.format()(บางส่วนไม่มาก) และปรับให้ถูกต้อง แต่ฉันคิดว่าตอนนี้ฉันมีทุกอย่างที่จำเพาะ สามารถใช้สนามกอล์ฟมากขึ้นในการคำนวณความกว้างนั้น

N=input()+1
for i in range(N):print''.join(' {n:>{w}}'.format(w=len(`2**(len(bin(N))-2)`),n=i^r)for r in range(N))

1

Caché ObjectScript , 127 ไบต์

x(n)s w=$L(2**$bitfind($factor(n),1,100,-1))+1 f i=0:1:n { w $j(i,w) } f i=1:1:n { w !,$j(i,w) f j=1:1:n { w $j($zb(i,j,6),w) } }

รายละเอียด:

x(n)
 set w=$Length(2**$bitfind($factor(n),1,100,-1))+1
 for i=0:1:n {
     write $justify(i,w)
 }
 for i=1:1:n {
     write !,$justify(i,w)
     for j=1:1:n {
         write $justify($zboolean(i,j,6),w)
     }

 }


0

Python 2, 77 ไบต์

n=input()+1
t=range(n)
for i in t: print "%3d"*n % tuple([x^i for x in t])

3
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! สำหรับสิ่งที่ฉันเห็นคำตอบของคุณในที่นี้น่าเสียดายที่คนอื่น ๆ ที่นี่พลาดจุดการจัดตำแหน่งคอลัมน์
แมว


0

Excel VBA ขนาด 95 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อแบบทันทีที่รับอินพุตจากช่วง[A1]และเอาต์พุตไปยังคอนโซล

For y=0To[A1]:For x=0To[A1]:z=x Xor y:?Spc([Len(2^-Int(-Log(A1,2)))]-Len(z))Str(z);:Next:?:Next

0

พื้นฐานขนาดเล็ก 499 ไบต์

สคริปต์ที่รับอินพุตจากTextWindowวัตถุและเอาต์พุตเป็นแบบเดียวกัน

a=TextWindow.Read()
For y=0To a
For x=0To a
n=x
b()
z1=z
n=y
b()
l=Math.Max(Array.GetItemCount(z),Array.GetItemCount(z1))
o=0
For i=1To l
If z1[i]<>z[i]And(z[i]=1Or z1[i]=1)Then
z2=1
Else 
z2=0
EndIf
o=o+z2*Math.Power(2,i-1)
EndFor
TextWindow.Write(Text.GetSubText("      ",1,Text.GetLength(Math.Power(2,Math.Ceiling(Math.Log(a)/Math.Log(2))))-Text.GetLength(o))+o+" ")
EndFor
TextWindow.WriteLine("")
EndFor
Sub b
z=0
c=0  
While n>0
c=c+1
z[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
EndSub

ลองที่ SmallBasic.com ใช้ Silverlight และจะต้องทำงานใน IE หรือ Edge

Enterเลือกคอนโซลสีดำจากนั้นพิมพ์จำนวนเต็มการป้อนข้อมูลและกด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.