ตัวคูณร่วมน้อย


31

ตัวคูณร่วมน้อยชุดของจำนวนเต็มบวกAเป็นจำนวนเต็ม postive เล็กที่สุดBเช่นว่าสำหรับแต่ละkในAมีอยู่ในเชิงบวกจำนวนเต็มดังกล่าวว่าnk*n = B

รับค่าเป็นจำนวนเต็มบวกอย่างน้อยสองค่าเป็นอินพุต

กฎระเบียบ

  • อนุญาตให้สร้างบิลด์ แต่ถ้าโซลูชันของคุณใช้คุณควรสนับสนุนให้รวมโซลูชันสำรองที่ไม่ใช้ GCD / LCM ในตัว อย่างไรก็ตามโซลูชันสำรองจะไม่นับรวมกับคะแนนของคุณเลยดังนั้นจึงเป็นตัวเลือกทั้งหมด
  • อินพุตและเอาต์พุตทั้งหมดจะอยู่ในช่วงที่สามารถจำแนกได้สำหรับภาษาของคุณ หากภาษาของคุณมีความสามารถตามจำนวนเต็มขนาดใหญ่โดยพลการโซลูชันของคุณจะต้องทำงานกับอินพุตและเอาต์พุตขนาดใหญ่โดยพลการ

กรณีทดสอบ

[7, 2] -> 14
[8, 1] -> 8
[6, 4, 8] -> 24
[8, 2, 1, 10] -> 40
[9, 6, 2, 1, 5] -> 90
[5, 5, 7, 1, 1] -> 35
[4, 13, 8, 8, 11, 1] -> 1144
[7, 2, 2, 11, 11, 8, 5] -> 3080
[1, 6, 10, 3, 4, 10, 7] -> 420
[5, 2, 9, 10, 3, 4, 4, 4, 7] -> 1260
[9, 7, 10, 9, 7, 8, 5, 10, 1] -> 2520

6
เพราะมันเป็นความเข้าใจผิดที่มีเหตุผลบ่อยครั้ง: สูตร LCM (a, b) = ab / GCD (a, b) ไม่ได้ขยายเกินสองตัวเลข (หรือสำหรับเรื่องนั้นเป็นหนึ่งในตัวเลข!)
Greg Martin

คำตอบ:


4

ที่จริงแล้ว12 1 ไบต์

คำแนะนำเกี่ยวกับการเล่นกอล์ฟยังคงมีอยู่แม้ว่าฉันไม่แน่ใจว่าจะปรับปรุง LCM ที่มีอยู่ภายในได้อย่างไร ลองออนไลน์!

รุ่น 12 ไบต์ที่ไม่มีในตัว ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

╗2`╜@♀%ΣY`╓N

Ungolfing

          Implicit input array.
╗         Save array in register 0.
2`...`╓   Starting with f(0), find the first (two) x where f(x) returns a truthy value.
          These two values will be 0 and our LCM.
  ╜         Push array from register 0.
  @         Swap the top two values. Stack: x, array
  ♀%        Map % over x and array, returning (x % item) for each item in array.
  ΣY        If the sum of all the modulos equals 0, x is either 0 or our LCM.

N         Push the last (second) value of our results. This is our LCM.
          Implicit return.

คุณรู้หรือไม่ว่าคุณได้รับอนุญาตให้ใช้ builtin ใช่ไหม?
Mego

1
@ ฉันจะเพิ่มเข้าไปในนี้ แต่ความเข้าใจของฉันคือว่าบิลด์อินหมดกำลังใจดังนั้นฉันจึงไม่ได้ใช้มันในตอนแรก
Sherlock9

1
อนุญาตให้สร้างเครื่องได้ พวกเขาไม่ได้ท้อแท้เลย - ฉันแค่อยากจะสนับสนุนวิธีแก้ปัญหาที่ไม่ได้รวมอยู่ด้วยเพราะพวกเขามักจะน่าสนใจกว่าตัวในตัว
Mego

1
ผมอ่านที่เป็นจริง 1 ไบต์
programmer5000

2
@ programmer5000 ผมคิดว่าอาจเป็นสาเหตุที่ภาษาที่เรียกว่าจริง ...
เสวนาฟีนิกซ์

17

JavaScript (ES6), 36 ไบต์

f=(a,i=1)=>a.some(v=>i%v)?f(a,i+1):i

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


แน่นอน ... ฉันคิดถึงการทำลูปด้วยเทคนิคนี้ แต่การเรียกซ้ำนั้นสั้นกว่า
ETHproductions

1
นี่คืออัจฉริยะ ... ถ้าฉันจำได้ว่าsomeคืนจริงถ้าอย่างน้อยหนึ่งองค์ประกอบในอาร์เรย์เป็นไปตามเงื่อนไขใช่มั้ย
WallyWest


11

เยลลี่ 3 ไบต์

æl/

ลดโดย LCM ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

รุ่นสำรอง 6 ไบต์

ÆE»/ÆẸ

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

มันทำงานอย่างไร

ÆE»/ÆẸ  Main link. Argument: A (array)

ÆE      Yield all prime exponents of each integer in A.
  »/    Reduce columns (exponents that correspond to the same prime) by maximum.
    ÆẸ  Turn the resulting array of prime exponents into the corresponding integer.

8

Python, 69 65 52 50 ไบต์

A=lambda l,i=1:any(i%a for a in l)and A(l,i+1)or i

บันทึก 2 ไบต์ขอบคุณ Dennis!

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


1
anyใช้เครื่องกำเนิดไฟฟ้า คุณไม่จำเป็นต้องใช้วงเล็บ
เดนนิส

3
A=lambda l,i=1:all(i%a<1for a in l)or-~A(l,i+1)บันทึกอีกสองสามไบต์
Dennis

8

MATL , 7 ไบต์

&YFX>^p

ไม่มีบิลด์

ลองออนไลน์!

คำอธิบาย

ลองทำ[8, 2, 1, 10]ตัวอย่างเป็นตัวอย่าง

&YF    % Take array implicitly. Push vector of prime factors and matrix of exponents 
       % of factorization, where each row represents one of the input numbers
       %   STACK: [2 3 5], [3 0 0; 1 0 0; 0 0 0; 1 0 1]
X>     % Maximum of each column
       %   STACK: [2 3 5], [3 0 1]
^      % Element-wise power
       %   STACK: [8 1 5]
p      % Product of array
       %   STACK: 40
       % Implicitly display

แก้ไข (9 มิถุนายน 2017): YFด้วยสองเอาต์พุตได้รับการแก้ไขในรุ่น 20.1.0 : ช่วงเวลาที่ไม่ใช่ปัจจัยและเลขชี้กำลัง (ศูนย์) ของพวกเขาจะถูกข้าม สิ่งนี้จะไม่ส่งผลกระทบต่อโค้ดข้างต้นซึ่งใช้งานได้โดยไม่ต้องมีการเปลี่ยนแปลงใด ๆ


6

Julia (3 Bytes) [กำลังทำงานในตัวไม่ใช่]

lcm     # Using LCM built-in (3 Bytes)

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

ตัวอย่าง:

println(lcm(1,2,3,4,5,6,7,8,9)) #Prints 2520

6

PowerShell v2 +, 73 60 ไบต์

param($a)for($i=1;($a|?{!($i%$_)}).count-ne$a.count){$i++}$i

รับอินพุต$aวนขึ้นจาก$i=1ด้วย$i++ขึ้นอยู่กับเงื่อนไข สภาพเป็นที่($a|?{!($i%$_)}).countเป็น-nOT equal $a.countไป ความหมายวงปลายเมื่อองค์ประกอบของ$aที่จะหารของมีค่าเท่ากับองค์ประกอบของ$i $aจากนั้น$iจะปล่อยให้อยู่คนเดียวบนท่อและเอาท์พุทเป็นนัย

กรณีทดสอบ

PS C:\Tools\Scripts\golfing> @(7,2),@(8,1),@(6,4,8),@(8,2,1,10),@(9,6,2,1,5),@(5,5,7,1,1),@(4,13,8,8,11,1)|%{($_-join',')+" -> "+(.\least-common-multiple.ps1 $_)}
7,2 -> 14
8,1 -> 8
6,4,8 -> 24
8,2,1,10 -> 40
9,6,2,1,5 -> 90
5,5,7,1,1 -> 35
4,13,8,8,11,1 -> 1144

PS C:\Tools\Scripts\golfing> @(7,2,2,11,11,8,5),@(1,6,10,3,4,10,7),@(5,2,9,10,3,4,4,4,7),@(9,7,10,9,7,8,5,10,1)|%{($_-join',')+" -> "+(.\least-common-multiple.ps1 $_)}
7,2,2,11,11,8,5 -> 3080
1,6,10,3,4,10,7 -> 420
5,2,9,10,3,4,4,4,7 -> 1260
9,7,10,9,7,8,5,10,1 -> 2520

4

Mathematica ขนาด 3 ไบต์

LCM

การใช้งาน:

In[1]:= LCM[9, 7, 10, 9, 7, 8, 5, 10, 1]                                        

Out[1]= 2520

6
วันที่ Mathematica จับคู่กับเยลลี่เป็นวันที่ฉันไม่เคยคิดว่าจะเห็น
Steven H.

3

Cheddar, 33 ไบต์

(n,i=1)f->n.any(i&(%))?f(n,i+1):i

ไม่มีอะไรใหม่สุดยอด

Ungolfed

(n, i = 1) f ->
  n.any(j -> i % j) ?
    f(n, i + 1) :
    i

โดยพื้นฐานแล้วสิ่งนี้จะเริ่มต้นที่หนึ่งและเพิ่มขึ้นเรื่อย ๆ จนกระทั่งพบ LCM


3

JavaScript (ES6), 63 59 ไบต์

f=([x,...a])=>a[0]?x*f(a)/(g=(m,n)=>n?g(n,m%n):m)(x,f(a)):x

ค้นหา LCM แบบซ้ำ ๆ ของสององค์ประกอบสุดท้าย


นี่คือสิ่งที่ทางออกของฉันจะได้รับ:a=>a.reduce((l,n)=>l*n/(g=(m,n)=>n?g(n,m%n):m)(l,n))
Neil

@Neil คุณสามารถโพสต์ได้หากคุณต้องการ ฉันสงสัยว่าเทคนิคของฉันจะสั้นได้อย่างไร ...
ETHproductions


3

JavaScript (ES6), 52 ไบต์

a=>a.reduce((l,n)=>l*n/(g=(m,n)=>n?g(n,m%n):m)(l,n))

ฉันreduceตอบคำตอบนี้ได้มากที่สุด แต่ฉันก็ไม่ได้อยู่ใกล้ความเรียบง่ายของคำตอบ @ Hedi


3

Java 8, 75 59 121 89 ไบต์

ใช้อัลกอริทึมแบบยุคลิดและความจริงที่ว่า LCM (A, B) = A * B / GCD (A, B)

  • ปิด16ไบต์ ขอบคุณ @carusocomputing
  • เพิ่มหลายอินพุต + 62ไบต์
  • ปิด32ไบต์ ขอบคุณ @Olivier Grégoire

รหัส:

public static int lcm(int l, int c){
  for(int i=1;i<=l&&i<=c;++i) 
    if (i%l==0&&i%c==0)
      return l*c/i;
}
public static int lcm(int...x){
  int y=x[0];
  for(int j:x){
    y=lcm(j,y);
  }
  return y;
}

ลบตัวแบ่งบรรทัด:

int g(int a,int b){return b<1?a:g(b,a%b);}

l->{int l=1;for(int n:a)l=l*n/g(l,n);return l;}

เทคนิคเป็นตัวอย่าง แต่ถ้าคุณเพิ่ม n->{...}ฉันเชื่อว่ามันจะถูกต้อง Java 8
Magic Octopus Urn

ขอบคุณ ฉันพยายามทำความคุ้นเคยกับแลมบ์ดาใน Java ด้วยแลมบ์ดาคุณสามารถเล่นกอล์ฟวง for for loop ได้ แต่ฉันไม่รู้
Roman Gräf

ใช่ทุกสิ่งนั้นเป็นสิ่งที่ตามมาใน Java; คุณน่าจะเรียนรู้มันได้ดีกว่าใน Python :)
Magic Octopus Urn

ถ้าฉันไม่มีอะไรขาดหายไปสิ่งนี้จะไม่สนับสนุนอินพุตมากกว่าสองรายการ
pinkfloydx33

หากคุณคำนวณ GCD คุณสามารถเล่นกอล์ฟได้มากขึ้น: int g(int a,int b){return b<1?a:g(b,a%b);}ที่คุณสามารถเล่นกอล์ฟมากขึ้น: LCM สามารถกลายint l(int[]a){int l=1;for(int n:a)l=l*n/g(l,n);return l;}เป็นรวมเป็น 99 ไบต์
Olivier Grégoire




2

J, 11 ไบต์

>./&.(_&q:)

มีวิธีแก้ปัญหาสำหรับ3 ไบต์โดยใช้ LCM builtin

*./

คำอธิบาย

>./&.(_&q:)  Input: array of integers A
      _&q:   Get the prime exponents of each integer in A
>./&         Reduce by maximum on the lists
   &. _&q:   Convert the list of exponents back to an integer

*./  Input: array of integers A
  /  Reduce using
*.     LCM

2

CJam, 18 17 16 ไบต์

บันทึก 1 ไบต์ขอบคุณ Martin Ender

กำลังเพิ่มขึ้นจนกระทั่งพบ LCM

q~0{)_2$f%:+}g\;

ลองออนไลน์


1
ฉันไม่คุ้นเคยกับ CJam ทั้งหมด แต่กฎการใช้ซ้ำนั้นมีไว้สำหรับฟังก์ชั่นไม่ใช่โปรแกรมเต็มรูปแบบ หากโซลูชัน 17 ไบต์ของคุณเป็นโปรแกรมเต็มรูปแบบที่ทำงานได้อย่างต่อเนื่องในทุกการทำงานก็ถือว่าใช้ได้
Mego

2

แร็กเก็ต 13 ไบต์

lcm เป็นฟังก์ชันในตัวใน Racket:

(apply lcm l)

การทดสอบ:

(define (f l)
   (apply lcm l))

(f (list 7 2)) 
(f (list 8 1)) 
(f (list 6 4 8)) 
(f (list 8 2 1 10)) 
(f (list 9 6 2 1 5))
(f (list 5 5 7 1 1)) 
(f (list 4 13 8 8 11 1))
(f (list 7 2 2 11 11 8 5))
(f (list 1 6 10 3 4 10 7))
(f (list 5 2 9 10 3 4 4 4 7)) 
(f (list 9 7 10 9 7 8 5 10 1))

เอาท์พุท:

14
8
24
40
90
35
1144
3080
420
1260
2520

อ่า คุณจะใช้ไวยากรณ์นั้นได้อย่างไร ฉันมักจะยอมแพ้เมื่อฉันพยายามเรียนรู้แร็กเกต
Roman Gräf

1
คำแรกในวงเล็บคือชื่อโพรซีเดอร์ส่วนที่เหลือเป็นอาร์กิวเมนต์ หากการโต้แย้งเป็นกระบวนการมันจะต้องอยู่ในวงเล็บของตัวเอง ค่า (ไม่ใช่ขั้นตอน) จะถูกเขียนโดยไม่มีเครื่องหมายวงเล็บ ฉันคิดว่ามันเป็นภาษาที่ใช้งานทั่วไปที่ยอดเยี่ยมพร้อมกับได้รับประโยชน์เพิ่มเติมจากความเครียดในการเขียนโปรแกรมการทำงาน การได้มาจาก LISP ทำให้ผู้เขียนเข้าใจถึงขอบเขตของการเขียนโปรแกรม
rnso

ฉันพบว่าการเข้ารหัสคำหลักและภาษาจะง่ายกว่าใน Racket & Scheme มากกว่า Lisp
rnso

ใช่ แต่ฉันบอกว่าฉันเข้าใจเสียงกระเพื่อม? ฉันชอบภาษามากขึ้นเช่น Jelly หรือ Java
Roman Gräf

1
ความแตกต่างหลักทางไวยากรณ์ระหว่าง Java และ Racket คือ f (a, b) vs (fab), x + y + z vs (+ xyz), x == y vs (eq? xy) และ x = 2 vs (define x 2) หรือถ้ากำหนดไว้แล้ว (set! x 2) ยังไม่จำเป็นต้องประกาศประเภทเช่นโมฆะสาธารณะคงที่หรือสตริง int char ฯลฯ หวังว่าจะทำให้คุณสนใจ Racket อีกครั้ง
rnso

2

R, 36 ไบต์ (ไม่ใช่ในตัว)

v=scan();i=1;while(any(i%%v))i=i+1;i

รับอินพุต จากนั้นทดสอบค่าจำนวนเต็มบวกแต่ละค่าโดยทำการปรับค่า


ฉันเชื่อว่าคุณต้องการcatรอบสุดท้ายของคุณi
จูเซปเป้

@Giuseppe เมื่อฉันเรียกใช้ค่าจะพิมพ์ออกมาดี
user5957401

ดูการอภิปรายที่นี่แต่ผมคิดว่าec=Tเป็นเรื่องปกติสำหรับ 4 มากกว่า 5 cat()สำหรับ
Giuseppe

1
ไม่ว่าจะใช้วิธีนี้สามารถเล่นv=scan();while(any((F=F+1)%%v)){};Fกับบางส่วนcat()หรือec=Tทำให้เป็น 40 หรือ 39 ไบต์ตามลำดับ และ +1 วิธีการที่ดีมาก
Giuseppe

1

Pyth, 9 ไบต์

.U/*bZibZ

โปรแกรมที่รับอินพุตของรายการบน STDIN และพิมพ์ผลลัพธ์

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

มันทำงานอย่างไร

.U/*bZibZ  Program. Input: Q
.U         Reduce Q by (implicit input fill):
   *bZ      Product of current and next value
  /   ibZ   divided by GCD of current and next value
           Implicitly print

1

Haskell ขนาด 10 ไบต์

foldr1 lcm

ตัวอย่างการใช้งาน: ->foldl1 lcm [5,2,9,10,3,4,4,4,7]1260


1

C #, 50 + 18 = 68 ไบต์

50 ไบต์สำหรับการกำหนดวิธีการ +18 ไบต์สำหรับการนำเข้า LINQ

using System.Linq;int L(int[]n,int i=1)=>n.All(x=>1>i%x)?i:L(n,i+1);

ค่อนข้างเหมือนกันกับคำตอบอื่น ๆ มากมาย นับซ้ำจนกว่าจะพบ LCM ฉันรู้สึกประหลาดใจเล็กน้อยที่นี่ไม่ได้รับ StackOverflowException ดังนั้นฉันจึงมีเวอร์ชันที่ไม่ใช่แบบเรียกซ้ำซึ่งจริงๆแล้วมีความยาวเพียง 1 ไบต์

using System.Linq;n=>{for(int i=1;;i++)if(n.All(x=>1>i%x))return i;};

Ungolfed:

using System.Linq;            // Import LINQ
int L(int[] n, int i = 1) =>  // Function declaration
    n.All(x => 1 > i % x)     // Check if each x in n divides i
        ? i                   // And if so return i
        : L(n, i + 1)         // Otherwise increment i and recurse
;

1

Pip 10 ไบต์

W$+o%g++oo

ใช้กลยุทธ์ "ลองทุกหมายเลขจนกว่าจะถึงหนึ่งงาน" ลองออนไลน์!

            o is preinitialized to 1, g is list of cmdline args
   o%g      Mod o by each arg
 $+         Sum (truthy if any nonzero, falsy if all zero)
W           Loop while that expression is truthy:
      ++o     Increment o
         o  Autoprint o

1

PHP, 42 74 ไบต์

for(;($p=++$f*$argv[1])%$argv[2];);echo$p;

ตรงไปข้างหน้า:
วน$fจาก 1 ขึ้นไป; หาก$f*$aแบ่งออก$bโดยไม่มีเศษเหลืออยู่จะพบ LCM


ฉันโอเวอร์โหลดทั้งหมดat least... นี่คือรหัสสำหรับพารามิเตอร์จำนวนเท่าใดก็ได้:

for(;$i<$argc;)for($p=$argv[$i=1]*++$f;++$i<$argc&$p%$argv[$i]<1;);echo$p;

วน$fซ้ำตั้งแต่ 1 ขึ้นไปขณะที่วงภายในไม่ได้ทำงานถึง $ argc
วน$iจาก2จนถึง$argc-1ขณะที่$f*$argv[1]หารผ่าน$argv[$i]โดยไม่มีส่วนที่เหลือ
ลูปทั้งสองเสีย: $f*$argument 1การพิมพ์



1

Python 3, 83 ไบต์

import math,functools as i
t=lambda t:i.reduce(lambda a,b:int(a*b/math.gcd(a,b)),t)

ยินดีต้อนรับสู่ PPCG!
Laikoni

คุณอาจต้องการรวมลิงก์ไปยังเว็บไซต์ทดสอบออนไลน์เช่นลองออนไลน์! ดังนั้นจึงเป็นเรื่องง่ายสำหรับผู้อื่นในการตรวจสอบคำตอบของคุณ
Laikoni

1

Brachylog v2, 8 ไบต์

{×↙Xℕ₁}ᵛ

ลองออนไลน์!

มันตลกมากที่แผนที่นี้ตรงกับคำจำกัดความที่ให้ไว้ในการท้าทาย

{     }ᵛ    Each element of
            the input
 ×          multiplied by
  ↙X        some arbitrary and inconsistent integer
    ℕ₁      is a natural number,
       ᵛ    which is the same for each element,
            and is the output.

ทางออกช้าลงอย่างน่าสงสัย แต่มีความหมายสั้นกว่า:

Brachylog v2, 5 ไบต์

f⊇p~d

ลองออนไลน์!

รับอินพุตผ่านตัวแปรเอาต์พุตและให้เอาต์พุตผ่านตัวแปรอินพุต ฉีกขวาผ่านการทดสอบสี่ครั้งแรก แต่ฉันยังคงรออยู่ในวันที่ห้า ... ปกติแล้วฉันยังคงแก้ปัญหาหลักของฉันและเพียงแค่เชื่อว่ามันทำงานได้อย่างถูกต้อง แต่ฉันไม่รู้ว่าทำไมมันไม่ได้ ยืนยันว่า 90 คือ LCM ของ9, 6, 2, 1, 5เมื่อฉันให้ 90ยี่สิบนาทีที่ผ่านมา

(แก้ไข: ยืนยันคำตอบภายในไม่เกิน 16 ชั่วโมงและสร้างขึ้นพร้อมกับ LCM 5, 5, 7, 1, 1หลังจากนั้นประมาณสองวัน)

         The output variable
   ~d    with duplicates removed
  p      is a permutation of
 ⊇       a sublist of
f        the factors of
         the input variable.

และอีกคำอธิบายที่แตกต่างอย่างสิ้นเชิงโดยบังเอิญว่าโซลูชั่น Brachylog v1 ของ Fatalize แปลโดยบังเอิญ:

Brachylog v2, 10 ไบต์

;.gᵗ↔z%ᵛ0<

ลองออนไลน์!

สิ่งนี้ได้รับการช่วยเหลือจากวิธีแก้ปัญหาที่ฉันทำเพื่อความท้าทายนี้ก่อนที่ฉันจะรู้ว่าผลลัพธ์ไม่ได้ถูก จำกัด ว่าเป็นจำนวนเต็ม

 .            The output
; gᵗ↔z        paired with each element of
              the input,
      %ᵛ      when the first element of each pair is taken mod the second, is always
        0     zero.
              Furthermore, the output
         <    is strictly greater than
        0     zero.

0

Pyth - 7 6 ไบต์

ไม่มีบิลด์

*F{sPM

ลองมันออนไลน์ได้ที่นี่


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