Chào thế giới! với các nhân vật bán chung


28

Như một số bạn có thể biết, để có được một ngôn ngữ trên Dennis's Try It Online tuyệt vời ! , xin chào, thế giới! chương trình là bắt buộc. Gần đây, Dennis đã thúc đẩy một cách để tải các chương trình này từ trang web. Dưới đây là một pastebin JSON của các ký tự được sử dụng trong các chương trình đó, theo tần suất, kể từ ngày 27 tháng 7 năm 2017.

Một số nhân vật cần một số tình yêu, vì vậy, thách thức của bạn là xuất ra Hello, World! (tốt nhất là bằng một ngôn ngữ liên quan đến quá trình này), chỉ sử dụng các ký tự được chỉ định bên dưới. Những nhân vật này là tất cả các nhân vật được sử dụng giữa 1099(bao gồm) thời gian, cùng với hai nhân vật phổ biến nhất, 0, bởi vì tôi cảm thấy tốt.

0 $&*?ABCDEFGIJKLNPQRSTUXYZ\`gjkqwxyz{}÷≤≥=║_

Việc sử dụng ký tự của bạn nên dựa trên sự xuất hiện của nó trong một chương trình bình thường, không dựa trên điểm mã hoặc giá trị byte của nó.

Bạn phải sử dụng ít nhất một ký tự từ bộ đó, vì vậy các chương trình có độ dài 0 không hợp lệ.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

JSFiddle để kiểm tra xem câu trả lời của bạn có hợp lệ không


Tôi có thể xuất một khoảng trắng trong dòng tiếp theo không?
dzaima

@dzaima Nếu bạn không thể xuất nó mà không có khoảng trống, hãy làm điều đó. Nếu loại bỏ không gian chỉ sử dụng nhiều byte hơn, hãy loại bỏ khoảng trống
Stephen

Có sự đồng thuận của cộng đồng (hoặc dis / trợ cấp cụ thể ở đây) đối với các ký tự không in được đưa vào đầu ra (STDOUT) không? Không chắc chắn tôi đã thấy nó xuất hiện trước đây (và nó sẽ dễ dàng bị bỏ qua) nhưng nó thay đổi chiến lược của tôi một cách đáng kể ở đây ...
brhfl

@brhfl không phải là điều mà tôi biết - tiêu chuẩn duy nhất là các dòng mới thường được cho phép, bạn có thể hỏi trong trò chuyện
Stephen

Câu trả lời:


6

SOGL V0.12 , 89 75 68 byte

z{}xxxx≥x≥x≥xXUqXxq≤qq≤q *R_IIRq  q *R_I0II*IRqxXq≤qxqxq CR_0II÷Rq0*

Hãy thử nó ở đây!
Lưu ý: bất cứ khi nào qhoặc đầu ra được đề cập ở đây, nó không bật như đầu ra popping (bất kỳ oOpP) nào không có sẵn hoặc xuất ra một dòng mới.

Giải thích (lỗi thời, điều thay đổi là chữ "H" được in bằng các chữ cái trong bảng chữ cái):

 $             push "$"
  R_           convert to an array of ordinals, then push all the contents to the stack
    0II        push 0+1+1 = 2
       *       multiply by that
        R      convert to character
         q     output
          z    push the lowercase alphabet
           {}  iterate over it, pushing each char, and do nothing. Stack: ["H","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
stack manipulation:
 xxxx ["H","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r"]
 ≥    ["r","H","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q"]
 x    ["r","H","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"]
 ≥    ["o","r","H","a","b","c","d","e","f","g","h","i","j","k","l","m","n"]
 x    ["o","r","H","a","b","c","d","e","f","g","h","i","j","k","l"]
 ≥    ["l","o","r","H","a","b","c","d","e","f","g","h","i","j","k"]
 xxx  ["l","o","r","H","a","b","c","d","e"]
 q    output the "e"
 ≤    ["o","r","H","a","b","c","d","e","l"]
 qq   output the "l" twice
 ≤    ["r","H","a","b","c","d","e","l","o"]
 q    output the "o"

*                       push "*",
 R_                     convert to an array of ordinals, then push all to stack
   II                   increase by 2
     R                  convert back to character
      q                 output
         q              push a space, then output
           *            push "*"
            R_          convert to an array of ordinals, then push all to stack
              I         increase that
               0II      push 0+1+1 = 2
                  *     multiply
                   I    increase
                    Rq  output as character
stack manipulation: (starting stack: ["r","H","a","b","c","d","e","l","o",","," ","W"])
 x  ["r","H","a","b","c","d","e","l","o",","]
 X  ["r","H","a","b","c","d","e","l","o"]
 q  output the "o"
 ≤  ["H","a","b","c","d","e","l","o","r"]
 q  output the "r"
 x  ["H","a","b","c","d","e","l"]
 q  output the "l"
 x  ["H","a","b","c","d"]
 q  output the "d"

C            push "C"
 R_          convert to ordinal as before
   0II÷      floor divide by 2
       Rq    output as character
         0*  multiply by 0 so nothing extra would be outputted

Sự thật thú vị: tất cả các nhân vật trong số các nhân vật được phép đều ở trong bảng mã SOGLs: D


Vậy ... Bạn có một công việc ổn định tốt như một nhà phát triển chuyên nghiệp phải không? Bởi vì dang, đây là một ngôn ngữ tuyệt vời ... Cũng là trình thông dịch JS tuyệt vời, bạn đã hoàn thành nó tối qua :)? Bạn có thể bắt đầu đăng tài liệu cho một số ngôn ngữ? Hoặc trò chuyện riêng tư nhắn tin cho tôi vị trí của tài liệu đó? SOGL giết nó.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn 1) không lol Tôi 15 2) Cá nhân tôi không thích nó vì cách nó được tạo ra là điều cơ thể nhất mà tôi đã thực hiện 3) Trình thông dịch JS đã có mặt trong một thời gian 4) các tài liệu mới nhất về SOGL (nếu bạn có thể gọi họ như vậy) đang ở đây , máng một số thứ (như palenChars.txt) được cập nhật nhiều hơn ở đây
dzaima

Chúc mừng bạn đã giảm số byte một lần nữa! Tôi thực sự không nghĩ rằng tôi có thể nhận được của tôi thấp hơn !!
Dom Hastings

23

Perl 5 , 76 byte

}{${$_=$`x?B?}{?\w$?}{$_=qq{Lg\LLL$&= w$&RLD=}&qq=y}\LLL$&L _$&RLDA=}=$_=\*G

Điều này sử dụng một tính năng đã không được chấp nhận, nhưng hoạt động cục bộ trong thiết bị đầu cuối của tôi (phiên bản 5.18.2 như đã lưu ý). Trong các phiên bản cũ hơn của Perl ?\w?là một từ đồng nghĩa cho /\w/phép tôi truy cập vào kết hợp regrec và tôi có đủ ký tự cho $&(trận đấu cuối cùng) và $`(văn bản trước trận đấu cuối cùng). Tôi cần những thứ này để có thể có được O. Tôi tạo ra điều này là tạo ra một globtham chiếu ( $_=\*Gmà, được chuyển thành vô hướng, là một cái gì đó giống nhưGLOB(0x7ffb728028d0) ). Khi đã vào $_, ?B?sẽ khớp với B$`sẽ chứa GLO, sau đó tôi có thể khớp với \w$cái sẽ lưu trữ Otrong$&được chèn vào các chuỗi mà tôi đang chạy theo chuỗi - VÀ để tạo phần còn lại của văn bản, phần thân của chuỗi được hạ thấp bằng cách sử dụng \L.

Hãy thử trực tuyến! - sử dụng /\w/thay ?\w?cho phiên bản Perl trên TIO quá mới.


Perl 5 , 65 byte

Đây là một chút gian lận hơn vì nó dựa vào tên tệp trên TIO ( .code.tiovì vậy), vì vậy tôi không thực sự nghĩ rằng điều này là cạnh tranh, nhưng tôi hài lòng với kết quả này!

}{${$_=$0}{?\w$?}{$_=qq{Lg\LLL$&= w$&RLD=}&qq=y}\LLL$&L _$&RLDA=}

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


Tôi đã không nói bất cứ điều gì về nội dung của cờ, vậy -plà tốt. Làm tốt lắm, đây là điều tôi đã hy vọng khi tôi hỏi điều này :)
Stephen

1
làm thế nào ... cái gì ... cái ...
Okx

@StepHen Tôi rất vui vì đã có nghĩa vụ! Tôi thực sự đã thực sự thích điều này. Tôi rất vui vì bạn không phạt cờ quá, tôi sẽ cập nhật bài viết của tôi. Cảm ơn!
Dom Hastings

@Okx Tôi rất vui vì đã có hiệu ứng đó!
Dom Hastings

Bạn có chắc chắn không cần thêm 15 byte <3?
Bạch tuộc ma thuật Urn

10

Unary , 7 * 10 182 byte

Unary là Brainfuck được chuyển đổi thành nhị phân được chuyển đổi thành unary sử dụng 0làm bộ đếm. Về cơ bản, nó ngưng tụ một chương trình Brainfuck thành một số và đầu ra là số 0s đó. Chúng thường là những chương trình rất lớn.

Tôi sẽ không dán chương trình ở đây vì tôi không biết SE cho phép bao nhiêu văn bản nhưng tôi cá là nó ít hơn thế này. Thay vào đó, tôi sẽ dán số lượng không chính xác trong câu trả lời này:

708184005756841022918598670049178934705323143517361395031673227349803938380119378597780037353721967636097362645175347036417214959141923667629285233360306016978751166690464736541968556

Vì đây là một câu trả lời khá rẻ, đảm bảo không phải là ngắn nhất và tôi chỉ đơn giản là sao chép nó, tôi đang biến đây thành một bài viết wiki.


2
"Tôi không biết SE cho phép bao nhiêu văn bản" ít nhất không phải là 7 * 10¹⁸², nó lớn hơn 65536.
Erik the Outgolfer

9

05AB1E , 137 106 95 byte

X00X00DXX00DXX00XX0X0X00D0XXXX0X00X00XXX00XXX0XXXXXX00XXXXX0XXXX00D0X000DD00XXJC000gDD0000g***B

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

-31 cảm ơn @Adnan vì đã chỉ ra tôi có thể sử dụng cơ sở 108.

- ?? cảm ơn @Riley vì đã chỉ ra một số điều sai.


Phiên bản cũ (phương pháp khác nhau):

05AB1E , 211 186 166 byte

0g00g000000000gUX000000gXX00000g000g00g000gD0000g0 000g00000gX00000gX00000g0 00000g00000000g0000000g00g00000000gD000000gX0000000g0g00000gUXJX00000000000000000g000g**B

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


Haha! VÀ Ở ĐÂY, tôi nghĩ rằng ESOLANGS KHÔNG CÓ CƠ HỘI NÀO!


Đầu tiên, chúng tôi nhận được 255 được lưu trữ trong X:

00g               # Push 2 (length of 00).
   00000g         # Push 5 (length of 00000).
         00000g   # Push 5.
               JU # Join to 255 and store in X.

Sau đó, bằng cách sử dụng thủ thuật độ dài tương tự, chúng tôi đẩy: 1296995323340359595058728869715

0g00g000000000g000000g000000000g000000000g00000g000g00g000g000g0000g0 000g00000g000000000g00000g000000000g00000g0 00000g00000000g0000000g00g00000000g00000000g000000g000000000g0000000g0g00000gJ

Nơi chúng tôi chỉ sử dụng 0<space>thay vì thủ thuật độ dài cho các số không.

Sau đó, cuối cùng, chúng tôi đẩy 255 mà chúng tôi đã lưu trữ và chuyển đổi từ 255 sang cơ sở 10 :

X  # Push stored 255.
 B # Convert to base 255.

Vẫn chơi golf bằng cách sử dụng các ký tự cho phép khác, và sao chép, nó sẽ là một phút.


8

Beatnik , 148 byte

K QQQQQQQG ZD XA K QQJA KD ZD XA K KG KD ZD ZD ZD XA XA K B KD ZD XA K QQQQF ZD ZD XA K QQQD XA K A Z KD XA ZD XA K B KD XA ZD XA K J Z XA K QQQB XA

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

Giải trình

Beatnik dựa trên hướng dẫn được thực hiện dựa trên số điểm đáng chú ý của từ này. Đây là một lời giải thích rút gọn:

Code         Scrabble Score   Explanation

K            5                push the scrabble score of the next word
QQQQQQQG     72               72 ['H']
ZD           12               pop a value; push it back twice
XA           9                pop a value; print its ASCII character
KD           7                pop two values; push their sum
Z            10               pop two values; push their difference

8

Moorhens (v2.0), 3423 983 923 866 749 716 byte

Tôi nghĩ rằng điều này có thể được chơi golf một chút, Moorhens không phải là một ngôn ngữ dễ dàng để làm việc với.

xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU KA xU xU xU xU xU xU xU xU xU xU xU xU KA AA xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU KA xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU KA xU xU xU xU xU xU xU KA KA xU xU xU AA AA AA AA AA KA xU AA KA xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU KA xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU xU KA xU xU xU KA XI XI XI XI XI XI KA XI XI XI XI XI XI XI XI AA AA AA AA AA AA AA AA AA AA AA AA

Giải trình

Moorhens là một ngôn ngữ dựa trên các từ trong từ điển. Mỗi từ tương ứng với một hoạt động dựa trên hàm băm của nó. Năm hoạt động sử dụng ở đây là xU, ER, XI, KA, vàAA

  • xU tăng ĐKDV
  • ER đặt một số 0 mới trên ngăn xếp.
  • XI giảm chỉ số ĐKDV
  • KA nhân đôi ĐKDV
  • AA cuộn ĐKDV xuống đáy

Chúng tôi đẩy từng chữ cái với các ứng dụng thành công của các hoạt động này.


5
'Hai hoạt động' - Tôi không rành về esolang nhưng chắc chắn đó là năm hoạt động?
boboquack

@boboquack đã được sửa
Thuật sĩ lúa mì

1
liên kết với ngôn ngữ?
Leaky Nun

Tôi nghĩ rằng đây là nó. github.com/Wheatwizard/Moorhen
đệ quy

5

Glypho , 480 byte

AABCABABABBAABABAABCABBAABABABBCABBAABABABABABABABBAABBAABABABABABABABBAABBAAABCABBAABABAABCAABCABBAABABABBCABABABBAABBAABABAABCAABCABBAAABCABBAABABABBAABBAABABAABCABCAABABABABABBAABBAABBAABABAABCABAAABABAABAABBAABCAABABABBAABBAAABCAABCABBAABABABBCABABABBCABABABBAABAAABABAABAABABABBAABABABBAABABABAAABABAABAABBAABABABBAAABCABBAABABAABCABCAABABABABABBAABBAABBAABABAABCABCAABAAABABAABAABBAABABABBCAABCABBAAABCAABCABBAAABCABBAABABABBAABABABBCABABABBAABAAABABABCAABBAAABAABACABBBABCB

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


4

Headsecks , 78 byte

yyzyzzxNxNzx{yyy{y{y{yzzz_{_zzyy\zxxxxxx\zzy\\zz\zx\{{\{{\zzz\xxx\{{\{{y\zzzx\

4

JavaScript gấp đôi, 318 byte

Tôi không chắc nếu điều đó được cho phép, tôi không thể làm điều đó bằng trình thông dịch JavaScript một lần. Nó tương tự như sử dụng eval()nhưng thay vào đó tôi sử dụng trình thông dịch hai lần: (Hãy thử trong bảng điều khiển để nhận kết quả được in lại)

`\`\\x${0xA*0xA&0xC}${0xA&0xC}\\x${0xA*0xF&0xF}${0xB*0xF&0xF}\\x${0xA*0xF&0xF}C\\x${0xA*0xF&0xF}C\\x${0xA*0xF&0xF}F\\x${0xE*0xF&0xF}C\\x${0xE*0xF&0xF}${0}\\x${0xB*0xF&0xF}${0xB*0xB*0xF&0xF}\\x${0xA*0xF&0xF}F\\x${0xB*0xB*0xF&0xF}${0xE*0xF&0xF}\\x${0xA*0xF&0xF}C\\x${0xA*0xF&0xF}${0xA*0xA&0xC}\\x${0xE*0xF&0xF}${0**0}\``

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

Đánh giá để:

`\x48\x65\x6C\x6C\x6F\x2C\x20\x57\x6F\x72\x6C\x64\x21`

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

Mà đánh giá Hello, World!


3

Smallf ** k , 266 byte:

zJ$NJ`ZZx*gQYQQ{zqyKKUkUR?AS`zB`JB&UCKCIxQ_G0*000FzzJ&?YwkC\qqgZ`xYQyC}DgY_&_S}KPZ\&?SGAE&{Gw_w} GAgA{qT{gC&`qI?xwCNQwgR}?{*QEwQUj&BT&jR__IJJIqUqAPF0yICXESL?AYR QIAFU& yYwE&$\Njj B0T*F j$?kCzQk*}U}UgI$}Ew_yDL`qYI*E_G}SCjXDFNJKGNIGyIwA\BzLP`*zCILGCNqyYZyq? GwN{q{gKSj

Trên thực tế, các nhân vật là không liên quan. Đó chỉ là vấn đề liệu mỗi nhân vật có một điểm mã chẵn hay một điểm mã lẻ hay không. Do đó, tôi đã nỗ lực sử dụng mọi ký tự có sẵn (ngoại trừ các ký tự đa nhân) (mặc dù do nó được chọn ngẫu nhiên, tôi đã không nỗ lực để đảm bảo điều đó).


1
@totallyhuman Bạn nói đúng; Tôi sẽ thay đổi điều đó. Tôi sẽ chỉ loại bỏ các nhân vật đa nhân. Nó không có codepage thực sự; nó chỉ cần được lưu trữ dưới dạng 1 và 0 (1 cho số lẻ ordvà 0 cho số chẵn ord) vì vậy bạn có thể nói đây là 33,25 byte xD
HyperNeutrino

Việc sử dụng ký tự của bạn nên dựa trên sự xuất hiện của nó trong một chương trình bình thường, không dựa trên điểm mã hoặc giá trị byte của nó.
KSmarts

@KSmarts Tôi sẽ hỏi OP về điều đó.
HyperNeutrino

@KSmarts Điều đó có nghĩa là nếu một ngôn ngữ có một bảng mã khác và ví dụ như '5'chiếm vị trí thông thường 'A', bạn không được phép sử dụng '5'.
HyperNeutrino

@KSmarts chỉ có nghĩa là nếu bạn có một bảng mã không chuẩn, các ký tự này sẽ di chuyển xung quanh bảng mã đó. Bạn vẫn có thể sử dụng mật mã của họ như một phần của chương trình.
Stephen

3

Pyke , 133 144 byte

? BXKKKKRKRKRK\CkJ00q}}}XEjTX}G_E\E\L\LkJjRT}}XRGREkJjR 00q}R? B_RE\ \wkJjRT}}XRGRE\R\L\DkJjRZ0q}}R? B_RER? JR? KREZjZ0q}AREkJjRT}}RG_RE00q}}RAA

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

Một mớ hỗn độn mã khủng khiếp gần như chắc chắn có thể rút ngắn ... Xây dựng nó một ký tự một lần.

? BXKKKKRKRKRK\CkJ - ".C" - A string that when evaled, gets the character at the point
00q}}}XEj - Construct 64 by doing `((0==0)*2*2*2)**2` and then eval, getting the "@" character and store it in `j`
TX}G_E - Get "h" using `@` by looking it up in the alphabet
\E\L\LkJ - "hELL"
jRT}}XRGREkJ - "hELLo"
jR 00q}R? B_RE  - ","
\ \wkJ - "hELLo, w"
jRT}}XRGRE\R\L\DkJ - "hELLo, woRLD"
jRZ0q}}R? B_RER? JR? KREZjZ0q}AREkJ - "hELLo, woRLD!"
jRT}}RG_RE00q}}RAA - "Hello, World!"

2

đc , 164 162 byte

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzS zzS?zzzzzzzzzzzzS$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzPzzzzzzzzzzzzzzzzSwzzzzzzzzzzzzzzzPzzzzzzzzSLzPzPzzzzPL$PL PLwPzPzzzzPLLPAI*PL?P

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

Có khả năng là một cách tiếp cận tốt hơn / thú vị hơn. Tôi đã thử sử dụng thủ thuật ASCII + 256 dccó, nhưng nó cũng tạo ra các ký tự bổ sung (ngay cả khi chúng không in) và một khi tôi đã đến 'o', số nguyên tố 111 tuyệt vời, tôi đã gặp rắc rối ngay cả khi gặp giá trị 111+ (bội số của 256) được xác định rõ ràng. Vì vậy, đây là một giải pháp khá đơn giản (mặc dù có thể chơi golf nếu có thể):

Trong dc, zlà một lệnh đẩy độ sâu ngăn xếp lên ngăn xếp. Điều đó có nghĩa là chúng ta có thể sử dụng nó như một sự gia tăng. Đây là cách tôi tạo hầu hết các giá trị ASCII của mình cho thử thách này (được in bằngP ), mà tôi đẩy lên các ngăn xếp có tên Svà bật lại vào ngăn xếp chính với L.

dccho phép bạn sử dụng các giá trị hex AF ngay cả khi cơ số đầu vào là số thập phân (mặc định). May mắn thay, chữ cái đầu tiên của chúng tôi, 72, là bội số của 12, vì vậy tôi lưu một hoặc hai byte ở đây bằng cách nhân 6 * 12 và in ngay lập tức (zzzzzzzC*P ). Phiên bản 164 byte của tôi đã sử dụng phép nhân từ sớm để có được 72 ('H'), thông minh nhẹ nhưng là một sự nắm giữ từ một nỗ lực trước đó và lãng phí byte. Bây giờ, tôi bắt đầu bằng cách tăng và tiết kiệm dung lượng, dấu chấm than và dấu phẩy không đúng thứ tự và do đó chưa thể được in. Tiếp theo, tôi đến 'H', mà tôi in ngay lập tức, trước khi tôi đến 'W', mà tôi phải lưu lại sau này.

Tôi chỉ đơn giản in khi tôi nhấn 'e', ​​sau đó tôi tăng lên 'l'. Tôi in hai trong số đó và lưu một. Khi tôi thực hiện nó thành 'o', trước tiên tôi nghĩ rằng tôi phải lưu một trong những thứ đó sau, nhưng mọi thứ đều tốt theo thứ tự vào thời điểm này. Tôi in một 'o', lấy lại dấu phẩy, dấu cách và 'W' từ trước đó và bây giờ tôi quay lại 'o'. Tôi in cái này và tăng một vài giá trị cần thiết cao nhất, 'r' (114), mà tôi in trước khi tải và in 'l' tôi đã giấu trước đó.

Sắp xong! 'd' là giá trị ASCII 100, có thể dễ dàng thực hiện bằng cách nhân 10 * 10 (ít byte hơn so với việc lưu trữ trước đó và tải ngay bây giờ). Giá trị hex Alà 10, như là cơ số đầu vào của chúng ta mà chúng ta có thể truy xuất bằng lệnh I. Nhân số đó, in, sau đó tải và in dấu chấm than của chúng tôi từ trước đó. Chào thế giới!

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.