Các số nguyên tố khác ngoài Optimus


36

Thử thách

Cho một số nguyên đầu vào n > 0, xuất số lượng số nguyên tố ( khác với n, nếu nchính nó là số nguyên tố) có thể được tạo ra bằng cách thay đổi một chữ số trong khai triển thập phân của n (mà không thay đổi số chữ số).

Ví dụ

Ví dụ , n = 2. Bằng cách thay đổi một chữ số trong phần mở rộng thập phân của 2, chúng ta có thể đưa ra ba số nguyên tố bổ sung 3, 5, 7, do đó a(n) = 3.

Cho một ví dụ khác , n = 13. Bằng cách thay đổi một chữ số, bạn có thể nhận được các số nguyên tố 11, 17, 19, 23, 43, 53, 73, 83, vì vậy a(13) = 8.

Đối với một ví dụ cuối cùng , n = 20. Bằng cách thay đổi một chữ số, bạn có thể nhận được các số nguyên tố 23, 29, vì vậy a(20) = 2.

Trình tự

Dưới đây là 20 điều khoản đầu tiên để bạn bắt đầu. Đây là OEIS A048853 .

4, 3, 3, 4, 3, 4, 3, 4, 4, 4, 7, 4, 8, 4, 4, 4, 7, 4, 7, 2

Quy tắc

  • Đầ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 đưa ra trong bất kỳ định dạng thuận tiện .
  • Bỏ qua các số 0 đứng đầu (ví dụ, 03không phải là số nguyên tố theo công thức này).
  • 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ó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở 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.

4
Tôi đang cố gắng nghĩ về cái nhỏ nhất nmà đầu ra là 0. Tôi nghĩ đó là n = 200. Tôi cũng nghĩ rằng họ đến trong chùm: 200,202,204,206,208, 320,322,...,328, 510,...,518, 620,...628, 840,...,848,, vv
Kỹ sư Toast

"Đầu vào và đầu ra có thể được coi là phù hợp với loại số nguyên gốc của ngôn ngữ của bạn" nói rằng chúng tôi không được phép lấy đầu vào dưới dạng chuỗi?
Dead Possum

1
@DeadPossum Không, điều đó được cho phép. Chỉ là bạn không cần lo lắng về 2 ^ 100 làm đầu vào nếu bạn chỉ đang sử dụng số nguyên 32 bit.
admBorkBork

Hãy cho tôi biết nếu tôi quá nhiệt tình ... Tôi có 3 bài nộp khác nhau
Patrick Roberts

2
@EngineerToast Sau khi tìm thấy ví dụ đầu tiên (294001), cuối cùng tôi đã nghĩ đến việc tìm kiếm nó trên OEIS: A192545A158124 . Cũng liên quan: A143641 .
Ørjan Johansen

Câu trả lời:


10

05AB1E , 17 16 14 11 byte

ā°`<Ÿʒ.L}pO

Giải trình:

ā             Push inclusive range from 1 to the length of the input
 °            Raise 10 to the power of each element
  `           Push each element to the stack
   <          Decrement the topmost element
    Ÿ         Inclusive range
              For 13, this creates an array like [10 11 12 13 14 .. 98 99]
     ʒ.L}     Only keep elements with a levenshtein distance to the input of
              exactly one
         p    Check each element for primality
          O   Sum

Hãy thử trực tuyến! hoặc lên tới 100 .


1
.L? Nghiêm túc? .L?!?!
Erik the Outgolfer

@EriktheOutgolfer L.
Okx

Ý tôi là, có một tích hợp cho khoảng cách levenshtein!
Erik the Outgolfer

@EriktheOutgolfer ¯ \ _ (ツ) _ /
Okx

Tôi biết đã được một lúc, nhưng bạn có thể loại bỏ <để lưu một byte. Ngay cả khi bộ lọc không loại bỏ 100/ 1000/ 10000/ v.v., dù sao nó cũng không bao giờ là số nguyên tố nên sẽ không ảnh hưởng đến đầu ra.
Kevin Cruijssen

5

Python 2 , 146 136 127 121 118 byte

Cảm ơn @ Mr.Xcoder đã góp ý

lambda I:sum(all(i%v for v in range(2,i))*sum(z!=x for z,x in zip(I,`i`))==1for i in range(1+10**~-len(I),10**len(I)))

Giải trình:

Tạo các số có độ dài bằng với độ dài đầu vào, bỏ qua đầu tiên (1,10,100,1000, ...)

for i in range(1+10**~-len(I),10**len(I))

Kiểm tra xem số được tạo khác với đầu vào chỉ bằng một chữ số

sum(z!=x for z,x in zip(I,`i`))==1

Kiểm tra nguyên tố

all(i%v for v in range(2,i))

Đếm

sum(...)    

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


Có thể ngắn hơn để không biến nó thành lambda, và làm r=range, vì bạn sử dụng nó nhiều lần ...?
Stewie Griffin

1
Điều này làm việc cho những thứ như thế 143nào? Bởi vì tôi thấy range(1,10), điều đó không bao gồm 0, và 103là chính
Ông Xcoder

@ Mr.Xcoder đã được sửa
Dead Possum

1
Bạn không cần 0trong r(0,10). r(10)đủ.
Ông Xcoder

1
Ngoài ra, tôi đề nghị đặt nó như vậy:lambda I,r=range:
Ông Xcoder

4

Javascript (ES6) 148 byte

Lấy đầu vào dưới dạng chuỗi và trả về dưới dạng số

n=>(n.replace(/./g,"$`a$' ").split` `.map(s=>s&&[..."0123456789"].map(d=>r+=+(t=s.replace(/a/,d))[0]&&t^n&&(p=v=>t>1&(--v<2||t%v&&p(v)))(t)),r=0),r)

Đoạn mã ví dụ:

f=
n=>(n.replace(/./g,"$`a$' ").split` `.map(s=>s&&[..."0123456789"].map(d=>r+=+(t=s.replace(/a/,d))[0]&&t^n&&(p=v=>t>1&(--v<2||t%v&&p(v)))(t)),r=0),r)

for(var k=1;k<=20;k++)
  o.innerText+=f(""+k)+" "
<pre id=o></pre>



3

Toán học, 105 byte

F=Count[Range[f=IntegerDigits;g=10^Length@f@#/10,10g],n_/;PrimeQ@n&&MatchQ[f@n-f@#,{x=0...,_,x}]&&n!=#]&;

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

Functionmà mong đợi một số nguyên dương #. Đặt fbằng với hàm IntegerDigitstrả về danh sách các chữ số của đầu vào. Chúng tôi lấy Rangetừ gđến 10g(bao gồm), nơi g=10^Length@f@#/10là sức mạnh lớn nhất của 10nhỏ hơn hoặc bằng đầu vào #, sau đó Countcác nví dụ đó PrimeQ@n&&MatchQ[f@n-f@#,{x=0...,_,x}]&&n!=#. PrimeQ@nkiểm tra xem có phải nlà số nguyên tố hay không, MatchQ[f@n-f@#,{x=0...,_,x}]kiểm tra xem sự khác biệt giữa danh sách các chữ số của n#có phải là biểu mẫu {0..., _, 0...}hay không và n!=#đảm bảo rằng có n#không Unequal.


3

JavaScript (ES6), 153 142 139 byte

n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)

Chấp nhận đầu vào dưới dạng một chuỗi. Hành vi không xác định cho đầu vào không hợp lệ, mặc dù nó sẽ chấm dứt mà không có lỗi trên bất kỳ chuỗi nào tôi có thể nghĩ đến. Không nhất thiết là trước cái chết nóng của vũ trụ, đặc biệt là đối với các chuỗi dài.

Bản giới thiệu

f=
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
console.log([...''+1e19].map((_,i)=>f(i+1+'')).join())
i.onchange=()=>console.log(f(i.value))
<input id=i>

Cải tiến

Đã lưu 11 byte bằng cách cấu trúc lại các reduce()cuộc gọi thành map()các cuộc gọi và bằng cách sao chép ngầm định mảng atrong tham số hàm, thay vì trong ngữ cảnh của splice()cuộc gọi.

Đã lưu 3 byte nhờ đề xuất của @Neil để chuyển đổi [...Array(10)]sang [...''+1e9].

Mã chưa hoàn thành

input => (
  [...input].map(
    (char, decimal, [...charArray]) =>
      [...'' + 1e9].map(
        (unused, digit) => sum +=
          digit + decimal && digit != char ?
            prime(
              (
                charArray.splice(decimal, 1, digit)
                , charArray.join``
              )
            ) :
            0
      )
    , sum = 0
    , prime = test => eval('for(factor = test; test % --factor;); factor == 1')
  )
  , sum
)

Giải trình

Hàm sử dụng hai cấp độ map()để tổng số lượng hoán vị vượt qua bài kiểm tra tính nguyên thủy, được mượn và sửa đổi từ câu trả lời này .

(Câu trả lời gốc)

reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)

Vì vậy, ví dụ, để tính tổng của một mảng, bạn sẽ vượt qua một initialValuesố 0, và trả về một aggregateđến bình đẳng accumulator + currentValue. Thay đổi cách tiếp cận này một chút, thay vào đó, chúng tôi tính toán số lượng hoán vị vượt qua bài kiểm tra nguyên thủy:

reduce(
  (passedSoFar, currentDecimal, currentIndex, digitArray) =>
    isValidPermutation() ?
      passedSoFar + prime(getPermutation()) :
      passedSoFar
  , 0
)

Đó thực chất là phần bên trong reduce(), lặp đi lặp lại tất cả các hoán vị của digitArraybằng cách thay đổi từng decimalphần cụ thể permutatedDigit. Sau đó, chúng ta cần một cái bên ngoài reduce()để lặp lại tất cả những gì có thể permutatedDigitđể thay thế từng cái decimal, chỉ là 0-9.

Bất thường trong thực hiện

[...''+1e9].map((u,j)=>...là con đường ngắn nhất @Neil có thể nghĩ ra để lặp một cuộc tranh cãi 0qua 9. Nó là tốt hơn để làm như vậy với u, nhưng ukhông hữu ích cho từng phần tử trong mảng, trong trường hợp này.

i+jtrong điều kiện ternary kiểm tra để đảm bảo rằng đó 0không phải là một hoán vị có thể có của chữ số hàng đầu, theo thông số kỹ thuật thách thức. j!=cđảm bảo rằng bản gốc nkhông phải là một ứng cử viên để trải qua bài kiểm tra nguyên thủy.

(a.splice(i,1,j),a.join``)là một mớ hỗn độn. splice()thay thế chữ số tại decimal == ibằng permutatedDigit == j, nhưng vì splice()trả về các phần tử bị loại bỏ (trong trường hợp này, sẽ bằng [a[i]]) thay vì mảng đã sửa đổi, chúng ta phải sử dụng toán tử dấu phẩy để chuyển mảng đã sửa đổi asang kiểm tra tính nguyên thủy, nhưng không phải trước khi nhập join()nó thành một chuỗi số.

Cuối cùng, eval()là để lưu một byte kể từ khi so sánh với cách tiếp cận chính tắc hơn, nó ngắn hơn:

q=>eval('for(k=q;q%--k;);k==1')

q=>{for(k=q;q%--k;);return k==1}

Tham chiếu đến kiểm tra chính pđược khởi tạo trong một đối số không được sử dụng cho map()cuộc gọi.


Tôi nghĩ rằng các trang lời khuyên nói [...''+1e9]là ngắn hơn.
Neil

2

Python 2 , 134 byte

lambda x,r=range,l=len:sum(~-f*(~-l(x)==sum(`f`[t]==x[t]for t in r(l(x))))and all(f%v for v in r(2,f))for f in r(10**~-l(x),10**l(x)))

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

Phiên bản thanh lịch hơn, dài hơn:

lambda x,r=range,l=len:l(filter(lambda f:(~-f*(~-l(x)==sum(`f`[t]==x[t]for t in r(l(x)))))*all(f%v for v in r(2,f)),r(10**~-l(x),10**l(x))))

Đầu vào được lấy dưới dạng Chuỗi.


Giải thích (phiên bản cũ hơn)

  • lambda x,r=range,l=len:- Xác định lambda với tham số String xvà hai tham số không đổir=rangel=len.

  • sum(1...) - Nhận độ dài, giúp tiết kiệm hơn 1 byte len([...]) .

  • for f in r(10**~-l(x),10**l(x))- Tạo hoàn toàn tất cả các số có cùng độ lớn với đầu vào (mong đợi 0). Chẳng hạn, một đầu vào của3 , sẽ dẫn đến [1, 2, 3, 4, 5, 6, 7, 8, 9].

  • sum(1for t in r(l(x))if`f`[t]==x[t])==~-l(x)and f>1 - Kiểm tra xem số hiện tại có chính xác 1 chữ số so với đầu vào không và nó có cao hơn 1 không.

  • all(f%v for v in r(2,f)) - Kiểm tra nếu số hiện tại là số nguyên tố.


1
Bạn thay đổi sum(1for..ifBOOL)để sum(BOOLfor)tiết kiệm một số byte
Dead Possum

Chúng ta có được phép lấy đầu vào dưới dạng chuỗi không? Nhìn vào "Đầu vào và đầu ra có thể được coi là phù hợp với kiểu số nguyên gốc của ngôn ngữ của bạn" Tôi không chắc chắn
Dead Possum

@DeadPossum Một số câu trả lời làm. Tại sao nó không được phép?!
Ông Xcoder

Tôi đã hết phiếu cho ngày hôm nay, nhưng sẽ càng sớm càng tốt: D
Dead Possum

@DeadPossum Chắc chắn. Đừng quên hoặc tôi sẽ ping bạn! ( </joke>)
Ông Xcoder

1

JavaScript (ES6), 137 byte

i=(a=prompt()).length;s=0;while(i--)for(j=0;j<=9;j++){(b=[...a]).splice(i,1,j);k=b=b.join('');while(b%--k);s+=i+j&&a[i]!=j&&k==1}alert(s)

Điều chỉnh câu trả lời khác của tôi thành một bản đệ trình toàn chương trình bằng các phương thức API Web prompt()alert().


1

Bean , 126 byte

00000000: a64d a065 8050 80a0 5d20 8001 a64d a06f  ¦M e.P. ] ..¦M o
00000010: 8025 39b5 cb81 2065 27a6 4da0 6680 2581  .%9µË. e'¦M f.%.
00000020: 0035 cb81 2066 27a6 53d0 80cd a05e 8043  .5Ë. f'¦SÐ.Í ^.C
00000030: cf20 5d00 2080 82a0 65a5 3a20 66a6 4da0  Ï ]. .. e¥: f¦M 
00000040: 6780 4da0 5e80 53d0 80a0 5e20 807b 2300  g.M ^.SÐ. ^ .{#.
00000050: b5cc a05e 8f4b c120 6728 264d a06f 814e  µÌ ^.KÁ g(&M o.N
00000060: cecc a065 8b20 6681 4cd0 84a0 5d20 6581  ÎÌ e. f.LÐ. ] e.
00000070: 2066 814c a067 8025 3a26 206f b130        f.L g.%:& o±0

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

Một sự thích ứng của việc gửi JavaScript toàn chương trình của tôi .

Tương đương JavaScript

i=a.length
s=0
while(i--){
  j=10
  while(j--){
    (b=[...a]).splice(i,1,j)
    k=b=b.join('')
    while(b%--k);
    s+=i+j&&a[i]!=j&&k==1
  }
}
s

Giải trình

ađược khởi tạo ngầm định là dòng đầu vào đầu tiên dưới dạng một chuỗi và câu lệnh cuối cùng slà đầu ra ngầm định, chứa tổng các hoán vị nguyên tố.


1

Husk , 32 byte

Lof§&ȯ=1Σzo±≠d⁰o=Ld⁰L↑o≤Ld⁰Lmdİp

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

Ungolfed / Giải thích

                              İp  -- get all primes
                            md    -- and convert them to list of digits
                     ↑o≤   L      -- take as long as the lenghth of these digit lists are ≤ ..
                        Ld⁰       -- .. the number of digits of input 
 of                               -- from those primes filter:
               o=Ld⁰L             --   same number of digits as input
   §&                             --   and
        Σz                        --   the number of..
          o±≠d⁰                   --   .. digits that differ from input digits ..
     ȯ=1                          --   .. must be one
L                                 -- finally count them


1

PHP , 151 147 141 140 136 134 129 128 byte

-6 byte nhờ @Einacio; -1 byte nhờ @Titus

<?php for($i=$m=10**strlen($n=$argv[1]);$i-->$m/10;)if(levenshtein($n,$i)==$f=$t=1){while($t<$i)$f+=$i%$t++<1;$c+=$f==2;}echo$c;

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

Được định dạng, với ý kiến:

<?php
// Work through each integer with the same number of digits as the input $argv[1].
for ($i = $m = 10 ** strlen($n = $argv[1]); $i-- > $m / 10;)
    // Is it exactly one digit different from the input?
    if (levenshtein($n, $i) == $f = $t = 1) {
        // Count its factors.
        while ($t < $i) $f += $i % $t++ < 1;
        // If there are exactly 2 factors then it's a prime, so increment the counter.
        $c += $f == 2;
    }
// Print the final count.
echo $c;

Để giữ nó ngắn nhất có thể, tôi đã:

  • bài tập kết hợp $f = $t = 1 ;
  • snook trong một ++gia số như là một phần của biểu thức khác $f += $i % $t++ == 0(gia số được thực hiện sau khi hoạt động mô đun và do đó không ảnh hưởng đến kết quả của nó);
  • và thay vì sử dụng một ifcâu lệnh cho gia số có điều kiện đã sử dụng thực tế là boolean true khi được sử dụng như một số nguyên trở thành 1, sử dụng $c += $f == 2;chứ không phải if ($f == 2) $c++;.

1
bạn không cần xác định $ c, nó được tính là 0 trên lần đầu tiên + =
Einacio

@Einacio Luật chơi golf là gì? Điều đó có được phép không, vì nó đưa ra một thông báo cảnh báo biến không xác định?
WebSmithery

@Einacio Rõ ràng bất kỳ đầu ra nào cho STDERR đều có thể bị bỏ qua, vì vậy cảm ơn bạn đã gợi ý.
WebSmithery

1
+1 để sử dụng levenshtein. Ý kiến ​​hay! $i%$t++<1ngắn hơn $i%$t++==0.
Tít


0

PHP, 100 + 1 byte

for(;~($a=$argn)[$i];$i++)for($d=-!!$i;$d++<9;$c+=$k==1)for($a[$i]=$d,$k=$a;--$k&&$a%$k;);echo$c-$i;

Chạy như ống với -nRhoặc thử trực tuyến .

phá vỡ

for(;~($n=$argn)[$i];$i++)  # loop through argument digits, restore $n in every iteration
    for($d=-!!$i;               # loop $d from 0 (1 for first digit)
        $d++<9;                 # ... to 9
        $c+=$k==1                   # 3. if divisor is 1, increment counter
    )
        for($n[$i]=$d,              # 1. replace digit
            $k=$n;--$k&&$n%$k;      # 2. find largest divisor of $n smaller than $n
        );
echo$c-$i;                  # print counter - length

0

Java 8, 201 194 byte

n->{String s=n+"";int r=0,i=0,j,k,t,u,l=s.length();for(;i<l;i++)for(j=0;++j<10;r+=n==u|t<2?0:1)for(u=t=new Integer(s.substring(0,i)+j+(i<l?s.substring(i+1):"")),k=2;k<t;t=t%k++<1?0:t);return r;}

Giải trình:

Hãy thử nó ở đây.

n->{                        // Method with integer as parameter and return-type
  String s=n+"";            //  String representation of the input-int
  int r=0,                  //  Result-integer
      i=0,j,k,              //  Index-integers
      t,u,                  //  Temp integers
      l=s.length();         //  Length of the String
  for(;i<l;i++)             //  Loop (1) from 0 to `l` (exclusive)
    for(j=0;++j<10;         //   Inner loop (2) from 1 to 10 (exclusive)
        r+=                 //     And after every iteration, raise the result by:
           n==u             //      If the current number equals the input
           |t<2?            //      or it is not a prime:
            0               //       Add nothing to the result-counter
           :                //      Else:
            1)              //       Raise the result-counter by one
      for(                  //    Inner loop (3)
          u=t=              //     First set both `u` and `t` to:
              new Integer(  //      Convert the following String to an integer: 
               s.substring(0,i)
                            //       Get the substring from 0 to `i` (exclusive)
               +j           //       + `j`
               +(i<l?       //       + If `i` is smaller than the String-length:
                  s.substring(i+1)
                            //          The substring from 0 to `i` (inclusive)
                 :          //         Else:
                  "")),     //          Nothing
          k=2;              //     And start `k` at 2
              k<t;          //     Continue looping as long as `k` is smaller than `t`
        t=t%k++<1?          //     If `t` is divisible by `k`:
           0                //      Change `t` to 0
          :                 //     Else:
           t                //      Leave `t` as is
      );                    //    End of inner loop (3)
                            //    (`t` remained the same after loop 3? -> It's a prime)
                            //   End of inner loop (2) (implicit / single-line body)
                            //  And of loop (1) (implicit / single-line body)
  return r;                 //  Return the result-counter
}                           // End of method

new Integer(s.substring(0,i)+j+(i<l?s.substring(i+1):"") sẽ dẫn đến các số nguyên này:

Dành cho 0-9: 1, 2, 3, 4, 5, 6, 7, 8, 9.
Dành cho 10: 10, 20, 30, 40, 50, 60, 70, 80, 90, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19.
Dành cho 11: 11, 21, 31, 41, 51, 61, 71, 81, 91, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19.
v.v.


0

JavaScript (ES7), 118 byte

Đưa đầu vào dưới dạng một chuỗi.

n=>[...2**29+'4'].map(d=>n.replace(/./g,c=>s+=d+i>0&(P=k=>N%--k?P(k):N-n&&k==1)(N=p+d+n.slice(++i),p+=c),i=p=0),s=0)|s

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

Đã bình luận

n =>                        // n = input number (as a string)
  [...2**29 + '4']          // generate "5368709124" (all decimal digits)
  .map(d =>                 // for each digit d in the above string:
    n.replace(/./g, c =>    //   for each digit c in n:
      s +=                  //     increment s if the following code yields 1:
        d + i > 0 & (       //       if this is not the first digit of n or d is not "0":
          P = k =>          //         P = recursive function taking k and using N:
            N % --k ?       //           decrement k; if k is not a divisor of N:
              P(k)          //             do recursive calls until it is
            :               //           else:
              N - n &&      //             return true if N is not equal to n
              k == 1        //             and k is equal to 1 (i.e. N is prime)
          )(                //         initial call to P ...
            N =             //           ... with N defined as:
              p +           //             the current prefix p
              d +           //             followed by d
              n.slice(++i), //             followed by the trailing digits
                            //             (and increment the pointer i)
            p += c          //           append c to p
          ),                //         end of initial call
          i = p = 0         //         start with i = p = 0
    ),                      //   end of replace()
    s = 0                   //   start with s = 0
  ) | s                     // end of map(); return s

0

Ruby với -rprime, 101 byte

-rprime10ftôioor(tôiog10n)+1n

->n{d=n.digits;Prime.each(10**l=d.size).count{|x|d.zip(e=x.digits).count{|a,b|a==b}==l-1&&e.size==l}}

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

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.