Đây là bồ công anh ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
Bồ công anh ASCII có ba tham số: Chiều dài của thân (số dương từ 1 đến 256, số hạt (số dương từ 0 đến 7) và hướng (^ hoặc v). Các bồ công anh ở trên có chiều dài, hạt và hướng, ( 3,5, ^), (3,2, ^), (2,3, ^) và (3,7, v) tương ứng.
Hạt giống được điền theo thứ tự sau (lộn ngược cho bồ công anh từ trên xuống), được minh họa trên một cây bồ công anh có chiều dài 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Các thách thức:
Viết chương trình / hàm mà khi cho bồ công anh ASCII làm đầu vào, trả về độ dài, số hạt và hướng được định dạng tương tự như các ví dụ trên và khi các tham số trong định dạng đó trả về một bồ công anh ASCII với các tham số đó. Bạn có thể bỏ qua dấu ngoặc đơn và giả sử đầu vào / đầu ra sẽ là một số, dấu phẩy, số, dấu phẩy và ^
hoặc v
. Bạn có thể thay thế các ký tự khác trong ^
/ v
miễn là chúng vẫn có thể dễ dàng được hiểu là 'lên' / 'xuống' (ví dụ: u
/ d
). Bạn không cần phân biệt giữa các bồ công anh trông giống nhau, chẳng hạn như (2.1, ^) và (3.0, ^) hoặc (2.1, ^) và (2.1, v). Với nghệ thuật ASCII, một trong hai bộ tham số sẽ là đầu ra chấp nhận được và cả hai bộ tham số có thể cho cùng một nghệ thuật ASCII.
Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte thắng.
Một chương trình ví dụ trong C # (thậm chí không được đánh gôn):
string Dandelion(string s)
{
if (s.Contains(','))
{
//got parameters as input
string[] p = s.Split(',');
//depth and width (number of seeds)
int d = int.Parse(p[0]);
int w = int.Parse(p[1]);
//draw stem
string art = " |";
while (d > 2)
{
d--;
art += "\n |";
}
//draw head
string uhead = (w % 2 == 1 ? "|" : " ");
string dhead = uhead;
if (w > 1)
{
uhead = "\\" + uhead + "/";
dhead = "/" + dhead + "\\";
if (w > 5)
{
uhead = "_" + uhead + "_\n /|\\";
dhead = "_\\|/_\n " + dhead;
}
else if (w > 3)
{
uhead = " " + uhead + " \n /|\\";
dhead = " \\|/ \n " + dhead;
}
else
{
uhead = " " + uhead + " \n |";
dhead = " |\n " + dhead;
}
}
else
{
uhead = " " + uhead + "\n |";
dhead = " |\n " + dhead;
}
//add head to body
if (p[2] == "^")
{
return uhead + "\n" + art;
}
return art + "\n" + dhead;
}
else
{
//ASCII input
string[] p = s.Split('\n');
int l = p.Length - 1;
int offset = 0;
//find first non-' ' character in art
while (p[0][offset] == ' ')
{
offset++;
}
int w = 0;
if (p[0][offset] == '|')
{
//if '|', either head-down or no head.
if (offset == 0 || p[l][offset - 1] == ' ')
{
//if no space for a head to the left or no head at the bottom, no head.
return l.ToString() + ",1,^";
}
//head must have at least size 2, or else indistinguishable from no head case
w = 6;
if (p[l][offset] == '|')
{
//odd sized head
w = 7;
}
if (offset == 1 || p[l - 1][offset - 2] == ' ')
{
//not size 6 or 7
w -= 2;
if (p[l - 1][offset - 1] == ' ')
{
//not size 4 or 5
w -= 2;
}
}
return l.ToString() + "," + w.ToString() + ",v";
}
else if (p[0][offset] == '\\')
{
//head at least size 2 and not 6/7, or indistinguishable from no head.
w = 4;
if (p[0][offset + 1] == '|')
{
w = 5;
}
if (p[1][offset] == ' ')
{
w -= 2;
}
}
else
{
w = 6;
if (p[0][offset + 2] == '|')
{
w = 7;
}
}
return l.ToString() + "," + w.ToString() + ",^";
}
}
^
vàv
?