Tạo một bức tường nhị phân


33

Cho một mảng các số nguyên dương trong cơ sở 10, trong đó n > 0, xuất đại diện của chúng thành một bức tường nhị phân.

Cái này hoạt động ra sao?

  1. Chuyển đổi từng số thành biểu diễn nhị phân của nó.
  2. Di chuyển đại diện với các số 0 đứng đầu theo chiều dài của số dài nhất tức là 1, 2-> 1, 10->01, 10 .
  3. Tạo một bức tường trong đó 1s là gạch và 0s bị thiếu gạch.

Một bức tường là một khối các ký tự trong đó bất kỳ ký tự có thể in nào đại diện cho một viên gạch và một khoảng trắng ( 32) đại diện cho một viên gạch bị thiếu. Bạn có thể chọn bất kỳ ký tự nào cho viên gạch, nó không cần phải khác biệt trên tường miễn là nó không phải là một ký tự khoảng trắng. Nhân vật gạch bị thiếu phải là một không gian. Ví dụ dưới đây tôi đã sử dụng *cho các viên gạch.

Thí dụ

Đầu vào:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. Đầu ra:

    ****
     ***
    ** *
    * **
    

Quy tắc

  • Đầu vào phải được lấy trong cơ sở 10, nếu ngôn ngữ của bạn chấp nhận các cơ sở khác, bạn không thể sử dụng chúng.
  • Hàng đầu và dấu vết dòng mới được cho phép.
  • Đầu vào có thể được lấy dưới dạng danh sách các số nguyên, các đối số riêng biệt hoặc bất kỳ định dạng hợp lý nào.
  • Đầu ra có thể ở bất kỳ định dạng hợp lý nào: chuỗi phân tách dòng mới, mảng dòng, mảng 2d, v.v.
  • Sơ hở tiêu chuẩn là không được phép.

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

Lưu ý rằng trong trường hợp thử nghiệm đầu tiên, tất cả các lớp đều có một viên gạch trống ở cuối.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

****
* **
****
****

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

Đây là mã golf nên mã ngắn nhất sẽ thắng!


Đầu ra có thể là một mảng các dòng hoặc một mảng 2 ký tự không?
trứng

@ovs Xin lỗi, tôi nghĩ rằng tôi đã chỉ định rằng, vâng, bạn có thể xuất ra một mảng hoặc mảng 2d, v.v ... Bất kỳ định dạng hợp lý nào.
TheLethalCoder

Trong trường hợp mảng 2D, chúng ta có thể sử dụng số cho các khối thay vì ký tự không? ví dụ[[1, " ", 1, " "], ...]
Arnauld

@Arnauld Vâng, điều đó có vẻ tốt.
TheLethalCoder

1
@Giuseppe Chỉ các dòng mới, nếu không nó sẽ bị nhầm lẫn cho các viên gạch rỗng.
TheLethalCoder

Câu trả lời:


13

MATL , 5 byte

B42*c

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

Giải trình

B     % Implicitly input an array of numbers. Convert to binary. 
      % Gives a matrix with each row corresponding to a number
42    % Push 42 (ASCII code of '*')
*     % Multiply
c     % Convert to char. Char 0 is displayed as space. Implicitly display

Bạn có thể chọn bất kỳ ký tự nào cho viên gạch, nó không cần phải khác biệt trên tường miễn là nó không phải là một ký tự khoảng trắng. Vâng, điều đó có nghĩa là bạn có thể không cần 42*hoặc một cái gì đó ...
Erik the Outgolfer 24/07/17

@EriktheOutgolfer Tôi có thể chọn bất kỳ số nào khác, nhưng tôi nghĩ cần ba byte đó.
Luis Mendo

Điều gì xảy ra nếu có một byte dựng sẵn cho 100một số hoặc một số khác?
Erik the Outgolfer 24/07/17



8

Octave, 22 byte

@(x)[dec2bin(x)-16,'']

Dùng thử trực tuyến

Giải trình:

Đã lưu một số byte nhờ Luis Mendo! Ngoài ra, tôi không nhận thấy rằng tôi có thể chọn nhân vật nào để xây tường, không chỉ *.

@(x)                    % Take the input as a column vector
    dec2bin(x)          % Convert each row of the input to a string with 1 and 0
                        % It gets automatically padded with zeros, to fit the longest number
    dec2bin(x)-16       % Subtract 16, to get from the ASCII-values of 1/0 (48/49)
                        % to 32/33 (space and !)
@(x)[dec2bin(x)-16,'']  % Concatenate with the empty string to convert it to a string.

Hoặc với de2bi:

Giải trình:

@(x)                          % Take the input as a column vector
               de2bi(x)       % Convert each row of the input to a binary number.
                              % Gets automatically padded to fit the longest number
            42*de2bi(x)       % Multiply the matrix by 42, which is the ASCII-value for *
           [42*de2bi(x),'']   % Concatenate the matrix with the empty string to convert
                              % it to a string. 0 are automatically displayed as spaces
@(x)fliplr([42*de2bi(x),''])

Các hoạt động sau đây trên TIO, để biết thêm 7 byte:

@(x)fliplr([42*(dec2bin(x)>48),''])

Hãy thử nó ở đây


5

Python 3 , 88 84 71 74 72 byte

Một lambda trả về một danh sách các Chuỗi, đại diện cho mỗi dòng.

lambda n:[bin(x)[2:].replace(*'0 ').rjust(len(bin(max(n)))-2)for x in n]

Hãy thử trực tuyến! (liên kết đến phiên bản mới được phân tách)

Giải trình

  • lambda n:- Tạo một lambda (ẩn danh), với một tham số n. Trả về ngầm.

  • [...] - Tạo ra một sự hiểu biết danh sách.

  • bin(x)[2:] - Được biểu diễn nhị phân của các số.

  • .replace(*'0 ')- Thay thế tất cả các lần xuất hiện của 0với một không gian.

  • .rjust(len(bin(max(n)))-2) - Đệm các biểu diễn nhị phân theo chiều dài của cái dài nhất.

  • for x in n- Lặp lại qua n, với biến x.


Thay đổi

  • - 1 - 3 byte nhờ @Rod, -(...)+2= 2-(...), sử dụngrjust()

  • Đã thêm một phiên bản bin()thay vào đó, không hợp lệ vì nó không hoạt động 12.

  • Đã sửa lỗi trên bằng cách sử dụng format().

  • Thay đổi loại trả về danh sách Chuỗi, vì nó được OP cho phép.

  • Đã sửa một lỗi khác bằng cách sử dụng rjust()và chuyển trở lại bin(), được phát hiện và sửa bởi @Rod.


5

JavaScript (ES6), 81 79 byte

Đã lưu 2 byte bằng cách sử dụng số thay vì ký tự cho các khối hình, như đề xuất của Rick Hitchcock

Trả về một mảng 2D với 1 giây cho các viên gạch.

f=(a,b=[],x=1)=>a.every(n=>n<x)?a.map(n=>b.map(i=>n&i?1:' ')):f(a,[x,...b],x*2)

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




4

Ruby, 63 59 byte

-4 byte với sự giúp đỡ từ Alexis Andersen

->*n{puts n.map{|i|("%#{('%b'%n.max).size}b"%i).tr'0',' '}}

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


1
bạn không cần 0 ở định dạng chuỗi. bạn có thể cạo một byte bằng cách thay thế n.max.to_s(2).sizebằng ('%b'%n.max).sizevà bạn thực sự không cần phải thay thế 1bằng*
Alexis Andersen

@AlexisAndersen cảm ơn :)
daniero 24/07/17

4

R , 87 88 byte

Các khối tường được đại diện bởi một 8, bởi vì, rất nhiều đêm.

write(ifelse((I=sapply(scan(),intToBits))[(M=max(which(I>0,T)[,1])):1,],8,' '),1,M,,'')

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

Danh sách số nguyên đầu vào được chuyển đổi thành mảng bit được cắt theo 0 bit và được đảo ngược.

Mảng giảm sau đó là đầu ra bằng cách sử dụng write và độ rộng cột được xác định khi mảng được cắt.

ifelse() là tùy chọn IF duy nhất hoạt động trên các vectơ không may.


@Vlo chỉ ra rằng bạn có thể sử dụng 1thay vì ""cho tệp đầu ra write.
Giuseppe

@Giuseppe cảm ơn vì tiền boa
MickyT


3

APL (Dyalog) , 30 22 20 14 byte

Đã lưu 6 byte nhờ @ Adám

' *'[⍉2⊥⍣¯1⊢⎕]

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

(giả sử ⎕IO←0 vì đây là mặc định trên nhiều máy)

Điều này nhận đầu vào dưới dạng một mảng và trả về một ma trận với * s và s.

Giải trình

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string

Lưu 6 byte với' *'[⍉2⊥⍣¯1⊢⎕]
Adám

@ Adám Cảm ơn các mẹo, tôi không biết tôi có thể xóa ¨.
Kritixi Lithos

3

T-SQL, 290 byte

declare @ int;select @=max(log(a,2))+1from @i;with t as(select convert(varchar(max),a%2)b,a/2c,@-1m,ROW_NUMBER()over(order by(select 1))r from @i union all select convert(varchar(max),concat(c%2,b))b,c/2c,m-1,r from t where m>0)select replace(b,0,' ')from t where m=0group by r,b order by r

Công dụng 1 cho các mảnh gạch, giả sử đầu vào đến từ bảng@

Ungolfed, với một số lời giải thích

-- assume input is presented in an input table
declare @input table (a int)
insert into @input values (15), (7), (13), (11)

---- start here

-- figure out how many characters are needed, by taking log2
declare @max int
select @max = max(log(a, 2)) + 1
from @input

-- recursive cte
-- will join against itself, recursively finding each digit in the binary string
;with cte as
(
    select 
        convert(varchar(max), a % 2) as b, -- is the least significant bit 1 or 0
        a / 2 as c, -- remove least significant bit, for the next run
        @max - 1 as max, -- keep track of iterations left
        ROW_NUMBER() over (order by (select 1)) as rn -- keep the order of the input
    from @input

    union all -- recursive loop
              -- below columns follow the same pattern

    select convert(varchar(max), 
        concat(cte.c % 2, cte.b)) as b, -- prepend the current binary string with the newest least significant bit
        cte.c / 2 as c, 
        cte.max - 1, 
        cte.rn
    from cte
    where cte.max > 0
)
select replace(b, 0, ' ') -- swap 0s for space
from cte
where max = 0 -- only take the last iteration
group by rn, b -- grab each unique input, 
               -- need to group by row number so it can be ordered by
               -- need to group by binary string, so it can be selected
order by rn -- sort by the order the input arrived in

3

Toán học, 40 byte

Grid@PadLeft@IntegerDigits[#,2]/. 0->""&

Gạch là 1s

Toán học, 48 byte

Grid@PadLeft@IntegerDigits[#,2]/.{0->"",1->"#"}& 

Gạch là #


Bạn chỉ cần một dấu gạch chéo trong //.. ( /.có nghĩa là "thay thế một lần", //.có nghĩa là "tiếp tục thay thế cho đến khi mọi thứ ngừng thay đổi".)
Không phải là một cây vào

ok-fixed-cảm ơn
J42161217

Bạn không cần khoảng trắng sau dấu phẩy trong hàm IntegerDigits.
Đánh dấu S.

vâng, tôi biết, điều này xảy ra khi bạn sao chép / dán từ notebook.fixed
J42161217

2

C # (.NET Core) , 112 + 18 = 130 86 + 41 = 127 byte

a=>a.Select(n=>C.ToString(n,2).Replace("0"," ").PadLeft(C.ToString(a.Max(),2).Length))

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

Số lượng byte bao gồm 41 byte từ using System.Linq;using C=System.Convert;. Sử dụng 1như nhân vật cho bức tường. Tuy nhiên, đây là cách quá dài ngay cả đối với C # ...


Đặt vào namespace System.Linq{}để lưu một số byte. Được a.Max()đảm bảo là đúng (tôi chắc chắn rằng tôi không phải là người thông minh nhất với nhị phân: P)? Sẽ class Convert{}tiết kiệm được byte nào?
TheLethalCoder

1
Nếu tôi đặt chương trình trong một không gian tên nhất định, tôi có nên gửi toàn bộ chương trình thay vì chỉ một lambda không? Tôi không chắc chắn về các quy tắc cho điều đó ...
Charlie

Tôi thường chỉ đặt trong không gian tên với lambda. Tôi không nghĩ đã từng có một câu hỏi về nó và nó nằm trong trang mẹo C #.
TheLethalCoder

Tôi không nghĩ rằng điều này là hợp lệ, vì bạn không thể biên dịch nó mà không sử dụng nhập khẩu tĩnh.
MetaColon

2
@MetaColon đó là lý do tại sao tôi thêm các byte vào using System.Linq;using C=System.Convert;số byte, vì hai cái đóusing này là cần thiết để mã biên dịch.
Charlie

2

Võng mạc , 63 byte

.+
$*#<
+`(#+)\1
$1 
 #
#
{T`<`_`^(<.+(¶|$))+$
m`^<
 <
(.)<
<$1

Hãy thử trực tuyến! Giải trình:

.+
$*#<

Chuyển đổi sang unary, và hậu tố a <.

+`(#+)\1
$1 
 #
#

Chuyển đổi thành nhị phân.

{T`<`_`^(<.+(¶|$))+$

Khi tất cả các <s đã đến bên trái, xóa tất cả.

m`^<
 <

Chèn một khoảng trắng trước bất kỳ <s nào đã đến bên trái.

(.)<
<$1

Di chuyển tất cả < bước còn lại một bước. Rửa sạch và lặp lại.


2

PowerShell , 100 byte

$args|%{if(($c=($a=[convert]::ToString($_,2)).length)-gt$l){$l=$c}$a-replace0,' '}|%{$_.padleft($l)}

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

Ugh, converting đến nhị phân trong PowerShell là rất đau. Cộng với .lengthcác cuộc gọi y đến -replacecác 0với các không gian, cộng với một dài.padLeft() cuộc gọi để làm cho họ tất cả như nhau .length, tất cả còn tăng cường hệ trình dài.

Đề nghị chơi golf để có được dưới 100 được chào đón.


2

PHP, 84 byte

while(++$i<$argc)echo strtr(sprintf("\n%".-~log(max($argv),2).b,$argv[$i]),10,"* ");

May mắn thay, hoạt động bit phôi log kết quả đến int. float wouldn làm việc ở đây.

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


2

Clojure, 185 byte

(fn[i](let[b(map #(Long/toBinaryString %)i)](map #(clojure.string/replace(clojure.string/replace(format(str"%0"(reduce(fn[l i](max l(count i)))0 b)"d")(read-string %))"1""#")"0"" ")b)))

Phiên bản bị đánh cắp:

(fn [i]
    (let [b (map #(Long/toBinaryString %) i)]
        (map
            #(clojure.string/replace
                (clojure.string/replace
                    (format
                        (str "%0"
                            (reduce
                                (fn [l i] (max l(count i))) 0 b)
                            "d")
                        (read-string %))
                        "1"
                        "#")
                "0"
                " ")
        b)))

Hàm ẩn danh lấy đối số làm danh sách. Trả về các dòng như danh sách.

Đọc các câu trả lời khác, tôi cá là nó có thể nhỏ hơn. clojure.string/replacemất một lượng ký tự tục tĩu để viết ..


2

Japt , 33 30 byte

¡'0p(¡X¤lÃn o)-X¤l)+X¤)£" *"gX

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

Đã lưu 3 byte nhờ @Justin Mariner

Giải trình

¡                              // map input integers
    (¡X¤lÃn o)                 // longest binary string length
              -X¤l)            // minus current binary string length
 '0p                           // repeat zero
                   +X¤)        // concat with current binary string
                       £       // map chars of binary string
                        " *"gX // swap 0 and 1 with ' ' and '*'

Bạn có thể thả 3 ký tự cuối cùng để trả về một chuỗi các chuỗi và sử dụng -Rcờ (không được thêm vào số byte) để xem đầu ra được nối với dòng mới: tại đây .
Justin Mariner

2

Python 3 , 92 90 byte

lambda a:[' '*(len(bin(max(a)))-len(i)-2)+i for i in[bin(i)[2:].replace(*'0 ')for i in a]]

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

Trả về một danh sách các dòng. Xếp chúng lên cho thấy họ thực sự sắp xếp đúng.

['111 ', ' 1  ', ' 11 ', '  1 ']
>>>
 111 
  1  
  11 
   1 

Sự phá vỡ

Về cơ bản chuyển đổi mảng thành nhị phân, sau đó thay thế tất cả 0 bằng dấu cách. Nsố lượng không gian được thêm vào phía trước của mỗi dòng trong đó N = [length of longest line] - [length of line].

-1 bytes Cảm ơn ông Xoder

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


Bạn không thể có khoảng trắng ở đầu hoặc cuối ở đầu ra.
TheLethalCoder

@TheLethalCoder ơi, chắc là đã đọc sai quy tắc! Cảm ơn đã nắm bắt điều đó.
Graviton

90 byte , thay thế '0',' 'bằng *'0 '.
Ông Xcoder

@ Mr.Xcoder Ah thú vị, sẽ không bao giờ nghĩ về điều đó. Cảm ơn!
Graviton

2

Japt , 11 byte

m¤z3 z ·r0S

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

Giải trình

m¤z3 z ·r0S  Implicit input of array
m¤           Map the array to binary strings
  z3 z       Rotate right 270° and then right 90°. This adds left padding to each string
       ·r0S  Join with newlines and replace 0s with spaces

Khai thác tốt với z3 z. Không chắc tại sao y ykhông hoạt động ở đó, tôi sẽ xem xét nó sau ...
Sản phẩm ETH

2

Java 7, 130 108 88 byte

Đã lưu 22 nhờ @TheLethalCoder Đã lưu 20 nhờ @Xanderhall

void a(int[]b){for(int i:b)System.out.println(Long.toBinaryString(i).replace('0',' '));}

Ung dung:

void a(int[]b){
    for(int i:b)
        System.out.println(Long.toBinaryString(i).replace('0', ' '));       
}

1
Đăng gia tăng itại b[i]để lưu một byte. Bạn có thể giữ đầu ra với 1'vì vậy không cần .replace('1','*'). Sử dụng Java 8 thay thế và biên dịch thành lambda để lưu byte. Nếu bạn không muốn làm điều đó sẽ int[]btiết kiệm một byte.
TheLethalCoder

Cảm ơn bạn! Bạn có thể vui lòng giải thích những gì "Đăng tăng i tại b [i] để lưu một byte." có nghĩa?
Java Gonzar

i++đánh giá isau đó tăng nó (trong khi ++ingược lại) để bạn có thể di chuyển i++ra khỏi forvòng lặp và sử dụng b[i++]thay thế. Ồ và trong khi chúng tôi ở đó, bạn chỉ có một dòng trong vòng lặp của mình để không cần niềng răng.
TheLethalCoder

Thật! Thật tuyệt, cảm ơn bạn
Java Gonzar

2
Bạn có thể lưu một vài byte bằng cách chuyển vòng lặp của bạn sang vòng lặp foreach. for(int x:i)Ngoài ra, bạn có thể sử dụng Long.toBinaryStringthay vì phiên bản Integer để lưu 3 byte.
Xanderhall

1

Python 2, 217 byte

Sau 2 giờ mã hóa tôi đã quyết định, numpy là ý tưởng tồi cho việc này

import numpy as n
i=n.loadtxt("i")
o=[n.copy(i)]
o[0].fill(10)
while n.count_nonzero(i)>0:
 o.append(i%2+32)
 i=n.vectorize(lambda x:x//2)(i)
print n.fliplr(n.array(o).T).astype('uint8').view('c').tostring().decode()

Sử dụng trong Ubuntu

Cài đặt gọn gàng

python2 -m pip install numpy

Tạo tập tin có tên ivới đầu vào ở định dạng14 4 6 2

Chạy

python2 prog.py

1

8 , 232 254 250 byte

0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop

Phiên bản Ungolfed với ý kiến

\ convert to binary and save longest string length
: f 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop ;

\ pad binary number with zero
: f1 a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop ;

\ replace every 0 with space
: f2 a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ;

\ replace every 1 with * and print each line of bricks
: f3 ( nip /1/ "*" s:replace! . cr ) a:each drop ;

Những từ này phải được gọi theo thứ tự (xem ví dụ)

Cách sử dụng và ví dụ

ok> [15,7,13,11] 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop
****
 ***
** *
* **

Hay nói rõ hơn

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****


1

VBA Excel, 170 161 byte

Chơi gôn

Hàm cửa sổ tức thời VBE ẩn danh lấy đầu vào định dạng 1 2 3 .. ntừ phạm vi [A1]và xuất tường nhị phân tương ứng sang cửa sổ Ngay lập tức VBE qua phạm vi[B1,C1,2:2]

n=Split([A1]):[A2].Resize(1,UBound(n)+1)=n:[C1]="=Int(1+Log(B1,2))":For Each i In n:[B1]=i:?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," "):Next

Định dạng:

n=Split([A1])
[A2].Resize(1,UBound(n)+1)=n
[C1]="=Int(1+Log(B1,2))"
For Each i In n
[B1]=i
?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," ")
Next

Bị đánh cắp

Toàn bộ Subthường trình lấy đầu vào định dạng Array(1, 2, 3...)và xuất tường nhị phân tương ứng vào cửa sổ Ngay lập tức VBE qua phạm vi[A1,B1,2:2]

Sub a(ByRef n As Variant)
    Let Range("A1").Resize(1,UBound(n)+1) = n
    Let Range("C1").Value = "=Int(1+Log(A1,2))"
    Dim i As Integer
    For Each i In n
        Let Range("A1").Value = i
        Debug.Print Replace(
                            Replace(
                                    [Right( Rept( 0, C1) & Dec2Bin( B1), C1)],
                                    1,
                                    "*"
                            ),
                            0,
                            " "
                    )
    Next
End Sub

1

Than , 20 byte

WS«⸿≔IιιWι«←§ *ι≧÷²ι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Hoạt động bằng cách chuyển đổi thủ công từng số đầu vào thành nhị phân nhưng in theo thứ tự từ phải sang trái. Tôi lấy đầu vào là một chuỗi kết thúc dòng mới vì Char than không có cách nào tốt để nhập danh sách nếu không tôi sẽ viết một cái gì đó như thế này mà không may hiện mất 21 byte:

WS⊞υIιW⌈υ«Eυ﹪κ²↓⸿≧÷²υ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Phiên bản này vectơ trên mảng đầu vào, mặc dù đầu ra của nó được mã hóa thành -s để lưu một byte.

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.