这些是ASCII蒲公英:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\ASCII蒲公英有三个参数:茎长(阳性数在1~ 256之间,种子数在0~7之间)和方位(^或v)。蒲公英的长度、种子和方向分别为(3,5,^),(3,2,^),(2,3,^)和(3,7,v)。
种子按以下顺序填充(头朝下的蒲公英倒转),长度为2的蒲公英:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |编写一个程序/函数,当给定一个ASCII蒲公英作为输入时,返回它的长度、种子数和方向,其格式类似于上面的示例,并且当给定的参数以该格式返回带有这些参数的ASCII蒲公英。您可以忽略括号,假设输入/输出是一个数字、一个逗号、一个数字、一个逗号,或者是^或v。您可以将其他字符替换为^/v,只要它们仍然很容易被解释为'up'/'down‘(例如,u/d)。您不需要区分看起来相同的蒲公英,例如(2,1,^)和(3,0,^)或(2,1,^)和(2,1,v)。给定ASCII技术,这两组参数都是可接受的输出,这两组参数都可以给出相同的ASCII技术。
这是密码-高尔夫,所以以字节为单位的最短代码将获胜。
C#中的一个示例程序(甚至没有稍微变高):
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() + ",^";
}
}发布于 2017-02-06 22:18:33
接受输入为stdin中的单个字符串,而不拖尾换行符。参数将采用相同的方式,但格式化为
length (1-256)
orientation (u or d)
seeds (0-7)当输入是蒲公英时,程序的输出参数将采用与上面相同的格式。
六角山:
00000000 26 52 ca c1 20 5d d3 d0 80 d5 cd a0 5e 80 4c cc &RÊÁ ]ÓÐ.ÕÍ ^.LÌ
00000010 a0 45 86 25 3e 88 4d a0 6b 80 4c a0 5e 80 23 60 E.%>.M k.L ^.#`
00000020 cd a0 63 80 43 cd a0 5f 80 50 84 a3 81 00 20 5e Í c.CÍ _.P.£.. ^
00000030 d0 84 a3 81 01 4d a0 60 80 4a c1 4c a0 45 86 25 Ð.£..M `.JÁL E.%
00000040 3a d0 84 a3 81 02 4c a0 45 92 25 3a d0 84 a3 81 :Ð.£..L E.%:Ð.£.
00000050 03 20 60 a0 5f a3 81 04 cd a0 61 80 50 84 a3 81 . ` _£..Í a.P.£.
00000060 05 20 5e cf 52 cc a0 45 86 25 3c a3 81 06 23 81 . ^ÏRÌ E.%<£..#.
00000070 07 a0 61 cf 53 d0 80 a3 81 08 20 80 b5 4c a0 43 . aÏSÐ.£.. .µL C
00000080 8c 25 3a 00 52 a0 6b d3 50 80 a0 63 20 80 7e 20 .%:.R kÓP. c .~
00000090 63 20 80 7b 23 00 53 d0 80 c3 cc d0 80 a0 78 20 c .{#.SÐ.ÃÌÐ. x
000000a0 80 01 8c 25 3a d2 ce cc a0 5d 80 23 81 09 80 4c ...%:ÒÎÌ ].#...L
000000b0 d0 84 a0 5e 25 3b 81 23 81 0a ce d3 50 80 a0 78 Ð. ^%;.#..ÎÓP. x
000000c0 20 80 7e 81 23 60 23 71 cc d2 cc d0 84 d0 84 a0 .~.#`#qÌÒÌÐ.Ð.
000000d0 78 25 3a 25 3a 81 23 81 0b cc a5 3d 8b 4c cc d0 x%:%:.#..Ì¥=.LÌÐ
000000e0 84 d0 84 a0 78 25 39 25 39 81 50 84 d0 84 a0 78 .Ð. x%9%9.P.Ð. x
000000f0 25 3a 25 39 8d 25 3b 4c cc d0 84 d0 84 a0 78 25 %:%9.%;LÌÐ.Ð. x%
00000100 39 25 3c 81 23 81 0b 8d 25 3b 8b 4c d0 84 d0 84 9%<.#...%;.LÐ.Ð.
00000110 a0 78 25 39 25 3b 81 23 81 0b 00 20 80 7b 23 81 x%9%;.#... .{#.
00000120 04 a0 df 20 a0 5c a0 7c a0 2f 0a a0 a0 5f af fc . ß \ | /. _¯ü
00000130 5c a0 fc 20 8a a0 a0 fc a0 20 a0 a0 fc a0 20 7c \ ü . ü ü |
00000140 20
00000141等效JavaScript:
+a? // if input is parameters
(
b=(C>5)<<(o=b=="d"), // encoding if seeds > 5 and if orientation is down
g=[ // storing dandelion as array of characters
c=" _ "[b], // "_" if seeds > 5 and orientation is up, else " "
" \\"[d=+(C>1)], // "\" if seeds > 1, else " "
" |"[C&1], // "|" if seeds is odd, else " "
" /"[d],
c, // "_" if seeds > 5 and orientation is up, else " "
"\n",
e=" _"[b], // "_" if seeds > 5 and orientation is down, else " "
...( // spread characters for .reverse() to be correct
C>3? // if seeds > 3 "/|\" else " | "
"/|\\":
" | "
),
e, // "_" if seeds > 5 and orientation is down, else " "
..."\n | ".repeat(A-1) // repeat stem length - 1 times
],
o? // if orientation is down, reverse
g.reverse():
g
).join(""): // join array of characters
[ // else if input is dandelion
_.length-1, // length of stem is number of rows - 1
a==" | "||b[2]!="|"? // test orientation of dandelion
_.reverse()&&"d": // reverse rows if necessary and return "d" for down
"u" // else return "u" for up
,
(
_[1][1]!=" "? // if 1,1 is not " ", seeds is 4 or more
4+(_[0][0]!=_[1][0])*2: // if 0,0 or 1,0 is "_", seeds is 6 or 7
(_[0][3]!=" ")*2 // if 0,3 is not " ", seeds is 2 or 3
)+
(_[0][2]!=" ") // if 0,2 is not " ", seeds is odd
].join("\n") // join parameters with newline to match input format隐式地将stdin作为_中未格式化字符串的换行符数组,并隐式输出参数为三重奏。下面的测试套件和这里的演示:
const js = String.raw`
+a? // if input is parameters
(
b=(C>5)<<(o=b=="d"), // encoding if seeds > 5 and if orientation is down
g=[ // storing dandelion as array of characters
c=" _ "[b], // "_" if seeds > 5 and orientation is up, else " "
" \\"[d=+(C>1)], // "\" if seeds > 1, else " "
" |"[C&1], // "|" if seeds is odd, else " "
" /"[d],
c, // "_" if seeds > 5 and orientation is up, else " "
"\n",
e=" _"[b], // "_" if seeds > 5 and orientation is down, else " "
...( // spread characters for .reverse() to be correct
C>3? // if seeds > 3 "/|\" else " | "
"/|\\":
" | "
),
e, // "_" if seeds > 5 and orientation is down, else " "
..."\n | ".repeat(A-1) // repeat stem length - 1 times
],
o? // if orientation is down, reverse
g.reverse():
g
).join(""): // join array of characters
[ // else if input is dandelion
_.length-1, // length of stem is number of rows - 1
a==" | "||b[2]!="|"? // test orientation of dandelion
_.reverse()&&"d": // reverse rows if necessary and return "d" for down
"u" // else return "u" for up
,
(
_[1][1]!=" "? // if 1,1 is not " ", seeds is 4 or more
4+(_[0][0]!=_[1][0])*2: // if 0,0 or 1,0 is "_", seeds is 6 or 7
(_[0][3]!=" ")*2 // if 0,3 is not " ", seeds is 2 or 3
)+
(_[0][2]!=" ") // if 0,2 is not " ", seeds is odd
].join("\n") // join parameters with newline to match input format`;
// bean binary
const bin = bean.compile(js);
// program as function
const prog = bean.program(bin);
(document.body.onchange = function () {
const parameters = stem.value + '\n' + orientation.value + '\n' + seeds.value;
dandelion.textContent = prog(parameters);
params.value = prog(dandelion.textContent);
})();textarea {
resize: none;
}<script src="https://cdn.rawgit.com/patrickroberts/bean/master/dst/bean.min.js"></script>
<input id=stem type=number min=1 max=256 value=5>
<select id=orientation>
<option value="u">u</option>
<option value="d">d</option>
</select>
<input id=seeds type=number min=0 max=7 value=5>
<p>Dandelion (output from program given parameters)</p>
<pre id=dandelion></pre>
<p>Parameters (output from program given dandelion)</p>
<textarea id=params rows=3></textarea>https://codegolf.stackexchange.com/questions/109304
复制相似问题