Đó là một nhiệm vụ hàng năm, được rồi


22

Cho số 1≤n≤365, xuất ngày thứ n trong năm ở định dạng "Tháng thứ năm". Ví dụ: đã cho 1, bạn nên xuất "ngày 1 tháng 1", không có "của".

Lịch Gregorian sẽ được sử dụng và chương trình không nên tính đến năm nhuận, vì vậy chương trình của bạn sẽ không bao giờ xuất ra "ngày 29 tháng 2" trong mọi trường hợp. Bất kỳ phương pháp nào cũng có thể được sử dụng, miễn là tuân theo định dạng "Tháng thứ năm" được đề cập trước đó. Chương trình của bạn cũng phải xuất các số thứ tự một cách chính xác, có nghĩa là nó phải luôn luôn xuất thứ 1, 2, 3, nên 1, 2 hoặc 3 tương ứng là số ngày cho bất kỳ đầu vào nào. Không gian hàng đầu hoặc thụt đầu dòng khác được cho phép.

Đây là mã golf, vì vậy giải pháp ngắn nhất của các nhân vật sẽ thắng.

Các trường hợp thử nghiệm:

1 gives 1st January
2 gives 2nd January
3 gives 3rd January
365 gives 31st December
60 gives 1st March
11 gives 11th January

4
Ngoài ra, bạn có cần buộc một thông báo lỗi trên các số> 365 không? Chương trình có thể cho rằng đó là đầu vào không hợp lệ và nó sẽ không cần phải xử lý điều đó?
R

5
Vì không phải ai cũng là người nói tiếng Anh bản địa, bạn có thể muốn thêm các ngày đó là 11, 12 và 13 lấy "th", các số kết thúc bằng "1" get "st", "2" get "nd", "3" nhận "thứ" và tất cả những thứ khác nhận được "thứ".
Adám

9
Whoa, đừng chấp nhận câu trả lời quá nhanh. Đặc biệt không trả lời sai !
Adám

6
Bạn nên thêm ít nhất 11(11 ngày tháng giêng) và 21(21 st tháng Giêng) với các trường hợp thử nghiệm.
Arnauld

1
Và trong khi bạn đang chỉnh sửa các trường hợp thử nghiệm, có thể chỉ định chính xác định dạng trường hợp thử nghiệm của bạn là gì. Một vài người trả lời đã nghĩ rằng đó 123=là một phần của đầu ra cần thiết. Hoặc chỉ cần chỉnh sửa các trường hợp thử nghiệm của bạn để đọc một cái gì đó như: 365cho31st December
Adám

Câu trả lời:


9

PHP ,38 40 30 28 byte

<?=date("jS F",86399*$argn);

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

Chạy với php -nFđầu vào là từ STDIN. Ví dụ (tập lệnh trên có tên y.php):

$ echo 1|php -nF y.php
1st January
$ echo 2| php -nF y.php
2nd January
$ echo 3| php -nF y.php
3rd January
$ echo 11|php -nF y.php
11th January
$ echo 21|php -nF y.php
21st January
$ echo 60|php -nF y.php
1st March
$ echo 365|php -nF y.php
31st December

Giải trình

Xây dựng dấu thời gian kỷ nguyên cho ngày mong muốn vào năm 1970 (thuận tiện không phải là năm nhuận) bằng cách nhân day number * number of seconds per day(86400). Tuy nhiên, điều này sẽ mang lại kết quả cao hơn một ngày vì vậy thay vào đó nhân với number of seconds in a day - 1(86399), với phạm vi số đầu vào (1≤n≤365) sẽ dẫn đến dấu thời gian vào cuối mỗi ngày chính xác. Sau đó, chỉ cần sử dụng định dạng ngày dựng sẵn của PHP cho đầu ra.


tại sao -ncần thiết
Ven

@Ven có thể không phải trong mọi trường hợp, nhưng chỉ vô hiệu hóa mọi cài đặt trong php.ini cục bộ có thể tạo ra hành vi không nhất quán.
640KB

6

Thạch ,  79 78  77 byte

-1 sửa lỗi :) (không nên chuyển đổi trước để tìm chỉ mục, nên đảo ngược sau, nhưng sau đó chúng ta có thể theo đuôi thay vì đầu)
-1 bằng cách sử dụng phản xạ ( ⁽©ṅB+30_2¦2-> ⁽0ṗb4+28m0)

⁽0ṗb4+28m0SRṁRƲœiµṪȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤$K

Một chương trình đầy đủ in kết quả

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

Làm sao?

sẽ cập nhật điều này sau ...

⁽©ṅB+30_2¦2SRṁRƲZœiµḢȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“...»Ḳ¤$K - Main Link: integer, n
⁽©ṅB+30_2¦2SRṁRƲZœi - f(n) to get list of integers, [day, month]
⁽©ṅ                 - compressed literal 2741
   B                - to a list of binary digits -> [ 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]
    +30             - add thirty                    [31,30,31,30,31,30,31,31,30,31,30,31]
         ¦          - sparse application...
        2           - ...to indices: [2]
       _  2         - ...action: subtract two       [31,28,31,30,31,30,31,31,30,31,30,31]
               Ʋ    - last four links as a monad - i.e. f(x):
           S        -   sum x                       365
            R       -   range                       [1..365]
              R     -   range x (vectorises)        [[1..31],[1..28],...]
             ṁ      -   mould like                  [[1..31],[32..59],...]
                Z   - transpose                     [[1,32,...],[2,33,...],...]
                 œi - 1st multi-dimensional index of n  -> [day, month]

µḢȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“...»Ḳ¤$K - given [day, month] format and print
µ                                  - start a new monadic chain - i.e. f(x=[day, month])
 Ḣ                                 - head -- get the day leaving x as [month])
  Ȯ                                - print it (with no newline) and yield it
   %30                             - modulo by thirty
      %20                          - modulo by twenty
         «4                        - minimum of that and four
                     ¤             - nilad followed by link(s) as a nilad:
            “nḄƲf⁷»                -   dictionary words "standard"+" the" = "standard the"
                   s3              -   split into threes = ["sta","nda","rd ","the"]
           ị                       - index into
                      Ṗ            - remove rightmost character
                               ¤   - nilad followed by link(s) as a nilad:
                         “...»     -   dictionary words "January"+" February"+...
                              Ḳ    -   split at spaces = ["January","February",...]
                        ị          - index into (vectorises across [month])
                       ,           - pair                  e.g. ["th", ["February"]]
                                K  - join with spaces           ["th ", "February"]
                                   - print (implicitly smashes)   th February

4
Thủ thuật "tiêu chuẩn" là tuyệt vời.
Ven

Tôi đồng ý với @Ven , mẹo hay! Nó cũng lưu một byte trong câu trả lời 05AB1E của tôi so với chuỗi nén được "thstndrd"chia thành các phần có kích thước 2 ( .•oθ2(w•2ô), cảm ơn. :)
Kevin Cruijssen

1
Đây phải là một trong những chương trình Jelly dài nhất tôi từng thấy.
JAD

6

C # (Trình biên dịch tương tác Visual C #) , 115 113 109 98 byte

g=>$"{f=(g=p.AddDays(g-1)).Day}{"tsnr"[f=f%30%20<4?f%10:0]}{"htdd"[f]} {g:MMMM}";DateTime p;int f;

Cảm ơn @someone vì đã lưu 9 byte

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


1
@KevinCruijssen Tôi đã sửa đổi trật tự, nên được sửa ngay bây giờ.
Hiện thân của sự thiếu hiểu biết

.code.tio(2,22): error CS0165: Use of unassigned local variable 'p'Có vẻ như điều cấu trúc không hoạt động.
JAD

var g=new DateTime().AddDays(n-1)hoạt động mặc dù
JAD

@JAD lỗi về phía tôi, đã được sửa
Hiện thân của sự thiếu hiểu biết


5

Python 3.8 (tiền phát hành) , 112 byte

lambda x:str(d:=(t:=gmtime(x*86399)).tm_mday)+'tsnrhtdd'[d%5*(d%30%20<4)::4]+strftime(' %B',t)
from time import*

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

Thật kỳ lạ, tôi không phải ngoặc đơn d:=(t:=gmtime(~-x*86400), có lẽ vì trình thông dịch chỉ kiểm tra nếu có các ()ký tự xung quanh biểu thức gán và không phải chính biểu thức đó được ngoặc đơn.

-2 nhờ gwaugh .
-5 nhờ xnor .


5

Perl 6 , 166 161 byte

{~(.day~(<th st nd rd>[.day%30%20]||'th'),<January February March April May June July August September October November December>[.month-1])}o*+Date.new(1,1,1)-1

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

Hardcodes tất cả các tên tháng, chiếm phần lớn không gian. Man, Perl 6 thực sự cần một định dạng ngày thích hợp.


4

Hack, 115 59 39 byte

$x==>date("jS F",mktime(0,0,0,1,$x));

Vì @gwaugh có cùng giải pháp với tôi khi tôi chơi gôn, nên tôi sẽ đăng bài này lên Hack :).


Wow, tâm trí tuyệt vời nghĩ như nhau. :) +1 cho bạn!
640KB

@gwaugh haha, tôi không biết mình chỉ có thể có một chương trình cấp cao nhất. Tôi cũng sẽ chỉnh sửa của tôi để làm cho nó ở cấp cao nhất và tìm cách để có được một điểm số tốt hơn e ;-)
Ven

1
@gwaugh Tạo Hack của tôi thay thế.
Ven

1
Bạn có thể muốn chỉ định tham số năm không nhảy cho mktime()cuộc gọi của mình nếu không nó sẽ trả lại đầu ra sai nếu chạy vào năm nhuận. (phải làm theo câu trả lời của tôi).
640KB

4

JavaScript (ES6),  117  113 byte

Đã lưu 4 byte nhờ @tsh

d=>(n=(d=new Date(1,0,d)).getDate())+([,'st','nd','rd'][n%30%20]||'th')+' '+d.toLocaleString('en',{month:'long'})

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

Đã bình luận

d =>                     // d = input day
  ( n =                  //
    ( d =                // convert d to
      new Date(1, 0, d)  //   a Date object for the non leap year 1901
    ).getDate()          // save the corresponding day of month into n
  ) + (                  //
    [, 'st', 'nd', 'rd'] // ordinal suffixes
    [n % 30 % 20]        // map { 1, 2, 3, 21, 22, 23, 31 } to { 'st', 'nd', 'rd' }
    || 'th'              // or use 'th' for everything else
  ) + ' ' +              // append a space
  d.toLocaleString(      // convert d to ...
    'en',                // ... the English ...
    { month: 'long' }    // ... month name
  )                      //

Không có ngày dựng sẵn, 188 byte

f=(d,m=0)=>d>(k=31-(1115212>>m*2&3))?f(d-k,m+1):d+([,'st','nd','rd'][d%30%20]||'th')+' '+`JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember`.match(/.[a-z]*/g)[m]

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


Thất bại trong các ngày 11, 12, 13 mỗi tháng
Dữ liệu hết hạn

1
@ExpiredData Cảm ơn bạn đã báo cáo điều này. Đã sửa bây giờ.
Arnauld

Bỏ qua bình luận của tôi, tôi đã làm một lỗi ID10T.
asgallant

Tôi không chắc cách nodejs xử lý các thẻ ngôn ngữ, nhưng có vẻ như việc sử dụng 0sẽ hoạt động như sử dụng "en". Và thay đổi để toLocaleStringtiết kiệm 4 byte. 110 byte
tsh

@tsh Có vẻ như toLocaleStringđang sử dụng các cài đặt mặc định của hệ thống khi nó chuyển qua một chuỗi không được nhận dạng hoặc một giá trị số. Vì vậy, nó có thể là bất cứ điều gì. Tham số này về cơ bản là không hiệu quả trên một cá thể TIO, vì dù sao chỉ có các ngôn ngữ tiếng Anh được cài đặt .
Arnauld

4

Smalltalk, 126 byte

d:=Date year:1day:n.k:=m:=d dayOfMonth.10<k&(k<14)and:[k:=0].o:={#st.#nd.#rd}at:k\\10ifAbsent:#th.m asString,o,' ',d monthName

1
Tôi không biết Smalltalk, nhưng điều này có đúng 11th,12th,13thkhông? Nếu tôi đọc chính xác, bạn chia số nguyên cho 10 ngày, nhưng điều đó có nghĩa là nó sẽ dẫn đến 11st,12nd,13rd, trừ khi một cái gì đó trong mã sửa lỗi này trong khi tôi không biết về nó.
Kevin Cruijssen

@KevinCruijssen Bạn nói đúng. Cảm ơn đã gọi sự chú ý của tôi về điều này. Tôi sẽ cần phải chi thêm một số byte để sửa lỗi này.
Leandro Caniglia

1
@KevinCruijssen, Xong. Cảm ơn một lần nữa.
Leandro Caniglia

3

C # (Trình biên dịch tương tác Visual C #) , 141 139 133 124 122 byte

a=>{var d=s.AddDays(a-1);int x=d.Day,m=x%30%20;return x+"thstndrd".Substring(m<4?m*2:0,2)+d.ToString(" MMMM");};DateTime s

Cảm ơn Arnauld về phương pháp nhanh hơn để loại bỏ 11,12,13th tiết kiệm 4 byte

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


Tuy nhiên, sử dụng C # 8, điều này có thể được giảm xuống thành: a=>{var d=s.AddDays(a-1);int x=d.Day,m=x%30%20;return x+"thstndrd"[(m<4?m*2:0)..2]+$" {d:MMMM}";};DateTime s Trình biên dịch tương tác dường như không hỗ trợ thay đổi cấp độ ngôn ngữ của nó thành "xem trước" tại thời điểm này.
Arcanox


Tôi khá chắc chắn rằng bạn phải thêm một dấu chấm phẩy sauDataTime s
Hiện thân của sự thờ ơ


3

MySQL, 47 45 42 byte

SELECT DATE_FORMAT(MAKEDATE(1,n),"%D %M")

Năm 1901 có thể được thay thế bằng bất kỳ năm nào / không phải là năm nhuận.

Chỉnh sửa: đã lưu hai byte bằng cách xóa khoảng trắng và ba byte khác bằng cách thay đổi năm thành 1, nhờ @Embodyment of Ignorance .


Bạn có thể loại bỏ khoảng trắng giữa 1901, nvà chuỗi không?
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance vâng tôi có thể, cảm ơn!
NicolasB

Ngoài ra, tại sao không thay thế 1901 bằng một năm như 1? 1 không phải là một năm nhuận và nó ngắn hơn 3 byte
Hiện thân của sự thờ ơ

@EmbodimentofIgnorance thực hiện và thực hiện :-)
NicolasB

3

05AB1E , 81 79 78 76 75 74 73 71 70 69 byte

•ΘÏF•ºS₂+.¥-D0›©ÏθDT‰ć≠*4šß„—ÊØ3ôsè¨ð”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”#®OèJ

-9 byte nhờ @Grimy .
-1 byte nhờ vào standard themánh khóe của @ JonathanAllan th,st,nd,rd, mà anh ta đã sử dụng trong câu trả lời Jelly của mình .

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

Giải trình:

•ΘÏF        # Push compressed integer 5254545
     º       # Mirror it vertically: 52545455454525
      S      # Converted to a list of digits: [5,2,5,4,5,4,5,5,4,5,4,5,2,5]
       ₂+    # And 26 to each: [31,28,31,30,31,30,31,31,30,31,30,31,28,31]
             # (the additional trailing 28,31 won't cause any issues)
           # Undelta this list (with automatic leading 0):
             #  [0,31,59,90,120,151,181,212,243,273,304,334,365,393,424]
  -          # Subtract each from the (implicit) input-integer
   D0       # Duplicate the list, and check for each if it's positive (> 0)
      ©      # Store the resulting list in the register (without popping)
       Ï     # Only leave the values at those truthy indices
        θ    # And get the last value from the list, which is our day
D            # Duplicate this day
 T          # Take the divmod-10 of this day: [day//10, day%10]
   ć         # Extract the head; pop and push the remainder-list and head: [day%10], day//10
            # Check whether the day//10 is NOT 1 (0 if day//10 == 1; 1 otherwise)
     *       # Multiply that by the [day%10] value
      4š     # Prepend a 4 to this list
        ß    # Pop and push the minimum of the two (so the result is one of [0,1,2,3,4],
             # where the values are mapped like this: 1..3→1..3; 4..9→4; 10..19→0; 20..23→0..3; 24..29→4; 30,31→0,1)
 thŠØ       # Push dictionary string "th standards"
      3ô     # Split it into parts of size 3: ["th ","sta","nda","rds"]
        sè   # Swap and index the integer into this list (4 wraps around to index 0)
          ¨  # And remove the trailing character from this string
ð            # Push a space " "
”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”
             # Push dictionary string "December January February March April May June July August September October November"
 #           # Split on spaces
  ®          # Push the list of truthy/falsey values from the register again
   O         # Get the amount of truthy values by taking the sum
    è        # Use that to index into the string-list of months (12 wraps around to index 0)
J            # Join everything on the stack together to a single string
             # (and output the result implicitly)

Xem mẹo 05AB1E này của tôi để hiểu lý do:

  • (phần Cách sử dụng từ điển? ) ”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”"December January February March April May June July August September October November"
  • (phần Cách sử dụng từ điển? ) …thŠØ"th standards"
  • (phần Cách nén số nguyên lớn? ) •ΘÏF•5254545

1
-2 byte bằng cách sử dụng 5в28 + để nén: TIO
Grimmy

1
Sử dụng S là một ý tưởng hay, -1 byte một lần nữa: TIO
Grimmy

1
@Grimy Cảm ơn vì -1 byte cho •EË7Óæ•S₂+, nhưng golf -3 của bạn không hoạt động một cách đáng tiếc. Lập chỉ mục tự động kết thúc trong 05AB1E, do đó 5st,6nd,7rd,25st,26nd,27rd,29stsẽ sai. PS: nếu nó hoạt động, có thể đã có thêm -1. :)
Kevin Cruijssen

1
-1 lần nữa (sử dụng "tiêu chuẩn thứ" thay vì "tiêu chuẩn" loại bỏ sự cần thiết Á).
Grimmy

1
-1 ( •C.ñÒā•đến •ΘÏF•º, các chữ số phụ không quan trọng)
Grimmy

2

bash, 82 80 byte

-2 byte chỉ nhờ @ ASCII

a=(th st nd rd);set `printf "%(%e %B)T" $[$1*86399]`;echo $1${a[$1%30%20]-th} $2

TIO

bash + ngày GNU, 77 byte

a=(th st nd rd);set `date -d@$[$1*86399] +%e\ %B`;echo $1${a[$1%30%20]-th} $2


Chỉ có ASCII, có trừ 100 giây mỗi ngày, 100 * 365 = 36500 ít hơn một ngày (86400), cũng hoạt động với 86399 (trừ 1 giây mỗi ngày)
Nahuel Fouilleul

: / vẫn trông rất dài nhưng chưa tìm thấy cách nào tốt hơn
ASCII chỉ có

2

Shell + coreutils, 112 90 byte

date -d0-12-31\ $1day +%-dth\ %B|sed 's/1th/1st/;s/2th/2nd/;s/3th/3rd/;s/\(1.\).. /\1th /'

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Chỉnh sửa: Đã lưu 22 byte nhờ @NahuelFouilleul. Giải trình:

date -d0-12-31\ $1day

Tính số ngày sau ngày đầu tiên trước một năm không nhuận. (Đáng buồn là bạn không thể thực hiện tính toán ngày tương đối từ @-1.)

+%-dth\ %B|sed

Xuất ra ngày trong tháng (không có số 0 đứng đầu) thvà tên tháng đầy đủ.

's/1th/1st/;s/2th/2nd/;s/3th/3rd/;

Fix lên 1st, 2nd, 3rd, 21st, 22nd, 23rd31st.

s/\(1.\).. /\1th /'

Khôi phục 11thlại 13th.


tôi thấy câu trả lời này sau khi tôi, có thể tiết kiệm 18bytes sử dụng một lệnh sed, cũng stại dayscó thể được gỡ bỏ, và 19trong1969
Nahuel Fouilleul

@NahuelFouilleul Người cuối cùng sử dụng Bash-ism vì vậy nên được đăng dưới dạng câu trả lời riêng, nhưng cảm ơn vì những lời khuyên khác!
Neil

2

Thạch , 115 114 101 97 byte

%30%20¹0<?4Ḥ+ؽị“thstndrd”ṭ
“5<Ḟ’b4+28ÄŻ_@µ>0T,>0$ƇZṪµ1ịị“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤,2ịÇƊṚK

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

Dài theo tiêu chuẩn Jelly, nhưng được thực hiện từ các nguyên tắc đầu tiên.

Cảm ơn @JonathanAllan vì đã lưu 13 byte thông qua việc hiểu rõ hơn về nén chuỗi.


“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤sẽ tiết kiệm được 13 (Compress.dipedia tìm kiếm một không gian hàng đầu và có cách xử lý đặc biệt cho nó).
Jonathan Allan


1

Màu đỏ , 124 byte

func[n][d: 1-1-1 + n - 1[rejoin[d/4 either 5 > t: d/4 % 30 % 20[pick[th st nd rd]t + 1]['th]]pick system/locale/months d/3]]

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

Thêm n- 1 ngày vào 1-1-1 (1 tháng 1 năm 2001) để tạo thành một ngày, hơn là sử dụng phương pháp của Arnauld để lập chỉ mục thành các hậu tố tháng. Quá xấu Red là 1 chỉ mục, điều này đòi hỏi phải điều chỉnh bổ sung. Điều tốt là Red biết tên của tháng :)


1

APL (NARS), ký tự 235, 470 byte

{k←↑⍸0<w←+\v←(1-⍵),(12⍴28)+13561787⊤⍨12⍴4⋄k<2:¯1⋄d←1+v[k]-w[k]⋄(⍕d),({d∊11..13:'th'⋄1=10∣d:'st'⋄2=10∣d:'nd'⋄3=10∣d:'rd'⋄'th'}),' ',(k-1)⊃(m≠' ')⊂m←'January February March April May June July August September October November December'}

13561787 là con số mà trong cơ sở 4 có thể được tổng hợp thành (12⍴28) để có được chiều dài mỗi tháng ... kiểm tra:

  f←{k←↑⍸0<w←+\v←(1-⍵),(12⍴28)+13561787⊤⍨12⍴4⋄k<2:¯1⋄d←1+v[k]-w[k]⋄(⍕d),({d∊11..13:'th'⋄1=10∣d:'st'⋄2=10∣d:'nd'⋄3=10∣d:'rd'⋄'th'}),' ',(k-1)⊃(m≠' ')⊂m←'January February March April May June July August September October November December'}     
  ⊃f¨1 2 3 365 60 11
1st January  
2nd January  
3rd January  
31st December
1st March    
11th January 


-2

Python 3 , 95 byte

Đã ghi nó: P

from datetime import *;f=lambda s:(datetime(2019,1,1)+timedelta(days=s-1)).strftime("%d of %B")

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


2
Điều này không tạo ra các hậu tố thứ tự và có các số 0 đứng đầu về số ngày. Điều ofnày cũng không cần thiết
Jo King
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.