Ini adalah dandelion ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
Dandelion ASCII memiliki tiga parameter: Panjang batang (jumlah positif antara 1 dan 256, jumlah biji (jumlah positif antara 0 dan 7), dan orientasi (^ atau v). Dandelion di atas memiliki panjang, biji dan orientasi, ( 3,5, ^), (3,2, ^), (2,3, ^) dan (3,7, v) masing-masing.
Biji-biji diisi dengan urutan sebagai berikut (dibalik terbalik untuk dandelion head-down), diilustrasikan pada dandelion dengan panjang 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Tantangan:
Tulis sebuah program / fungsi yang ketika diberi dandelion ASCII sebagai input, mengembalikan panjangnya, jumlah benih, dan orientasi yang diformat mirip dengan contoh di atas dan ketika diberikan parameter dalam format itu mengembalikan dandelion ASCII dengan parameter tersebut. Anda dapat mengabaikan tanda kurung dan menganggap input / output akan berupa angka, koma, angka, koma, dan salah satu ^atau v. Anda dapat mengganti karakter lain dengan ^/ vselama mereka masih dapat dengan mudah diartikan sebagai 'naik' / 'turun' (misalnya, u/ d). Anda tidak perlu membedakan antara dandelion yang terlihat sama, seperti (2,1, ^) dan (3,0, ^) atau (2,1, ^) dan (2,1, v). Mengingat seni ASCII, set parameter akan menjadi output yang dapat diterima, dan kedua set parameter dapat memberikan seni ASCII yang sama.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Contoh program dalam C # (bahkan tidak sedikit golf):
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() + ",^";
}
}
^danv?