ลองทำตาราง!


20

งาน

รับอักขระที่ไม่สามารถพิมพ์ช่องว่างได้หนึ่งตัวสร้างตารางขนาด 3x3 ของอินพุตนั้น ตัวอย่างเช่นถ้าอินพุตเป็น#ดังนั้นเอาต์พุตคือ:

###
# #
###

กฎระเบียบ

  • รูปแบบเอาต์พุตเข้มงวดแม้ว่าจะขึ้นบรรทัดใหม่ต่อท้ายก็ตาม หมายความว่าต้องการช่องว่างตรงกลางและยังต้องใช้อักขระขึ้นบรรทัดใหม่สองตัวเพื่อแยกสามบรรทัด

Testcases

การป้อนข้อมูล: #

เอาท์พุท:

###
# #
###

การป้อนข้อมูล: A

เอาท์พุท:

AAA
A A
AAA

การป้อนข้อมูล: 0

เอาท์พุท:

000
0 0
000

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

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์


2
ความจริงที่ว่าขนาดได้รับการแก้ไขช่วยให้การเพิ่มประสิทธิภาพบางอย่าง คำตอบจากความท้าทายที่เชื่อมโยงอาจไม่สามารถแข่งขันได้ที่นี่ ดังนั้นฉันไม่คิดว่ามันจะซ้ำกัน
Luis Mendo

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

32
@Ayoungcoder มันเป็นเหตุผลที่ถูกต้องสมบูรณ์ในการลงคะแนนความท้าทาย
ข้าวสาลีตัวช่วยสร้าง

2
@Shaggy: ในแง่ของความยากลำบากมีความยากในการเขียนโปรแกรมและความยากลำบากในการเล่นกอล์ฟ โปรแกรมนี้เขียนได้ง่าย แต่ฉันไม่แน่ใจว่ามันง่ายต่อการตีกอล์ฟ

5
ในความคิดของฉันนี่เป็นความท้าทายที่ดีสำหรับผู้ที่เพิ่งเริ่มต้นกับการตีกอล์ฟ มันเป็นการดีที่จะมีความยากลำบากผสมผสานกัน การบรรทุกเกินพิกัดในประเภทใดประเภทหนึ่งจะทำให้ความเสียหายของชุมชนบางส่วน ดังนั้นฉันดีใจที่ความท้าทายนี้ถูกเขียนขึ้น
isaacg

คำตอบ:


30

Charcoal , 5 3 ไบต์

B³S

ลองออนไลน์! แก้ไข: บันทึกแล้ว 40% ขอบคุณ @carusocomputing คำอธิบาย:

B   Draw a box
³   3×3 (second dimension is implicit if omitted)
S   Using the input character

3
ฉันรู้สึกว่านี่เป็นการโกง ... > _>
HyperNeutrino

14
แน่นอนว่าB³Sการโกงอึชีวิตนี้
Magic Octopus Urn

1
ทำไมเรื่องนี้ถึงโกง? @carusocomputing และนีล Anwser ของเขาดูเหมือนขวาให้ฉัน
ลัค H

1
@Ayoungcoder "การโกง" ในขณะที่ "ดูเหมือนว่าราคาถูก" ไม่เหมือนกับใน "การโกงตามตัวอักษร"; รหัสมีในตัวสำหรับ "พิมพ์กล่องขนาด n โดยใช้อักขระ s" รหัสที่สั้นที่สุดสำหรับความท้าทายนี้คือ: 1. อ่านอินพุต 2. กำหนดมิติข้อมูล 3. พิมพ์กล่อง คำตอบของการท้าทายนี้อย่างมีเหตุผลจะไม่ต่ำกว่า 2 ไบต์หากอินพุตมีนัย
Magic Octopus Urn

2
@carusocomputing อาประชด - พฤติกรรมตารางนัยรำคาญฉันในคำตอบของฉันที่จะเห็นภาพขั้นตอนวิธี Euclidean อีกครั้ง
Neil

48

แครอท 11 ไบต์

###
# #
###

ลองออนไลน์!

โปรแกรมอยู่ในโหมดคาเร็ตโดยที่#s ถูกแทนที่ด้วยอินพุต


26
ความรู้สึกเมื่อโปรแกรมที่ดูไม่ถูกต้องสมบูรณ์ในตอนแรกนั้นใช้ได้จริงอย่างสมบูรณ์
Erik the Outgolfer

3
@EriktheOutgolfer เคยได้ยิน Perl ไหม?
NoOne อยู่ที่นี่

19

Python 2 , 32 ไบต์

lambda s:s+s.join(s+'\n \n'+s)+s

ลองออนไลน์!
สำหรับs='a': ตรงกลางs+'\n \n'+sสร้างa\n \naและs.joinเปลี่ยนใน(ตัวหนาs เป็นคนที่เพิ่ม) เพราะยอมรับสตริงเป็น iterable แล้วมันจะล้อมรอบด้วยตัวละครที่ขาดหายไปสองตัวaa\na a\naaa.join.join


สิ่งนี้จะเพิ่มตัวละครลงในบรรทัดกลางได้อย่างไร คุณช่วยอธิบายคำตอบได้มั้ย
Notts90

1
@ Notts90 เพิ่มคำอธิบาย c:
Rod

ขอบคุณฉันไม่ทราบ. จอยสามารถย้ำสตริง
Notts90

ใช้งานได้ใน Python 3 ด้วย BTW ที่ยอดเยี่ยมมาก (เช่นเดียวกันโดยใช้วิธีการเดียวกัน3*c+c.join('\n \n')+3*cกับที่ 32. )
Jonathan Allan

15

MATL , 5 ไบต์

3Y6*c

ลองออนไลน์!

คำอธิบาย

3Y6   % Push predefined literal: [true true true; true false true; true true true]
*     % Implicitly input a character. Multiply element-wise by its code point
c     % Convert to char. Implicitly display. Char 0 is displayed as space

1
มันเร็วมาก! ไม่ได้คาดหวังว่า 5 ไบต์จะมาเร็วขนาดนั้น
Luc H

2
คุณรู้ภาษาภาษารหัส - กอล์ฟ ... ¯ \ _ (ツ) _ / ¯
Luis Mendo

11
แน่นอนเพราะเหตุใดคุณจะไม่มีตัวอักษรที่กำหนดไว้ล่วงหน้าสำหรับ [จริงจริงจริง จริงเท็จจริง จริงจริงจริง]
PunPun1000

11
@ PunPun1000 มันใช้งานได้จริงมาก (พร้อมกับ convolution) เพราะมันเป็นหน้ากากมาตรฐาน8-connection ( Moore neighboorhood )
Luis Mendo

3
@LuisMendo มันยอดเยี่ยมเรียนรู้สิ่งใหม่ ๆ ที่นี่ทุกวันไม่เกี่ยวกับการเล่นกอล์ฟรหัส
PunPun1000

13

05AB1E , 8 ไบต์

4×ð«û3ô»

ลองออนไลน์!

INPUT    # ['R']                 | Implicit Input: 'R'
---------#-----------------------+-------------------------------
4×       # ['RRRR']              | Repeat string 4 times.     
  ð      # ['RRRR',' ']          | Push space onto top of stack.
   «     # ['RRRR ']             | Concatenate last 2 items.
    û    # ['RRRR RRRR']         | Palindromize.
     3ô  # [['RRR','R R','RRR']] | Split into 3 pieces.
       » # ['RRR\nR R\nRRR']     | Join with newlines
---------#-----------------------+-------------------------------
OUTPUT   # RRR                   | Implicitly print the top
         # R R                   | of the stack on exit.
         # RRR                   |

แนวคิดดั้งเดิมโดยใช้ 30 เป็นเลขฐานสอง (ยังไม่เสร็จคนอื่นลองทำในภาษาอื่น):

05AB1E , 12 ไบต์

30bûTIð«‡3ô»

ลองออนไลน์!



11

Python 3.6 , 33 ไบต์

lambda c:f'{3*c}\n{c} {c}\n{3*c}'

ลองออนไลน์!


ไม่มีปัญหา. ดูเหมือนว่าจริงแล้วมันใช้งาน 3.6.1 อยู่ ถ้าคุณลองimport sysแล้วsys.versionในแบบจำลองมันจะคืนค่า 3.6.1 มากกว่า 3.5.2 ไม่มีความคิดว่าทำไมมันบอกว่า 3.5.2 ที่ด้านบนดูเหมือนว่าพวกเขาทำผิดพลาดที่นั่น!
numbermaniac

2
โอ้ฮ่าฮ่ากรณีของ "ไม่เชื่อในสิ่งที่คุณอ่าน" เสมอ - ขอบคุณ!
Jonathan Allan

9

RPL (Reverse Polish Lisp) , 60 ตัวอักษร

→STR 1 4 START DUP NEXT " " + SWAP + 4 ROLLD + + SWAP 2 PICK

(โปรดทราบว่า "→" เป็นอักขระตัวเดียวใน HP48 และเครื่องคำนวณที่เข้ากันได้)

จะแสดงสิ่งที่คุณต้องการด้วยการมีสามรายการในกองซ้อน:

3.: "###"
2.: "# #"
1.: "###"

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

อินพุต (สามารถเป็นอะไรก็ได้ไม่จำเป็นต้องเป็นสตริง) ใส่รหัส ผล

คำอธิบาย:

  • →STR: ทำให้วัตถุสุดท้ายในสแต็กเป็นสตริง (ดังนั้นอินพุตสามารถเป็นอะไรก็ได้เช่นตัวเลข)
  • 1 4: กดหมายเลข1และ4ไปที่สแต็ก
  • START [...] NEXT: ชอบ for for loop แต่ไม่มีการเข้าถึงตัวแปรตัวนับ รับตัวเลขสองตัวจากสแต็ก (ที่นี่เราเพิ่งกด1และ4) และเรียกใช้รหัส[...]ในเวลาที่สอดคล้องกัน (ที่นี่สี่ครั้ง)
  • DUP: ทำซ้ำรายการสุดท้ายในสแต็ก
  • " ": กดสตริง(เช่นสตริงที่มีหนึ่งช่องว่าง) ไปยังสแต็ก
  • +: นำวัตถุสองรายการออกจากสแต็กและส่งคืนเข้าด้วยกันเพื่อหาสตริง: เรียงต่อกัน
  • 4: กดหมายเลข4ไปที่สแต็ก
  • ROLLD: ใช้องค์ประกอบสุดท้าย (ที่นี่: 4ที่เราเพิ่งผลัก) จากสแต็กและม้วนองค์ประกอบถัดไปไกลลงไปในสแต็คตามจำนวนที่เราเพิ่งใช้จากสแต็กระบุ
  • SWAP: สลับองค์ประกอบสแต็กสององค์ประกอบสุดท้าย
  • 2: กด2ไปที่สแต็ก
  • PICK: ใช้องค์ประกอบ (ที่นี่: 2เราเพิ่งผลักไปที่สแต็ค) ตีความมันเป็นตัวเลข n และคัดลอกองค์ประกอบที่ n จากสแต็ก

7

JavaScript ขนาด 28 ไบต์

c=>c+c+c+`
${c} ${c}
`+c+c+c

ลองมัน

f=
c=>c+c+c+`
${c} ${c}
`+c+c+c
o.innerText=f(i.value="#")
i.oninput=_=>o.innerText=f(i.value)
<input id=i maxlength=1><pre id=o>


ฉันคิดว่าคุณอาจจะสามารถบันทึกหนึ่งหรือสองไบต์ได้โดยการเก็บผลลัพธ์c+'\n'+cไว้ชั่วคราว
Neil

ไม่เป็นไรฉันคิดผิดยังคงเป็น 28 ไบต์
Neil

@ Neil: ใช่มีสองตัวเลือกสำหรับกำหนดสิ่งต่าง ๆ ให้กับตัวแปร แต่พวกเขาทั้งหมดมาที่ 28 ไบต์หรือมากกว่า
Shaggy

6

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

1 ไบต์ขอบคุณ Erik the Outgolfer

x4,`Ks3Y

ลองออนไลน์!


ฉันสงสัยว่าจะทำอย่างไร ... ฉันมีx4µ©;⁶;®œs3Yเวลา 12 ไบต์เพราะฉันไม่สามารถหาวิธีที่จะหลีกเลี่ยงการทำซ้ำหลายขั้นตอนกลางของฉัน แต่ดี!
HyperNeutrino

1
คุณจะรู้ว่ามีในตัวสำหรับการทำK j⁶โอ้และมันก็มีความรวดเร็วใน`การเปลี่ยนสีย้อมให้เป็นแบบ Monad โดยใช้อาร์กิวเมนต์เดียวกันทั้งสองด้าน
Erik the Outgolfer

5

Java 7, 56 55 ไบต์

-1 ขอบคุณ Leaky Nun ที่ชี้ให้เห็นพื้นที่ที่ฉันพลาดไป

String a(char s){return"...\n. .\n...".replace('.',s);}

เพียงแทนที่ช่วงเวลาด้วยอักขระที่กำหนดสำหรับอินพุต #:

...       ###
. .  =>   # #
...       ###

ลองออนไลน์!


5

PHP, 32 ไบต์

<?=strtr("000
0 0
000",0,$argn);

ลองออนไลน์!


ค่อนข้างน่าสนใจ<?=$a=$argn,"$a$a\n$a $a\n$a$a$a";(ตัวแบ่งบรรทัดจริงแทน \ n แน่นอน) มีจำนวนไบต์เท่ากันทุกประการ
Christoph

@Christoph ทำให้มันเป็นวิธีการของคุณ ฉันยังไม่ได้ลองทางเลือกนี้
JörgHülsermann

5

sed, 28 18 ไบต์

s:.:&&&\n& &\n&&&:

ลองออนไลน์!


อันใหม่นี้ใช้ไม่ได้ผลอันเก่าแก้ไขได้ แต่คุณลืม: ใน anwser
Luc H

@Ayoungcoder :ขออภัยผิดพลาดวางสุดท้าย คงที่
eush77

ลองแบบออนไลน์ควรเป็น [ลองออนไลน์!]: tio.run/nexus/sed#@19spWelpqYWk6emACLU1Kz@/0/… "sed - TIO Nexus"
Luc H

@Ayoungcoder แน่นอนขอบคุณ
eush77



4

Brain-Flak , 61 , 59 bytes

(((((((({})))<([][][]())>)<(([][][]()){})>)<([]()()())>)))

ลองออนไลน์!

นี่คือ 58 ไบต์ของโค้ด+1ไบต์สำหรับ-cแฟล็กซึ่งเปิดใช้งานอินพุตและเอาต์พุต ASCII

คำอธิบาย:

(((
   (
    (
     (

      #Duplicate the input 3 times
      ((({})))

#Push 10 (newline)
<([][][]())>

     #Push the input again
     )

#Push 32 (space)
<(([][][]()){})>

    #Push the input again
    )

#Push 10 (newline)
<([]()()())>)

#Push input 3 times
)))



3

อ็อกเทฟ 36 ไบต์

x=repmat(input(0),3);x(5)=32;disp(x)

ลองออนไลน์!

คำอธิบาย

สิ่งนี้จะสร้างเมทริกซ์ถ่าน 3x3 โดยป้อนอินพุตถ่านซ้ำและตั้งค่ารายการที่ 5 ในลำดับหลักของคอลัมน์ (เช่นศูนย์กลาง) เป็น32(ASCII สำหรับพื้นที่)



3

Ruby , 27 25 ไบต์

บันทึก 2 ไบต์ขอบคุณ Level River St

->x{[s=x*3,x+" "+x,s]*$/}

ลองออนไลน์!


เมื่อคุณทำเบราว์เซอร์เช่นนี้โปรดรวมส่วนท้ายเป็นรหัสเพราะมันใช้งานไม่ได้
Luc H

@Ayoungcoder นี่เป็นฟังก์ชั่นที่ไม่ระบุตัวตน คุณสามารถกำหนดให้ตัวแปร ( f=...) แล้วเรียกมันด้วยf.call(...)
Cyoce

1
คุณสามารถใช้การขึ้นบรรทัดใหม่ตามตัวอักษรในเครื่องหมายคำพูดแทน"\n"การบันทึก 1 ไบต์ ใช้งานได้ดียิ่งขึ้น$/ซึ่งเป็นตัวแปรพิเศษที่ตั้งค่าเป็นบรรทัดใหม่ตามค่าเริ่มต้น - ประหยัด 2 ไบต์
ระดับ River St

1 ไบต์น้อยกว่าtrโซลูชัน การทำงานที่ดี
Cyoce

3

Brainfuck, 40 ไบต์

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

ลองออนไลน์! ต้องมีการนำไปใช้งานที่สามารถเข้าถึงด้านซ้ายของตำแหน่งเริ่มต้น

ดูเพิ่มเติมที่: คำตอบในสมองของ Gravitonซึ่งใช้แนวทางที่แตกต่างกัน (แต่จะยาวกว่า)


คำอธิบาย:

Brainfuck สามารถเล่นเล่ห์กลมากมายด้วยชุดคำสั่งที่ จำกัด น่าเสียดายที่คำตอบนี้ไม่ได้ใช้สิ่งใดเลยเพราะมันถูกกว่า

+++++[->++<<++++++>]                         Sets the cells to |5*6|>0<|5*2|
,                   Takes input character into the middle cell | 30|>#<| 10|
...                                Print the top of the square | 30|>#<| 10| ###
>.                                   Print a newline character | 30| # |>10|    \n
<.                               Print another input character | 30|>#<| 10| #
<++.                  Add 30+2 for a space character and print |>32| # | 10|  _
>.                   And just print the 5 remaining characters | 32|>#<| 10|   #
>.                                                             | 32| # |>10|    \n
<...                                                           | 32|>#<| 10| ###

# = อักขระอินพุต, _ = ช่องว่าง (ASCII 32), \ n = บรรทัดใหม่ (ASCII 10)


ผลลัพธ์ในกล่องสวยงามนี้ (สำหรับอินพุต '+'):

+++
+ +
+++

3

05AB1E , 7 6 ไบต์

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

ж¹ðJû

คำอธิบาย:

         # Implicit input                  # ['R']
 Ð       # Repeat string three times       # ['R', 'R', 'R']
  ¶      # Push newline character          # ['R', 'R', 'R', '\n']
   ¹     # Push first input                # ['R', 'R', 'R', '\n', 'R']
    ð    # Push space                      # ['R', 'R', 'R', '\n', 'R', ' ']
     J   # Join stack                      # ['RRR\nR ']
      û  # Palindromize ("abc" -> "abcba") # ['RRR\nR R\nRRR']
         # Implicit output                 # []

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


Oooo ... สมาร์ทฉันไม่เคยคิดเลยว่า palindromize จะทำงานอย่างไรในการขึ้นบรรทัดใหม่
Magic Octopus Urn

ж¹ðJû6 ไบต์
Magic Octopus Urn



2

Swift3, 50 ไบต์

[1,2,3].map{$0==2 ? print(c+" "+c) : print(c+c+c)}

สิ่งนี้ใช้ผู้ประกอบการที่สามในการพิมพ์สตริงที่แตกต่างกันขึ้นอยู่กับแถว

ลองออนไลน์



2

C #, 50 ไบต์

a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);

กรณีทดสอบ:

var f = new Action<string>(
a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);
);
f("#");

คุณต้องมีคุณสมบัติครบถ้วนConsoleเช่นSystem.Console..
TheLethalCoder

2

เป็นกลุ่ม 9 การกดแป้น

สมมติว่าอินพุตถ่านมีอยู่ในบัฟเฟอร์, vim ทำให้สิ่งนี้ตรงไปตรงมา

x3pY2plr<space>

อาจมีคำสั่งการใช้งาน Magic vim ที่นี่ (ดูเหมือนจะมีอยู่เสมอ) ดังนั้นคำแนะนำในการปรับปรุงยินดีต้อนรับ การกดแป้นเพียงปุ่มเดียวด้านหลัง V!


ฉันค่อนข้างแน่ใจว่านี่สั้นที่สุดเท่าที่จะทำได้ คำตอบที่ดี!
DJMcMayhem

2

แอสเซมบลี Z80 หรือ 8080 รหัสเครื่อง 21 ไบต์

สมมติว่าหน่วยความจำที่แมปอุปกรณ์ I / O:

              Z80 8080
3A xx xx ld a, (อินพุต) อินพุต lda; รับตัวอักษร
11 0A 20 ld de, 200ah lxi d, 200ah; พื้นที่ & ขึ้นบรรทัดใหม่
21 yy yy ld hl, เอาท์พุท lxi h, เอาท์พุท; รับที่อยู่เอาท์พุท
77 ld (hl), mov m, a; อักขระเอาท์พุท * 3
77 ld (hl), mov m, a
77 ld (hl), mov m, a
73 ld (hl), e mov m, e; ขึ้นบรรทัดใหม่
77 ld (hl), mov m, a; ตัวละครออก
72 ld (hl), d mov m, d; พื้นที่ส่งออก
77 ld (hl), mov m, a; ตัวละครออก
73 ld (hl), e mov m, e; ขึ้นบรรทัดใหม่
77 ld (hl), mov m, a; อักขระเอาท์พุท * 3
77 ld (hl), mov m, a
77 ld (hl), mov m, a
76 halt hlt; หรือ C9 ret

ไม่จำเป็นต้องใช้ล่าม!

hexdump:

0000: 3A 00 FF 11 0A 20 21 01 FF 77 77 77 73 77 72 77
0010: 73 77 77 77 76

โดยที่ที่อยู่อินพุตอยู่ที่ FF00h และที่อยู่ของผลลัพธ์จะถูกแมปที่ FF01h ที่อยู่ที่แท้จริงจะขึ้นอยู่กับฮาร์ดแวร์ที่แท้จริง ของหลักสูตรนี้ถือว่า I / O คือหน่วยความจำที่แมป ถ้ามันถูกแมป I / O มันจะใช้เวลาหลายไบต์พิเศษเพราะคำแนะนำ Z80 & 8080 I / O เป็นสองไบต์ต่อกัน สิ่งนี้ยังถือว่าอุปกรณ์เอาต์พุตตีความ 0Ah เป็นบรรทัดใหม่และไม่จำเป็นต้องมี CR (0Dh) ซึ่งจะเพิ่ม 4 ไบต์พิเศษให้กับโปรแกรม


ยินดีต้อนรับสู่ Codegolf.stackexchange ในขณะที่ดูเหมือนว่าคุณมีทุกสิ่งภายใต้การควบคุมโปรดอ่านศูนย์ช่วยเหลือและรายการคำถาม โพสต์แรกที่ดี
Rohan Jhunjhunwala

คุณสามารถให้เลขฐานสิบหกของรหัสของคุณได้หรือไม่?
CalculatorFeline

ไบต์ฐานสิบหกอยู่ในคอลัมน์แรก แต่ถ้าคุณต้องการ hexdump "บริสุทธิ์" ฉันได้เพิ่มเข้าไปแล้ว
Dan Howell

2

J-uby , 22 20 ไบต์

-2 ไบต์ขอบคุณ@Jordan

:tr&"...
. .
..."&?.

คำอธิบาย

String#trเป็นวิธีการแทนที่ตัวอักษรของรูบี้ การ&เชื่อมโยงแรก:trกับ"...\n. .\n..."และที่สองนำ'.'ไปใช้บางส่วนกับมัน อย่างมีประสิทธิภาพนี่คือ->s{"...\n. .\n...".tr('.',s)}


จะ:trทำงานเช่นเดียวกับ:gsubที่นี่?
จอร์แดน

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