ทำให้มันระเบิด!


33

ใช้เมทริกซ์ของจำนวนเต็มบวกเป็นอินพุตและทำให้มันระเบิด!


วิธีที่คุณระเบิดเมทริกซ์คือการเพิ่มค่าศูนย์รอบ ๆ ทุกองค์ประกอบรวมถึงเส้นขอบภายนอก

รูปแบบอินพุต / เอาต์พุตเป็นตัวเลือกเช่นเคย!

กรณีทดสอบ:

1
-----
0 0 0
0 1 0
0 0 0
--------------

1 4
5 2
-----
0 0 0 0 0
0 1 0 4 0
0 0 0 0 0
0 5 0 2 0
0 0 0 0 0
--------------

1 4 7
-----
0 0 0 0 0 0 0
0 1 0 4 0 7 0
0 0 0 0 0 0 0
--------------

6
4
2
-----
0 0 0
0 6 0
0 0 0
0 4 0
0 0 0
0 2 0
0 0 0

คำตอบ:


59

ภาษาสคริปต์การทำงานของ Flashpointขนาด 182 ไบต์

f={t=_this;c=count(t select 0);e=[0];i=0;while{i<c*2}do{e=e+[0];i=i+1};m=[e];i=0;while{i<count t}do{r=+e;j=0;while{j<c}do{r set[j*2+1,(t select i)select j];j=j+1};m=m+[r,e];i=i+1};m}

Ungolfed:

f=
{
  // _this is the input matrix. Let's give it a shorter name to save bytes.
  t = _this;
  c = count (t select 0);

  // Create a row of c*2+1 zeros, where c is the number of columns in the
  // original matrix.
  e = [0];
  i = 0;
  while {i < c*2} do
  {
    e = e + [0];
    i = i + 1
  };

  m = [e]; // The exploded matrix, which starts with a row of zeros.
  i = 0;
  while {i < count t} do
  {
    // Make a copy of the row of zeros, and add to its every other column 
    // the values from the corresponding row of the original matrix.
    r = +e;
    j = 0;
    while {j < c} do
    {
      r set [j*2+1, (t select i) select j];
      j = j + 1
    };

    // Add the new row and a row of zeroes to the exploded matrix.
    m = m + [r, e];
    i = i + 1
  };

  // The last expression is returned.
  m
}

โทรด้วย:

hint format["%1\n\n%2\n\n%3\n\n%4",
    [[1]] call f,
    [[1, 4], [5, 2]] call f,
    [[1, 4, 7]] call f,
    [[6],[4],[2]] call f];

เอาท์พุท:

ด้วยจิตวิญญาณแห่งความท้าทาย:


6
ไม่ทราบ; ชาย; หนึ่งพัน.
MooseBoys

2
ตอนนี้ฉันสับสน
Grajdeanu Alex

@MrGrj คำสั่งทำให้บางสิ่งบางอย่างระเบิดอย่างแท้จริง

1
+1 สำหรับ GIF ที่สอง " ในจิตวิญญาณของความท้าทาย "! :)
Kevin Cruijssen

10

เจลลี่ ,  12  11 ไบต์

-1 ไบต์ด้วย Erik the Outgolfer (ไม่จำเป็นต้องใช้อาร์กิวเมนต์ที่สลับกันสำหรับการเข้าร่วม)

j00,0jµ€Z$⁺

ลองออนไลน์! หรือดูชุดทดสอบ

ลิงค์ monadic ยอมรับและส่งคืนรายการ

อย่างไร?

j00,0jµ€Z$⁺ - Link: list of lists, m
          ⁺ - perform the link to the left twice in succession:
         $  -   last two links as a monad
      µ€    -     perform the chain to the left for €ach row in the current matrix:
j0          -       join with zeros                [a,b,...,z] -> [a,0,b,0,...,0,z]
  0,0       -       zero paired with zero = [0,0]
     j      -       join                     [a,0,b,0,...,0,z] -> [0,a,0,b,0,...,0,z,0]
        Z   -     and then transpose the resulting matrix

คุณสามารถบันทึกไบต์:j00,0jµ€Z$⁺
Erik the Outgolfer

โอ้แน่นอนขอบคุณ!
Jonathan Allan


6

MATLขนาด 12 ไบต์

FTXdX*0JQt&(

อินพุตเป็นเมทริกซ์ที่มี;ตัวคั่นแถว

ลองออนไลน์!

คำอธิบาย

FT     % Push [0 1]
Xd     % Matrix with that diagonal: gives [0 0; 0 1]
X*     % Implicit input. Kronecker product
0      % Push 0
JQt    % Push 1+j (interpreted as "end+1" index) twice
&(     % Write a 0 at (end+1, end+1), extending the matrix. Implicit display

5

Japt , 18 ไบต์

Ov"y ®î íZ c p0Ã"²

ทดสอบออนไลน์! (ใช้-Qแฟล็กเพื่อให้เอาต์พุตง่ายต่อการเข้าใจ)

คล้ายกับคำตอบของเยลลี่ แต่มีความยาวทั้งหมด ...

คำอธิบาย

ส่วนด้านนอกของรหัสเป็นเพียงวิธีแก้ปัญหาเพื่อจำลองของเยลลี่:

  "             "²   Repeat this string twice.
Ov                   Evaluate it as Japt.

รหัสตัวเองคือ:

y ®   î íZ c p0Ã
y mZ{Zî íZ c p0}   Ungolfed
y                  Transpose rows and columns.
  mZ{          }   Map each row Z by this function:
     Zî              Fill Z with (no argument = zeroes).
        íZ           Pair each item in the result with the corresponding item in Z.
           c         Flatten into a single array.
             p0      Append another 0.

ทำซ้ำสองครั้งกระบวนการนี้ให้ผลลัพธ์ที่ต้องการ ผลลัพธ์ถูกพิมพ์โดยปริยาย


5

Huskขนาด 12 ไบต์

₁₁
Tm»o:0:;0

รับและส่งกลับอาร์เรย์จำนวนเต็ม 2D ลองออนไลน์!

คำอธิบาย

แนวคิดเดียวกันกับคำตอบอื่น ๆ อีกมากมาย: เพิ่มเลขศูนย์ลงในแต่ละแถว การดำเนินการแถวถูกนำมาใช้ด้วยการพับ

₁₁         Main function: apply first helper function twice
Tm»o:0:;0  First helper function.
 m         Map over rows:
  »         Fold over row:
   o         Composition of
      :       prepend new value and
    :0        prepend zero,
       ;0    starting from [0].
            This inserts 0s between and around elements.
T          Then transpose.

5

Mathematica ขนาด 39 ไบต์

r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r

ลองที่กล่อง Wolfram! เรียกมันว่า " r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r@{{1,2},{3,4}}"

เช่นเดียวกับคำตอบอื่น ๆ อีกมากมายงานนี้ทำโดยการแปลงค่าและศูนย์ riffling ในแต่ละแถวจากนั้นทำสิ่งเดียวกันอีกครั้ง ได้รับแรงบันดาลใจจากคำตอบของ Jonathan Allan Jellyโดยเฉพาะ แต่เพราะฉันบังเอิญเห็นคำตอบนั้นก่อน


4

Dyalog APL ขนาด 24 ไบต์

บันทึก 4 ไบต์ด้วย @ZacharyT

บันทึก 5 ไบต์ด้วย @KritixiLithos

{{⍵↑⍨-1+⍴⍵}⊃⍪/,/2 2∘↑¨⍵}

ลองออนไลน์!


คุณไม่จำเป็นต้องมี parens อยู่1,1,⍴⍵ใช่ไหม?
Zacharý

ฉันได้รับสิ่งนี้: {{⍵↑⍨-1 1+⍴⍵}⊃⍪/,/2 2∘↑¨⍵}เมื่อวันที่ 26
Kritixi Lithos

@KritixiLithos ใช้งานได้ดี1 1+!
Uriel

อาร์เรย์ของ APL ที่มุ่งเน้นจะ1+ทำงานอย่างไร
Zacharý

@ZacharyT ฉันเพิ่งตระหนักว่าหลังจากที่ได้เห็นคำตอบของคุณ ...
Kritixi Lithos


3

Python 3 , 104 101 97 93 86 ไบต์

  • @ Zachary T บันทึก 3 ไบต์: wลบตัวแปรที่ไม่ได้ใช้ออกแล้วและหนึ่งพื้นที่ที่ไม่ต้องการ
  • @ Zachary T บันทึกอีก 4 ไบต์: [a,b]เช่นเดียวกับa,bที่ผนวกเข้ากับรายการ
  • @ ไม่บันทึก 4 ไบต์: การใช้การแบ่งส่วน
  • @ Zachary T และ @ovs ช่วยประหยัด 7 ไบต์: บีบข้อความในวนรอบ
def f(a):
 m=[(2*len(a[0])+1)*[0]]
 for i in a:r=m[0][:];r[1::2]=i;m+=r,m[0]
 return m

ลองออนไลน์!


1
คุณสามารถลบwและบันทึก 2 ไบต์: repl.it/JBPE
Zacharý

1
โอ้คุณมีพื้นที่ว่างที่ไม่จำเป็นหลังเส้นm+=[r,w]
Zacharý

1
นอกจากนี้คุณสามารถบันทึก 4 ไบต์โดยการเปลี่ยน[j,0]ไปj,0และ[r,m[0]เพื่อr,m[0]?
Zacharý

1
คุณสามารถบันทึก 4 ไบต์อื่น ๆ โดยใช้ตัวแบ่งส่วนข้อมูล
nore

1
คุณสามารถบันทึกสามไบต์โดยแปลงเป็น python2 และเปลี่ยนการforเยื้องวนเป็นแท็บเดียว
Zacharý

3

Python 3, 118 ไบต์

def a(b):
    z='00'*len(b[0])+'0'
    r=z+'\n'
    for c in b:
        e='0'
        for d in c:e+=str(d)+'0'
        r+=e+'\n'+z+'\n'
    return r

เล่นกอล์ฟเป็นครั้งแรก! ไม่ใช่สิ่งที่ดีที่สุด แต่ฉันค่อนข้างภูมิใจถ้าฉันสามารถพูดได้เช่นนั้น!

  • -17 ไบต์จากความคิดเห็นของ Wheat
  • -4 ไบต์จากการขีดเส้นที่สองสำหรับการวนซ้ำ

สวัสดีและยินดีต้อนรับสู่เว็บไซต์ ดูเหมือนว่าคุณจะมีพื้นที่ว่างที่นี่ ตัวอย่างเช่นบางส่วนของคุณ+=และ=ถูกล้อมรอบด้วยช่องว่างซึ่งสามารถลบออกได้ นอกจากนี้การทำ+=สองครั้งในแถวสามารถทำให้ง่ายขึ้นในคำสั่งเดียวตัวอย่างเช่นe+=str(d)+'0'
Wheat Wizard

@Weateatizard: ขอบคุณและขอบคุณ บันทึก 17 ไบต์ :)
Liren

ตอนนี้ฉันสังเกตเห็นว่าคุณสามารถยุบforวงในของคุณลงในบรรทัดเดียวfor d in c:e+=str(d)+'0'แต่คุณอาจต้องการไปกับแผนที่เข้าร่วม (str, d)) + '0' , in which case it becomes pointless to define e`
ข้าวสาลีตัวช่วยสร้าง

1
แค่คิดเองว่า! อืมฉันจะต้องเรียนรู้ว่า. join และ map () คืออะไรครั้งแรกที่ฉันเดา ฉันจะกลับมา!
Liren

1
คุณสามารถใส่คำจำกัดความของzและrในบรรทัดเดียวกัน (ด้วย;ระหว่างพวกเขา), บันทึกไบต์ของการเยื้อง
nore

3

R, 65 ไบต์

ขอบคุณ Jarko Dubbeldam และ Giuseppe สำหรับความคิดเห็นที่มีค่ามาก!

รหัส

f=function(x){a=dim(x);y=array(0,2*a+1);y[2*1:a[1],2*1:a[2]]=x;y}

อินพุตสำหรับฟังก์ชั่นจะต้องเป็นเมทริกซ์หรืออาเรย์สองมิติ

ทดสอบ

f(matrix(1))
f(matrix(c(1,5,4,2),2))
f(matrix(c(1,4,7),1))
f(matrix(c(6,4,2)))

เอาท์พุต

> f(matrix(1))
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    1    0
[3,]    0    0    0
> f(matrix(c(1,5,4,2),2))
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    1    0    4    0
[3,]    0    0    0    0    0
[4,]    0    5    0    2    0
[5,]    0    0    0    0    0
> f(matrix(c(1,4,7),1))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    0    0    0    0    0    0
[2,]    0    1    0    4    0    7    0
[3,]    0    0    0    0    0    0    0
> f(matrix(c(6,4,2)))
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    6    0
[3,]    0    0    0
[4,]    0    4    0
[5,]    0    0    0
[6,]    0    2    0
[7,]    0    0    0

ฉันคิดว่าใช้a=dim(x)*2+1แทนnrowและncolจะดีกว่า จากนั้นคุณสามารถทำและy=matrix(0);dim(y)=a 2*1:a[1],2*1:a[2]
JAD

1
จริงๆแล้วy=array(0,a)จะสั้นกว่านี้
JAD

1
ฉันเชื่อว่าคุณสามารถลบวงเล็บรอบดัชนีได้เช่น2*1:a[1]เนื่องจาก:มีลำดับความสำคัญสูงกว่า*
Giuseppe


2

PHP , 98 ไบต์

อินพุตเป็นอาร์เรย์ 2 มิติเอาต์พุตเป็นสตริง

<?foreach($_GET as$v)echo$r=str_pad(0,(count($v)*2+1)*2-1," 0"),"
0 ".join(" 0 ",$v)." 0
";echo$r;

ลองออนไลน์!

PHP , 116 ไบต์

อินพุตและเอาต์พุตเป็นอาร์เรย์ 2 มิติ

<?foreach($_GET as$v){$r[]=array_fill(0,count($v)*2+1,0);$r[]=str_split("0".join(0,$v)."0");}$r[]=$r[0];print_r($r);

ลองออนไลน์!


2

Clojure, 91 ไบต์

#(for[h[(/ 2)]i(range(- h)(count %)h)](for[j(range(- h)(count(% 0))h)](get(get % i[])j 0)))

ทำซ้ำช่วงในครึ่งขั้นตอน



2

Python 2 , 64 ไบต์

lambda l:map(g,*map(g,*l))
g=lambda*l:sum([[x,0]for x in l],[0])

ลองออนไลน์!

ฟังก์ชั่นgแทรกอินพุตระหว่างศูนย์ ฟังก์ชั่นหลักสลับอินพุตขณะที่ใช้gจากนั้นทำอีกครั้ง อาจมีวิธีหลีกเลี่ยงการซ้ำซ้อนในฟังก์ชั่นหลัก


2

JavaScript (ES6), 73 72 ไบต์

a=>(g=a=>(r=[b],a.map(v=>r.push(v,b)),b=0,r))(a,b=a[0].map(_=>0)).map(g)

จัดรูปแบบและแสดงความคิดเห็น

การใส่เลขศูนย์ในแนวนอนและแนวตั้งนั้นคล้ายกันมาก แนวคิดที่นี่คือการใช้ฟังก์ชั่นเดียวกันg ()สำหรับทั้งสองขั้นตอน

a =>                            // a = input array
  (g = a =>                     // g = function that takes an array 'a',
    (                           //     builds a new array 'r' where
      r = [b],                  //     'b' is inserted at the beginning
      a.map(v => r.push(v, b)), //     and every two positions,
      b = 0,                    //     sets b = 0 for the next calls
      r                         //     and returns this new array
  ))(a, b = a[0].map(_ => 0))   // we first call 'g' on 'a' with b = row of zeros
  .map(g)                       // we then call 'g' on each row of the new array with b = 0

กรณีทดสอบ


2

ถ่าน , 49 ไบต์

A⪪θ;αA””βF⁺¹×²L§α⁰A⁺β⁰βA⁺β¶βFα«βA0δFιA⁺δ⁺κ⁰δ⁺䶻β

ลองออนไลน์!

อินพุตเป็นสตริงเดี่ยวที่แยกแถวด้วยเครื่องหมายอัฒภาค


1
Modern Charcoal สามารถทำได้ใน 24 ไบต์≔E⪪θ;⪫00⪫ι0θFθ⟦⭆ι0ι⟧⭆⊟θ0แต่แม้จะหลีกเลี่ยง StringMap ฉันยังคงคิดว่าสามารถทำได้ใน 27 ไบต์
Neil

โอ้และเคล็ดลับทั่วไปสองสามข้อ: มีตัวแปรที่กำหนดไว้ล่วงหน้าสำหรับสตริงว่างและคุณสามารถสร้างสตริงศูนย์ที่มีความยาวที่กำหนดโดยใช้ Times หรือ Mold
Neil

2

โมดูล C ++ 17 +, 192 ไบต์

อินพุตเป็นแถวของสตริงจากcin , เอาต์พุตไปยังcout

import std.core;int main(){using namespace std;int i;auto&x=cout;string s;while(getline(cin,s)){for(int j=i=s.length()*2+1;j--;)x<<0;x<<'\n';for(auto c:s)x<<'0'<<c;x<<"0\n";}for(;i--;)x<<'0';}

2

C # , 146 ไบต์


ข้อมูล

  • อินพุต Int32[,] mเมทริกซ์ที่จะระเบิด
  • เอาท์พุท Int32[,]เมทริกซ์ที่ระเบิด

แข็งแรงเล่นกอล์ฟ

(int[,] m)=>{int X=m.GetLength(0),Y=m.GetLength(1),x,y;var n=new int[X*2+1,Y*2+1];for(x=0;x<X;x++)for(y=0;y<Y;y++)n[x*2+1,y*2+1]=m[x,y];return n;}

Ungolfed

( int[,] m ) => {
    int
        X = m.GetLength( 0 ),
        Y = m.GetLength( 1 ),
        x, y;

    var
        n = new int[ X * 2 + 1, Y * 2 + 1 ];

    for( x = 0; x < X; x++ )
        for( y = 0; y < Y; y++ )
            n[ x * 2 + 1, y * 2 + 1 ] = m[ x, y ];

    return n;
}

อ่านได้ไม่ดี

// Takes an matrix of Int32 objects
( int[,] m ) => {
    // To lessen the byte count, store the matrix size
    int
        X = m.GetLength( 0 ),
        Y = m.GetLength( 1 ),
        x, y;

    // Create the new matrix, with the new size
    var
        n = new int[ X * 2 + 1, Y * 2 + 1 ];

    // Cycle through the matrix, and fill the spots
    for( x = 0; x < X; x++ )
        for( y = 0; y < Y; y++ )
            n[ x * 2 + 1, y * 2 + 1 ] = m[ x, y ];

    // Return the exploded matrix
    return n;
}

รหัสเต็ม

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<Int32[,], Int32[,]> f = ( int[,] m ) => {
            int
                X = m.GetLength( 0 ),
                Y = m.GetLength( 1 ),
                x, y,

                a = X * 2 + 1,
                b = Y * 2 + 1;

            var
                n = new int[ a, b ];

            for( x = 0; x < X; x++ )
                for( y = 0; y < Y; y++ )
                    n[ a, b ] = m[ x, y ];

            return n;
        };

        public static Int32[,] Run( Int32[,] matrix ) {
            Int32[,]
                result = f( matrix );

            Console.WriteLine( "Input" );
            PrintMatrix( matrix );

            Console.WriteLine( "Output" );
            PrintMatrix( result );

            Console.WriteLine("\n\n");

            return result;
        }

        public static void RunTests() {
            Run( new int[,] { { 1 } } );
            Run( new int[,] { { 1, 3, 5 } } );
            Run( new int[,] { { 1 }, { 3 }, { 5 } } );
            Run( new int[,] { { 1, 3, 5 }, { 1, 3, 5 }, { 1, 3, 5 } } );
        }

        static void Main( string[] args ) {
            RunTests();

            Console.ReadLine();
        }

        public static void PrintMatrix<TSource>( TSource[,] array ) {
            PrintMatrix( array, o => o.ToString() );
        }
        public static void PrintMatrix<TSource>( TSource[,] array, Func<TSource, String> valueFetcher ) {
            List<String>
                output = new List<String>();

            for( Int32 xIndex = 0; xIndex < array.GetLength( 0 ); xIndex++ ) {
                List<String>
                    inner = new List<String>();

                for( Int32 yIndex = 0; yIndex < array.GetLength( 1 ); yIndex++ ) {
                    inner.Add( valueFetcher( array[ xIndex, yIndex ] ) );
                }

                output.Add( $"[ {String.Join( ", ", inner )} ]" );
            }

            Console.WriteLine( $"[\n   {String.Join( ",\n   ", output )}\n]" );
        }
    }
}

ข่าว

  • v1.0 - 146 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ

  • ไม่มี

คุณไม่จำเป็นต้องใช้(int[,] m)=>ก็m=>เพียงพอแล้วหากคุณระบุmว่าเป็น int-array 2 มิติในคำตอบของคุณ นอกจากนี้คุณยังสามารถเปลี่ยน,x,ไป,x=0,และได้รับการกำจัดของx=0ในการเริ่มต้นสำหรับห่วงสำหรับ -1 ไบต์ และคุณสามารถลบy++จากภายในวงโดยการเปลี่ยน=m[x,y];ไป=m[x,y++];สำหรับเพิ่มเติม -1 ไบต์ แต่ +1 จากฉันและถ้าฉันสร้างพอร์ตคำตอบของคุณก็จะสั้นกว่าคำตอบ Java ปัจจุบันของฉัน :)
Kevin Cruijssen

1

Dyalog APL ขนาด 24 ไบต์

{{⍵↑⍨¯1-⍴⍵}⊃⍪/,/2 2∘↑¨⍵}

การปรับปรุงใด ๆ ยินดีต้อนรับและต้องการ!






1

APL (Dyalog) 22 ไบต์

พรอมต์สำหรับเมทริกซ์ส่งคืนเมทริกซ์ที่ล้อมรอบ

{⍺⍀⍵\a}/⍴∘0 1¨1+2×⍴a←⎕

ลองออนไลน์!

a←⎕ ความพร้อมในการเมทริกซ์และกำหนดที่จะ

 ขนาดของ(แถวคอลัมน์)

 คูณด้วยสอง

1+ เพิ่มหนึ่ง

⍴∘0 1¨ ใช้แต่ละเพื่อr eshape (cyclically) ตัวเลขเป็นศูนย์และหนึ่ง

{}/ ลดโดยการใส่ฟังก์ชั่นนิรนามต่อไปนี้ระหว่างตัวเลขสองตัว:

⍵\a ขยาย * คอลัมน์ของaตามอาร์กิวเมนต์ที่ถูกต้อง

⍺⍀a ขยาย * แถวของแถวนั้นตามอาร์กิวเมนต์ด้านซ้าย

* 0 แทรกคอลัมน์ / แถวของค่าศูนย์ 1 แทรกคอลัมน์ข้อมูล / แถวเดิม


1

Java 8, 183 166 162 129 ไบต์

m->{int a=m.length,b=m[0].length,x=0,y,r[][]=new int[a*2+1][b*2+1];for(;x<a;x++)for(y=0;y<b;r[x*2+1][y*2+1]=m[x][y++]);return r;}

input และ output int[][]เป็น

-33 ไบต์โดยการสร้างพอร์ตของ@auhmaan 's C # คำตอบ

คำอธิบาย:

ลองที่นี่

m->{                                // Method with 2D integer-array as parameter and return-type
  int a=m.length,                   //  Current height
      b=m[0].length,                //  Current width
      x=0,y,                        //  Two temp integers
      r[][]=new int[a*2+1][b*2+1];  //  New 2D integer-array with correct size
  for(;x<a;x++)                     //  Loop (1) over the height
    for(y=0;y<b;                    //   Inner loop (2) over the width
      r[x*2+1][y*2+1]=m[x][y++]     //    Fill the new array with the input digits
    );                              //   End of inner loop (2)
                                    //  End of loop (1) (implicit / single-line body)
  return r;                         //  Return result 2D integer-array
}                                   // End of method


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