Tam giác Pascal (Sắp xếp)


24

Hầu hết mọi người ở đây đều quen thuộc với Tam giác của Pascal. Nó được hình thành bởi các hàng liên tiếp, trong đó mỗi phần tử là tổng của hai hàng xóm phía trên bên trái và phía trên bên phải của nó. Dưới đây là các 5hàng đầu tiên (mượn từ tam giác Tạo Pascal ):

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1
  . . .

Thu gọn các hàng này sang bên trái

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
. . .

Sắp xếp chúng theo thứ tự tăng dần

1
1 1
1 1 2
1 1 3 3
1 1 4 4 6
. . .

Đọc tam giác này theo hàng

[1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 4, 6 ...]

Đưa ra một đầu vào n, đầu ra nsố thứ trong chuỗi này. Đây là OEIS 107430 .

Quy tắc

  • Bạn có thể chọn lập chỉ mục dựa trên 0 hoặc 1. Vui lòng cho biết trong trình của bạn.
  • Đầu vào và đầu ra có thể được coi là phù hợp với kiểu số nguyên của ngôn ngữ của bạn.
  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Lỗ hổng tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

6
Tiêu đề rất hay!
Luis Mendo

1
Theo liên kết OEIS, thay đổi duy nhất cần thiết để tạo chuỗi này thay vì hệ số nhị thức là phân chia số nguyên. Điều đó chắc chắn rơi vào "tầm thường".
Peter Taylor

5
@PeterTaylor Điều này không giống như một bản sao rõ ràng đối với tôi. Có nhiều cách tiếp cận khả thi khác có thể dẫn đến các cơ hội chơi gôn thú vị, đặc biệt là đối với các ngôn ngữ không có tích hợp nhị thức.
Arnauld

4
@PeterTaylor Tôi cũng không tin đây là bản sao. Cho đến nay, các câu trả lời MATL, JavaScript và Pascal khá khác nhau giữa hai thử thách. Tuy nhiên, vì phiếu bầu của tôi là một cái búa, tôi sẽ không bỏ phiếu.
admBorkBork

4
Hoàn toàn đồng ý với @AdmBorkBork. Vì vậy, tính tôi là mở lại phiếu bầu. Điều đó làm cho 3 bây giờ. Có bao nhiêu phiếu cần thiết để mở lại?
Luis Mendo

Câu trả lời:


9

JavaScript (ES6), 79 byte

Chỉ số 0.

f=(n,a=[L=1])=>a[n]||f(n-L,[...a.map((v,i)=>k=(x=v)+~~a[i-1-i%2]),L++&1?k:2*x])

Bản giới thiệu

Làm sao?

f = (                       // f = recursive function taking:
  n,                        //   n = target index
  a = [L = 1]               //   a[] = current row, L = length of current row
) =>                        //
  a[n] ||                   // if a[n] exists, stop recursion and return it
  f(                        // otherwise, do a recursive call to f() with:
    n - L,                  //   n minus the length of the current row
    [                       //   an array consisting of:
      ...a.map((v, i) =>    //     replace each entry v at position i in a[] with:
        k =                 //       a new entry k defined as:
        (x = v) +           //       v +
        ~~a[i - 1 - i % 2]  //       either the last or penultimate entry
      ),                    //     end of map()
      L++ & 1 ?             //     increment L; if L was odd:
        k                   //       append the last updated entry
      :                     //     else:
        2 * x               //       append twice the last original entry
    ]                       //   end of array update
  )                         // end of recursive call

Thuật toán này trực tiếp tạo ra các hàng được sắp xếp của Tam giác Pascal. Nó cập nhật n theo độ dài của hàng trước cho đến khi tồn tại [n] . Chẳng hạn, 6 lần lặp được yêu cầu cho n = 19 :

 L | n  | a[]
---+----+------------------------
 1 | 19 | [ 1 ]
 2 | 18 | [ 1, 1 ]
 3 | 16 | [ 1, 1, 2 ]
 4 | 13 | [ 1, 1, 3, 3 ]
 5 |  9 | [ 1, 1, 4, 4, 6 ]
 6 |  4 | [ 1, 1, 5, 5, 10, 10 ]
                        ^^

Công việc tốt đẹp. Tôi không chắc chắn nếu tôi hiểu chính xác làm thế nào nó hoạt động. Nỗ lực của tôi hóa ra dài hơn bạn nhiều.
kamoroso94

@ kamoroso94 Tôi đã thêm một lời giải thích.
Arnauld

Tôi thích điều này! Thực sự rất thích tìm hiểu những gì nó đang làm.
Xù xì

6

Octave , 46 byte

@(n)(M=sort(spdiags(flip(pascal(n)))))(~~M)(n)

1 dựa.

Hãy thử trực tuyến!

Giải trình

Hãy xem xét n=4như một ví dụ.

pascal(n) đưa ra ma trận Pascal:

 1     1     1     1
 1     2     3     4
 1     3     6    10
 1     4    10    20

Các hàng của tam giác Pascal là các antidiagonals của ma trận này. Vì vậy, nó được lật theo chiều dọc bằng cách sử dụngflip(···)

 1     4    10    20
 1     3     6    10
 1     2     3     4
 1     1     1     1

mà biến đổi antidiagonals thành đường chéo.

spdiags(···) trích xuất các đường chéo (khác không), bắt đầu từ phía dưới bên trái và sắp xếp chúng thành các cột có đệm:

 1     1     1     1     0     0     0
 0     1     2     3     4     0     0
 0     0     1     3     6    10     0
 0     0     0     1     4    10    20

M=sort(···)sắp xếp từng cột của ma trận này và gán kết quả cho biến M:

 0     0     0     1     0     0     0
 0     0     1     1     4     0     0
 0     1     1     3     4    10     0
 1     1     2     3     6    10    20

Lập chỉ mục logic (···)(~~M)hiện được sử dụng để trích xuất các giá trị khác của ma trận này theo thứ tự chính cột (xuống, sau đó qua). Kết quả là một vectơ cột:

 1
 1
 1
 1
···
10
10
20

Cuối cùng, nmục thứ-thứ của vectơ này được trích xuất bằng cách sử dụng (···)(n), trong trường hợp này cung cấp 1.


5

Python 2 , 86 78 72 byte

-8 byte nhờ Rod

g=lambda n,r=[1]:r[n:]and r[n/2]or g(n-len(r),map(sum,zip([0]+r,r+[0])))

Hãy thử trực tuyến!

Bị đánh cắp

def g(n, row=[1]):
  if n < len(row):
    return row[n/2]
  else:
    next_row = map(sum, zip([0] + row, row + [0]))
    return g(n - len(row), next_row)

Hãy thử trực tuyến!

Hàm tính toán đệ quy hàng Tam giác của Pascal. Với hàng hiện tại như row, map(sum, zip([0] + row, row + [0])).
Tại mỗi cuộc gọi nđược giảm theo độ dài của hàng hiện tại. Nếu hàm đến đúng hàng, nthsố thấp nhất của hàng sẽ được trả về.
Vì nửa đầu của một hàng theo thứ tự tăng dần và mỗi hàng là đối xứng, nên số nằm ở chỉ số n/2(0-index, chia số nguyên).


4

Ngôn ngữ Wolfram (Mathicala) , 55 byte

Việc lập chỉ mục là dựa trên 1.

(##&@@@Sort/@Table[n~Binomial~k,{n,0,#},{k,0,n}])[[#]]&

Hãy thử trực tuyến!

Giải trình

Đây có thể là golf, tôi không phải là người dùng Mathicala có nhiều kinh nghiệm.

Table[n~Binomial~k,{n,0,#},{k,0,n}]

Với mỗi n ∈ [0, Input] , tạo bảng nhị thức với mỗi k ∈ [0, n] ∩ .

Sort/@

Sắp xếp từng cái. Sử dụng một tốc ký để Map[function,object]- function/@object.

(##&@@@...)[[#]]

Làm phẳng danh sách kết quả và truy xuất phần tử có chỉ mục trong danh sách là đầu vào.



3

R , 58 byte

function(n)(m=apply(outer(0:n,0:n,choose),1,sort))[m>0][n]

Hãy thử trực tuyến!

Tính toán n choose kcho từng n,ktrong [0,1,...,n]một ma trận, sắp xếp các hàng tăng dần (*) và loại bỏ các số không, sau đó chọn nphần tử thứ.

(*) Điều này cũng biến đổi chúng thành các cột nhưng tốt hơn vì R lưu trữ một ma trận dưới dạng một vectơ theo cột , cho phép chúng ta lập chỉ mục trực tiếp vào nó trong khi duy trì trật tự.


3

Haskell , 143 132 125 123 byte

((p>>=s.h)!!)
p=[1]:map(\r->zipWith(+)(0:r)(r++[0]))p
h r=splitAt(div(length r)2)r
s(a,b)=reverse b!a
(h:t)!b=h:(b!t)
x!_=x

Dòng đầu tiên là một hàm không có điểm lấy một chỉ mục (dựa trên 0) và trả về số thích hợp trong chuỗi. Hãy thử trực tuyến!

Đây là chương trình Haskell đầu tiên của tôi! Tôi chắc chắn rằng nó có thể ngắn hơn nhiều. Lời khuyên được đánh giá cao.

Đã lưu 2 byte nhờ nimi

Bị đánh cắp

pascalRows = [1] : map (\row -> zipWith (+) (0:row) (row++[0])) pascalRows
halves row = splitAt (div (length row) 2) row
joinSorted (first, second) = interleave (reverse second) first
interleave [] _ = []
interleave longer shorter = (head longer) : (interleave shorter (tail longer))
f n = (concatMap (joinSorted.halves) pascalRows) !! n

Bạn vẫn còn itrong chức năng s, được đổi tên thành !, tôi đoán. Nếu bạn sử dụng hàm infix, bạn có thể thả ()xung quanh reverse b: s(a,b)=reverse b!a.
nimi

@nimi Ah, cảm ơn - Tôi đã thay đổi nó trên TIO nhưng đã bỏ lỡ một vị trí trên mã ở đây. Và cảm ơn cho các dấu ngoặc đơn.
DLosc

3

JavaScript, 57 byte

f=(i,r=1)=>i<r?i>1?f(i-2,--r)+f(i<r?i:r-1,r):1:f(i-r,r+1)

Chỉ số 0.

Làm thế nào điều này đến:

Bước 0:

c=(i,r)=>i?r&&c(i-1,r-1)+c(i,r-1):1
f=(i,r=1)=>i<r?c(i>>1,r-1):f(i-r,r+1)

Mã này rất dễ hiểu:

  • hàm ctính công thức sử dụng kết hợp: C (n, k) = C (n-1, k) + C (n-1, k-1); hoặc 1 nếu k == 0 hoặc k == n
  • Hàm fcố gắng tìm ra số hàng và chỉ mục trong hàng, sau đó gọi hàm c để nhận kết quả.

Bước 1:

c=(i,r)=>i>1?--r&&c(i-2,r)+c(i,r):1
f=(i,r=1)=>i<r?c(i,r):f(i-r,r+1)

Trong bước này, chúng tôi cố gắng sửa đổi lệnh gọi của hàm c để c(i,r)làm cho nó giống như tham số của f.

Bước 2:

c=(i,r)=>i>1?--r&&c(i-2,r)+c(i<r?i:r-1,r):1
f=(i,r=1)=>i<r?c(i,r):f(i-r,r+1)

Chúng tôi kiểm tra i<rxem sử dụng chức năng fhay chức năngc . Đó là lý do tại sao xạ hương giữ i<rtrong khi đệ quy chức năngc .

Bước 3:

f=(i,r=1)=>i<r?i>1?--r&&f(i-2,r)+f(i<r?i:r-1,r):1:f(i-r,r+1)

Ở bước này, chúng ta hợp nhất hai hàm này thành một.

Sau một số golf nữa, cuối cùng chúng tôi đã có câu trả lời được mô tả ở trên.


2

Thạch , 13 byte

0rcþ`ZṢ€Ẏḟ0⁸ị

Hãy thử trực tuyến!

Sử dụng thuật toán Dyalog của Uriel.

1 chỉ mục.

Giải trình:

0rcþ`ZṢ€Ẏḟ0⁸ị
0r            Return inclusive range from 0 to n
    `         Call this dyad with this argument on both sides
   þ           Outer product with this dyad
  c             Binomial coefficient
     Z        Zip
       €      Call this link on each element
      Ṣ        Sort
        Ẏ     Concatenate elements
         ḟ0   Remove 0s
           ⁸ị Take the nth element

Bạn có thể thêm một lời giải thích? Tôi không thể tìm ra những gì þđang làm ở đây.
Xù xì

1
@Shaggy Đó là sản phẩm bên ngoài, tôi sẽ thêm một lời giải thích.
Erik the Outgolfer 7/2/18

2

JavaScript (Node.js) , 65 byte

Thậm chí không một mảng được sử dụng. Chỉ số 0.

f=(n,i=0,g=x=>x?x*g(x-1):1)=>n>i?f(n-++i,i):g(i)/g(c=n>>1)/g(i-c)

Hãy thử trực tuyến!

Giải trình:

f=(n,i=0,                 )=>                                     // Main Function
         g=x=>x?x*g(x-1):1                                        // Helper (Factorial)
                             n>i?                                 // Is n > i?
                                 f(n-++i,i):                      // If so, call function
                                                                  // f(n-i-1, i+1) to skip
                                                                  // . i+1 terms
                                            g(i)/g(c=n>>1)/g(i-c) // If not, since sorting 
                                                                  // . the binomial coeffs
                                                                  // . equals to writing
                                                                  // . the first floor(i/2)
                                                                  // . coefficients twice
                                                                  // . each, so a shortcut

1

Pascal , 373 byte

function t(n,k,r:integer):integer;begin if(n<k)then t:=r-1 else t:=t(n,k+r,r+1)end;
function s(n,k:integer):integer;begin if(k=0)then s:=n else s:=s(n+k,k-1)end;
function f(n,k:integer):integer;begin if((k<1)or(k>n))then f:=0 else if n=1 then f:=1 else f:=f(n-1,k-1)+f(n-1,k)end;
function g(n:integer):integer;var k:integer;begin k:=t(n,0,1);g:=f(k,(n-s(0,k-1)+2)div 2)end;

g là chức năng.

Hãy thử trực tuyến!


n=1 thencó thể n=1then.
Jonathan Frech

Rất vui, có vẻ như if(k=0)thencó thể trở thành if k=0then.
Xù xì

nếu một số nào đó luôn lớn hơn 0, bạn nên sử dụng wordthay vì integer.
tsh

1

Java 8, 187 byte

n->{int r=~-(int)Math.sqrt(8*n+1)/2+1,a[]=new int[r],k=r,x=0;for(;k-->0;a[k]=p(r,k))x+=k;java.util.Arrays.sort(a);return a[n-x];}int p(int r,int k){return--r<1|k<2|k>r?1:p(r,k-1)+p(r,k);}

Giải trình:

Hãy thử trực tuyến.

n->{                   // Method with integer as both parameter and return-type
  int r=~-(int)Math.sqrt(8*n+1)/2+1,
                       //  Calculate the 1-indexed row based on the input
      a[]=new int[r],  //  Create an array with items equal to the current row
      k=r,             //  Index integer
      x=0;             //  Correction integer
  for(;k-->0;          //  Loop down to 0
    a[k]=p(r,k))       //   Fill the array with the Pascal's Triangle numbers of the row
    x+=k;              //   Create the correction integer
  java.util.Arrays.sort(a);
                       //  Sort the array
  return a[n-x];}      //  Return the `n-x`'th (0-indexed) item in this sorted array

// Separated recursive method to get the k'th value of the r'th row in the Pascal Triangle
int p(int r,int k){return--r<1|k<2|k>r?1:p(r,k-1)+p(r,k);}

1

MATL , 11 byte

:qt!XnSXzG)

1 dựa.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy xem xét đầu vào 4là một ví dụ. ;là dấu phân cách hàng cho ma trận hoặc vectơ cột.

:     % Implicit input: n. Push the row vector [1 2 ... n]          
      S STACK: [1 2 3 4]
q     % Subtract 1, emlement-wise: gives [0 1 ... n-1]
      % STACK: [0 1 2 3]
t!    % Duplicate and transpose into a column vector
      % STACK: [0 1 2 3], [0; 1; 2; 3]
Xn    % Binomial coefficient, element-wise with broadcast. Gives an
      % n×n matrix where entry (i,j) is binomial(i,j), or 0 for i<j
      % STACK: [1 1 1 1;
                0 1 2 3;
                0 0 1 3;
                0 0 0 1]
S     % Sort each column
      % STACK: [0 0 0 1;
      %         0 0 1 1;
      %         0 1 1 3;
      %         1 1 2 3]
Xz    % Keep only nonzeros. Gives a column vector
      % STACK: [1; 1; 1; 1; 1; 2; 1; 1; 3; 3]
G)    % Get the n-th element. Implicitly display
      % STACK: 1

1

Mẻ, 128 byte

@set/as=2,t=r=m=i=1
:l
@if %1 geq %t% set/as+=r,t+=r+=1&goto l
@for /l %%i in (%s%,2,%1)do @set/ar-=1,m=m*r/i,i+=1
@echo %m%

Chỉ số 0.


Bạn có thể thêm một lời giải thích, xin vui lòng? Tôi không thể theo logic ở đây.
admBorkBork

@AdmBorkBork Ba ​​dòng đầu tiên tính toán hàng rvà cột %1-(s-2)của chuỗi %1thứ. Dòng thứ tư sau đó sử dụng số đó để tính hệ số nhị thức (n k) = n!/(n-k)!k!= n(n-1)...(n+1-k)/(1)(2)...k= (n/1)((n-1)/2)...((n+1-k)/k). MathJax ở đâu khi tôi cần nó?
Neil


1

05AB1E , 10 byte

Chỉ số 0

ÝεDÝc{}˜sè

Hãy thử trực tuyến!

Giải trình

Ý             # push range [0 ... input]
 ε    }       # apply to each element
  DÝc         # N choose [0 ... N]
     {        # sort
       ˜      # flatten result to a list
        sè    # get the element at index <input>

1

Thạch , 11 byte

Ḷc€`Ṣ€Fḟ0ị@

Hãy thử trực tuyến!

Một liên kết đơn âm lấy chỉ mục và trả về một số nguyên - sử dụng lập chỉ mục dựa trên 1.

Làm sao?

Thực hiện thử thách khá nhiều như khi nó được viết, chỉ với phần bên phải của tam giác Pascal (số không) sau đó bị ném đi ...

Ḷc€`Ṣ€Fḟ0ị@ - Link: integer, i    e.g. 1   or    9
Ḷ           - lowered range            [0]       [0,1,2,3,4,5,6,7,8]
   `        - repeat left as right arg [0]       [0,1,2,3,4,5,6,7,8]
 c€         - binomial choice for €ach [[1]]     [[1,0,0,0,0,0,0,0,0],[1,1,0,0,0,0,0,0,0],[1,2,1,0,0,0,0,0,0],[1,3,3,1,0,0,0,0,0],[1,4,6,4,1,0,0,0,0],[1,5,10,10,5,1,0,0,0],[1,6,15,20,15,6,1,0,0],[1,7,21,35,35,21,7,1,0],[1,8,28,56,70,56,28,8,1]]
    Ṣ€      - sort €ach                [[1]]     [[0,0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,1,1],[0,0,0,0,0,0,1,1,2],[0,0,0,0,0,1,1,3,3],[0,0,0,0,1,1,4,4,6],[0,0,0,1,1,5,5,10,10],[0,0,1,1,6,6,15,15,20],[0,1,1,7,7,21,21,35,35],[1,1,8,8,28,28,56,56,70]]
      F     - flatten                  [1]       [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,2,0,0,0,0,0,1,1,3,3,0,0,0,0,1,1,4,4,6,0,0,0,1,1,5,5,10,10,0,0,1,1,6,6,15,15,20,0,1,1,7,7,21,21,35,35,1,1,8,8,28,28,56,56,70]
       ḟ0   - filter discard zeros     [1]       [1,1,1,1,1,2,1,1,3,3,1,1,4,4,6,1,1,5,5,111,1,6,6,15,15,21,1,7,7,21,21,35,35,1,1,8,8,28,28,56,56,70]
         ị@ - index into (sw@p args)    1         3 --------------^

1

Màu đỏ , 206 byte

f: func[n][t: copy[[1]]l: 0
while[l < n][a: copy last t insert append a 0 0 b: copy[]repeat i k:(length? a)- 1[append b a/(i) + a/(i + 1)]append t reduce[b]l: l + k]foreach p t[sort p]pick split form t{ }n]

1 dựa

Hãy thử trực tuyến!

Giải trình:

f: func [n] [
    t: copy [[1]]                       ; start with a list with one sublist [1]
    l: 0                                ; there are 1 items overall
    while [l < n] [                     ; while the number of items is less than the argument
        a: copy last t                  ; take the last sublist 
        insert append a 0 0             ; prepend and append 0 to it  
        b: copy []                      ; prepare a list for the sums  
        repeat i k: (length? a) - 1 [   ; loop throught the elements of the list
            append b a/(i) + a/(i + 1)] ; and find the sum of the adjacent items
        append t reduce [b]             ; append the resulting list to the total list
        l: l + k                        ; update the number of the items
    ]
    foreach p t [sort p]                ; sort each sublist
    v: pick split form t { } n          ; flatten the list and take the n-th element
]

1

Perl, 48 byte

Bao gồm +1chop

perl -pe '$_-=$%until$_<++$%;$./=$_/--$%for 1..$_/2;$_=$.' <<< 19

Sử dụng lập chỉ mục cơ sở 0.


1

J, 46 41 byte

f=:](([-2!]){/:~@(i.!<:)@])[:<.2&!@,:^:_1

Chỉ số 0

Hãy thử trực tuyến!

Ghi chú:

  • <.2&!@,:^:_1đưa ra số hàng liên quan của tam giác Pascal bằng cách làm tròn xuống nghịch đảo của y choose 2.
  • /:~@(i.!<:)@] tính toán hàng và sắp xếp nó.
  • [-2!] đưa chỉ số vào hàng.

Xin chào. Chào mừng đến với trang web! Đây là một câu trả lời đầu tiên rất hay :)
DJMcMayhem

1

Julia , 70 byte

f(x)=map(n->binomial(n-1,ceil(Int,x/2-(n^2-n)/4-1)),round(Int,√(x*2)))

1 dựa

Giải trình:

đầu tiên nó tìm số hàng, sau đó là số cột, sau đó tính nhị thức


Chào mừng đến với PPCG!
Martin Ender

vâng, khuôn mặt hạnh phúc
Jimmy Chen


0

Bình thường, 15 byte

@u+GSm.cHdhHhQY

Chỉ số 0

Thử nó

Giải trình

@u+GSm.cHdhHhQY
 u          hQY   Reduce on [0, ..., input], starting with the empty list...
  +G              ... append to the accumulator...
    Sm.cHdhH      ... the sorted binomial coefficients.
@              Q  Take the 0-indexed element.


0

Ruby , 56 byte

->n{a=0;n-=a until n<a+=1;[*2..a].combination(n/2).size}

Dựa trên 0

Đầu tiên lấy hàng và cột trong tam giác, sau đó tính hệ số nhị thức tương ứng với vị trí đó.

Hãy thử trực tuyến!


0

Trên thực tế , 8 byte

Phần lớn dựa trên câu trả lời Jelly của Jonathan Allan . Sử dụng chỉ mục 0.

;r♂╣♂SΣE

Hãy thử trực tuyến!

Ungolfing

          Implicit input n.
;         Duplicate n.
 r        Lowered range. [0..n-1].
  ♂╣      Pascal's triangle row of every number.
    ♂S    Sort every row.
      Σ   Sum each row into one array.
       E  Get the n-th element of the array (0-indexed).
          Implicit return.

Nó được cho là tạo ra một số duy nhất; các nthứ trong chuỗi. Điều này tạo ra một mảng.
đệ quy

Rất tiếc. Đã sửa. Cảm ơn @recursive
Sherlock9



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.