สลับอาเรย์บูลีน


19

คนเรียบง่ายดี

อินพุต

รับอาเรย์บูลีน (หรือทางเลือกที่ยอมรับได้) คุณสามารถสันนิษฐานได้ว่าอาเรย์จะไม่ยาวเกิน 32 องค์ประกอบ

[false, false, true, false, false]

เอาท์พุต

ย้อนกลับทุกองค์ประกอบของอาร์เรย์และส่งออกมัน

[true, true, false, true, true]

กฎระเบียบ

  • คุณสามารถเขียนโปรแกรมเต็มหรือเพียงแค่ฟังก์ชั่น
  • ช่องโหว่มาตรฐานใช้
  • รหัสที่สั้นที่สุดเป็นไบต์ต่อภาษาชนะ!

กรณีทดสอบ

Input:
[true, false]
Output:
[false, true]

Input: //Example of acceptable alternative
[0,1,1]
Output:
[1,0,0]

แล้วอาร์เรย์ของ0(false, 0 bits ทั้งหมด) และ-1(true, 1 bits ทั้งหมด) ล่ะ?
ลินน์


ที่เกี่ยวข้อง (ได้รับความเรียบง่ายของงานหลักที่ผมจะบอกความแตกต่างในรูปแบบที่มีมากพอที่สำคัญที่เหล่านี้จะไม่ซ้ำกัน.)
มาร์ตินเอนเดอร์

6
มากกว่าโค้ดกอล์ฟสิ่งนี้ที่ฉันชอบ: ผู้ประกอบการที่ไม่ใช่ภาษาโปรดของคุณคือใคร? คะแนนเพิ่มเติมถ้ามันทำงานในรายการ
licorna

คำตอบ:



14

เยลลี่ขนาด 1 ไบต์

¬

ลองออนไลน์!

¬ไม่ใช่ตรรกะ (1 ถ้า false-y, อื่น 0) C(“ ส่วนประกอบ”, 1 − z ) ก็ใช้ได้เช่นกัน


12
ฉันคิดว่า @Dennis กำลังจะมีปัญหากับคุณ
ข้อบกพร่อง

15
@flawr มันเป็นเรื่องของเวลาก่อนที่ Dennis จะทำมันใน 0 ไบต์หรือน้อยกว่า
Erik the Outgolfer

2
@EriktheGolfer "0 bytes หรือน้อยกว่า " hmm
zdimension

1
@zdimension มันเป็นเดนนิสเขาทำได้สั้นกว่าที่คุณคิด (อ่านมส์)
Erik the Outgolfer


12

Matlab, 4 1 ไบต์

สิ่งนี้ควรอธิบายด้วยตนเอง

~

Matlab มีโอเปอเรเตอร์หนึ่งไบต์~ถ้าคุณต้องการฟังก์ชั่นที่คุณสามารถ@notใช้ได้


22
รับ@rgument, negate, output, terminate ใช่ไหม?
Martin Ender

2
ฮ่าฮ่าใช่ฉันแปลกใจที่คุณคล่องแคล่วใน Matlab!
ข้อบกพร่อง

ฮ่า ๆ ดูเหมือนว่า Borat "นี่ควรจะเป็นคำอธิบายตัวเอง .... ไม่"
user2023861

แน่นอนว่า~เป็นคำตอบที่เหมาะสมเนื่องจากเป็นโอเปอเรเตอร์ที่ได้รับการโต้แย้ง ฉันคิดว่า~[1,0,0,1,0]เหมาะสมทั้งหมด
Tasos Papastylianou

1
@TasosPapastylianou การส่งโอเปอร์เรเตอร์นั้นใช้ได้อย่างแน่นอน (ในบางภาษาเช่น Julia และ Mathematica มันเป็นเรื่องธรรมดาที่จะกำหนดผู้ปฏิบัติงานของคุณเพราะมันสั้นกว่าการกำหนดฟังก์ชั่นของคุณเอง) แต่ฉันแน่ใจว่าข้อบกพร่องของฉัน ;)
Martin Ender

10

Haskell ขนาด 7 ไบต์

map not

ตัวอย่าง:

Prelude> (map not) [False, True, True]
[True,False,False]

คุณไม่จำเป็นต้องใส่วงเล็บในตัวอย่างใช่มั้ย
ข้อบกพร่อง

9
ฉันทำไม่ได้ แต่ฉันต้องการแสดงให้เห็นในตัวอย่างว่าคำตอบของฉันคือการแสดงออกที่ถูกต้องและไม่เป็นตัวอย่าง
Lynn

3
มีการแก้ไขที่แนะนำในขณะนี้เพื่อสร้างรหัสnot<$>แต่นั่นไม่ใช่นิพจน์ที่ถูกต้อง คุณไม่สามารถเขียนf = not<$>แล้วf [False, True, True]; ตัวดำเนินการจำเป็นต้องใช้วงเล็บที่อยู่รอบ ๆ ซึ่งจะส่งผลต่อจำนวนไบต์
Lynn

2
และคุณก็ไม่ควรที่จะแนะนำรหัสผ่านการแก้ไขต่อไป
undergroundmonorail


10

C, 46 ไบต์รุ่นเรียกซ้ำ

f(char*s){*s?putchar(*s&72?*s:*s^1),f(++s):0;}

C, 47 ไบต์ซ้ำรุ่น

f(char*s){for(;*s;putchar(*s&72?*s:*s^1),s++);}

เรียกใช้ฟังก์ชั่นหลักนี้

main(c,v)char**v;
{
    f(v[1]);
}

และอินพุทแบบนี้

a.exe [1,0,1,1,0]
[0,1,0,0,1]

สั้นกว่าที่ฉันคาดไว้สำหรับ C!
Chris Jefferson

10

R, 1 ไบต์

!

ตัวอย่าง:

> !c(TRUE, FALSE)
[1] FALSE  TRUE

มันยังทำงานได้กับอินพุตตัวเลข:

> !c(1, 0)
[1] FALSE  TRUE

เราไม่ได้ จำกัด เฉพาะอาเรย์หนึ่งมิติ ลองสร้างเมทริกซ์แล้วสุ่มด้วย 0s และ 1s:

> mat = matrix(rbinom(16, 1, .5), ncol=4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    0    1    0    0
[3,]    0    0    0    0
[4,]    1    1    1    0

เราสามารถกลับด้านนี้ได้อย่างง่ายดาย:

> !mat
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE FALSE
[2,]  TRUE FALSE  TRUE  TRUE
[3,]  TRUE  TRUE  TRUE  TRUE
[4,] FALSE FALSE FALSE  TRUE

เราสามารถทำเช่นนี้ต่อไปสำหรับจำนวนมิติโดยพลการ นี่คือตัวอย่างของอาเรย์สี่มิติ:

> bigarray = array(rbinom(32, 1, 0.5), dim=c(2,2,2,2))
> bigarray
, , 1, 1

     [,1] [,2]
[1,]    0    0
[2,]    0    0

, , 2, 1

     [,1] [,2]
[1,]    1    0
[2,]    0    0

, , 1, 2

     [,1] [,2]
[1,]    0    1
[2,]    0    1

, , 2, 2

     [,1] [,2]
[1,]    1    0
[2,]    1    1

> !bigarray
, , 1, 1

     [,1] [,2]
[1,] TRUE TRUE
[2,] TRUE TRUE

, , 2, 1

      [,1] [,2]
[1,] FALSE TRUE
[2,]  TRUE TRUE

, , 1, 2

     [,1]  [,2]
[1,] TRUE FALSE
[2,] TRUE FALSE

, , 2, 2

      [,1]  [,2]
[1,] FALSE  TRUE
[2,] FALSE FALSE

ใช้งานไม่ได้กับตัวละครฉันกลัว

> !"Hello world"
Error in !"Hello world" : Invalid argument type.

1
เพื่อประหยัดในการส่งคำตอบที่เหมือนกันสิ่งนี้สามารถใช้ได้ใน Julia ด้วย (ยกเว้นว่าจะไม่สามารถใช้กับตัวเลขที่เป็นตัวเลขได้)
Sp3000

8

Perl 6 , 4 ไบต์

"French" / เวอร์ชั่น Unicode:

!«*

"Texas" / เวอร์ชัน ASCII:

!<<*

อินพุตเป็นค่าเดียวซึ่งสามารถถือว่าเป็นรายการ

นี่คือ AA สิ่งที่แลมบ์ดา ( *)กับตรรกะประกอบคำนำหน้าไม่ได้ ( !)รวมใช้ประกอบคำนำหน้าไฮเปอร์ (« )

อย่างมีประสิทธิภาพนี้เป็นเช่นเดียวกับ:

-> $_ { $_.values.hyper.map: &prefix:<!> }
# ( currently the Rakudo implementation doesn't actually do the 「.hyper」 call,
#   but prefix 「«」 is specifically designated for doing things in parallel )

การใช้งาน:

# pretend it's a method
say (True,False,True,True).&( !«* );
# (False True False False)

say ( !«* )( (False,False,True,False,False) );
# (True True False True True)


# give it a lexical name
my &list-invert = !«*;

#              v¯¯ a space is necessary here
say list-invert (True,False);
# (False True)

say (False,True).&list-invert;
# (True False)

ฉันแค่พยายามไขปริศนาในสิ่งเดียวกัน ฉันมีเพียงเท่าที่{!«@_}:)
ฮอบส์

!**ควรทำงานด้วย
Jo King

7

เขาวงกต 9 ไบต์

,$:)%#$.,

ลองออนไลน์! ถือว่าอินพุตที่คั่นด้วยบรรทัดใหม่ขึ้นบรรทัดใหม่ที่ต่อท้าย ขอบคุณ @MartinEnder สำหรับความช่วยเหลือด้านการเล่นกอล์ฟ

โปรแกรมนี้ค่อนข้างแปลกสำหรับโปรแกรม Labyrinth - มันไม่ได้ใช้ประโยชน์จากลักษณะ 2D ของภาษาและจริง ๆ แล้วมันตีกลับไปมา ในการเดินทางไปข้างหน้าครั้งแรกเรามี:

[Moving rightward]
,            Read char c of input
 $           XOR c with implicit 0 at bottom of stack
  :)%        Calculate c % (c+1), erroring out if c == -1 from EOF, otherwise returns c
     #$      XOR with (length of stack == 1)
       .     Output (c^1) as char
        ,    Read newline

[Moving leftward]
       .     Output newline
      $      XOR two implicit 0s, stack [0]
    %#       Mod with (length of stack == 1), giving stack [0]
 $:)         Increment, duplicate then XOR, stack still [0]
,            Read char c of input

การเกิดขึ้นครั้งถัดไปของ$XORs นั้นคือ 0 ที่มีอยู่บนสแต็กด้วยcเมื่อเทียบกับ 0 โดยปริยายที่ด้านล่างของสแต็กเหมือนในการทำงานครั้งแรก ทั้งสองสถานการณ์ออกจากสแต็กเป็น[c]และโปรแกรมจะทำซ้ำหลังจากนั้น

ทางเลือก 9- ไบต์:

,:):/$.:,
,::)/)$.,
,:):%)$.,

2
เอฟเฟกต์ไปข้างหน้า - ข้างหลังนี้ยอดเยี่ยมจริงๆ
DLosc

ฉันชอบคำตอบนี้ มันมีความสุข :)
คดีกองทุนของโมนิกา

6

Mathematica ขนาด 7 ไบต์

Not/@#&

หรือไม่มีตัวอักษร:

!#&/@#&

สำหรับน้ำตาลซินแทคติค: &ทำเครื่องหมายจุดสิ้นสุดของฟังก์ชันที่ไม่มีชื่อและมีลำดับความสำคัญต่ำมาก หมายถึงอาร์กิวเมนต์แรกของที่ใกล้ที่สุดและการปิดล้อม# เป็นผู้ประกอบการสำหรับ ดังนั้นเป็นเพียงฟังก์ชั่นที่ไม่มีชื่อที่ขัดแย้งโต้แย้งในคำอื่น ๆ ที่เหมือนกันในการในตัว เป็นผู้ประกอบการสำหรับ ดังนั้นรหัสก็จะเทียบเท่ากับที่ค่อนข้างอ่านง่ายขึ้น&!Not!#&Not/@MapMap[Not, #]&


11
วิธีการที่!#&/@#&ฉันควรจะอ่านว่า? :)
ลินน์

1
@Lynn นั่นช่วยได้ไหม :)
Martin Ender

4
ฉันประหลาดใจที่Notไม่สามารถฟังได้
ซิมมอนส์

@ASimmons ใช่แล้วเช่นกัน I.
Martin Ender

6

Python, 27 25 24 ไบต์

ขอบคุณ Lynn สำหรับการเล่นกอล์ฟสองไบต์และ xnor และ Mego สำหรับการเล่นกอล์ฟอีกครั้ง

lambda a:[b^1for b in a]

1
อาร์เรย์0/ 1ได้รับอนุญาตและสั้นกว่า1-b not bฉันถาม OP ว่าอาร์เรย์ของ0/ -1ได้รับอนุญาตหรือไม่ซึ่งในกรณี~bนี้จะสั้นกว่า
ลินน์

2
b ^ 1 ใช้ได้เช่นกัน
xnor

@ xnor และนั่นจะดีกว่าเพราะพื้นที่ก่อนที่forจะถูกทิ้ง
Mego

ฉันไม่ทราบว่า1forจะถูกแยกวิเคราะห์เป็นโทเค็นที่แยกกันสองอัน อืม TIL
Steven H.

6

C #, 19 ไบต์

เป็นฟังก์ชั่นระบุชื่อใช้บูล [] และส่งกลับ IEnumerable

b=>b.Select(x=>!x);

หรือ 36 ไบต์ด้วย

dynamic f(bool[]b)=>b.Select(x=>!x);

5

สูตร IBM / Lotus Notes ขนาด 2 ไบต์

!a

การใช้งาน:

สร้างฟอร์ม Notes ที่มีสองฟิลด์ชื่อ a และ b

a (อินพุต) = แก้ไขได้, ตัวเลข, หลายค่า, คั่นด้วยเครื่องหมายจุลภาค

b (เอาท์พุท) = คำนวณ, ตัวเลข, หลายค่า, คั่นด้วยเครื่องหมายจุลภาค

วางสูตรข้างต้นลงใน b และกำหนดค่าเริ่มต้นเป็น 0

สร้างเอกสารใหม่ด้วยฟอร์มป้อนรายการเลขฐานสองใน a และกด F9 เพื่ออัปเดตเอาต์พุต

ตัวอย่าง:

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

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

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

ทำงานได้เนื่องจากได้รับรายการเป็นอินพุตสูตร Notes จะใช้การกระทำที่ระบุกับทุกองค์ประกอบในรายการ


2
โอ้พระเจ้าของฉัน ... บริษัท ของฉันเพิ่งเปลี่ยนจากโน้ตบัว ฉันหวังว่าจะไม่เห็นมันอีก +1 สำหรับการโยนกลับ
Magic Octopus Urn

ฉันคิดว่าหลาย บริษัท กำลัง @carusocomputing และอาจจะถูกต้อง ฉันได้ทำงานกับมันเป็นเวลานานกว่า 20 ปีแล้วและมันก็ยังทำให้ฉันประหลาดใจว่าภาษาสูตรอะไรที่สามารถทำได้ด้วยการทำซ้ำรายการบางครั้ง มันสนุกที่ได้เปิดนักออกแบบเป็นครั้งคราวและดูว่าฉันยังจำได้มากแค่ไหน :-)
ElPedro


5

สวิฟท์ 3 (7 ไบต์)

.map(!)

เช่น

[true, false].map(!)

คำอธิบาย

ดูเหมือนจะค่อนข้างชัดเจน โทรในอาร์เรย์map [true, false]หนึ่ง "gotcha" คือใน Swift ตัวดำเนินการเป็นเพียงฟังก์ชันและสามารถส่งผ่านเป็นอาร์กิวเมนต์ วิธีนี้map(!)จะผ่าน "ไม่ได้" ฟังก์ชั่นลงใน!map


คำตอบสั้น ๆ ที่น่าประทับใจสำหรับภาษาที่แย่มากสำหรับการเล่นกอล์ฟ :)
DJMcMayhem

ฉันรู้สึกเหมือนฉันทำผิดกฎหรืออะไรบางอย่าง ฉันไม่แน่ใจว่าสิ่งเหล่านี้ถูกตัดสินอย่างไร : D
mklbtz

นี่มันเจ๋งมาก.
JAL

5

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 240 ไบต์

.
Ajax,.
Puck,.
Act I:.
Scene I:.
[Enter Ajax and Puck]
Puck:
Open your mind.Is hog as big as you?If so, let us return to scene II.You be sum of difference of zero and you and cat.Open thy heart!Let us return to scene I.
Scene II:.
[Exeunt]

รับอินพุตเป็นสตริง\0และ\1อักขระควบคุม เอาท์พุทเป็นสตริงของหรือ0 1หากอินพุตต้องเหมือนกับเอาต์พุตให้แทนที่Open thy heartด้วยSpeak thy mindไม่มีการเปลี่ยนแปลงใน bytecount หาก\0และ\1ไม่สามารถใช้งานได้ให้ทำตามด้านบน แต่ให้แทนที่Open your mindด้วยListen to thy heartค่าปรับ 5 ไบต์

Ungolfed:

The Invertion of Veronan Arrays.

Romeo, who stores the element.
Juliet, who lectures him.

Act I: In which an array is inverted.

Scene I: A silent entrance.

[Enter Romeo and Juliet]

Scene II: In which Juliet pours out her heart to Romeo.

Juliet:
  Open your mind. Is nothing better than thee? If so, let us proceed to scene III. 
  Thou art as good as the sum of the difference between nothing and thee and my 
  cat. Open your heart! Let us return to scene II.

Scene III: Finale.

[Exeunt]

สิ่งนี้แปลโดยประมาณเป็น pseudocode C ต่อไปนี้:

int romeo;

Scene1:
romeo = getchar();
if (0 > romeo) goto Scene2;
romeo = 0 - romeo + 1;
printf("%d", romeo);
goto Scene1;

Scene2:;

ฉันใช้ล่ามนี้ วิ่งตัวอย่าง:

$ python splc.py invert.spl > invert.c
$ gcc invert.c -o invert.exe
$ echo -ne "\x00\x01\x00" | ./invert
101

4

JAISBaLขนาด 1 ไบต์

!

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

สำหรับสองไบต์อาร์เรย์สามารถพิมพ์ได้อย่างชัดเจน:

อินพุตอยู่ในรูปแบบอาร์เรย์แปลก ๆ ของ JAISBaL (ซึ่งฉันประดิษฐ์ขึ้น แต่ฉันไม่ชอบ ... )

กรณีทดสอบ (ผลลัพธ์จากล่าม Java, 3.0.5):

Enter a value > [true][false]


--------------------
Stack: [[false, true]]
Locals: {}
----------------------------------------
Enter a value > [false][false][true][false][false]


--------------------
Stack: [[true, true, false, true, true]]
Locals: {}

4

PowerShell ขนาด 15 ไบต์

$args[0]|%{!$_}

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

อย่างไรก็ตามสิ่งที่เรียบร้อยก็คือเนื่องจาก PowerShell หลวมในข้อกำหนดการคัดเลือกคุณสามารถป้อนข้อมูลแบบผสมอย่างสมบูรณ์และรับเอาต์พุตบูลีนที่เหมาะสม ตัวอย่างเช่นนี่คือค่าบูลีนที่แท้จริง$false/$true , ตัวเลข0 1และ123456789เป็นจำนวนเต็ม, สตริงว่าง, สตริงที่ไม่ว่าง, อาเรย์ที่ว่างเปล่าและอาเรย์ที่ไม่ว่าง -

PS C:\Tools\Scripts\golfing> .\invert-a-boolean-array.ps1 @($false,$true,0,1,123456789,'','foo',@(),@(1,1))
True
False
True
False
False
True
False
True
False

4

Perl, 7 ไบต์

รวมถึง +2 สำหรับ -lp

ตั้งค่าบูลีนแต่ละค่าเป็น 0 หรือ 1 ในบรรทัดของมันเอง

invert.pl
1
1
0
^D

invert.pl:

#!/us/bin/perl -lp
$_^=1


3

Cheddar ขนาด 10 ไบต์

@.map((!))

ฉันหวังว่าฉันจะนับในขณะที่ฉันเขียนจากโทรศัพท์


1
ฉันคิดว่าอย่างเท่าเทียมกันfn.vec((!))หากได้รับการปล่อยตัวออกมา: P
Conor O'Brien

3

Java, 58 ไบต์

void f(boolean[]a){for(boolean i:a)System.out.print(!i);}

วิธีในการเล่นกอล์ฟ: เปลี่ยนarrเป็นa(บันทึก 4 ไบต์) เขียนint[]aแทนint a[](บันทึก 1 ไบต์),
Olivier Grégoire

โอ๊ะ! ฉันจะลืมมันได้อย่างไร และขอขอบคุณ @ OlivierGrégoire
Numberknot

3

brainfuck (58 ไบต์)

-[>+<-----]>--->,[<[->->+<<]>[--<]>[>]<[-<+<+>>]<+.[-]<>,]

ลองที่นี่

Ungolfed

-[>+<-----]>---     Number 48 (stands for 0)
>,                  Read in first point
[               
    <[->->+<<]      Subtract 1 from 48 flag, subtract 1 from read data, add 1 for new flag
    >           
    [--<]           If sitting on 1 (true) subtract 2 and move left)
        >[>]<       Move to 48 flag
        [-<+<+>>]   Add 48 to data point
        <+.[-]<     Add 1 move print, zero cell, move to new 48 cell
        >,          Read in next point
]                   Loop if input remaining

รับอินพุต 1s หรือ 0s (11001) ที่ไม่มีการแบ่งแยก


3

Logicodeขนาด9 8 ไบต์

out!binp

ง่ายจริงๆ

รับอินพุตเป็นสตริงไบนารีเนื่องจาก Logicode ไม่รองรับรายการ (เช่น[true, false]นั้น10)

outoutputs ผลสาย

!คำสั่งคำนวณไม่บิตในสตริงทุกครั้งเพื่อสิ่งที่ต้องการจะเป็น!111000

binpคือการใส่ไบนารี

บันทึก 1 ไบต์ขอบคุณ @daHugLenny


ฉันคิดว่าคุณสามารถลบช่องว่างระหว่างและout !binp
acrolith

@daHugLenny Huh ฉันไม่ทราบว่าคุณสามารถทำได้ ขอบคุณ!
clismique




2

Python 2, 24 ไบต์ (ไม่แข่งขัน)

lambda a:[i-1for i in a]

ลอจิกมีความคล้ายคลึงกับสตีเว่น แต่ฉันพยายามที่จะใช้นี้เป็นความคิดเห็นความคิดที่แตกต่างกัน แต่เพราะมันยังคงใช้เวลา0/ 1อาร์เรย์ไม่ได้/0 -1ไม่มีการโกนแบบไบท์ทีสำหรับใช้0/ -1ดังนั้นขอให้มีสติ โปรดทราบว่านี่ไม่ใช่การแข่งขันจนกว่า Steven หรือ Lynn จะอนุญาตให้ฉันใช้ความคิดนี้ ถ้าเป็นเช่นนั้นฉันอาจลบเครื่องหมายที่ไม่ใช่คู่แข่ง โปรดทราบว่ารหัสนี้ไม่สามารถขโมยได้อย่างไร้ยางอาย สตีเว่นเท่านั้นที่สามารถใช้มันสำหรับคำตอบของเขา


2

ทับทิมขนาด 14 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ:

->a{a.map &:!}

ทดสอบมัน

->a{a.map &:!}.call([true, true, false, true, false, true, true])
# => [false, false, true, false, true, false, false]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.