นับจาก 1 ถึงจำนวนเต็ม ... ใน Binary


13

บทนำ:

ฉันจำได้ว่าตอนที่ฉันยังเป็นเด็กฉันจะได้รับเครื่องคิดเลขและกด+ปุ่มต่อไปและดูว่าฉันสามารถนับได้สูงแค่ไหน ตอนนี้ฉันชอบที่จะเขียนโปรแกรมและฉันกำลังพัฒนาสำหรับ iOS

การนับเป็นทักษะพื้นฐานสำหรับทั้งมนุษย์และคอมพิวเตอร์ ถ้าไม่มีมันคณิตศาสตร์ที่เหลือก็ทำไม่ได้ มันทำได้ง่ายๆโดยการเริ่มต้น1และเพิ่ม1เข้าไปซ้ำ ๆ

ความท้าทาย:

นี่เป็นเพียงความท้าทายอย่างง่าย สิ่งที่ฉันต้องการให้โปรแกรมของคุณทำคือพิมพ์จาก1ไปยังสิ่งที่Integerใช้ในอย่างไรก็ตามฉันจะโยนบิดเนื่องจากนับทศนิยมน่าเบื่อ:

การนับไม่สามารถอยู่ในฐาน 10 ได้ แต่ต้องแสดงตัวเองนับเป็นเลขฐานสอง

ดังนั้นในการนับถึง 5 โดยใช้จำนวนเต็ม 32 บิตมันจะเป็นดังนี้:

0000 0000 0000 0000 0000 0000 0000 0001 ..... 1
0000 0000 0000 0000 0000 0000 0000 0010 ..... 2
0000 0000 0000 0000 0000 0000 0000 0011 ..... 3
0000 0000 0000 0000 0000 0000 0000 0100 ..... 4
0000 0000 0000 0000 0000 0000 0000 0101 ..... 5

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

ตัวอย่างอินพุต:

จำนวนเต็ม 32 บิต 5

ตัวอย่างผลลัพธ์:

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101

เกณฑ์การให้คะแนน:

คะแนนของคุณจะเท่ากับรหัสของคุณหลายไบต์ เช่นนี้คือ Code Golf คะแนนต่ำสุดชนะ

คะแนนโบนัส:

หากคุณแสดงในการส่งออกจำนวนเป็นที่เป็นเลขฐาน 10 (ตัวอย่างเช่น0000 0000 0000 0000 0000 0000 0000 0001ในไบนารีเท่ากับฐาน 10 1) 0.8คูณคะแนนของคุณโดย

หากคุณจัดกลุ่มผลลัพธ์ 4 หลักอย่างที่ฉันทำให้คูณคะแนนของคุณด้วย0.8(อีกครั้ง) สิ่งนี้ไม่จำเป็น

อย่าปัดขึ้นและอย่าปัดเศษ คะแนนของคุณคือจำนวนจุดลอยตัว

โชคดี!


คุณต้องใส่ตัวเลขในกลุ่มสี่คั่นด้วยช่องว่างหรือไม่?
xnor

@ xnor ไม่ฉันทำเพื่อการอ่าน แต่ฉันจะรวมโอกาสโบนัสสำหรับสิ่งนั้นด้วย
DDPWNAGE

จะทำอย่างไรถ้าฉันใช้ชนิดข้อมูลที่มีขนาดไม่ใหญ่โต (เช่น Python 3 int)
isaacg

@isaacg ระบุว่าโปรแกรมของคุณใช้จำนวนเต็ม 32 หรือ 64 บิต คุณไม่จำเป็นต้องรองรับจำนวนเต็มเหล่านั้นที่อยู่นอกขอบเขต คุณจะต้องส่งออกสิ่งที่คุณป้อน กล่าวอีกนัยหนึ่งคือตัวเลือกของคุณ
DDPWNAGE

4
จะเป็นเช่นไรหากผู้ใช้ของเราใช้บางอย่างที่แตกต่างกันเช่นจำนวนเต็ม 30 บิต (Haskell) หรือจำนวนเต็มความแม่นยำตามอำเภอใจ (J)
FUZxxl

คำตอบ:


14

APL, 10 ตัวอักษร

อีกอย่างใน APL ถือว่า⎕IO←1(ค่าเริ่มต้น) ไม่มีคะแนนโบนัส อ่านหมายเลขจากอุปกรณ์อินพุต หาก APL ของคุณใช้จำนวนเต็ม 64 บิตแทนจำนวนเต็ม 32 บิตให้แทน 64 เป็น 32 ตามต้องการ

ขอให้สังเกตว่า APL แปลงเป็นตัวเลขทศนิยมอย่างโปร่งใสเมื่อช่วงของจำนวนเต็มเกิน มันยากมากที่จะบอกว่า APL ขนาดเต็มจำนวนทำงานกับอะไร

⍉(32⍴2)⊤⍳⎕

คำอธิบาย

2          ⍝ the number 2
32⍴2       ⍝ a vector of 32 twos.
(32⍴2)⊤X   ⍝ X represented as base 2 to 32 digits precision
⍳X         ⍝ a vector of the integers from 1 to X
⎕          ⍝ a number queried from the terminal
(32⍴2)⊤⍳⎕  ⍝ the output we want, flipped by 90°
⍉(32⍴2)⊤⍳⎕ ⍝ the output we want in correct orientation (⍉ is transpose)

ดูเหมือนว่าฉันไม่ควรพยายามอย่างหนักที่จะได้รับ 4 กลุ่มฮ่าฮ่า
protist

@protist อย่าพยายามรับคะแนนโบนัสที่ยากเกินกว่าจะนำไปใช้ได้ มันแทบไม่คุ้มค่ากับความพยายาม
FUZxxl

คำถามที่ถามเป็นพิเศษสำหรับการนับไบต์มากกว่าตัวอักษรดังนั้นคะแนนควรเป็น 20 ไบต์
ankh-morpork

@ dohaqatar7 มีการเข้ารหัส APL (เช่นcodepage 907 ) ที่พอดีกับอักขระ APL ทั้งหมดที่ตั้งค่าเป็นหนึ่งไบต์ มีส่วนขยาย APL บางส่วนที่ไม่สามารถเข้ารหัสด้วยหน้ารหัส APL แบบดั้งเดิมได้ แต่ฉันไม่ได้ใช้ส่วนขยายใด ๆ
FUZxxl

7

JavaScript ( ES6 ) 56.8 (71 * 0.8)

รุ่น 32 บิตเนื่องจาก JavaScript ไม่สามารถจัดการความแม่นยำ 64 บิตได้ (สูงสุด 53 บิตโดยใช้ทศนิยมสองเท่า)

โดยไม่ต้องจัดกลุ่ม

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1),i)} 

ด้วยการจัดกลุ่ม - คะแนน 60.16 (94 * .64)

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1).match(/..../g).join` `,i)}

ทดสอบในเบราว์เซอร์ใด ๆ (ES5)

function f(n)
{
  for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).substr(1).match(/..../g).join(' '),i)
}

// Test
console.log = function(x,y) { O.innerHTML += x+' '+y+'\n' }
Count to: <input id=I><button onclick="O.innerHTML='';f(+I.value)">-></button>
<pre id=O></pre>


6

Pyth, 18 * 0.8 * 0.8 = 11.52 ไบต์

VSQjd+c.[64.BN\04N

ตัวอย่างผลลัพธ์:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 10

2
@DDPWNAGE ให้เวลากับคนอื่นในการแข่งขันก่อนที่จะยอมรับคำตอบ :)
orlp

เอาล่ะฉันกำลังคิดที่จะยอมรับมันชั่วคราวเพื่อให้ผู้คนรู้ว่าต้องเอาชนะอะไร
DDPWNAGE

2
@DDPWNAGE โปรดจำไว้ว่าคุณไม่สามารถยอมรับคำตอบได้อย่างง่ายดายหลังจากที่คุณตอบรับและรอสองสามชั่วโมง
FUZxxl

4

Pyth, 19 * 0.8 * 0.8 = 12.16 ไบต์

VSQjd+cjk.[032.BN4N

ตัวอย่างเอาต์พุตสำหรับอินพุต 5:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5

สาธิต.


4

Python 2, 48 * 0.8 = 38.4

i=0;exec"i+=1;print format(i,'032b'),i;"*input()

แปลงตัวเลขเป็นไบนารีใช้การจัดรูปแบบสตริงเพื่อแปลงเป็นเลขฐานสองที่มีตัวเลข 32 หลักแล้วพิมพ์ตัวเลขทศนิยมสำหรับโบนัส ใช้การexecวนซ้ำเพื่อเพิ่มจาก1เป็นค่าอินพุต


เป็นทางออกที่ดี! ผมไม่เชื่อว่ามันจะถูกระบุไว้ แต่นี้จะล้มเหลวในจำนวนมากในช่วง 32 OverflowError: repeated string is too longบิต: ไม่แน่ใจว่าเป็นเพียงแค่เครื่องของฉันเท่านั้น
Kade



3

KDB (Q), 50 * 0.8 * 0.8 = 32

ฉันรู้สึกเศร้าเล็กน้อยกับการส่งของฉัน :( ควรมีวิธีที่ดีกว่าในการทำเช่นนี้!

{-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}

คำอธิบาย

                                         1+til x     / counting
   {                                  }@'            / lambda each
                      (0N 4#0b vs x),x               / convert to binary and join with input
    " "sv raze@'string                               / convert to string, concatenate each string and join with space
{-1                                             ;}   / print and surpress output in lambda

ทดสอบ

q){-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5

2
คุณสามารถไปที่ K;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
ประท้วง

3

เสียงกระเพื่อมสามัญ, 96.0

คะแนน: (* 150 .8 .8)

(lambda(y)(flet((p(n &aux(x(format()"~39,'0b ~:*~d"n)))(dolist(p'(4 9 14 19 24 29 34))(setf(aref x p)#\ ))(princ x)(terpri)))(dotimes(i y)(p(1+ i)))))

ตัวอย่าง

เรียกใช้ฟังก์ชันด้วย 10:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 1010 10

คำอธิบาย

(format()"~39,'0b ~:*~d" #b101010101010) ให้:

"000000000000000000000000000101010101010 2730"

สตริงกลาง (อาร์เรย์) ถูกปรับเปลี่ยนเพื่อใส่อักขระช่องว่างตามดัชนี zero-based ต่อไปนี้: 4 9 14 19 24 29 29 34 จากนั้นจะถูกพิมพ์

โปรดทราบว่า(format t"~39,'0,' ,4:b ~:*~d" #b101010101010)รูปแบบที่ตรงไปตรงมาชัดเจนไม่ได้ทำสิ่งที่เราต้องการ มันพิมพ์:

00000000000000000000000001010 1010 1010 2730

(ช่องว่างภายในไม่ได้ถูกจัดกลุ่มตาม 4)



3

C, 97 * 0.8 * 0.8 = 62.08

a,x;main(b){for(scanf("%u",&b);a++<b;printf("%d\n",a))for(x=32;x--;)printf("%*d",x%-4-2,a>>x&1);}

ตัวอย่างเอาต์พุตสำหรับอินพุต "5":

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9

ฉันสามารถเพิ่มช่องว่างอีกหนึ่งตัวเพื่อแยกตัวเลขทศนิยมออกจากตัวเลขฐานสอง แต่โดยทางเทคนิคแล้วปัญหาไม่ได้ต้องการ แก้ไข: ขอบคุณ CL!


1
คุณสามารถแทนที่x%-4-1ด้วยx%-4-2เพื่อเพิ่มช่องว่างระหว่างไบนารีและทศนิยมโดยไม่ต้องเสียค่าใช้จ่ายเพิ่มเติม (สิ่งนี้จะกำจัดพื้นที่เพิ่มเติมที่จุดเริ่มต้นของแต่ละบรรทัด)
CL-

2

อ็อกเทฟ 23 ตัว

dec2bin(1:input(""),32)

ตัวอย่างเอาต์พุตสำหรับอินพุต 5:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab, 19 ไบต์

@(x)dec2bin(1:x,32)

ไม่มากเกินไปสำหรับ MatLab นี้มีทศนิยมในตัวเป็นตัวแปลงไบนารีและพิมพ์ผลลัพธ์โดยอัตโนมัติ


1
นี่ไม่ได้พิมพ์จำนวนเต็ม 32- บิต / 64- บิต
user0815

ขอโทษที่ขอบคุณสำหรับหัวขึ้น ฉันได้เปลี่ยนรหัสตาม
Robby

คำตอบนี้เกือบทั้งหมดเป็นเหมือนคำตอบ Octave
Alex A.

2

จูเลีย 42 ไบต์

มันสั้นกว่านี้เล็กน้อยหากไม่มีโบนัส

n->for i=1:n println(lpad(bin(i),64,0))end

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ใช้จำนวนเต็มและพิมพ์การแทนเลขฐานสองของแต่ละหมายเลขจาก 1 ถึงnแต่ละแผ่นด้านซ้ายมีค่าศูนย์ถึง 64 อักขระ


พร้อมโบนัส 78 ไบต์ * 0.8 * 0.8 = 49.92

n->for i=1:n for j=1:4:64 print(lpad(bin(i),64,0)[j:j+3]*" ")end;println(i)end

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ใช้จำนวนเต็มและพิมพ์การแทนฐานสองดังเดิมคราวนี้แบ่งออกเป็นกลุ่มละ 4 ด้วยจำนวนในฐาน 10 ที่ท้าย


2

เสียงกระเพื่อมสามัญคะแนน: 64.0

100 ไบต์ * 0.8 * 0.8

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

เอาท์พุต

0000 0000 0000 0000 0000 0000 0000 0001  1
0000 0000 0000 0000 0000 0000 0000 0010  2
0000 0000 0000 0000 0000 0000 0000 0011  3
0000 0000 0000 0000 0000 0000 0000 0100  4
0000 0000 0000 0000 0000 0000 0000 0101  5
0000 0000 0000 0000 0000 0000 0000 0110  6
0000 0000 0000 0000 0000 0000 0000 0111  7
0000 0000 0000 0000 0000 0000 0000 1000  8
0000 0000 0000 0000 0000 0000 0000 1001  9
0000 0000 0000 0000 0000 0000 0000 1010  10

รหัส

(defun r(n)(dotimes(i n)(format t"~{~a~a~a~a ~}~a~%"(coerce(format()"~32,'0B"(1+ i))'list)(1+ i))))

คำอธิบาย

ตามที่อธิบายไว้ในคำตอบของ coredumpสตริงรูปแบบ

"~32,'0B"

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

"~ {~ a ~ a ~ a ~ a ~} ~ a ~%"

หลังจากแต่ละกลุ่มของ 4 มีช่องว่างและหลังจากกลุ่มสุดท้ายหมายเลข base10 จะถูกพิมพ์

โดยไม่มีการจัดกลุ่ม (60x0.8 => 48.0)

(defun r(n)(dotimes(i n)(format t"~32,'0B ~:*~a~%"(1+ i))))

สิ่งนี้ใช้ ~: * เพื่อประมวลผลอาร์กิวเมนต์รูปแบบ (เดี่ยว) อีกครั้ง


1

PHP, 51.84 (81 × .8 × .8)

รุ่น 32 บิตเนื่องจาก PHP นั้น จำกัด อยู่ที่ Windows 32 บิตเท่านั้นโดยไม่คำนึงว่าระบบปฏิบัติการนั้นเป็นแบบ 64 บิตหรือไม่

รับอาร์กิวเมนต์บรรทัดคำสั่งหนึ่งรายการ

for($i=0;$i++<$argv[1];)echo chunk_split(str_pad(decbin($i),32,0,0),4," ")."$i\n";

1

CoffeeScript, 60.8 (76 × .8)

รุ่น 32 บิตสำหรับเหตุผลที่กล่าวถึงข้างต้นเนื่องจาก CoffeeScript คอมไพล์ลงใน JavaScript

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32),i)for i in[1..x]

ด้วยการจัดกลุ่มมันจะยาวขึ้นเล็กน้อย: 64.64 (101 × .8 × .8)

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32).match(/.{4}/g).join(" "),i)for i in[1..x]

1

Haskell, 56 ไบต์

f n=putStr$unlines$take n$tail$sequence$replicate 32"01"

การใช้งาน:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

สำหรับ 64bit แทนที่ด้วย32 64เลขอื่น ๆ ก็ใช้ได้เช่นกัน


1

J, 20 ไบต์

(32#2)#:>:i.".1!:1<1

ตัวอย่างอินพุตและเอาต์พุต:

3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1


1

Ruby, 64 บิต

70 * 0.8 * 0.8 = 44.8 ไบต์ (แยก, ทศนิยม)

1.upto(gets.to_i){|i|puts ("%064d"%i.to_s 2).scan(/.{4}/)*?\s+" #{i}"}

51 * 0.8 = 40.8 ไบต์ (ทศนิยม)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)+" #{i}"}

67 * 0.8 = 53.6 ไบต์ (แยก)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2).scan/.{4}/}

44 ไบต์ (ไม่มีโบนัส)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)}

1

05AB1E , 13 11 ไบต์

Lb32jsäð0:»

-2 ไบต์ขอบคุณที่@ Mr.Xcoder

เอาต์พุตโดยไม่มีตัวคั่นช่องว่างหรือหมายเลขลำดับ

ลองออนไลน์

คำอธิบาย:

L              # List of range [1,input]
               #  i.e. 5 → [1,2,3,4,5]
 b             # Convert each to a binary string
               #  i.e. [1,2,3,4,5] → ['1','10','11','100','101']
  32j          # Join everything together with a minimum length per item of 32,
               # which basically prepends spaces to make it length 32
               #  i.e. ['1','10','11','100','101'] → '                               1                              10                              11                             100                             101'
     sä        # Split it into the input amount of parts
               #  i.e. 5 → ['                               1','                              10','                              11','                             100','                             101']
       ð0:     # Replace every space with a 0
               #  i.e. '                             101' → '00000000000000000000000000000101'
          »    # Join everything together by newlines (and output implicitly)

1
Lb32jsäð0:»ใช้งานได้ 11 ไบต์
Mr. Xcoder

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