การคูณแฮคเกอร์


33

เป้าหมายของคุณคือการใช้การดำเนินการคูณXOR ( ไร้ค่า ) ตามที่กำหนดไว้ด้านล่างในไม่กี่ไบต์เท่าที่จะทำได้

ถ้าเราคิดว่า bitwise XOR ( ^) เป็นการเพิ่มแบบไบนารีโดยไม่ต้องถือ

   101   5
^ 1001   9
  ----  
  1100  12

  5^9=12

เราสามารถดำเนินการ XOR คูณ@ด้วยการทำไบนารียาวคูณ^แต่ทำขั้นตอนการเพิ่มโดยไม่ดำเนินการเป็นค่าที่เหมาะสมแฮคเกอร์

     1110  14
   @ 1101  13
    -----
     1110
       0
   1110
^ 1110 
  ------
  1000110  70

  14@13=70

(สำหรับนักคณิตศาสตร์นี่คือการคูณในพหุนามพหุนามF_2[x]ระบุพหุนามกับจำนวนธรรมชาติโดยการประเมินที่x=2พหุนามมากกว่า Z)

แฮคเกอร์เดินทางคูณa@b=b@aร่วมและจัดจำหน่ายมากกว่าค่าที่เหมาะสมแฮคเกอร์(a@b)@c=a@(b@c) a@(b^c)=(a@b)^(a@c)ในความเป็นจริงมันเป็นงานที่ไม่ซ้ำกันเช่นที่ตรงกับการคูณa@b=a*bเมื่อใดก็ตามaและbมีพลังแห่งเช่น21,2,4,8...

ความต้องการ

ใช้จำนวนเต็มสองจำนวนที่ไม่เป็นลบเป็นอินพุตและเอาต์พุตหรือพิมพ์ XOR-product นี่ควรเป็นตัวเลขหรือการแสดงสตริงทศนิยมไม่ใช่การขยายแบบไบนารี ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

ไม่ต้องกังวลกับจำนวนเต็มล้น

a b a@bนี่คือบางส่วนกรณีทดสอบรูปแบบเป็น

0 1 0
1 2 2
9 0 0
6 1 6
3 3 5
2 5 10
7 9 63
13 11 127
5 17 85
14 13 70
19 1 19
63 63 1365

13
สิ่งนี้เป็นที่รู้จักกันดีในชื่อ "การคูณแบบลดน้อยลง" ซึ่งคุณอาจต้องการเพิ่มชื่อคำถามและด้วยความน่าจะเป็นสูงรายการที่เล็กที่สุดคือคำสั่งPCLMULQDQ686 x86 จากส่วนขยาย CLMUL น่าเสียดายที่ฉันลงคะแนนสำหรับความรู้เกี่ยวกับชุดคำสั่ง x86 ก่อนหน้านี้ (ที่เกี่ยวข้องกับPEXT/PDEP) ดังนั้นฉันจะทิ้งความคิดเห็นไว้ที่นี่
Iwillnotexist Idonotexist

@IwillnotexistIdonotexist ขอบคุณสำหรับการบันทึกเป็นเรื่องดีที่มีชื่อให้กับ Google
xnor

หากสิ่งที่กล่าวมาข้างต้นไม่ใช่ "xor" คุณต้องโทรหาวิธีอื่นในรูปแบบ xorc หรือ xornc ... ไม่ใช่ xor
RosLuP

1
@RosLuP ไม่ใช่ xor แต่เป็นการคูณ xor
xnor

@boboquack ที่จริงแล้วฉันเชื่อว่าการคูณด้วย nimber นั้นแตกต่างกัน ตัวอย่างเช่นมันมี 2 * 2 == 3 ทั้งสองนี้กระจายผ่านการเพิ่ม nim แต่สิ่งที่ท้าทายในการแข่งขันนี้ตรงกับการคูณกับพลังของ 2 ในขณะที่ nimber ในการแข่งขันเฉพาะใน 2 ^ (2 ^ n)
xnor

คำตอบ:


36

รหัสเครื่อง x86: 7 ไบต์

66 0F 3A 44 C1 00 C3  pclmulqdq xmm0, xmm1, 0 \ ret

เพียงสองคำแนะนำ pclmulqdqการยกของหนักนั้นใช้งาน xor-multiplication อย่างแท้จริง retเพื่อให้เป็นฟังก์ชัน callable หวังว่าจะสนองความต้องการของ "outputting" ผลลัพธ์ (ในค่า return xmm0) การใส่อาร์กิวเมนต์จำนวนเต็มในxmmargs นั้นผิดปกติเล็กน้อย แต่ฉันหวังว่าคุณจะยกโทษให้ฉัน


1
การใช้งานในตัวมีเสียงเหมือนการโกง ...
CJ Dennis

4
@CJDennis ในเมตาโพสต์มาตรฐานของช่องโหว่ไม่มีความเห็นเป็นเอกฉันท์ว่าควรถูกแบนหรือไม่ มี 44 เสียงโหวตสำหรับแบน, 31 คะแนนโหวตต่อต้าน
isaacg

1
@isaacg ฉันจริงๆไม่ได้พยายามที่จะจู้จี้จุกจิก แต่ถ้อยคำของคำถามคือเป้าหมายของคุณคือการใช้การดำเนินงานของแฮคเกอร์ (ที่ carryless) คูณ คำตอบนี้ "ใช้" การดำเนินการเองหรือเพียงแค่เรียกฟังก์ชั่นของคนอื่นหรือไม่? คำตอบอื่น ๆ ทั้งหมดทำงานหนักด้วยตัวเองซึ่งมักจะอยู่ในระยะไม่กี่ไบต์ของคำตอบนี้ ฉันคิดว่าพวกเขาทั้งหมดฉลาดและสมควรได้รับการอัปเดตมากกว่านี้
CJ Dennis

8
ฉันไม่รู้สึกผิดที่จะตอบคำตอบหากคำถามนั้นไม่สำคัญเลยมันถูกนำไปใช้โดยตรงโดยซีพียูทั่วไปใคร ๆ ก็แทบจะไม่ได้ระดับที่ต่ำกว่านั้น มันไม่น่าสนใจหรือน่าจดจำเป็นพิเศษ แต่ดูเหมือนจะเป็นคำตอบที่ถูกต้องดังนั้น +1
Vality

9
ฉันไม่มีปัญหากับการใช้งานในตัวเพื่อแก้ไขปัญหานี้ - ไม่เช่นนั้นฉันก็ไม่รู้ว่ามีอยู่แล้วในตัว
xnor

14

Z80, 11 ไบต์

B7 CB 32 30 01 B3 C8 CB 23 18 F6   

รหัสเรียกว่าเป็นฟังก์ชั่น aและbอยู่ในDและE(ลำดับไม่สำคัญ) และคำตอบจะถูกเก็บไว้Aเมื่อรหัสส่งคืน (ไม่มีฟังก์ชั่น I / O)

B7      XOR A     //  A^=A (A=0)
CB 32   SRL D     //    CARRY = lsb(D), D>>=1, ZERO = D==0
30 01   JR NC, 1  //    jump 1 byte if not CARRY
B3      XOR E     //      A^=E, ZERO = A==0
C8      RET Z     //    return if ZERO
CB 23   SLA E     //    E<<=1
18 F6   JR -10    //    jump -10 bytes

มันสร้างผลลัพธ์ที่ถูกต้องสำหรับอินพุตการทดสอบทั้งหมดยกเว้น63@63ว่าจะส่งคืน85เนื่องจากรีจิสเตอร์ทั้งหมดเป็น 8 บิตและ 1365 mod 256 = 85 (ล้นจำนวนเต็ม)


10

C, 44 38 ไบต์

ขอบคุณ nimi ตอนนี้เราใช้การเรียกซ้ำเป็น 6 ไบต์น้อยลง!

f(a,b){return b?(b&1)*a^f(a*2,b/2):0;}

เรากำหนดฟังก์ชันfที่ใช้a, b.

สิ่งนี้สามารถเรียกได้ว่า:

printf("%d @ %d = %d\n", 13, 14, f(13, 14));

ผลลัพธ์ใด:

13 @ 14 = 70

ลองทดสอบกรณีออนไลน์ !


1
ทำไมไม่รุ่น recursive f(a,b)={return(b)?(b&1)*a^f(2*a,b/2):0;}?
nimi

@nimi Ah ฉลาด! ฉันรู้ว่ามีวิธีกำจัดพารามิเตอร์ใบ้นั้น ตอนนี้ฉันมี 38 ไบต์ ขอบคุณ!
BrainSteel

1
การย้ายออก 44 ยังคงเป็นปกติ 44 :(
อเล็กซ์ A.

อินพุตไม่เป็นค่าลบดังนั้นคุณสามารถแทนที่(b&1)ด้วยb%2เพื่อบันทึกอีกสองไบต์เนื่องจาก%มีลำดับความสำคัญจากซ้ายไปขวาเหมือน*กัน
CL-

9

Pyth, 13 12 ไบต์

uxyG*HQjvz2Z

สาธิต.

uxyG*HQjvz2Z
                  Implicit:
                  z = input()
                  Q = eval(input())
                  Z = 0

       jvz2       The first input, written in base 2, like so: [1, 0, 1, ...
u      jvz2Z      Reduce over the binary representation, starting with 0.
 x                XOR of
  yG              Twice the previous number
    *HQ           and the second input times the current bit.

รุ่นเก่า 13 ไบต์:

xFm*vz.&Q^2dQ

สาธิต.


ฉันเดาว่าไม่มีวิธีที่ดีในการหลีกเลี่ยงvzการรับอินพุตจำนวนเต็มสองรายการ
xnor

@xnor ไม่น่าเสียดาย
isaacg

8

CJam, 14 13 ไบต์

q~2bf*{\2*^}*

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

ก่อนอื่นเราจะได้ผลลัพธ์การคูณที่ยาวก่อนแล้วค่อยเริ่มจากคู่ล่างสุด

q~                e# Eval the input. This puts the two numbers on stack
  2b              e# Convert the second number to binary
    f*            e# Multiply each bit of second number with the first number
                  e# This leaves an array with the candidates to be added in the long
                  e# multiplication step
      {    }*     e# Reduce on these candidates. Starting from the bottom
       \2*        e# Bit shift the lower candidate
          ^       e# XOR each other and continue

ลองออนไลน์ได้ที่นี่


7

J, 14 ไบต์

*/(~://.@)&.#:

การใช้งาน:

   5 (*/(~://.@)&.#:) 17     NB. enclosing brackets are optional
85

คำอธิบาย (ส่วนใหญ่อ่านจากขวาไปซ้ายuและvย่อมาจากฟังก์ชันตามอำเภอใจ):

  • u&.#:นำuไปใช้กับเวกเตอร์ของการเป็นตัวแทนไบนารีของหมายเลขอินพุตจากนั้นเปลี่ยนผลลัพธ์กลับไปเป็นจำนวนเต็ม ( u&.v == v_inverse(u(v(input_1), v(input_2))))
  • */products ( *) ของอินพุตในผลิตภัณฑ์ Descartes ( /) ของเวกเตอร์ไบนารีสองรายการ
  • v(u@)นำuไปใช้กับv(กับผลิตภัณฑ์ Descartes)
  • u/.นำuไปใช้กับทุกแนวต้านของผลิตภัณฑ์เดส์การต (การต่อต้านเส้นทแยงมุมหมายถึงตัวเลขที่ 1, 2, ... ในการแทนเลขฐานสอง)
  • ~:/ลด ( /) การต่อต้านในแนวทแยงด้วยการดำเนินการ XOR ( ~:)
  • ขั้นตอนสุดท้ายคือการสร้างจำนวนเต็มจากเวกเตอร์ไบนารีซึ่งจุดแรกดูแล

ลองออนไลน์ได้ที่นี่


5

Python 2, 35 ไบต์

f=lambda m,n:n and n%2*m^f(2*m,n/2)

f(13, 14)โทรเช่น ฉันคิดว่าภาษาส่วนใหญ่ที่มีโครงสร้างที่คล้ายกันจะรวมตัวกันในบางสิ่งเช่นนี้


4

Java, 62

(x,y)->{int r=0,i=0;for(;i<32;)r^=x*((y>>i)%2)<<i++;return r;}

ขยาย

class XORMultiplication {
    public static void main(String[] args) {
        IntBinaryOperator f = (x, y) -> {
                    int r = 0, i = 0;
                    for (; i < 32;) {
                        r ^= x * ((y >> i) % 2) << i++;
                    }
                    return r;
                };
        System.out.println(f.applyAsInt(14, 13));
    }
}

1
มีเหตุผลที่คุณต้องการfor(;i<32;)ที่จะwhile(i<32)? มันมีความยาวเท่ากัน แต่ข้อที่สองดูเหมือนเป็นวิธีเขียนที่เป็นธรรมชาติมากกว่า
JohnE

1
@ จอห์นฉันจะเดาว่าi++เดิมอยู่ในforวงและได้กอล์ฟไปยังตำแหน่งปัจจุบัน เนื่องจากwhileไม่มีขนาดเล็กกว่าจึงไม่มีเหตุผลที่จะเปลี่ยน
CJ Dennis

3

Haskell, 50 ไบต์

import Data.Bits
_#0=0
a#b=b.&.1*a`xor`2*a#div b 2

คำแปลของ @ BrainSteel's C คำตอบ ตัวอย่างการใช้งาน:

map (uncurry (#)) [(0,1),(1,2),(9,0),(6,1),(3,3),(2,5),(7,9),(13,11),(5,17),(14,13),(19,1),(63,63)]
[0,2,0,6,5,10,63,127,85,70,19,1365]

3

Perl - 35 ไบต์

#!perl -p
$\^=$`>>$_&1&&$'<<$_ for-/ /..31}{

การนับตัวเลือกบรรทัดคำสั่งเป็นหนึ่ง อินพุตถูกนำมาจากSTDINแยกพื้นที่

ตัวอย่างการใช้งาน:

$ echo 13 11 | perl xormul.pl
127
$ echo 5 17 | perl xormul.pl
85
$ echo 14 13 | perl xormul.pl
70
$ echo 19 1 | perl xormul.pl
19
$ echo 63 63 | perl xormul.pl
1365

3

Julia, 35 33 30 ไบต์

f(a,b)=b%2*a$(b>0&&f(2a,b÷2))

สิ่งนี้จะสร้างฟังก์ชั่นวนซ้ำfซึ่งใช้จำนวนเต็มสองจำนวนและส่งคืนผลิตภัณฑ์ XOR ของอินพุต

Ungolfed:

function f(a, b)
    # Bitwise XOR : $
    # Short-circuit AND : &&

    b % 2 * a $ (b > 0 && f(2a, b ÷ 2))
end

บันทึกสองสามไบต์ด้วยการสนับสนุนจาก Sp3000!


2

Python 2, 104 91 78 66 ไบต์

def y(a,b,c=0):
 for _ in bin(b)[:1:-1]:c^=int(_)*a;a<<=1
 print c

ใช้บิตของbในลำดับย้อนกลับสิ้นสุดก่อนที่คุณจะตี'0b'ที่จุดเริ่มต้นของสตริง คูณหนึ่งโดยแต่ละaและด้วยรวมแล้วซ้ายกะxor aจากนั้นพิมพ์ผลรวม



2

GAP , 368 ไบต์

สำหรับนักคณิตศาสตร์นี่คือการคูณในพหุนามแหวน F_2 [x] การระบุพหุนามกับจำนวนธรรมชาติโดยการประเมินที่ x = 2 เป็นพหุนามมากกว่า Z

แน่นอนเรามาทำเช่นนั้น! (นี่เป็นเพียงการตีกอล์ฟอย่างหลวม ๆ ประเด็นก็คือย้ายเข้าสู่ F 2 มากกว่า [x] และทำการคำนวณมากกว่าความพยายามใด ๆ ในการเป็นผู้ชนะ

นี่คือรหัส

f:=function(i,j)R:=PolynomialRing(GF(2));x:=IndeterminatesOfPolynomialRing(R);x:=x[1];a:=function(i)local n,r;r:=0*x;while not i=0 do n:=0;while 2^n<=i do n:=n+1;od;n:=n-1;r:=r+x^n;i:=i-2^n;od;return r;end;b:=function(r)local c,i,n;i:=0;n:=0;for c in CoefficientsOfUnivariatePolynomial(r) do if c=Z(2)^0 then n:=n+2^i;fi;i:=i+1;od;return n;end;return b(a(i)*a(j));end;

นี่คือรหัส ungolfed พร้อมคำอธิบาย:

xor_multiplication:=function(i,j)           
    R:=PolynomialRing(GF(2));
    x:=IndeterminatesOfPolynomialRing(R);
    x:=x[1];
    to_ring:=function(i)
        local n,r; 
        r:=0*x;
        while not i=0 do
            n:=0;
            while 2^n<=i do
                n:=n+1;
            od;
            n:=n-1;
            r:=r+x^n;
            i:=i-2^n;
        od;
        return r;
    end;
    to_ints:=function(r)
        local c,i,n;
        i:=0;n:=0;
        for c in CoefficientsOfUnivariatePolynomial(r) do
            if c=Z(2)^0 then
                n:=n+2^i;
            fi;
            i:=i+1;
        od;
        return n;
    end;
    return to_ints( to_ring(i)*to_ring(j));
end;

เอาล่ะออกก่อนดังนั้นเราจะสร้างชื่อแหวน univariate กว่าสนาม F 2Rและเรียกมันว่า โปรดทราบว่าGF(2)เป็น F 2ใน GAP

R:=PolynomialRing(GF(2));

ต่อไปเราจะไปกำหนดตัวแปรของ GAP เพื่อไม่แน่นอนของแหวนx Rตอนนี้เมื่อใดก็ตามที่ผมพูดxใน GAP Rระบบจะรู้ว่าฉันกำลังพูดคุยเกี่ยวกับไม่แน่นอนของแหวน

x:=IndeterminatesOfPolynomialRing(R);
x:=x[1];

ต่อไปเรามีสองฟังก์ชั่นซึ่งเป็นแผนที่ผกผันซึ่งกันและกัน แผนที่เหล่านี้เป็นทั้งสองอย่าง แต่ก็ไม่ได้เป็นโครงสร้างดังนั้นฉันจึงไม่สามารถหาวิธีที่ดีกว่าในการนำไปใช้ใน GAP มีวิธีที่ดีกว่าแน่นอนถ้าคุณรู้โปรดแสดงความคิดเห็น!

แผนที่แรกto_ringรับจำนวนเต็มและแมปไปยังองค์ประกอบเสียงเรียกเข้าที่สอดคล้องกัน มันทำสิ่งนี้โดยใช้การแปลงอัลกอริธึมแบบไบนารี่โดยที่ทุกอัน1ที่ปรากฏในไบนารี่จะถูกแทนที่ด้วยx^nตำแหน่งที่nเป็นกำลังที่เหมาะสมที่ 2 จะใช้ถ้าจำนวนนั้นเป็นไบนารี่จริง ๆ

    to_ring:=function(i)
        local n,r; 
        r:=0*x;                 # initiate r to the zero element of R
        while not i=0 do        # this is a modified binary algorithm
            n:=0;
            while 2^n<=i do
                n:=n+1;
            od;
            n:=n-1;
            r:=r+x^n;
            i:=i-2^n;
        od;
        return r;
    end;

ฟังก์ชั่นถัดไปกลับรายการนี้ to_intsใช้องค์ประกอบแหวนและแผนที่มันเป็นจำนวนเต็มที่สอดคล้องกัน ฉันทำสิ่งนี้โดยรับรายการค่าสัมประสิทธิ์ของพหุนามและแต่ละสัมประสิทธิ์ที่ไม่ใช่ศูนย์ผลลัพธ์จะเพิ่มขึ้น 2 ^ n ในวิธีเดียวกับที่เราจะแปลงเลขฐานสองเป็นทศนิยม

    to_ints:=function(r)
        local c,i,n;
        i:=0;n:=0;
        for c in CoefficientsOfUnivariatePolynomial(r) do
            if c=Z(2)^0 then          

                 # ^-- Right here you'll notice that the Z(2) is basically '1' in GF(2). So Z(2)^0 ~ 1 and Z(2)*0 ~ 0  
                 # effectively, this line checks for nonzero coefficients

                n:=n+2^i;
            fi;
            i:=i+1;
        od;
        return n;
    end;

สำหรับขั้นตอนสุดท้ายเราเรียกฟังก์ชันเหล่านี้ เรารับอินพุตจำนวนเต็มสองตัวแปลงเป็นองค์ประกอบในวงแหวนRแล้วคูณองค์ประกอบเหล่านี้เข้าด้วยกันแล้วส่งผลิตภัณฑ์กลับไปเป็นจำนวนเต็ม

return to_ints( to_ring(i)*to_ring(j));

1

Ruby, 76 75 73 ไบต์

a,b=$*.map{|x|x.to_i}
o=0
while(b>0)
o^=a&-(b&1)
a<<=1
b>>=1
end
puts(o)

Ruby, 60 ไบต์ (ฟังก์ชันเท่านั้นไม่มี I / O)

def t(a,b)
o=0
while(b>0)
o^=a&-(b&1)
a<<=1
b>>=1
end
t
end




1

ตัวประกอบ GNU (x86_64 Mac OS X), 97 ไบต์

นี่เป็นฟังก์ชั่นที่เหมาะสมที่สามารถเรียกได้จาก C:

.text
.globl _f
_f:
movq %rdi,%xmm0;movq %rsi,%xmm1;pclmulqdq $0,%xmm1,%xmm0;movq %xmm0,%rax;ret

& สามารถทดสอบกับโปรแกรม C นี้:

#include <stdio.h>
int f(int a, int b);
#define p(a,b) printf("%d %d %d\n", a, b, f(a, b))
int main(void)
{
    p(0,1);
    p(1,2);
    p(9,0);
    p(6,1);
    p(3,3);
    p(2,5);
    p(7,9);
    p(13,11);
    p(5,17);
    p(14,13);
    p(19,1);
    p(63,63);
}

โปรดทราบว่าใน Mac OS X คุณต้องใช้clang -x cในการรวบรวมเป็น C & ไม่ใช่ C ++

สำหรับ linux (ถ้าฉันจำได้ถูกต้อง) โค้ดจะเป็น 95 ไบต์:

.text
.globl f
f:
movq %rdi,%xmm0;movq %rsi,%xmm1;pclmulqdq $0,%xmm1,%xmm0;movq %xmm0,%rax;ret

น่าแปลกที่รุ่นนี้ยาวกว่าการกำหนดฟังก์ชันในแอสเซมบลีไลน์ แต่อันนี้ยาวกว่าโซลูชัน C บริสุทธิ์ที่เรามีอยู่แล้วดังนั้นฉันจึงตัดสินใจลองประกอบ

แก้ไข

หากนับตามขนาดที่ประกอบ (ไม่รวมป้ายกำกับ & c.) แสดงว่าเป็นขนาด

x86_64 แอสเซมเบลอร์ 22 ไบต์:

0:  66 48 0f 6e c7          movq         %rdi,  %xmm0
5:  66 48 0f 6e ce          movq         %rsi,  %xmm1
a:  66 0f 3a 44 c1 00       pclmullqlqdq $0,    %xmm1,%xmm0
10: 66 48 0f 7e c0          movq         %xmm0, %rax
15: c3                      ret

ฉันคิดว่าคุณวัดขนาดภาษาแอสเซมบลีด้วยรูปแบบที่คอมไพล์แล้ว
Nissa

0

golflua 68

x,y=I.r("*n","*n")r=0~@i=0,31r=B.x(r,x*B.ls(B.rs(y,i)%2,i+1))$w(r/2)

ทำโดยพื้นฐานบิตเดียวกับคำตอบ Java ของ Ypnypnแต่ดูเหมือนว่าจะต้องหารด้วย 2 ตอนท้ายเพื่อให้ทำงานได้อย่างถูกต้อง รับค่าเป็น stdin ตัวอย่างด้านล่าง

> 14 13 
70
> 19 1 
19
> 5 17 
85

0

Ceylon, 90 ไบต์

alias I=>Integer;I x(I a,I b)=>[for(i in 0:64)if(b.get(i))a*2^i].fold(0)((y,z)=>y.xor(z));

นี่เป็นเพียงอัลกอริทึมตามที่อธิบายไว้: ทวีคูณaโดย2^iที่ใดก็ตามที่iบิตถูกตั้งค่าbและรวมเข้าด้วยกันโดยใช้ xor ทำซ้ำได้0:64เพราะจำนวนเต็ม 64 บิตใน Ceylon เมื่อทำงานบน JVM (ต่ำกว่าเมื่อใช้งานเป็น Javascript แต่หลังจากนั้นb.get(i)ส่งคืนค่าเท็จ)

จัดรูปแบบ:

alias I => Integer;

I x(I a, I b) =>
      [
        for (i in 0:64)
            if (b.get(i))
                a * 2^i
      ].fold(0)((y, z) => y.xor(z));

ตู้นิรภัยนามแฝงอยู่ที่นี่เพียงหนึ่งไบต์


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