การเขียนโปรแกรม Exponential Slimy: การกอง Minecraft แบบบาง


108

Slimesเป็นศัตรูที่มีรูปร่างคล้ายลูกบาศก์ในMinecraftที่บุกเข้าไปในตัวมันเองซึ่งมีขนาดเล็กกว่าหลายตัวเมื่อถูกฆ่า สำหรับจุดประสงค์ของการท้าทายนี้เราจะอธิบายให้พวกเขาเห็นว่าเป็นภาพขนาด 8 × 8 พิกเซลที่มี 3 สี:

64x64 เมือก

น้ำเมือก 8x8 ←รุ่น True 8 × 8

สี RGB ที่แม่นยำคือ:

  • 0, 0, 0 สำหรับดวงตาและปาก
  • 110, 170, 90 สำหรับส่วนกลางสีเขียวเข้ม
  • 116, 196, 96 สำหรับด้านนอกสีเขียวอ่อน

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้จำนวนเต็มบวก N แล้วส่งภาพขนาด N ขนาดของ Slimes ที่บรรจุลงในสี่เหลี่ยม จากซ้ายไปขวาภาพควรเป็นไปตามรูปแบบของการ:

  • สแต็คของ 2 (N-1) 8 × 8 slimes
  • กองซ้อนของ 2 (N-2) 16 × 16 slimes
  • กองซ้อนของ 2 (N-3) 32 × 32 slimes
  • เป็นต้นจนกว่ากองจะมีเพียงหนึ่งเมือก

ภาพน้ำเมือกที่มีขนาดใหญ่กว่ารุ่น 8 × 8 ( น้ำเมือก 8x8) ถูกสร้างขึ้นโดยการอัปแซมปลิงเพื่อนบ้านที่ใกล้ที่สุด (เช่นเพิ่มพิกเซลทั้งหมดเป็นสองเท่า) โปรดทราบว่าคุณต้องใช้การออกแบบน้ำเมือกและสีที่กำหนดที่นี่

ภาพสุดท้ายจะมีขนาดบาง 2 N -1 และกว้าง2 (N + 3) -8 พิกเซลและสูง 2 (N + 2)พิกเซล

ภาพอาจถูกส่งออกในรูปแบบไฟล์ภาพทั่วไปบันทึกลงในไฟล์หรือพิมพ์ / คืนเป็นสตรีมข้อมูลดิบหรือแสดงโดยตรงระหว่างรันไทม์

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

โปรแกรมของคุณควรให้ผลลัพธ์ที่แน่นอนเหล่านี้

N = 1:

N = 1

N = 2:

N = 2

N = 3:

N = 3

N = 4:

N = 4

N = 5:

N = 5

N = 6:

N = 6

N ที่ใหญ่กว่าควรทำงานได้เช่นกัน


30
ฉันอยากโหวต แต่ฉันไม่ได้ลงคะแนน ฉันจะออกความคิดเห็นนี้ดังนั้นฉันจะจำไว้ว่าจะ upvote พรุ่งนี้
NoOne อยู่ที่นี่

23
ฉันยกระดับความคิดเห็นของคุณเพราะฉันมีจำนวนผู้โหวตไม่เพียงพอ
trichoplax

4
"ภาพเมือกที่มีขนาดใหญ่กว่ารุ่น 8 × 8 () นั้นสร้างขึ้นจากการสุ่มตัวอย่างเพื่อนบ้านที่ใกล้ที่สุด (กล่าวคือเพิ่มพิกเซลทั้งหมดเป็นสองเท่า)" คุณหมายถึงสี่เท่าของพิกเซลทั้งหมดทำให้แต่ละพิกเซลเป็นสี่เหลี่ยม 2x2 หรือไม่
Caridorc

1
@Caridorc ทวีคูณในแต่ละทิศทาง?
wizzwizz4

@ wizzwizz4 ใช่แต่ละพิกเซลกลายเป็น 4 ถูกต้องไหม?
Caridorc

คำตอบ:


21

MATL , 77 76 74 ไบต์

:"')^.,9&Xze`}+.E=p'F3ZaQ8e@qWt3$Y"G@-W1X"]&h[OOO;11 17E]5*29 7U24hhE&vEYG

รหัสทำงานในการกระทำนี้ซึ่งเร็วกว่าความท้าทาย

คุณสามารถลองในMATL ออนไลน์ ล่ามนี้ยังอยู่ระหว่างการทดลอง หากไม่ได้ผลให้ลองรีเฟรชหน้าเว็บแล้วกด "Run" อีกครั้ง

นี่คือตัวอย่างการรันในล่ามออฟไลน์:

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

คำอธิบาย

:                     % Input N implicitly. Generate range [1 2 ... N]
"                     % For each k in [1 2 ... N]
  ')^.,9&Xze`}+.E=p'  %   Compressed string
  F3Za                %   Decompress with target alphabet [0 1 2]
  Q                   %   Add 1
  8e                  %   Reshape into 8×8 array containing values 1, 2, 3
  @qW                 %   Push 2 raised to k-1
  t                   %   Duplicate
  3$Y"                %   Repelem: interpolate image by factor 2 raised to k-1
  G@-W                %   Push 2 raised to N-k
  1X"                 %   Repmat: repeat the array vertically. Gives a vertical strip
                      %   of repeated subimages
]                     % End for each
&h                    % Concatenate all vertical strips horizontally. This gives a big
                      % 2D array containing 1, 2, 3, which represent the three colors
[OOO;11 17E]5*        % Push array [0 0 0; 11 17 9] and multiply by 5
29 7U24hhE            % Push array [29 49 24] and multiply by 2
&vE                   % Concatenate the two arrays vertically and multiply by 2.
                      % This gives the colormap [0 0 0; 110 170 90; 116 196 96]
YG                    % Take the array and the colormap and display as an image

"N ที่ใหญ่กว่าน่าจะใช้งานได้เช่นกัน" แต่ดูเหมือนว่าคุณจะให้ข้อผิดพลาดของหน่วยความจำ / ดัชนีอยู่ที่ n = 9 แล้วนี่เป็นเพียงล่ามออนไลน์หรือเกิดขึ้นในรุ่นออฟไลน์ด้วยหรือไม่
David Mulder

1
@DavidMulder ฉันได้ทดสอบออฟไลน์แล้ว (คอมไพเลอร์ทำงานบน Matlab R2015b, Windows 7 64 บิต, RAM 4 GB) สำหรับการป้อนข้อมูลถึง11และใช้งานได้ สำหรับ11ผลลัพธ์คือภาพ 8192 × 16376 สำหรับ12มันจะเป็น 16384 × 32760 (536 ล้านพิกเซล) ซึ่งต้องการ RAM มากกว่า 4 GB ซึ่งมากกว่าแล็ปท็อปของฉันที่สามารถรองรับได้
Luis Mendo เมื่อ

2
ฉันชอบวิธีที่รหัสเริ่มต้นด้วยรอยยิ้มที่กลั้นน้ำตาของเขาเพราะอารมณ์ที่รุนแรงรหัสนี้ทำให้เขารู้สึก: "')
Tom Doodler

14

Dyalog APL, 118 113 ไบต์

('P3',⌽∘⍴,255,∊)(3↑(116 196 96)(110 170 90))[⊃,/i{⊃⍪/⍵⍴⊂⍺⌿⍺/8 8⍴∊22923813097005 926134669613412⊤¨⍨⊂32⍴3}¨⌽i←2*⍳⎕]

ทะลึ่ง ⎕IO=0

จากขวาไปซ้าย:

i←2*⍳⎕ พลัง 1 2 4 ... 2 n-1

i{ }¨⌽iวนซ้ำอำนาจ (กับ) และกำลังย้อนกลับ ( )

⊤¨⍨⊂32⍴3 ถอดรหัสแต่ละตัวเลขทางด้านซ้ายเป็น 32 หลักประกอบไปด้วย

8 8⍴∊ แผ่และก่อร่างใหม่เป็น 8 × 8

⍺⌿⍺/ทำซ้ำแต่ละแถวและคอลัมน์ครั้ง

⍵⍴⊂ถ่ายสำเนา

⊃⍪/ และเรียงซ้อนกันในแนวตั้ง

⊃,/ เข้าร่วมผลลัพธ์ทั้งหมดในแนวนอน

3↑(116 196 96)(110 170 90)สี; 3↑ขยายพวกเขาด้วย(0 0 0)

[ ]ทำดัชนีสีด้วยองค์ประกอบของเมทริกซ์แต่ละตัว result เป็นเมทริกซ์ของ RGB

('P3',⌽∘⍴,255,∊)เป็น "รถไฟ" - ฟังก์ชั่นที่ส่งกลับ'P3'ตามด้วยรูปร่างที่ตรงกันข้ามของการโต้แย้ง255และการโต้แย้งแบน


ฉันคิดว่าคุณสามารถเขียนโปรแกรมของคุณโดยสมมติว่า⎕IO←0เป็นเงื่อนไขนอกเหนือจากการนับไบต์ ระบบ APL จำนวนมากใช้สิ่งนั้นเป็นค่าเริ่มต้น (รวมถึง LOL ของคุณด้วย)
Tobia

11

JavaScript (ES7), 326 327ไบต์

n=>{x=(d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`;c.width=2*(c.height=4*(p=2**n)));for(i=0;i<n;i++){c=-1;for(j of[...'0001000001111110022112200221122011111110011121110111111000010000'])for(x.fillStyle=['#74c460','#6eaa5a','#000'][j],c++,k=0;k<p;)x.fillRect(c%8*(_=2**i)+_*8,~~(c/8)*_+_*8*k++,_,_)}}

เวอร์ชัน ES6 ที่ไม่ดี

ลองด้วยตัวคุณเอง

(n=>{
    x=(d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`;
    c.width=2*(c.height=4*(p=Math.pow(2,n)));
    for(i=0;i<n;i++){
        c=-1;
        for(j of[...'0001000001111110022112200221122011111110011121110111111000010000'])
            for(x.fillStyle=['#74c460','#6eaa5a','#000'][j],c++,k=0;k<p;)
                x.fillRect(c%8*(_=Math.pow(2,i))+_*8,~~(c/8)*_+_*8*k++,_,_)
    }
})(4);

ข้อแตกต่างระหว่างรุ่น ES7 และ ES6 ใช้แทน** Math.pow()นอกจากนี้คุณยังสามารถดูวิธีการที่คุณสามารถเรียกใช้ฟังก์ชั่น - n=4ในตัวอย่างนี้ด้วย

ผลลัพธ์

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


การแก้ไข

  • บันทึกแล้ว1 ไบต์ - พบเซมิโคลอนต่อท้ายที่ไม่จำเป็น;

นี่ค่อนข้างช้าและอาจใช้เวลาสักพักสำหรับตัวเลขที่มากกว่า 10


2
สีดูเหมือนจะออกมาเล็กน้อยในภาพที่นี่ คุณอาจจับภาพหน้าจอด้วย f.lux หรือไม่
Jezzamon

@ Jezzamon ขอบคุณที่ชี้ให้เห็น - ฉันก็สังเกตเห็นเช่นกัน มีความเป็นไปได้เล็กน้อยที่ฉันอาจเลือก " แปลงสีของเอกสารเป็นพื้นที่ใช้งาน " ในขณะที่นำเข้าภาพหน้าจอไปยัง Photoshop รูปภาพได้รับการแก้ไขแล้ว
แทรกชื่อที่นี่

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

7

C, 220 ไบต์

x,y,r;f(n){
printf("P3 %d %d 255 ",(8<<n)-8,4<<n);
for(y=0;y<4<<n;++y)for(r=0;r<n;++r)for(x=0;x<8<<r;++x)
puts("110 170 90\0 116 196 96\0 0 0 0"+12*
(117-"` t5L\rL\ru5tst5` "[x>>r+2|(y>>r)%8*2]>>(x>>r)%4*2&3));}

ฉันเพิ่มการขึ้นบรรทัดใหม่ที่ไม่มีประโยชน์เพื่อให้สามารถอ่านได้คะแนนจะไม่มีการขึ้นบรรทัดใหม่เหล่านี้

กำหนดฟังก์ชั่นf(n)ที่ส่งออกภาพ PPM ธรรมดาใน stdout


1
ด้วยเหตุผลบางอย่างคำตอบ C สวยหรูในใจของฉัน
downrep_nation

7

Mathematica, 267 255 254 225 212 ไบต์

G=10{11,17,9};Image@Join[##,2]&@@Table[Join@@Table[ImageData@ImageResize[Image[{t={g=G+{6,26,6},g,g,G,g,g,g,g},f={g,a=##&[G,G,G],a,g},e={g,b=0g,b,G,G,b,b,g},e,{a,a,G,g},{g,a,b,a},f,t}/255],4*2^j],2^(#-j)],{j,#}]&

บันทึกแล้ว29 42 ไบต์ขอบคุณ Martin Ender

ข้อเสนอแนะในการเล่นกอล์ฟต้อนรับโดยเฉพาะอย่างยิ่งสำหรับการสร้าง 8 8 (3) sอาร์เรย์ น่าเสียดายที่ไม่มีArrayResizeอะนาล็อกสำหรับ" " ImageResizeดังนั้นอาเรย์จะต้องถูกแปลงเป็นรูปภาพ ( Image) ก่อนที่จะทำการปรับขนาดแล้วกลับไปเป็นอาเรย์ ( ImageData) เพื่อทำJoinไอเอ็นจี

Ungolfed:

(* dark green, light green, black *)
G = 10 {11, 17, 9};
g = G + {6, 26, 6};
b = 0 g;

(* abbreviation for triple G sequence, top row, forehead, eye level *)
a = ##&[G, G, G];
t = {g, g, g, G, g, g, g, g};
f = {g, a, a, g};
e = {g, b, b, G, G, b, b, g};

(* slime *)
s =
  {
    t,
    f,
    e,
    e,
    {a, a, G, g},
    {g, a, b, a},
    f,
    t
  }/255;

(* jth column *)
c[n_, j_] := Join @@ Table[ImageData@ImageResize[Image[s], 4*2^j], 2^(n - j)]

(* final program *)
Image@Join[##, 2] & @@ Table[c[#, j], {j, #}] &

1
b=0g. เพื่อสร้างsมันอาจจะสั้นกว่าในการเข้ารหัสค่าพิกเซลเป็นตัวเลขฐาน 3 แต่ฉันต้องพยายามให้แน่ใจ ในขณะเดียวกันคุณสามารถบันทึกไบต์โดยไม่กำหนดb, g, f, e, tจนกว่าคุณต้องการพวกเขาและไม่จำเป็นต้องมีชื่อที่ทุกคนและไม่ไม่s cสำหรับคุณสามารถใช้2^(j-1)8 4*2^jใช้ทั้งหมดเหล่านั้นฉันสิ้นสุดที่ 225 ไบต์: pastebin.com/YnkUwvwV
Martin Ender

@ มาร์ตินเอนเดอร์ขอบคุณมากนี่เป็นคำแนะนำที่ดีมาก ๆ ! (หมายเหตุถึงตัวเอง: หลีกเลี่ยงการตั้งชื่อสิ่งต่าง ๆ ถ้าเป็นไปได้มิฉะนั้นจะทำการมอบหมายที่ (มากกว่าก่อน) เกิดขึ้นครั้งแรก)
lastresort

ผมไม่ได้มีเวลาที่จะคิดออกอย่างสมบูรณ์ในขณะนี้ แต่นี่คือความคิดที่จะหลีกเลี่ยงการImage, ImageResize, ImageDataสิ่ง บิตนี้พัดขึ้นอาร์เรย์โดยปัจจัยที่ 2: #&@@{##&@@{#,#}&//@x}ที่xเป็นอาร์เรย์ ดังนั้นถ้าคุณเก็บกริด 8x8 เริ่มต้นในตัวแปรxแล้วทำx=#&@@{##&@@{#,#}&//@x}หลังจากใช้แต่ละครั้งคุณสามารถสร้างไทล์เรียงต่อเนื่องกันได้ค่อนข้างง่าย
Martin Ender

อ๊ะนั่นยาวกว่า 4 ไบต์ซึ่งมันจะต้องเป็น:#&[##&[#,#]&//@x]
Martin Ender

หืมมฉันยังไม่ได้ใช้เพื่อการทำงาน แต่คุณสามารถบันทึกได้มากกว่านี้ด้วย) การใช้##~Join~2และ b) f={g,a=##&[G,G,G],a,g}จากนั้นแทนที่ทุกสิ่งที่เกิดขึ้นG,G,Gด้วยaเช่นกัน
Martin Ender

4

Python 2.7: 424 412 405 376 357 ไบต์

ฉันค่อนข้างใหม่กับการเล่นกอล์ฟ .... ไปเลย

from numpy import*
import PIL
def c(n,col):e=log2((col+8)/8)//1;r=2**e;t=2**(n-e-1);return tile(repeat(array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8])[:,(col-(8*r-8))//r],r),t)
n=input();i=PIL.Image.fromarray(column_stack([c(n,col) for col in range(2**(n+3)-8)]),mode='P');i.putpalette('t\xc4`n\xaaZ'+' '*762);i.show()

ungolfed และทดสอบความยาว ..

from numpy import*
import PIL

def c(n,col): #creates array for a given column
    s = array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8]) #slime template (golfed inline)
    e=log2((col+8)/8)//1 #exponent for tiles and repititions
    r=2**e #number of repitions (scale factor)
    t=2**(n-e-1) #number of tiles (vertically)
    return tile(
            repeat(
             s[:,(col-(8*r-8))//r] #select appropriate column from template
              ,r) #repeat it r times
               ,t) #tile it t times

n = input()
arr = column_stack([c(n,col) for col in range(2**(n+3)-8)]) #create image array by stacking column function
i=PIL.Image.fromarray(arr,mode='P'); #colormap mode
i.putpalette('t\xc4`n\xaaZ'+' '*762); #set colormap
i.show()

s = r'''from numpy import*
import PIL
def c(n,col):e=log2((col+8)/8)//1;r=2**e;t=2**(n-e-1);return tile(repeat(array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8])[:,(col-(8*r-8))//r],r),t)
n=input();i=PIL.Image.fromarray(column_stack([c(n,col) for col in range(2**(n+3)-8)]),mode='P');i.putpalette('t\xc4`n\xaaZ'+' '*762);i.show()'''

print len(s)

Edit1: ถูกลบออกsys.argv[1]ในความโปรดปรานของraw_input()การบันทึกคำสั่งนำเข้าพิเศษ

แก้ไข 2: ย่อการนำเข้า PIL แบบย่อ: นำออกfrom Imageเพิ่มแล้วPIL.

แก้ไข 3: ขอบคุณ @ Sherlock9 สำหรับการเข้ารหัสฐานสิบหกของแม่แบบน้ำเมือก

edit4: ไม่ต้องการฟังก์ชั่น def และใช้input()แทนraw_input()


คำแนะนำใด ๆ ที่เป็นมากกว่ายินดีต้อนรับ :) โดยเฉพาะอย่างยิ่งการลดขนาดอาร์เรย์เทมเพลต
แอรอน

บางสิ่งบางอย่างเช่นการใช้'0000100001111110111211100111111102211220022112200111111000001000'(อาร์เรย์ของคุณกลับหลัง) ดัดแปลงมาจากฐานที่ 3 ฐาน 0x2df0777ca228b9c18447a6fb16 ด้วยหมายเลขนั้นใช้รหัสเช่นนี้[0x2df0777ca228b9c18447a6fb//3**i%3 for i in range(64)]เพื่อรับจำนวนเต็มตามลำดับที่ถูกต้อง
Sherlock9

อาใน Python 2 [0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)]อาจจะดีกว่า
Sherlock9

ขอบคุณ @ Sherlock9 ที่ยังใหม่กับการเล่นกอล์ฟคุณช่วยอธิบายวิธีการเปลี่ยนรหัสพื้นฐานได้ไหม (ฉันถือว่า)
แอรอน

1
ส่วนที่สองคือรับอาร์เรย์กลับจากหมายเลข0x2df0777ca228b9c18447a6fbนั้น มันง่ายมาก สำหรับตัวอย่างที่ง่ายที่จะได้รับ0หลัก TH จาก01221100เพียงหารด้วย 3 0ครั้งและจากนั้นใช้หลักสุดท้าย (โดยใช้ mod 3) 0ที่จะได้รับ เพื่อที่จะใช้หลักที่ 2 หารด้วย 3 2ครั้งจากนั้น mod 3 1ที่จะได้รับ ความเข้าใจในรายการเพียงแค่หาร 3 64ครั้งเพื่อให้ได้อาร์เรย์เต็มกลับมา หากคุณมีคำถามใด ๆ เพิ่มเติมเราสามารถพูดคุยกับพวกเขาในการแชท PPCG
Sherlock9

1

R, 378 356 346 334 ไบต์

f=function(n){r=rep;k=r(0,4);m=r(1,6);L=c();for(i in 1:n)L=cbind(L,r(max(L,0)+2^(n-i):1,e=2^(i-1)));png(w=sum(w<-4*2^(1:n)),h=sum(h<-r(8,2^(n-1))));layout(L,w,h);for(i in 1:max(L)){par(mar=k);image(matrix(c(0,0,0,1,k,0,m,0,0,1,1,1,2,r(1,10),0,0,r(r(c(2,1,2,0),e=2),2),m,k,1,k),nr=8),col=c("#74C460","#6EAA5A",1),ax=F,an=F)};dev.off()}

บันทึกเป็นไฟล์ png เยื้องกับ linefeeds:

f=function(n){
    r=rep
    k=r(0,4)
    m=r(1,6)
    L=c()
    for(i in 1:n)L=cbind(L,r(max(L,0)+2^(n-i):1,e=2^(i-1)))
    png(w=sum(w<-4*2^(1:n)),h=sum(h<-r(8,2^(n-1))))
    layout(L,w,h)
    for(i in 1:max(L)){
        par(mar=k)
        image(matrix(c(0,0,0,1,k,0,m,0,
                       0,1,1,1,2,r(1,10),0,
                       0,r(r(c(2,1,2,0),e=2),2),
                       m,k,1,k),
                     nr=8),
              col=c("#74C460","#6EAA5A",1),ax=F,an=F)
    }
    dev.off()
}

N = 2: N = 3: N = 4:N = 2
N = 3
N = 4

คำอธิบายบางอย่าง:

นี่คือเมทริกซ์ที่กำลังพล็อต (0 หมายถึง lightgreen, 1 darkgreen และ 2 black; matrix ถูกเอียงเนื่องจากคอลัมน์เป็นแกน y และแถวแกน x)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    0    1    0    0    0    0
[2,]    0    1    1    1    2    2    1    0
[3,]    0    1    1    1    2    2    1    0
[4,]    1    1    1    1    1    1    1    1
[5,]    0    1    2    1    1    1    1    0
[6,]    0    1    1    1    2    2    1    0
[7,]    0    1    1    1    2    2    1    0
[8,]    0    0    1    0    0    0    0    0

แต่ละการเรียกเพื่อimageพล็อตเมทริกซ์นั้น (โดยแต่ละจำนวนเต็มสอดคล้องกับสี) สำหรับ N = 4 นี่คือ L (เมทริกซ์โครงร่างแต่ละหมายเลขไม่ซ้ำกันแสดงถึงพล็อตเดียว), w (ความกว้างของคอลัมน์เมทริกซ์) และ h (ความสูงของแถวเมทริกซ์):

> L
     [,1] [,2] [,3] [,4]
[1,]    8   12   14   15
[2,]    7   12   14   15
[3,]    6   11   14   15
[4,]    5   11   14   15
[5,]    4   10   13   15
[6,]    3   10   13   15
[7,]    2    9   13   15
[8,]    1    9   13   15
> w
[1]  8 16 32 64
> h
[1] 8 8 8 8 8 8 8 8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.