Đa thức in đẹp


38

Giới thiệu

Con người là một loài đáng chú ý, nhưng đôi khi chúng ta có thể rất lúng túng để hiểu đôi khi đặc biệt là đối với máy tính. Đặc biệt, chúng tôi dường như thích viết đa thức theo cách rất phức tạp với các quy tắc dường như tùy tiện.

Chương trình ngắn nhất bạn có thể viết để định dạng một đa thức chính xác bằng cách sử dụng các quy tắc này là gì?

Thử thách

Đầu vào

Danh sách các số nguyên nằm trong khoảng từ 1000 đến 1000 (bao gồm), biểu thị các hệ số của đa thức, với mục cuối cùng là hệ số x ^ 0 (hằng số), lần thứ hai là hệ số của x ^ 1, v.v.

Đầu ra

Một chuỗi đại diện cho đa thức này trong ký hiệu toán học được định dạng chính xác của con người.

Quy tắc:

  • Dấu hiệu trên hệ số dẫn đầu chỉ được hiển thị nếu nó âm.

Right: -x^2+3

Wrong: +x^2+3

  • Các thành phần có hệ số 0 không được in (trừ trường hợp góc trong đó tất cả các hệ số là 0 *).

Right: x^5-x^2+3

Wrong: x^5+0x^4+0x^3-x^2+0x+3

  • Các hệ số -1+1sẽ được hiển thị mà không có 1, trừ khi chúng là hằng số.

Right: x^5-x^2+1

Wrong: 1x^5-1x^2+1

  • Số mũ chỉ được hiển thị nếu nó lớn hơn 1 và biến chỉ được hiển thị nếu số mũ lớn hơn 0.

Right: 3x^3-7x^2+2x+1

Wrong: 3x^3-7x^2+2x^1+1x^0

  • * Trường hợp góc: trong khi các giá trị 0 thường dẫn đến việc không in thành phần đó, nếu tất cả các hệ số bằng 0 thì hằng số 0 sẽ được in.

Right: 0

Wrong: 0x+0

Wrong: (nothing)

  • Đây là môn đánh gôn, vì vậy người chiến thắng sẽ là chương trình có ít byte nhất.

Ví dụ đầu vào và đầu ra

Input:                  Output:
      [0]                      0
      [0,0]                    0
      [0,-1,35,0]             -x^2+35x
      [5,1,7,-9]               5x^3+x^2+7x-9
      [100,0,0,-1]             100x^3-1
      [931,21,-11,1]           931x^3+21x^2-11x+1

Tôi mong muốn được nhìn thấy giải pháp của bạn. Chúc vui vẻ!

CHỈNH SỬA:

  • Bạn có thể bao quanh các hoạt động bằng khoảng trắng nếu bạn muốn. Vì vậy, 3x+53x + 5cả hai đều tốt. 3x+ 53x +5không.
  • Nếu bạn muốn tạo ra các ký tự lũy thừa thực tế (nói bằng Tex) được phép vì nó thậm chí còn gần hơn với cách con người viết.
  • Các hệ số phải xuất hiện mà không có bất kỳ số thập phân nào, ví dụ 9x^2là chính xác, 9.0x^2là không.

7
Một câu hỏi mà tôi nên hỏi trong hộp cát nhưng không, chúng ta có thể in với khoảng trắng giữa các toán tử không? Vậy 3x^2 + 4so với 3x^2+4?
Giuseppe

1
Chúng ta có cần xuất số mũ bằng cách sử dụng dấu mũ không? Hoặc sẽ tạo ra một ký tự siêu ký tự thực tế được cho phép (ví dụ: cho câu trả lời trong TeX)?
Người hướng dẫn

3
@KevinCruijssen Tôi không phải là OP nhưng tôi sẽ nói là không, vì hầu hết mọi người không viết như vậy.
ShreevatsaR

2
@M BiếnKundu Vâng chắc chắn bạn có thể lấy đầu vào dưới dạng chuỗi.
Oisín Moran

1
@ OisínMoran Không có gì thú vị, chỉ cần đảm bảo đơn giản 1x-> xthay thế không thay đổi 21x^2thành 2x^2.
DLosc

Câu trả lời:


10

Võng mạc 0.8.2 , 56 byte

(?=( \S+)+)
x^$#1
\b0x.\d+ 

\b1x
x
x.1 
x 
 0

 -
-
 
+

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

(?=( \S+)+)
x^$#1

Chèn tất cả các quyền hạn của x, bao gồm x^1nhưng không x^0.

\b0x.\d+ 

Xóa tất cả các quyền hạn xvới hệ số bằng 0, nhưng không phải là dấu 0(chưa).

\b1x
x

Xóa một số nhân của 1(nhưng không phải là hằng số 1).

x.1 
x 

Xóa ^1các x^1.

 0

Xóa một hằng số 0 trừ khi đó là điều duy nhất còn lại.

 -
-

Xóa khoảng trắng trước a -.

 
+

Thay đổi bất kỳ không gian còn lại thành +s.


6

JavaScript (ES6), 107 106 byte

a=>a.map(c=>c?s+=(c>0&&s?'+':_)+(!--e|c*c-1?c:c<0?'-':_)+(e?e-1?'x^'+e:'x':_):e--,e=a.length,_=s='')&&s||0

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

Làm sao?

Đầu ra được xây dựng bằng cách áp dụng các công thức sau cho từng hệ số c của mảng đầu vào a [] trong khi theo dõi số mũ hiện tại e .

Công thức 1: dấu cộng

Nếu hệ số này hoàn toàn tích cực và đây không phải là thuật ngữ đầu tiên trong biểu thức đầu ra, chúng tôi nối thêm a +. Nếu không, chúng tôi không có gì.

c > 0 && s ? '+' : _

Công thức thứ 2: dấu trừ và hệ số

Nếu số mũ bằng 0 hoặc giá trị tuyệt đối của hệ số không bằng 1, chúng tôi sẽ thêm hệ số (có thể bao gồm một giá trị hàng đầu -). Mặt khác, chúng tôi nối thêm một -(nếu hệ số âm) hoặc không có gì.

!--e | c * c - 1 ? c : c < 0 ? '-' : _

Công thức thứ 3: biến và số mũ

Nếu số mũ là 0, chúng tôi sẽ không có gì. Nếu số mũ là 1, chúng tôi sẽ thêm x. Mặt khác, chúng tôi nối thêm x^theo số mũ.

e ? e - 1 ? 'x^' + e : 'x' : _

Điều này thất bại trong trường hợp này: [0,1,35,0], nó sẽ dẫn đầu với + x ^ 2
Makotosan

2
@Makotosan Cảm ơn bạn đã báo cáo điều này! Nên ổn bây giờ.
Arnauld

5

Stax , 37 byte

┴₧↕ê♦•Vªâÿσ9s╘dσ■à@@ⁿ■o─╦ñºº┌x╡ER▓ δ¿

Chạy và gỡ lỗi trực tuyến

Đây là phiên bản chưa được giải nén.

r{          reverse the input and map using block ...
  |c        skip this coefficient if it's falsy (zero)
  0<.+-@    sign char; e.g. '+'
  _|aYv i!+ abs(coeff)!=1 || i>0
    y$      str(abs(coeff)); e.g. '7'
    z       ""
  ?+        if-then-else, concatenate; e.g. '+7'
  "x^`i"    string template e.g. 'x^3' or 'x^0'
  iJ(T+     truncate string at i*i and trim. e.g. 'x^3' or ''
mr$         re-reverse mapped array, and flatten to string
c43=t       if it starts with '+', drop the first character
c0?         if the result is blank, use 0 instead

Chạy cái này


5

Python 3, 279 277 258 251 byte

k=str.replace
def f(x):
 z=len(x)
 y='--'*(['-1']==[c for c in x if'0'!=c][:1])
 for i,v in enumerate(x):
  p=str(z+~i)
  if v in'-1'and~i+z:y+='+x^'+p
  elif'0'!=v:y+='+'+v+'x^'+p
 return y and k(k(k(k(y[1:],'+-','-'),'^1',''),'x^0',''),'-+','-')or 0

Lấy đầu vào là một danh sách các chuỗi. Giải pháp này chưa được đánh giá cao. Điều này về cơ bản hoạt động bằng cách thay thế mọi thứ cho phù hợp với định dạng đầu ra, làm tăng cao số lượng byte.

Dùng thử trực tuyến!

Đặc biệt cảm ơn lò nướng và NK1406 .


Đã sửa tất cả các lỗi.
Manish Kundu

Bạn có thể sắp xếp lại bạn kiểm tra bình đẳng để thực hiện chúng if'0'!=iif'-1'==i.
Zacharý


@ovs cảm ơn rất nhiều
Manish Kundu



4

APL (Dyalog Classic) , 114 113 109 107 106 byte

{{⍵≡'':⍕0⋄⍵↓⍨'+'=⊃⍵}∊⍵{{'1x'≡2↑1↓⍵:¯1⌽1↓1⌽⍵⋄⍵}('-0+'[1+×⍺]~⍕0),∊(U/⍕|⍺),(U←⍺≠0)/(⍵>⍳2)/¨'x'('^',⍕⍵)}¨⌽⍳⍴⍵}

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

-4 byte nhờ @dzaima!

Điều này chắc chắn có thể được đánh golf xuống hơn nữa. Điều này đòi hỏi⎕IO←0


Cuối cùng tôi đã cạo hai byte đó ra ...
Zacharý 15/03/18

3

Pip , 78 byte

(RV(B."x^"._MERVg)J'+)R[`\b0[^+]+``x.0|\^1|^\++|\++$``\b1x``\++-?`][xx'x_@v]|0

Lấy các hệ số làm đối số dòng lệnh. Hãy thử trực tuyến!

Sử dụng ME(liệt kê bản đồ) và J(tham gia) để tạo ra một cái gì đó có dạng 0x^3+-1x^2+35x^1+0x^0, và sau đó một loạt các thay thế regex để chuyển đổi nó thành định dạng thích hợp.



3

Python 3, 161 162 byte

Đã sửa lỗi nhờ vào lò nướng.

l=len
lambda p:''.join(['+'*(i>0)*(c>0)+(str(c)[:-1],str(c))[abs(c)!=1or i==l(p)-1]+'x'*(i!=l(p)-1)+('^%d'%(l(p)+~i))*(i<l(p)-2)for i,c in enumerate(p)if c])or'0'

Mở rộng:

l=len # Alias the len function since we use it a lot
lambda p: ''.join([ # Join a list of strings
    '+'*(i>0)*(c>0) # Prepend a + if this isn't the first term and the coefficient is positive
    + (str(c)[:-1], str(c))[abs(c) != 1 or i == l(p) - 1] # If the coefficient is 1 and this isn't the last term, delete the '1' from the string representation, otherwise just use the string representation
    + 'x' * (i != l(p) - 1) # If this isn't the last term, append an x
    + ('^%d' % (l(p) + ~i)) * (i < l(p) - 2) # If this isn't one of the last two terms, append the exponent
for i, c in enumerate(p) if c]) # Iterating over each coefficient with its index, discarding the term if the coefficient is zero
or '0' # If all of the above resulted in an empty string, replace it with '0'

3

C # , 237 byte

c=>{var b=1>0;var r="";int l=c.Length;var p=!b;for(int i=0;i<l;i++){int n=c[i];int e=l-1-i;var o=p&&i>0&&n>0?"+":n==-1&&e!=0?"-":"";p=n!=0?b:p;r+=n==0?"":o+(e==0?$"{n}":e==1?$"{n}x":n==1||n==-1?$"x^{e}":$"{n}x^{e}");}return r==""?"0":r;}

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

3

Sạch sẽ , 172 byte

import StdEnv,Text
r=reverse
@""="0"
@a|a.[size a-1]<'0'=a+"1"=a
? -1="-"
?1=""
?a=a<+""
$l=join"-"(split"+-"(join"+"(r[?v+e\\v<-r l&e<-["","x":map((<+)"x^")[1..]]|v<>0])))

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


@BMO đã sửa lỗi tạm thời chờ chơi golf.
Οurous

3

Ngôn ngữ Wolfram / Mathicala, 39 byte

TraditionalForm@Expand@FromDigits[#,x]&

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

Hóa ra có một tích hợp để có được theo đúng thứ tự.

Giải pháp trước đây:

Ngôn ngữ Wolfram / Mathicala, 93 byte

StringReplace[StringRiffle[ToString/@InputForm/@MonomialList@FromDigits[#,x],"+"],"+-"->"-"]&

Ít nhất với tôi, điều này là cực kỳ dài đối với một ngôn ngữ được thiết kế cho thao tác toán học. Có vẻ như Expand@FromDigits[#,x]&nên hoạt động, nhưng thứ tự mặc định cho đa thức là mặt trái của những gì câu hỏi yêu cầu, vì vậy một số phần bổ sung được yêu cầu.

Giải trình

FromDigits[#,x]               converts input list to polynomial (technically converts to a number in base x)
MonomialList@                 gets list of terms of polynomial
InputForm/@                   converts each term to the form a*x^n
ToString/@                    then to a string version of that
StringRiffle[...,"+"]         joins using +'s
StringReplace[...,"+-"->"-"]& replaces +-'s with -'s

Không nên SringReplaceStringReplace?
Scott Milner

@ScottMilner Phải là một sai lầm khi tôi sao chép nó. Cảm ơn đã chú ý đến nó!
DanTheMan

3

Python3: 150 146 byte

f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'

(triển khai trước đó):

f=lambda l: ''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1] for i,a in zip(range(len(l)-1,-1,-1),l) if a).lstrip('+') or '0'

Bạn có thể thử trực tuyến

Thanh danh đến: @Benjamin


1
Arhg, có tôi! Bạn hạ nó xuống 4 bằng cách xóa một số khoảng trắng:f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Benjamin

3

Perl 5 -a , 94 byte

($_=shift@F)&&push@a,@a*!/-/>0&&'+',@F?s/\b1\b//r:$_,@F>0&&'x',@F>1&&'^'.@F while@F;say@a?@a:0

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


Dường như không hoạt động chính xác nếu hệ số cuối cùng (không đổi) là 1 hoặc -1.
nwellnhof

Đăng. Phải phá vỡ nó trong khi tôi đang chơi nó. Đã sửa nó với một vài byte nữa.
Xcali 17/03/18


2

Haskell , 166 163 byte

g s|l<-length s,v:w:r<-id=<<["- +"!!(1+signum m):(id=<<[show$abs m|abs m>1||e==0]++["x"|e>0]++['^':show e|e>1])|(e,m)<-zip[l-1,l-2..]s,m/=0]=[v|v>'+']++w:r|1<3="0"

Hãy thử trực tuyến! Ví dụ sử dụng: g [0,-1,35,0]sản lượng "-x^2+35x".


Giải pháp 166 byte trước đây, có thể đọc tốt hơn một chút:

0#n=show n
m#n=id=<<[show n|n>1]++"x":['^':show m|m>1]
m%0=""
m%n|n<0='-':m#(-n)|1<3='+':m#n
g s|l<-length s,v:m:r<-id=<<zipWith(%)[l-1,l-2..]s=[v|v>'+']++m:r|1<3="0"

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


2

Ruby , 111 byte

->a{i=a.size;s=a.map{|x|i-=1;"%+d"%x+[?x,"x^#{i}",""][i<=>1]if x!=0}*'';s[0]?s.gsub(/(?<!\d)1(?=x)|^\+/,""):?0}

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

Việc giải quyết vấn đề này trong Ruby hóa ra hơi khó chịu, chủ yếu là do thực tế là không giống như hầu hết các ngôn ngữ, trong Ruby (hầu như) mọi thứ đều là sự thật, bao gồm cả chuỗi 0 và chuỗi rỗng, do đó, ngay cả một kiểm tra đơn giản về số 0 cũng không xuất hiện càng ngắn càng tốt x?.

Tôi đã chơi với nhiều phương pháp xây dựng chuỗi khác nhau và cuối cùng giải quyết được một số cách tiếp cận:

  • Các điều khoản có 0 hệ số được loại bỏ bằng cách sử dụng một điều kiện đơn giản
  • +-các dấu hiệu được tạo ra bằng cú pháp định dạng với dấu hiệu bắt buộc:%+d
  • Các hình thức chính xác hoặc x^iđược chọn bằng cách sử dụng lập chỉ mục toán tử tên lửa[...][i<=>1]
  • Hàng đầu + và 1-s không cần thiết được xóa bằng thay thế regex

2

Husk , 44 43 41 40 byte

|s0Ψf¤|□ṁ`:'+f¹zμ+↓s²_&ε²¹↑□¹+"x^"s)¹m←ṡ

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

Điều này cảm thấy một chút lộn xộn; Husk không được tối ưu hóa cho thao tác chuỗi. Tôi mượn một số ý tưởng từ câu trả lời Stax .

Giải trình

         Implicit input, say L = [2,-3,0,-1].
         First we compute the exponents.
ṡ        Reversed indices: [4,3,2,1]
m←       Decrement each: [3,2,1,0]
         Then we format the individual terms of the polynomial.
zμ...)¹  Zip with L using two-argument lambda:
          Arguments are coefficient and index, say C = -3 and I = 2.
+"x^"s    Convert I to string and concatenate to "x^": "x^2"
↑□¹       Take first I*I characters (relevant when I = 0 or I = 1): "x^2"
_&ε²¹     Check if abs(C) <= 1 and I != 0, negate; returns -1 if true, 0 if false.
↓s²       Convert C to string and drop that many elements (from the end, since negative).
          Result: "-3"
          The drop is relevant if C = 1 or C = -1.
+         Concatenate: "-3x^2"
         Result of zipping is ["2x^3","-3x^2","x","-1"]
f¹       Keep those where the corresponding element of L is nonzero: ["2x^3","-3x^2","-1"]
         Next we join the terms with + and remove extraneous +s.
ṁ        Map and concatenate
`:'+      appending '+': "2x^3+-3x^2+-1+"
Ψf       Adjacent filter: keep those chars A with right neighbor B
¤|□       where at least one of A or B is alphanumeric: "2x^3-3x^2-1"
|s0      Finally, if the result is empty, return "0" instead.

2

Perl 6 , 97 byte

{$!=+$_;.map({('+'x?($_&&$++&$_>0)~.substr(--$!&&2>.abs)~(<<''x>>[$!]//'x^'~$!))x?$_}).join||'0'}

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

Giải trình:

$!=+$_;

$! theo dõi số mũ hiện tại.

'+'x?($_&&$++&$_>0)

Thêm vào +trước các hệ số dương, trừ khi đó là hệ số khác không đầu tiên. Các $_&&ngắn mạch đảm bảo rằng các biến trạng thái ẩn danh $chỉ được tăng lên cho phi zero-hệ số. Các &ngã ba đang sụp đổ khi bị cưỡng chế Bool với ?.

.substr(--$!&&2>.abs)

Giảm dần $!. Cắt 1 hoặc -1 hệ số trừ khi nó không đổi.

<<''x>>[$!]//'x^'~$!

Trường hợp đặc biệt tuyến tính và điều khoản không đổi. Sử dụng << >> cấu trúc bảo vệ trích dẫn ngắn hơn một byte so với tương đương ('','x')hoặc 2>$!??'x'x$!!!'x^'~$!.

x?$_

Ẩn các thuật ngữ bằng không, nhưng luôn đánh giá biểu thức trước cho --$!hiệu ứng phụ.

||'0'

Trả về 0nếu tất cả các hệ số bằng không.


2

Java 8, 202 176 174 173 byte

a->{String r="";int j=a.length;for(int i:a)r+=i==0*j--?"":"+"+i+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("(\\D)1x","$1x");}
  • 26 byte nhờ @Nevay .

Giải trình:

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

a->{                     // Method with String-array parameter and String return-type
  String r="";           //  Result-String, starting empty
  int j=a.length;        //  Power-integer, starting at the size of the input-array
  for(int i:a)           //  Loop over the array
    r+=i==0              //   If the current item is 0
           *j--?         //   (And decrease `j` by 1 at the same time)
        ""               //    Append the result with nothing
       :                 //   Else:
        "+"              //    Append the result with a "+",
        +i               //    and the current item,
        +(j<1?           //    +If `j` is 0:
           ""            //      Append nothing more
          :j<2?          //     Else-if `j` is 1:
           "x"           //      Append "x"
          :              //     Else:
           "x^"+j);      //      Append "x^" and `j`
  return r.isEmpty()?    //  If `r` is still empty
    "0"                  //   Return "0"
   :                     //  Else:
    r.substring(1)       //   Return the result minus the leading "+",
     .replace("+-","-")  //   and change all occurrences of "+-" to "-",
     .replaceAll("(\\D)1x","$1x");}
                         //   and all occurrences of "1x" to "x"

1
176 byte:a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
Nevay 17/03/18

1
@Nevay Bây giờ tôi chỉ nhận ra tất cả các đầu vào là số nguyên .. Tôi đã sử dụng đầu vào Chuỗi vì tôi nghĩ đầu vào thập phân cũng được cho phép ..>.> Dù sao, cảm ơn vì -26 byte. Và tôi đã có thể chơi gôn thêm 2 bằng cách đổi (j^j--)sang 0*j--.
Kevin Cruijssen 17/03/18

2

Python, 165 byte

lambda a:"".join([("+"if c>0 and i+1<len(a)else"")+(str(c)if i==0 or abs(c)!=1 else "")+{0:"",1:"x"}.get(i,"x^"+str(i))for i,c in enumerate(a[::-1])if c][::-1])or"0"

1

PHP, 213 byte

$p=0;for($i=count($a=array_reverse(explode(',',trim($argv[1],'[]'))))-1;$i>=0;$i--)if(($b=(float)$a[$i])||(!$i&&!$p)){$k=abs($b);echo ($b<0?'-':($p?'+':'')).((($k!=1)||!$i)?$k:'').($i>1?'x^'.$i:($i?'x':''));$p=1;}

Đối số dòng lệnh theo yêu cầu của OP (đối số đơn có dấu ngoặc và dấu phẩy).

Bản in đẹp và một số giải thích:

$p = false; /* No part of the polynomial has yet been printed. */
for ($i = count($a = array_reverse(explode(',',trim($argv[1],'[]')))) - 1; $i >= 0; $i--)
{
    $b = (float)$a[$i]; /* Cast to float to avoid -0 and numbers like 1.0 */
    if (($b != 0) or (($i == 0) and !$p)) /* Print, if $b != 0 or the constant if there is no part until here. */
    {
        $k = abs($b);
        echo ($b < 0 ? '-' : ( $p ? '+' : '')); /* Sign. The first sign is suppressed (if $p is false) if $b positive. */
        echo ((($k != 1) || ($i == 0)) ? $k : '');  /* Coefficient */
        echo ($i > 1 ? 'x^' . $i : (($i != 0) ? 'x' : ''));  /* x^3, x^2, x, constant with empty string. */
        $p = true; /* Part of the polynomial has been printed. */
    }
}

1

PowerShell, 295 byte

$c=$args[0]
$p=$c.length-1
$i=0
$q=""
while($p -ge 0){$t="";$e="";$d=$c[$i];switch($p){0{$t=""}1{$t="x"}Default{$t="x^";$e=$p}}if($d-eq 0){$t=""}elseif($d-eq 1){$t="+$t$e"}elseif($d-eq-1){$t="-$t$e"}elseif($d-lt 0 -or$i -eq 0){$t="$d$t$e"}else{$t="+$d$t$e"}$q+=$t;$i++;$p--}if($q -eq""){$q=0}
$q
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.