เป็นบอร์ด 2048 ที่ดีหรือไม่?


26

นี่เป็นคำถามแรกของฉันที่นี่ดังนั้นคำแนะนำใด ๆ ในความคิดเห็นจะได้รับการชื่นชม! ขอบคุณ;)

บทนำ

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

รูปแบบการตรวจสอบ / งานของคุณ

การส่งของคุณควรเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ส่งกลับค่าความจริงหากบอร์ดสามารถอธิบายได้ดังนี้: ลงไปในแต่ละคอลัมน์ของบอร์ดหมายเลขแรกควรสูงที่สุดของคอลัมน์จำนวนที่สองควรน้อยกว่า มากกว่าหรือเท่ากับจำนวนแรก ฯลฯกระดาน 2048 ที่ดีจะถูกกำหนดให้เป็นกระดานที่มีตัวเลขสูงสุดอยู่ด้านบน นี่คือโค้ดกอล์ฟดังนั้นรหัสที่สั้นที่สุดต่อภาษา (เป็นไบต์) จะชนะ

I / O

อินพุตสามารถถูกใช้ในวิธีที่เหมาะสมตัวอย่างเช่นอาร์เรย์ 4 อาร์เรย์แต่ละตัวมี 4 หมายเลขหรืออาร์เรย์ 16 ตัวเลข โดยรวมมันจะเป็นตัวเลข 16 เสมอแทน 4x4 บอร์ด เอาท์พุทควรเป็นค่าความจริงของอินพุตคือ "ดี 2048 บอร์ด" และค่าเท็จเป็นอย่างอื่น

ตัวอย่าง

Truthy:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 | 128| 32 |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

Falsy:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 | 16 |
|-------------------|
| 32 |    | 128|  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 |  32|    |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

บันทึก

ดูกรณีทดสอบที่ผิดพลาดครั้งที่ 2: เมื่อมีค่าว่าง (หรือ 0) ที่ใดที่หนึ่งและแม้เมื่อตามด้วยค่าที่สูงกว่าจำนวนที่ไม่เป็นศูนย์สุดท้ายค่านี้ควรเป็นเท็จเพราะค่าถัดไปหลังจาก ศูนย์จะสูงกว่า 0 ซึ่งทำให้ไม่ถูกต้อง

โชคดี!


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Martin Ender

คำตอบ:


16

Haskell , 21 ไบต์

all$scanr1 max>>=(==)

ลองออนไลน์!

รับรายการของคอลัมน์โดยมีช่องว่างว่างเป็น 0


[[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]]จะช่วยให้การส่งออกผิด
Jonathan Allan

@JonathanAllan มันจะส่งกลับค่าเท็จตามที่ควรคอลัมน์ที่ 2 ของคุณคือ [16,0,4,4] ซึ่งไม่ได้เป็นแบบ monotonic หรือว่าฉันขาดอะไรไป?
ฉันต้องการสร้างเกม

0 คือตัวยึดตำแหน่งของคุณสำหรับเซลล์ว่างไม่ใช่ค่า 0
Jonathan Allan

2
@Iwanttomakegames ที่ความคิดเห็นนั้นมีความหมายสำหรับคุณ (แทนที่ "your" ด้วย "the")
โจนาธานอัลลัน

@JanathanAllan ฉันขอโทษสำหรับความสับสนทั้งหมด แต่ 0 ควรแน่นอนในขณะที่เป็นตัวแทนของเซลล์ที่ว่างเปล่าให้นับเป็นค่า 0 เซลล์ว่างควรได้รับการปฏิบัติเช่นค่า '0'
dv02


9

APL (Dyalog) , 7 4 ไบต์

รับเมทริกซ์ 4 คูณ 4 โดยใช้ 0 สำหรับช่องว่างเป็นอาร์กิวเมนต์

⊢≡⌊⍀

ลองออนไลน์!

⌊⍀ เป็นจำนวนสะสมขั้นต่ำในแนวตั้ง

 เหมือนกับ

 อาร์กิวเมนต์ที่ไม่ได้แก้ไข?


สุดยอดกอล์ฟ! (ฉันคาดว่าจากคนที่ทำงานให้กับ Dyalog และตั้งโปรแกรม APL เป็นเวลานาน) และใช่ฉันมีสัญลักษณ์ APL จำนวนมากแม้ว่าจะไม่ใช่สัญลักษณ์ APL Alpha, Iota, Omega ล้วนแล้วแต่เป็นกรีกทั้งหมดไม่ใช่ APL ในทางเทคนิค พวกเขามาถึงใจก่อนเมื่อนึกถึงคำสั่งตัวเดียว ดังนั้นการเพิ่มและลดลงของฉันจึงเป็นของเยลลี่เพราะนั่นเป็นสิ่งที่คำนึงถึงก่อน (เพียงเพื่อแจ้งให้คุณทราบฉันถูกระงับการแชทดังนั้นคำตอบที่นี่)
Zacharý

7

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

Ṣ€U⁼

ลองออนไลน์!

อินพุตเป็นอาร์เรย์ของคอลัมน์ ทำงานร่วมกับกริดที่มีขนาดตามอำเภอใจ


การเป็นตัวแทนของเซลล์ว่างเปล่าคืออะไร? (เช่น 3 col ของกรณีทดสอบเท็จ 2) - "โดยรวมจะเป็นตัวเลข 16 เสมอ" มันจะทำงานกับศูนย์ถ้าคุณกรองพวกเขาออกก่อน
Jonathan Allan

@JonathanAllan ตามรายละเอียดที่ผมคิดนี้ถูกต้องมากเกินไป
HyperNeutrino

แต่ตอนนี้ที่จะล้มเหลวของฉันกรณีทดสอบปัญหากลับมามากกว่า0 1
Jonathan Allan

@JonathanAllan คุณกรองอย่างไรใน Jelly ._ ฉันคาดหวังว่าสิ่งนี้จะทำงานได้ แต่ḟ0ไม่ทำงาน
HyperNeutrino

1
@DirtyDev ไม่เป็นไรเราอยู่ที่นี่เพื่อเพลิดเพลินไปกับความท้าทายและช่วยให้ผู้ใช้ใหม่คุ้นเคยกับสถานที่นี้ :) ฉันหวังว่าคุณจะเพลิดเพลินกับชุมชน
HyperNeutrino

6

R (+ pryr) 23 ไบต์

pryr::f(all(diff(x))<1)

ซึ่งประเมินการทำงาน

function (x) 
all(diff(x)) < 1

ซึ่งใช้เมทริกซ์เป็นอินพุต:

     [,1] [,2] [,3] [,4]
[1,]   16    0   64    8
[2,]    8    0   32    8
[3,]    4    0   32    2
[4,]    2    0    0    0

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

     [,1] [,2] [,3] [,4]
[1,]   -8    0  -32    0
[2,]   -4    0    0   -6
[3,]   -2    0  -32   -2

ไม่มีค่าใด ๆ เหล่านี้ที่สามารถเป็น 1 หรือสูงกว่าในบอร์ดที่ดีดังนั้นเราจะทดสอบ<1และดูว่าallค่าของเมทริกซ์สอดคล้องหรือไม่

     [,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE

[1] TRUE

5

JavaScript ขนาด 37 ไบต์

x=>''+x==x.map(v=>v.sort((x,y)=>y-x))

เรียกว่าเป็นแบบนี้:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|

f([[8,8,2,0],[64,32,32,0],[0,0,0,0],[16,8,4,2]])

ทดสอบบน Firefox, Chrome, JavaScript Shell และ, Node.js


ทำไมคุณเปลี่ยนผลลัพธ์เป็นสตริง ( ''+)
Zacharý

@ Zacharý sortเป็นวิธีที่ไม่แน่นอนซึ่งจะกลายพันธุ์อาร์เรย์ ก่อนแปลงเป็นสตริงจะบันทึกสำเนาของอาร์เรย์ การแปลงเป็นสตริงยังทำให้การดำเนินการเท่ากันทำงานโดยค่า (สตริง) แทนการอ้างอิง
tsh


4

C # (. NET Core) , 71 ไบต์

i=>{for(int n=3;++n<i.Length;)if(i[n]>i[n-4])return false;return true;}

ลองออนไลน์!

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

อีกวิธีหนึ่งที่ต้องห้ามอย่างชัดเจน:

i=>{for(int n=3;i[++n]<=i[n-4];);}

ลองออนไลน์!

พ่น IndexOutOfBoundsException เพื่อระบุความเป็นจริงสิ้นสุดลงตามปกติเพื่อระบุว่าเป็นเท็จ ฉันลองรุ่นที่มีการแปลงจากข้อยกเว้น / ไม่มีข้อยกเว้นเป็นจริง / เท็จ แต่มันก็จบลงตราบเท่าที่เวอร์ชันปกติ


4

JavaScript, 34 , 32 ไบต์

v=>!v.some((x,i)=>i%4&&x>v[i-1])

โทรโดยผ่านในอาร์เรย์เดียวที่มีคอลัมน์แรกตามด้วย 2nd, 3 และ 4

เปรียบเทียบแต่ละหมายเลขกับหมายเลขก่อนหน้ายกเว้นตัวเลขแรกของแต่ละคอลัมน์และส่งกลับค่าจริงถ้าทั้งหมดเป็นจริง

ทดสอบ

f=v=>!v.some((x,i)=>i%4&&x>v[i-1])

f([16,8,4,2,0,0,0,0,64,32,32,0,8,8,2,0])
f([16,8,4,4,128,128,16,0,64,32,8,0,32,8,2,0])
f([16,8,32,2,0,0,0,0,64,32,128,0,8,16,2,0])
f([16,8,4,4,128,32,16,0,64,0,8,0,32,8,2,0])

แก้ไข: บันทึกไว้ 2 ไบต์ด้วย tsh


หลังจากบูลบางแปลง:v=>!v.some((x,i)=>i%4&&x>v[i-1])
TSH

3

Haskell , 28 ไบต์

all$and.(zipWith(>=)=<<tail)

นอกจากนี้ยังมี

all$(==)=<<sort

กับ 15 ไบต์ แต่มันต้องใช้import Data.Listเมื่อทำงานกับโหมโรงเท่านั้น อีกวิธีหนึ่งคือ

all$(==)=<<Data.List.sort

กับ 25 ไบต์ทำงานใน GHCI


3

Gaia , 3 6 ไบต์

+3 ไบต์เพราะเห็นได้ชัดว่าฉันไม่ทราบว่าภาษาของฉันทำงานอย่างไร

ọ¦_ẏ⁇!

นี่คือฟังก์ชั่นที่ยอมรับรายการของคอลัมน์และทิ้งผลลัพธ์ไว้ในสแต็ก

ไม่กี่อื่น ๆ 6 โซลูชั่นไบต์ที่มีอยู่รวมทั้งและ0+¦o¦ẏọ¦_ẏ¦ỵ

ลองออนไลน์!

คำอธิบาย

ọ¦      Deltas of each column
  _     Flatten
   ẏ⁇   Keep only positive numbers
     !  Negate (is it empty?)

ไม่สามารถ downvote แต่ใช้ผู้ประกอบการเพิ่มภาษาหลังจากที่ท้าทายถูกโพสต์ดูเหมือนจะไม่ยุติธรรมที่จะ me.Also ดูเหมือนว่าจะเป็นสิ่งต้องห้ามโดยค่าเริ่มต้นเป็นไปตามนี้
Cinaski

@Cinaski เราได้ชนิดของย้ายออกไปจากกฎที่เท่าที่เห็นนี่ ทั้งสองวิธีโซลูชันทางเลือกของฉันใช้ตัวดำเนินการที่มีอยู่ก่อนความท้าทาย
แมวธุรกิจ

ฉันจะเปลี่ยนเป็นหนึ่งในคนอื่น ๆ ที่ฉันเดา
Business Cat

ไม่เป็นไรฉันไม่ได้ตระหนักถึงกฎใหม่นั้น
Cinaski

3

TI-BASIC ขนาด 25 ไบต์

รับอินพุตเป็นเมทริกซ์ 4x4 ใน Ans

For(R,1,3
*row+(-1,Ans,R+1,R
End
Ans=abs(Ans

คำอธิบาย

For(R,1,3             Loop from row 1 to 3.

*row+(-1,Ans,R+1,R    Multiply row R+1 by -1 and add it to row R in-place.
                      Effectively, this subtracts row R+1 from row R.

End                   Now the first 3 rows contain the row differences,
                      and the 4th row is non-negative assuming valid input.

Ans=abs(Ans           Check whether every element in the matrix is equal to its
                      absolute value, or in other words, contains no negative values.

2

Haskell , 41 ไบต์

f[x]=1>0
f(a:b:c)|a<b=1<0|1>0=f$b:c
all f

ลองออนไลน์!

กำหนดฟังก์ชั่นจุดฟรีall fที่fกำหนดว่ารายการจะเรียงลำดับ


แย่แล้วเต้น Python ทีละ 1 ไบต์ P
HyperNeutrino

@HyperNeutrino เอาหลามของ xnor เต้น 21: P
Wheat Wizard

นอกจากนี้คุณยังสามารถกำหนดfเป็นf(a:b:c)=a>=b&&f(b:c)
Cristian Lupascu

2

JavaScript (ES6), 42 ไบต์

รับอาร์เรย์ของคอลัมน์ ส่งกลับจำนวน (truthy) falseหรือ

a=>a.every(c=>c.reduce((r,n)=>r&&n<=r&&n))

JavaScript (ES6), 54 47 ไบต์

ความพยายามครั้งแรก รับอาร์เรย์ของคอลัมน์ ผลตอบแทนหรือtruefalse

a=>a.every(c=>c.slice(1).every((n,i)=>n<=c[i]))

คุณคาดหวังว่าค่าใดสำหรับเซลล์ว่าง
Arnauld

2

MATL , 4 ไบต์

SGX=

ลองออนไลน์!

ป้อนข้อมูลเป็นอาร์เรย์ของแถวคว่ำ

S       % sort columns
GX=     % compare with input
        % true if arrays are numerically equal
        % (implicit) convert to string and display

ไม่ทำงานสำหรับกรณีที่ควรกลับ truthy ที่มีศูนย์ระหว่างองค์ประกอบคอลัมน์เช่นนี้ตัวอย่างเช่น
Jonathan Allan

คุณพูดถูกฉันกำลังแก้ปัญหาอยู่ BTW ฉันไม่ใช่คนเดียวที่มีปัญหากับเซลล์ว่างเปล่า)
Cinaski

ใช่ฉันเห็นแล้วว่า ฉันแนะนำกรณีทดสอบสำหรับมันด้วย Ping เมื่อแก้ไขแล้วคุณจะได้รับ upvote จากฉัน :)
Jonathan Allan

@Janathan ทุกคนรอใครบอกว่ามันควรจะกลับความจริงเมื่อมีศูนย์ระหว่างองค์ประกอบคอลัมน์? ดูกรณีทดสอบที่ผิดพลาดครั้งที่สองของฉันเซลล์ว่าง / a 0 ตามด้วยค่าที่สูงขึ้นเมื่อลงมาไม่ถูกต้อง
dv02

@DirtyDev FYI พร้อมถ้อยคำที่ให้ไว้ แต่เดิมและการตีความที่สมเหตุสมผลกรณีที่สองของคุณจะยังคงเป็นเท็จ เป็นเพียงกรณีทดสอบที่แนะนำของฉันจะเป็นจริง
Jonathan Allan


2

Dyalog APL, 21 19 15 ไบต์

∧/{⍵≡⍵[⍒⍵]}¨↓⍉⎕

ลองออนไลน์! (แก้ไขแล้วมันจะทำงานใน tryapl)

รับอินพุตเป็นอาร์เรย์ 2D

อย่างไร?

  • อินพุต
  • transpose
  • 2D array => 1D เวกเตอร์ของ 1D เวกเตอร์
  • { ... }¨ ใช้สิ่งนี้กับสมาชิกแต่ละคน (โต้แย้ง ):
    • ⍵[⍒⍵] เรียงจากมากไปน้อย
    • ⍵≡ ความเสมอภาคกับ
  • ∧/1ว่าทุกองค์ประกอบคือ


2

Japt , 7 ไบต์

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

ใช้อาร์เรย์ของคอลัมน์เป็นอินพุต เซลล์ที่ว่างเปล่าสามารถ0หรือละเว้นได้หากไม่มีหมายเลขอื่นในคอลัมน์

P+U¥®n§

ทดสอบมัน


คำอธิบาย

Uการป้อนข้อมูลโดยปริยายของอาร์เรย์

P+U

เติมUด้วยสตริงว่างโดยแปลงอาร์เรย์เป็นสตริง

¥

ตรวจสอบความเท่าเทียมกันซึ่งใช้ทางขวามือของสตริงเช่นกัน

®

Uแผนที่มากกว่า

เรียง ( n) <=โดย

ส่งออกผลลัพธ์บูลีนโดยปริยาย


Uการจัดเรียงที่ดีที่จะข้ามสอง คุณสามารถทำnnในตอนท้ายเช่นกัน;)
ETHproductions

ฉันรู้สึกประหลาดใจที่พบว่าไม่Uทำงานครั้งที่สองในกรณีนี้ @ETHproductions ฉันคิดว่ามันจะทำงานเฉพาะในกรณีที่ตัวแปรเป็นเพียง==สิ่งที่ไปทางซ้ายของ ฉันจะต้องจำไว้เพื่อใช้ในอนาคต
Shaggy


1

Java 8, 69 ไบต์

b->{for(int[]c:b)for(int i=0,f=1;i<3;)if(c[i]<c[++i])f=0;return f>0;}

ในการเขียนครั้งนี้การเต้นของ Swift จึงมีอยู่! ตรงไปตรงมาที่สุด อินพุตเป็นอาร์เรย์ของอาร์เรย์จำนวนเต็มอาร์เรย์ภายในเป็นคอลัมน์ของบอร์ด (กำลังสองด้านบนก่อน) Function<int[][], Boolean>โยนไป


1

MY , 66 62 20 ไบต์ (ไม่ใช่การแข่งขัน)

ω⍉ω⍉A6ǵ'ƒ⇹(E8ǵ'ƒ⇹(Π←

ลองออนไลน์!

ด้วยเหตุนี้ไม่ใช่การแข่งขันคือการที่ฉันเพิ่งดำเนินการ8E (≡)ซึ่งเทียบเท่ากับ APL

อย่างไร?

  • ω⍉ อาร์กิวเมนต์บรรทัดคำสั่งแรกที่ถูกย้าย
  • ω⍉ อาร์กิวเมนต์บรรทัดคำสั่งแรกที่ถูกย้าย
  • A6ǵ'กดchr(0x6A)( ในเพจรหัสซึ่งเรียงลำดับจากมากไปน้อย)
  • ƒ เป็นฟังก์ชันแทนที่จะเป็นสตริง
  • กดฟังก์ชั่นที่แมปฟังก์ชั่นที่ผุดผ่านแต่ละอาร์กิวเมนต์
  • ( ใช้
  • E8ǵ'ƒ⇹( สิ่งเดียวกันยกเว้นด้วยchr(0x8E)ซึ่งเป็นคำสั่งจับคู่ ( )
  • Π สินค้า
  • เอาต์พุตที่ไม่มีบรรทัดใหม่

ใช่สัญลักษณ์ของฉันจำนวนมากเหมือนกันหรือคล้ายกับของ APL คำอธิบายคือพวกเขามาถึงใจเมื่อฉันต้องการคำสั่ง 1 ตัวอักษร (ฉันไม่รู้ว่าทำไมฉันไม่ได้ใช้Tเพื่อขนย้าย)


0

Mathematica ขนาด 27 ไบต์

t=Thread;-t[Sort/@-t@#]==#&

คำอธิบาย:

  • Threadคือการดำเนินการ transpose เหมือนแปลกทั่วไปที่เกิดขึ้นที่จะใช้ transpose เมื่อได้รับเมทริกซ์
  • t=Thread;ให้ฉันใช้tสองครั้งแทนThreadสองครั้งเพื่อบันทึกไบต์
  • Sort เรียงลำดับรายการ (ตามลำดับที่เพิ่มขึ้น)
  • Sort\@แม็พSortฟังก์ชันกับแต่ละองค์ประกอบของรายการทีละรายการ เมื่อนำไปใช้กับเมทริกซ์จะเรียงลำดับแถว
  • t@#ใช้ฟังก์ชั่นไขว้กับอินพุต#ของฟังก์ชั่นหลัก
  • - รับค่าลบของรายการทั้งหมดเพื่อให้การเรียงลำดับแถวของเมทริกซ์ที่ถูกย้าย (คอลัมน์ของต้นฉบับ) เรียงลำดับรายการเหล่านั้นตามวิธีที่ต้องการ
  • ด้านนอก-t[...]ยกเลิกการลบและการสลับสับเปลี่ยนดังนั้นสิ่งที่เราทำจริงๆคือเรียงคอลัมน์ที่ใหญ่ที่สุดไปหาน้อยที่สุด
  • ==# ทดสอบเพื่อดูว่าเมทริกซ์เรียงคอลัมน์ใหม่นี้เท่ากับอินพุตต้นฉบับหรือไม่
  • &สิ้นสุดฟังก์ชั่นที่ไม่ระบุตัวตนด้วยการป้อนข้อมูลที่#เรากำหนดไว้

คุณสามารถลองออนไลน์ได้ในกล่องทดลองWolfram Cloudโดยการวางโค้ดเช่นต่อไปนี้แล้วคลิก Gear -> "Evaluate cell" หรือกด Shift + Enter หรือ Enter numpad:

t=Thread;-t[Sort/@-t@#]==#&@{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}

หรือสำหรับกรณีทดสอบทั้งหมด:

t=Thread;-t[Sort/@-t@#]==#&//Map[#,{{{16,0,64,8},{8,0,32,8},{4,0,32,2},{2,0,0,0}},{{16,128,64,32},{8,128,32,8},{4,16,8,2},{4,0,0,0}},{{16,0,64,8},{8,0,32,16},{32,0,128,2},{2,0,0,0}},{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}}]&
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.