Scrabble ที่สวมด้วยกระเบื้อง


35

ปัญหา

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

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

ดังนั้นโดยทั่วไปให้รายการของคะแนนแปลงเป็นสตริงหรือรายการตัวอักษรใด ๆ


กระเบื้องข่วนและกระจาย

  • 2 แผ่นเปล่า (คะแนน 0 คะแนน)
  • 1 คะแนน: E × 12, A × 9, I × 9, O × 8, N × 6, R × 6, T × 6, L × 4, S × 4, U × 4
  • 2 คะแนน: D × 4, G × 3
  • 3 คะแนน: B × 2, C × 2, M × 2, P × 2
  • 4 คะแนน: F × 2, H × 2, V × 2, W × 2, Y × 2
  • 5 คะแนน: K × 1
  • 8 คะแนน: J × 1, X × 1
  • 10 คะแนน: Q × 1, Z × 1

ดังนั้นถ้าคุณมีรายการคะแนน[10,10,8,5,1,1,1]ก็"QZJKEEE"จะใช้ได้ แต่"QQJKEEE"จะไม่ถูกต้อง (เนื่องจากมีไพ่ Q 1 ใบเท่านั้นในกระเป๋า)


กฎเฉพาะปัญหา

  • คุณอาจจะสมมติว่าอินพุตทั้งหมดนั้นถูกต้องและจะมี 7 ไทล์เสมอ (นั่นคือจะไม่มีรายชื่อของไพ่ 10 แต้มเจ็ดแต้มและจะไม่เป็นไพ่ 9 ใบ)
  • คุณสามารถสมมติว่าไม่มีการดึงไทล์ออกจากถุงมาก่อน (ดังนั้นการกระจายจึงเป็นการแจกแจงมาตรฐานของไทล์ภาษาอังกฤษตามที่กำหนดไว้ด้านบน)
  • คุณไม่จำเป็นต้องสร้างคำที่ถูกต้องเพียงสตริงตัวอักษรที่ถูกต้อง
  • ลำดับของสตริงของคุณไม่เกี่ยวข้องตราบใดที่ไทล์แต่ละแผ่นมีตัวอักษรที่เกี่ยวข้อง
  • คะแนนจะขึ้นอยู่กับคะแนนไทล์ข่วนภาษาอังกฤษมาตรฐานตามที่กำหนดไว้ข้างต้น
  • คุณสามารถแสดงผลเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กสำหรับช่องว่างคุณสามารถแสดงอักขระช่องว่างหรือขีดล่าง '_'
  • คำตอบของคุณอาจส่งออกเป็นตัวแทนที่เหมาะสมของกระเบื้องเช่น List, String, Array หรือ Sequence

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีด้วยพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ

เห็นได้ชัดว่าคุณสามารถส่งออกค่าที่เป็นไปได้มันยากที่จะกำหนดกรณีทดสอบที่เข้มงวด

บางกรณีที่มีค่าส่งคืนที่ถูกต้อง :

[10,0,10,5,8,8,0] -> "Q ZKJX "
[1,1,1,1,1,1,1] -> "EEEEEEE"
[1,2,3,4,5,8,0] -> "NDBHKJ "
[2,2,2,2,2,2,2] -> "DGDGDGD"

บางกรณีที่มีค่าส่งคืนไม่ถูกต้อง :

[10,0,10,5,8,8,0] -> "Q QKJX "  - Too many Qs 
[1,1,1,1,1,1,1] -> "EEEEEE "  - Space is 0 points not 1
[1,2,3,4,5,8,0] -> "NDBH" - Too short
[1,2,3,4,5,8,0] -> "NDBHKJ  I" - Too long
[1,2,3,4,5,8,0] -> "ÉDBHKJ1" - Contains none scrabble characters
[2,2,2,2,2,2,2] -> "GDGDGDG" - Contains too many Gs (case for invalid cycling)

ฉันต้องส่งออกสตริงหรือรายการตกลงหรือไม่?
Maltysen

คุณสามารถส่งออกรายการฉันจะอัปเดตคำถาม
ข้อมูลหมดอายุ

1
ฉันจะส่งออกอะไรว่างเปล่า?
Maltysen

3
กรณีทดสอบที่แนะนำ: [2,2,2,2,2,2,2](เฉพาะกรณีที่เป็นสิ่งสำคัญที่จะต้องเริ่มต้นด้วยการใช้วิธีการปั่นจักรยานDมากกว่าG)
Arnauld

1
การแจ้งเตือนคือ @ จากนั้นชื่อของบุคคลโดยไม่มีช่องว่าง Ie ข้อมูลที่หมดอายุจะกลายเป็น @ExpiredData
เอกภาพ

คำตอบ:


8

JavaScript (ES6), 72 ไบต์

ตัวแปรที่สั้นกว่าที่แนะนำโดย@supercat

a=>a.map(o=n=>'?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])

ลองออนไลน์!


JavaScript (ES6),  137 ... 84 78 77  76 ไบต์

บันทึก 10 ไบต์โดยใช้วิธีการหมุนเวียนของ Neil

ส่งคืนรายการของไพ่ ใช้_สำหรับกระเบื้องเปล่า

a=>a.map(o=n=>"____FHVWGDGD_K__BCMPEEEE_ZQ__XJ"[n*20%44%32+(o[n]=-~o[n])%4])

ลองออนไลน์!

อย่างไร?

สำหรับแต่ละคะแนนเราวนรอบกลุ่มไพ่ 4 ใบเริ่มด้วยกระเบื้องที่สองของแต่ละกลุ่ม (นี่เป็นสิ่งสำคัญสำหรับGvs D)

 points | group | max. sequence
--------+-------+---------------
    0   | ____  | __
    1   | EEEE  | EEEEEEE
    2   | GDGD  | DGDGDGD
    3   | BCMP  | CMPBCMP
    4   | FHVW  | HVWFHVW
    5   | _K__  | K         \
    8   | _XJ_  | XJ         }--- these letters may only appear once each
   10   | _ZQ_  | ZQ        /

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

____FHVWGDGD_K__BCMPEEEE_ZQ__XJ
^   ^   ^   ^   ^   ^   ^   ^
0   4   8  12  16  20  24  28

หมายเหตุ : เราไม่จำเป็นต้องเก็บข้อมูลสุดท้าย"_"ไว้"_XJ_"เนื่องจากจะไม่สามารถเข้าถึงได้

จำนวนของจุดที่nจะถูกแปลงเป็นดัชนีที่ถูกต้องผมnเป็นสตริงนี้ด้วย:

ผมn=((20×n)พอควร44)พอควร32

  n | *20 | mod 44 | mod 32 | group
----+-----+--------+--------+-------
  0 |   0 |    0   |    0   | ____
  1 |  20 |   20   |   20   | EEEE
  2 |  40 |   40   |    8   | GDGD
  3 |  60 |   16   |   16   | BCMP
  4 |  80 |   36   |    4   | FHVW
  5 | 100 |   12   |   12   | _K__
  8 | 160 |   28   |   28   | _XJ_
 10 | 200 |   24   |   24   | _ZQ_

โอ


การเพิ่ม o [n] ทีละ 8 ในแต่ละครั้งจะทำให้อักขระพิเศษหนึ่งตัวสำหรับความก้าวหน้า แต่อนุญาตให้หนึ่งแทนที่% 4 และ% 32 ด้วย & 31 สำหรับการชนะสุทธิ a=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31]))ที่ดีที่สุดของฉันขึ้นอยู่กับคุณจะเป็น เวอร์ชันที่สั้นกว่า "เกือบ" a=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))แต่วิธีการนั้นต้องการวิธีกระชับแผนที่ 8 และ 10 เป็น 11 และ 12 รวมทั้งการปรับเล็กน้อยกับสตริงเพื่อแก้ไขปัญหาแบบแยกออกจากกัน
supercat

@supercat ฟังดูดี! พรุ่งนี้ฉันจะตรวจดูอย่างใกล้ชิด
Arnauld

@supercat สูตรที่น่าสนใจอีกอย่างหนึ่งคือ'_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E'มีสตริงการค้นหาเพียง 22 ตัวอักษร แม้ว่ารหัสเต็มจะยังคงยาวกว่าโซลูชันของคุณ 2 ไบต์
Arnauld

7

ถ่าน 33 ไบต์

⭆觧⪪”&↖“Vh_z↶∕¡⌈∨₂χ¹‖◨⌊″”¶ι№…θκι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

 θ                  Input array
⭆                   Map over elements and join
     ”...”          Literal string " \nE\nDG\nBCMP\nFHVW\nK\n\n\nJX\n\nQZ"
    ⪪     ¶         Split on newlines
   §       ι        Indexed by current element
  §                 Cyclically indexed by
            №…θκι   Number of times current element has already appeared
                    Implcitly print

5

เยลลี่ ,  31 30 27  26 ไบต์

“ñẒẎYñ(“Nut¦hß’ṃØA;€⁶ɓṢĖœị

Monadic Link ยอมรับรายการจำนวนเต็มซึ่งให้รายการของอักขระ
- ยั่วโมโหของฉันก่อนหน้านี้ด้านล่างและการปรับปรุงของฉันของNick Kennedy

ลองออนไลน์!

เอาต์พุตไม่ได้ถูกจัดเรียงตามลำดับเช่นเดียวกับอินพุต (ได้รับอนุญาต)

การใช้ 2 ในการเพิ่มภาษาของตัวเองในคำตอบนั้นไม่ได้เกิดขึ้นบ่อยครั้ง! ( และɓที่นี่)

อย่างไร?

“...“...’ṃØA;€⁶ɓṢĖœị - Link: list of integers, V     e.g. [10,1,0,3,2,1,10]
“...“...’            - list of base 250 integers          [28089224382041, 77611203526272]
          ØA         - 'ABC...XYZ'
         ṃ           - base decompress (vectorises)       ["EDMFKZZJZQ", "NGPYKZZXZZ"]
            ;€       - for €ach: concatenate:
              ⁶      -   a space                          ["EDMFKZZJZQ ", "NGPYKZZXZZ "]
               ɓ     - start a new dyadic chain with swapped arguments - i.e. f(V,that)
                Ṣ    - sort                               [0,1,1,2,3,10,10]
                 Ė   - enumerate                          [[1,0],[2,1],[3,1],[4,2],[5,3],[6,10],[7,10]]
                  œị - multi-dimensional index into       " NEGMZQ"
                       (1-based and modular)

ก่อนหน้านี้ @ 30

“²rṛʂṂø5=Ɓṇ^N¥Y»⁾tky;⁶s2ɓṢĖUœị

Monadic Link ยอมรับรายการจำนวนเต็มซึ่งให้รายการของอักขระ

ลองออนไลน์!

ผลลัพธ์ของคนนี้ยังผสมกรณี (อนุญาตนี้)

อย่างไร?

“...»⁾tky;⁶s2ɓṢĖUœị - Link: list of integers, V          e.g. [10,1,0,3,2,1,10]
“...»               - compression of dictionary entries:
                    -   "end", "GMP", "fyttes", "adj", and "xci" and the string "qz"
                    -                                         "endGMPfyttesadjxciqz"
        y           - translate with:
     ⁾tk            -   ['t', 'k']                            "endGMPfykkesadjxciqz"
         ;⁶s2ɓṢĖUœị - ...
                    - ...then like the above method (except U reverses each pair of indices)
                                                              " neGMzq"

ฉันคิดว่าคุณพิมพ์ผิดในคำอธิบายแรกของคุณ ' NWGMZQ'หลังจากดัชนีหลายมิติกลายเป็นเพลงที่ไม่มีWสตริง ;)
Kevin Cruijssen

1
@KevinCruijssen - yws พิมพ์ผิด fixwd; ขอบคุณ!
Jonathan Allan

4

Pyth - 92 86 83 81 80 75 60 52 49 42 36 ไบต์

วนซ้ำผ่านอินพุต, popping ตัวอักษรที่มีอยู่ ฉันเพิ่งมีหนึ่งจดหมายแต่ละฉบับที่รวมกันให้ 7 สำหรับหมวดหมู่จุดนั้น ตอนนี้ใช้การเข้ารหัสสตริงที่บีบอัด

K[M*L7c."B_êº çÑOÒ
7âCkÑ"\Lm.)@K

K                       Assign to K       
 [M                     Map list(for popping). Uses a quirk of M to splat each first
  *L7                   Map repeating each string by 7
   c      \L            Split on occurrences of 'L'
    ."..."              Packed string encoding of the needed letters
m              (Q)      Map on input (input is taken implicitly)
 .)                     Pop. This returns the first element after removing it
  @K                    Index into K
   (d)                  The loop variable is given implicitly

Btw "_ E DG BCMP FHVW K JX QZ"นี้เป็นสตริงตัวอักษรเดิมก่อนการเข้ารหัส:

ลองมันออนไลน์



3

05AB1E , 70 52 39 38 29 26 25 ไบต์

{ε.•3Oû}α›ηö‡.ÝŽ{•2ôÁyèNè?

-18 ไบต์ขอบคุณที่@ExpiredData
-13 ไบต์โดยใช้เดียวกันขยายขนาด 7 จาก@Maltysen 's คำตอบ
-9 ไบต์โดยสร้างพอร์ตของคำตอบ Jellyของ@JonathanAllanดังนั้นอย่าลืมโหวตให้เขา!
-3 ไบต์ขอบคุณที่@Emigna

ผลลัพธ์ในรายการของอักขระและใช้ตัวอักษรตัวพิมพ์เล็กและช่องว่างสำหรับช่องว่าง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

{                      # Sort the (implicit) input-list
 ε                     # Map each character `y` in this list to:
  .•3Oû}α›ηö‡.ÝŽ{•     #  Push compressed string "endgmpfykkzzzzjxzzqz "
                  2ô   #  Split into parts of size 2
                    Á  #  Rotate it once towards the left so the space is leading
  yè                   #  Use integer `y` to index into the string-pairs
    Nè                 #  Then get the `N`'th character of the string-pair (with automatic
                       #   wraparound), where `N` is the index of the loop

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•3Oû}α›ηö‡.ÝŽ{•"endgmpfykkzzzzjxzzqz "


38 ไบต์ก่อนหน้าตอบ:

.•Mñ&Àû«ì{₆v*Å+µ-•#ðšε7∍}IvDyèн©?ε®õ.;

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

.•Mñ&Àû«ì{₆v*Å+µ-•    # Push compressed string "e dg bcmp fhvw k   jx  qz"
                  #   # Split on spaces: ["e","dg","bcmp","fhvw","k","","","jx","","qz"]
                   ðš # Prepend a space to this list
 ε7∍}                 # Extend each string to size 7:
                      #  ["       ","eeeeeee","dgdgdgd","bcmpbcm","fhvwfhv","kkkkkkk","","","jxjxjxj","","qzqzqzq"]
     Iv               # Loop `y` over the input-list:
       Dyè            #  Get the `y`'th string from a copy of the list
          н           #  Get it's first character
           ©?         #  Store it in the register, and print it without trailing newline
        ε             #  Then map each string in the list to:
         ®õ.;         #   Remove the first occurrence of the character from the register

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•Mñ&Àû«ì{₆v*Å+µ-•"e dg bcmp fhvw k jx qz"


คุณใช้" 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"ไม่ได้เหรอ
ข้อมูลหมดอายุ

@ ExpiredData อ่าแน่นอน คุณวาดได้แค่ 7 ตัวอักษร .. ขอบคุณ! จะเปลี่ยนมัน
Kevin Cruijssen

1
คุณสามารถบันทึก 3 ไบต์ใช้{vแทน7Fและแทนy I{Nè
Emigna

@Emigna อ่าแน่นอน .. ขอบคุณ!
Kevin Cruijssen

2

C (gcc) , 110 ไบต์

_[]={0,7,14,21,0,0,22,0,24};f(char*s){for(;*s+1;s++)*s=*s?*s-1?"DDDDGGGBBCCMMPFFHHVVWKJXQZ"[_[*s-2]++]:69:32;}

ลองออนไลน์!

ใช้_อาร์เรย์เป็นดัชนีลงในสตริงคงที่"DDDDGGGBBCCMMPFFHHVVWKJXQZ"แบบไดนามิกโดยมีข้อยกเว้นสำหรับ 0 และ 1

อาร์กิวเมนต์คือ-1อาร์เรย์ของคะแนนที่ถูกแปลงในสถานที่ให้เป็น-1สตริงที่สิ้นสุด




1

เยลลี่ , 34 32 ไบต์

“¿RÇĊƈ⁸⁾%ỵṆþœsṀṂ’ṃØAṣ”A;⁶ẋ€7⁸ịḢ€

ลองออนไลน์!

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

ขอบคุณ @JonathanAllan สำหรับการบันทึก 2 ไบต์!


โดยใช้การคลายการบีบอัดคุณสามารถบันทึก 2 ไบต์
Jonathan Allan

1

Python 3 , 178 142 135 127 112 117 ไบต์

def f(l):
 d=list(map(list,"  _EEEEEEE_DDDDGGG_BBCCMMP_FFHHVVW_K___JX__QZ".split('_')))
 return[d[i].pop()for i in l]

ลองออนไลน์!

-1 ไบต์ขอบคุณ cdlane

ขอบคุณที่ถูกต้องเพื่อ mathmandan


ใน "-> ใน" สำหรับ 111
cdlane

d=list(map(list,"...".split('_')))เพื่อบันทึก byte อื่น
cdlane

ฟังก์ชันนี้fอาจไม่จำเป็นต้องตั้งชื่อดังนั้นคุณสามารถบันทึก 2 ไบต์ อย่างไรก็ตามfกินรายการของdดังนั้นฉันไม่แน่ใจว่ามันเหมาะกับความต้องการฉันทามติที่ว่า "ฟังก์ชั่นจะต้องนำมาใช้ซ้ำโดยพลการโดยไม่ต้อง ... restating ... รหัสอื่น ๆ ที่มาพร้อมกับการส่ง" (ตัวอย่างเช่นการเรียกใช้f([10,0,10,5,8,8,0])มากกว่าหนึ่งครั้งจะส่งผลให้เกิดข้อผิดพลาด) โปรดดูการสนทนาเมตาที่นี่: codegolf.meta.stackexchange.com/a/7615/36885
mathmandan

0

Python 2 , 102 ไบต์ (หรืออาจ 95)

(ใช้ได้ดีสำหรับ Python 3)

lambda a:''.join([r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a))

ลองออนไลน์!

ฉันไม่คิดว่าสิ่งต่อไปนี้จะเป็นที่ยอมรับ:

lambda a:[[r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a)]

['__', 'JX', 'QZ', 'K']รุ่นที่สองนี้จะทำให้การส่งออกเช่น ดังนั้นตัวอักษรจะถูกต้อง แต่พวกเขาจะถูกเก็บรวบรวมโดยค่าจุด (ถ้าสิ่งนี้เป็นที่ยอมรับก็จะประหยัด 7 ไบต์)


0

PHP , 101 ไบต์

$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($argv as$t){echo$c=($d=$b[$t])[0];$b[$t]=substr($d,1).$c;}

ในฐานะโปรแกรมสแตนด์อะโลนอินพุตผ่านบรรทัดรับคำสั่ง:

$ php s.php 10 0 10 5 8 8 0
"Q_ZKJX_"

ลองออนไลน์!

หรือ 112 ไบต์เป็นฟังก์ชัน

function($a){$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($a as$t)$b[$t]=substr($d=$b[$t],1).$c[]=$d[0];return$c;}

ลองออนไลน์!

เอาท์พุต

[10,0,10,5,8,8,0]   "Q_ZKJX_"
[1,1,1,1,1,1,1]     "EEEEEEE"
[1,2,3,4,5,8,0]     "EDBFKJ_"
[2,2,2,2,2,2,2]     "DGDGDGD"


0

Perl 6 , 63 ไบต์

*>>.&{(<_ E DG BCMP FHVW K _ _ JX _ QZ>[$_]x 7).comb[%.{$_}++]}

ลองออนไลน์!

<_ E DG BCMP FHVW K _ _ JX _ QZ> # array indexed on tile value
(<...>[$_] x 7)     # pull letters for this value, repeat 7 times to catch E
          %         # anonymous stateful hash
           .{$_}    # element for this tile value
                ++  # post increment value to move position
       .comb[...]   # characters to array, pull this incrementing index

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

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