Các hình lục giác được kết nối ASCII


21

Tổng quan

Cho một số hình lục giác, sắp xếp chúng thành một hình dạng được kết nối trong giới hạn của hình ảnh nghệ thuật 50 x 50 ASCII. Hình dạng bạn chọn có thể tùy ý - bất cứ điều gì bạn thấy phù hợp nhất với việc chơi golf - miễn là nó được kết nối. Nó có thể có các lỗ với điều kiện chúng lớn hơn một hình lục giác (nếu không số lượng hình lục giác sẽ không rõ ràng).


Bố trí

Tất cả các hình lục giác phải ở dạng sau (chỉ kích thước và hướng này là hợp lệ):

 __
/  \
\__/    Note there are 2 underscores per horizontal edge.

Hai hình lục giác được kết nối trực tiếp nếu chúng có chung một cạnh:

 __               __
/  \__           /  \
\__/  \          \__/
   \__/    or    /  \
                 \__/

Hai hình lục giác không được kết nối nếu chúng chỉ chia sẻ một đỉnh:

 __  __
/  \/  \
\__/\__/

Chia sẻ một nửa cạnh cũng không được tính là kết nối:

 __
/  \
\__/
 /  \
 \__/

Một tập hợp các hình lục giác được kết nối nếu có một đường dẫn từ bất kỳ hình lục giác nào đến bất kỳ hình lục giác nào khác chỉ sử dụng các hình lục giác được kết nối trực tiếp .

Lỗ

Một lỗ có kích thước hình lục giác trong bộ sưu tập các hình lục giác được kết nối được tính là một hình lục giác, do đó, bất kỳ tác phẩm nghệ thuật ASCII nào cũng có số lượng hình lục giác rõ ràng.

Điều này không được tính là một lỗ vì lỗ tiềm năng là một hình lục giác đơn:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      7 hexagons (not 6 with a hole)

Điều này không được tính là một lỗ vì nó không tương ứng với một hình lục giác:

    __
 __/  \__
/  \__/  \__
\__/  \__/  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/      8 hexagons with a hole

Đầu vào và đầu ra

Đầu vào

Một số nguyên từ 1 đến 255.

Đầu ra

Một chuỗi nghệ thuật ASCII đại diện cho số lượng hình lục giác được kết nối như mô tả ở trên.

  • Số lượng hàng (chuỗi con phân tách dòng mới) nhiều nhất là 50, cộng với một dòng mới tùy chọn bổ sung.
  • Các hàng không cần phải có cùng độ dài, nhưng mỗi hàng phải có độ dài tối đa là 50.
  • Các hàng có độ dài bằng không có thể tồn tại trên hoặc dưới hình được kết nối với điều kiện tổng số hàng không vượt quá 50.
  • Các hàng chỉ có không gian có thể tồn tại bên trên hoặc bên dưới hình được kết nối với điều kiện tổng số hàng không vượt quá 50.
  • Không gian có thể xuất hiện ở bên trái của hình với điều kiện độ dài hàng không vượt quá 50 (hình không cần phải căn chỉnh sang bên trái).
  • Không gian có thể xuất hiện ở bên phải của hình với điều kiện độ dài hàng không vượt quá 50.
  • Bất kỳ ký tự nào không tạo thành một phần của hình dạng được kết nối phải là dấu cách hoặc dòng mới.

Với điều kiện đầu ra là chính xác, không bắt buộc phải nhất quán từ lần chạy này đến lần chạy tiếp theo.

Ví dụ

Đầu vào: 6

Đầu ra hợp lệ:

 __    __    __
/  \__/  \__/  \__
\__/  \__/  \__/  \
   \__/  \__/  \__/

 __    __
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/

          __
 __      /  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/
      /  \
      \__/

Đầu ra không hợp lệ:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      Invalid for 6 as the centre hole counts as a 7th hexagon.

 __    __    __      __
/  \__/  \__/  \    /  \
\__/  \__/  \__/    \__/
   \__/  \__/                Invalid as the 6 hexagons are not connected.

 __    __    __  __
/  \__/  \__/  \/  \
\__/  \__/  \__/\__/
   \__/  \__/           Invalid as vertex touching does not count as connected.

 __    __       __
/  \__/  \     /  \
\__/  \__/     \__/
/  \__/  \
\__/  \__/
   \__/       Invalid as the 6 connected hexagons are not the only visible characters.

Chiến thắng

Câu trả lời hợp lệ ngắn nhất tính bằng byte thắng.


Bảng xếp hạng

(sử dụng đoạn trích bảng xếp hạng của Martin )


Tôi sợ mọi người sẽ sử dụng mẫu đầu ra ví dụ đầu tiên vì nó có thể dễ thực hiện nhất.
Gây tử vong vào

1
@Firthize ví dụ của tôi chỉ hoạt động cho một đầu vào của 6. Đối với đầu vào của 255một hàng hình lục giác nằm ngang sẽ không phù hợp với nghệ thuật ASCII 50 x 50.
trichoplax

Bạn vẫn có thể chỉ cần lặp lại và điền vào các dòng bên dưới mỗi khi bạn đạt đến giới hạn 50 ký tự
Làm chết người vào

1
@Firthize Thách thức là giảm thiểu số lượng byte trong mã. Tôi không phiền nếu các mẫu đơn giản, sẽ rất thú vị để xem mọi người thử gì và phù hợp với các ngôn ngữ khác nhau.
trichoplax

@Firthize: Tôi không biết nó có ngắn hay không, nhưng một câu trả lời "thú vị" hơn có thể thực hiện một tìm kiếm thực tế để xem nơi nó có thể đặt hình lục giác và do đó có được đầu ra thú vị hơn.
Alex Van Liew

Câu trả lời:


13

CJam, 64 57 55 byte

" __
/  \
\__/"N/{_SS/\+_47>S3*f{\+}_2>\@?}q~(*]:..e>N*

Kiểm tra nó ở đây.

Điều này sẽ tạo ra mẫu sau, theo cột :

 __    __    __    __    __    __
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/

Giải trình

Điều này dựa trên mẹo tuyệt vời của Dennis , sử dụng .e>để lắp ráp một sản phẩm nghệ thuật ASCII từ nhiều tác phẩm. Như ông nói, .e>lấy tối đa phần tử của hai mảng (hoặc chuỗi) và vì các khoảng trắng có mã ký tự thấp nhất, chúng ta có thể sử dụng giá trị này để áp đặt bất kỳ ký tự nào khác trên lưới chuỗi. Hơn nữa, nếu hai mảng không có cùng độ dài, các phần tử bên ngoài của mảng dài hơn được sao chép đơn giản. Điều này có nghĩa là các mẫu khác nhau thậm chí không cần phải có cùng kích thước. Để áp dụng điều này cho mảng hai chiều (vì chúng tôi không muốn chèn dòng mới cho đến khi kết thúc), chúng tôi áp dụng .e>cặp đôi cho các dòng, cung cấp ..e>.

Ý tưởng cơ bản của mã là tạo ra các Nbản sao của một hình lục giác đơn được di chuyển đến đúng vị trí. Chúng tôi "di chuyển" hình lục giác theo chiều dọc bằng cách chuẩn bị các dòng trống và theo chiều ngang bằng cách thêm vào các khoảng trắng. Sau khi hoàn thành, chúng tôi gấp tất cả các bản sao lại với nhau, bằng cách sử dụng trình điều khiển đẹp nhất :..e>(có lẽ là toán tử dài nhất tôi từng sử dụng trong chương trình CJam).

Đây là mã:

" __
/  \
\__/"N/    e# Get a 2D character grid of the hexagon.
{          e# Read input N, repeat this block N-1 times.
  _        e#   Make a copy, so we leave the last hexagon on the stack.
  SS/\+    e#   Prepend two empty lines.
  _47>     e#   Make a copy and discard the first 47 lines.
  S3*f{\+} e#   Prepend 3 spaces to each line. This copy has been moved back to
           e#   the top and one column to the right.
  _2>      e#   Make a copy and discard another two lines.
  \@?      e#   If any lines were left after that, pick the copy in the next column,
           e#   otherwise, stay in the same column.
}q~(*      
]:..e>     e# Wrap all the hexagons in an array and fold them into a single grid.
N*         e# Join them with newline characters.

Man, tôi thực sự nên học một trong những ngôn ngữ chơi gôn này.
Alex Van Liew

@AlexVanLiew Bạn nên! :) Nhưng không phải vì nó cải thiện cơ hội chiến thắng môn đánh gôn của bạn, mà bởi vì CJam là một ngôn ngữ đẹp, rất thú vị khi lập trình và tôi không biết bất kỳ ngôn ngữ nào khác trong đó giải pháp trên (mà tôi nghĩ là khá thanh lịch) sẽ có ý nghĩa. ;)
Martin Ender

Tôi có thể học Pyth hoặc cả hai; cả hai đều khá giống nhau hay là một thứ tốt hơn so với phần còn lại?
Alex Van Liew

@AlexVanLiew Tôi không biết nhiều về Pyth, nhưng tôi biết rằng họ ở xa điều tương tự. CJam là một ngôn ngữ dựa trên ngăn xếp, trong khi Pyth có nguồn gốc là một tốc ký cho Python (nhưng giờ đây đã có bộ tích hợp sẵn). Pyth có thể hơi chiếm ưu thế khi chơi golf, nhưng cá nhân tôi thực sự thích lập trình ở một mô hình khác, vì vậy tôi sẽ gắn bó với CJam.
Martin Ender

Aha, tôi hiểu rồi. Tôi biết Python khá rõ, đó là lý do tại sao tôi muốn học Pyth, nhưng nếu tôi có thời gian, có lẽ tôi cũng sẽ thử cho CJam!
Alex Van Liew

7

Python 2, 219 207 ký tự

b=bytearray(' ');h=['__ ','/  \\','\\__/'];k=range;x=input();g=[b*50for _ in k(50)]
for i in k(x):
 c=i*3%48+1;r=(i*3+1)/48*2+i%2
 for m in k(i>15,3):n=m==0;g[r+m][c+n:c+4-n]=h[m]
print"\n".join(map(str,g))

Đưa đầu vào vào stdin.

Khá nhiều thứ chỉ tạo ra một lưới 50x50 không gian và sắp xếp các hình lục giác ở nơi thích hợp. Sau hình lục giác thứ 16, tôi không cần hàng đầu tiên h(hình lục giác dưới dạng mảng 2D) vì vậy tôi sử dụng i>15để bắt đầu phạm vi ở mức 1 thay vì 0. c=i*3%48+1;r=(i*3+1)/48*2+i%2tính toán c olumn và r ow tôi cần bắt đầu. nlà một boolean nhưng được sử dụng như một số nguyên để sửa các giới hạn (vì h[0]chỉ có 3 ký tự để tránh ghi đè lên công cụ).

Tôi khá hài lòng với cái này, tôi đã loại bỏ khoảng 50 byte kể từ phiên bản ban đầu, đặc biệt là khi tôi nhớ a[x:y]=bcú pháp.

Đầu ra (n = 30):

  __    __    __    __    __    __    __    __
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/  \__/
(plus 44 lines of spaces each 50 wide)

Vì các dòng khoảng trắng được cho phép, tôi đã thay đổi việc tạo thành gchỉ tạo 50 bytearraygiây thay vào đó 3+(x>1)+x/16*2, đó là số lượng hàng chính xác cần thiết, loại bỏ 12 byte.


6

Swift 2.0, 601 591 byte

import Cocoa
var a=Int(Process.arguments[1])!,b="/  \\__".join([String](count:9,repeatedValue:""))+"/",c="\\__/  ".join([String](count:9,repeatedValue:""))+"\\",d=c.startIndex,e=c.endIndex,j=[c.stringByReplacingOccurencesOfString("\\",withString:" ").stringByReplacingOccurencesOfString("/",withString:" ").substringToIndex(advance(d,3*a,e)),b.substringToIndex(advance(d,3*a+a%2,advance(e,-1)))]
while a>0{j+=[c.substringToIndex(advance(d,3*a+1,e)),b.substringToIndex(advance(d,3*a+(a+1)%2,e)]
a<=16 ?j+=[" "+j.removeLast().substringFromIndex(advance(d,1))]:()
a-=16}
for l in j{print(l)}

Chạy: swift hexagons.swift 21

Đầu ra:

 __    __    __    __    __    __    __    __    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/
   \__/  \__/  

Swift substringToIndexstringByReplacingOccurencesOfStringchiếm rất nhiều nhân vật ...


Tôi hoàn toàn không biết Swift, nhưng không có cách nào để xây dựng chuỗi lặp đi lặp lại với ít mã hơn?
Reto Koradi

Cách duy nhất tôi biết để lặp lại một chuỗi là với stringByPaddingToLength, tuy nhiên trong trường hợp này, nó sẽ dài hơn 11 ký tự so với việc gõ chuỗi đầy đủ.
David Skrundz

6
Tôi thấy Apple thực sự thích nối chuỗi quá dài. Không tệ như stringByAppendingStringtrong Objective-C nhưng vẫn ...
Gây tử vong vào

Bên ngoài mã golf, điều này thực sự tốt vì nó làm cho việc tìm kiếm một phương pháp dễ dàng hơn nhiều.
JustSid

4

C, 238 byte

#define h(A) c[m+A/4][n+A%4]
i,m,n;
f(a)
{
    char c[50][51];
    for(i=0;i<50;i++)for(m=0;m<51;m++)c[i][m]=m-50?32:0;
    for(;a;)
        m=a/12*2,n=a%12*3,a--%2?m=a/12*2+1,n=a%12*3+3:0,
        h(1)=h(2)=h(9)=h(10)=95,h(4)=h(11)=47,h(7)=h(8)=92;
    for(;i;)puts(c-i--+50);
}

Chỉ có không gian cần thiết và dòng mới được xem xét cho số lượng nhân vật.

Nó chỉ đơn giản là tạo ra một ma trận các ký tự, điền chúng theo thứ tự ngược lại, và sau đó in toàn bộ.


2

JavaScript (ES6), 265 byte

A=Array;f='forEach';U=x=1;y=0;a=A.from(A(51),_=>A.from(A(51),_=>' '));d=h=>(` __
/  \\
\\__/`.split`
`[f]((l,i)=>[...l][f]((c,j)=>{if('_/\\'.indexOf(a[x+i][y+j])<0)a[x+i][y+j]=c})),(x+=U*-2+1),(U=!U),(C-y<=3?((U=x+=2),y=0):y+=3),--h?d(h):a.map(d=>d.join``).join`
`)

Tessellates hình lục giác liên tiếp, từ trái sang phải, xen kẽ lên xuống xuống giống như một tổ ong cho đến khi kết thúc một hàng.

Ungolfed với mô tả (hoạt động trong firefox):

'use strict';
const CAP = 51;
var a = Array.from(Array(51), () => Array.from(Array(51),() => ' '))

function draw (hexagons, x, y, a, up) {
  // x, y (row, col) represents the current position of the cursor
  /*
  
    Here's a map of the first three iterations:
    
            01234567
     0        __
     1     __/  \__
     2    /  \__/  \
     3    \__/  \__/

    For the first 17 iterations, the cursor will be at:
    
      # | x | y
      ----------
      1 | 1 | 0
      2 | 0 | 3
      3 | 1 | 6
      4 | 0 | 9
      5 | 1 | 12
      6 | 0 | 15
      7 | 1 | 18
      8 | 0 | 21
      9 | 1 | 24
     10 | 0 | 27
     11 | 1 | 30
     12 | 0 | 33
     13 | 1 | 36
     14 | 0 | 39
     15 | 1 | 42
     16 | 0 | 45
     17 | 3 | 0      <- moves back to the first row

  */
` __
/  \\
\\__/`
  // split the hexagon into three lines
  .split('\n').forEach((line, index) => {
    // and for each line
    ;[...line].forEach((char, j) => {
      // if the cursor position (x, y) translated
      // by (index, j) is not already part of a hexagon
      // then replace it with the current (index, j) piece
      // of the hexagon
      /*
         0123
       0  __
       1 /  \
       2 \__/
       
      */
      if ('_/\\'.indexOf(a[x + index][y + j]) < 0)
        a[x + index][y + j] = char
    })
  })
  
  // `up` represents the next hexagon
  // if true, the next hexagon will be drawn attached to
  // the top right edge of the current hexagon
  if (up) {
    x -= 1
  // otherwise, it'll be drawn attached to the bottom right edge
  } else {
    x += 1
  }

  // move three columns to the right
  y += 3
  // change directions
  up = !up

  // if within the right boundary of the 51x51 matrix,
  // move back to the left edge and down 2 rows
  // and draw the next hexagon as an `up` hexagon
  if (51 - y <= 3) {
    y = 0
    x += 2
    up = true
  }

  // if hexagons > 0, then recurse and draw the next hexagon
  // otherwise, return the array (join the columns in each row, then join each row
  // by a new line)
  return --hexagons ?
    draw(hexagons, x, y, a, up)
    : a.map(d => d.join('')).join('\n')
}

var n = parseInt(prompt('Number to draw:'))
var r = draw(n, 1, 0, a, true)
document.write('<pre>' + r.replace(/\n/g, '<br>') + '</pre>')


2

Hồng ngọc, 120

->n{a=(1..50).map{' '*50}
n.times{|i|x=i%16*3
3.times{|j|a[47-i/16*2-x/3+j][x..x+3]=[' __ ','/  \\','\__/'][j]}}
puts a}

tạo một mảng gồm 50 chuỗi gồm 50 khoảng trắng, sau đó thay thế 4 ký tự trong 3 dòng để thêm các hình lục giác:

" __ "
"/  \"
"\__/"

Vì dòng đầu tiên chứa khoảng trắng, một khi hình lục giác đã được vẽ, chúng ta không thể vẽ một hình khác bên dưới nó, bởi vì các khoảng trắng sẽ ghi đè lên các hình lục giác trước đó.

Do đó, các hình lục giác được thêm vào dưới dạng hình thoi 16x16 (hình chữ nhật bị biến dạng) từ dưới lên trên và nghiêng từ dưới trái sang trên phải.

Chuỗi " __ "sau đó sẽ được ghi đè bằng bổ sung \/nơi cần thiết.

Ungolfed trong chương trình thử nghiệm

g=->n{
  a=(1..50).map{' '*50}              #make an array of 50 strings of 50 spaces
  n.times{|i|                        #loop through all hexagons
    x=i%16*3                         #x coordinate of top left corner of hexagon, 16 per row
    3.times{|j|                      #loop through 3 lines to print hexagon.
      a[47-i/16*2-x/3+j][x..x+3]=    #47-i/16*2 : start at the bottom and work up. each row is 2 lines high and contains 16 hexagons. x/3 : slant upwards as the row moves right. 
       [' __ ','/  \\','\__/'][j]    #These are the symbols for each of the 3 lines required for a hexagon. [x..x+3] defines which characters have to be replaced in each string.
    }      
  }
  puts a                             #print to stdout
}

N=gets.to_i
g.call(N) 

Sản lượng tiêu biểu (n = 250)

Cần có thêm một vài hàng khoảng trắng ở trên cùng, để tạo tổng cộng 50, nhưng tôi không biết có cách nào để Stackexchange định dạng để bao gồm chúng không.

                                              __  
                                           __/  \ 
                                        __/  \__/ 
                                     __/  \__/  \ 
                            __    __/  \__/  \__/ 
                         __/  \__/  \__/  \__/  \ 
                      __/  \__/  \__/  \__/  \__/ 
                   __/  \__/  \__/  \__/  \__/  \ 
                __/  \__/  \__/  \__/  \__/  \__/ 
             __/  \__/  \__/  \__/  \__/  \__/  \ 
          __/  \__/  \__/  \__/  \__/  \__/  \__/ 
       __/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
    __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
 __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/       
\__/  \__/  \__/  \__/  \__/  \__/  \__/          
/  \__/  \__/  \__/  \__/  \__/  \__/             
\__/  \__/  \__/  \__/  \__/  \__/                
/  \__/  \__/  \__/  \__/  \__/                   
\__/  \__/  \__/  \__/  \__/                      
/  \__/  \__/  \__/  \__/                         
\__/  \__/  \__/  \__/                            
/  \__/  \__/  \__/                               
\__/  \__/  \__/                                  
/  \__/  \__/                                     
\__/  \__/                                        
/  \__/                                           
\__/                                              
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.