我是卡尔文。只是想得到20个代表,这样这个用户就可以在PPCG迷你服务器聊天室中聊天了。
编写接受正整数的程序或函数。
如果整数为偶数(2,4,6,.),则打印或返回精确的ASCII艺术字符串:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
如果整数是奇数(1,3,5,.),则打印或返回这个精确的ASCII艺术字符串:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
您可以假设输入始终是正整数。
在这两种输出情况下,都可能有任意数量的尾随空格到每一行"T“的右侧,和/或一条拖尾换行符。注意每个字母之间有两列空格。
发布于 2015-07-28 07:28:43
使用基本编码方法。因为在Pyth中索引是模块化的,所以我甚至不需要为偶数做任何事情,只需将其按正确的顺序排列,并使用@Q
。作为一种奖励,这也适用于负数。
@mjbcs@L"_| /\\-"jCd6 56,"EWbòH\x00B)þKÙ£ÄIOõìæ«FFãbÐÄBØ\«¼,vã<RN>º:w÷ò¾<éifP9e|ÉWf!FÔèà""EWbòH\x00B)þOHÿ$@ËþçX'D[¾«Â?°´=&£üá ¹»ázHׯz3äkÕg{`!|ðY!ðGV"Q
我只尝试编码第一行,然后翻转和切换斜杠,但第一行和最后一行太难了。
我可以通过在代码中添加实际的空字节来保存6个字节,但这太麻烦了。
在网上试一试。
因为输出框太小,所以在网上看起来很糟糕。我建议修改开发控制台,并将col-md-5
更改为col-md-7
。
发布于 2015-07-28 22:37:51
k(w){char*f="_-/\\|]^^^\0<&*&)&3&(&&WX&J&*&\0t_&/&3&\0`);35)I5M\0a).@7).8-;./.-\0j()(0(1+4()(*+4+4()(04+",*o=f+4,m[229]="",i=7,c=10,p;for(memset(m,32,228);i;c=*f++^(w%2&i--/2==2)*115)for(p=0;*++o;m[(w%2?4-i/6-p/57:p/57)*57+p%57]=c)p+=*o-37;printf(m);}
这是一个函数k
,它接收一个参数并将消息打印到stdout
。
一个更易读的版本:
k(w)
{
char*f="\n_-/\\|", // characters to fill in
*o= " "// for each character, the list of positions to put it in, difference-encoded
"]%%^^^\0" // for '\n' (newline)
"<&*&)&3&(&&WX&J&*&\0" // for '_' (underscore)
"t_&/&3&\0" // for '-' (minus)
"`);35)I5M\0" // for '/' or '\' (slashes)
"a).@7).8-;./.-\0" // for '\' or '/' (slashes)
"j()(0(1+4()(*+4+4()(04+", // for '|' (vertical bar)
m[229]="", // message to generate
i, // index of character, running 7...1
c, // current character to fill in
p, // where to place the character
y; // y-coordinate of the character
memset(m,32,228); // fill the message with spaces
for(i=7;--i;)
{
c=*f++;
c^=~w%2|i/2^1?0:115; // flip the direction of slashes, if needed
for(p=0;*++o;)
{
p+=*o-37; // jump to next position
y=p/57; // extract the y-coordinate
y=w%2?4-i/5-y:y; // flip the y-coordinate, if needed
m[y*57+p%57]=c; // place the character
}
}
printf(m); // print the message
}
首先,它准备一个空消息(填充空格)。对于每个字符(例如|
或-
),它都有一个位置列表来放置该字符。
对于每个位置,如果应该打印颠倒版本,则位置将被翻转。也就是说,将其垂直坐标y
替换为4-y
或3-y
(取决于该字符是否为下划线)。另外,斜杠的方向被翻转--这是由带有XOR
的115
执行的。
这种控制结构也被用来放置换行符--在列表中增加4个坐标似乎比写一个显式循环更有效。
这个系统有一些小故障。首先,在翻转版本中,最后一个字母T看起来有点不同:
___
| |
| |
| _|_
要正确输出它,代码必须将|
字符放在_
字符之后。
此外,为了确保控制字符串只包含ASCII字符,我对其进行了编码:
37
,以将它们转换为ASCII范围32.127。我可以添加一个较小的数字,但是37
避免了像"
和\
这样的字符,这些字符必须在字符串文本中转义。-
字符出现在137号位置。为了说明这一点,我在另一个位置( 79 )添加了一个人工-
字符,该字符后来被覆盖--字符|
也出现在位置79。另一件有趣的事情是,我不能使用puts
输出字符串-这将产生额外的尾随换行符。所以我用printf
代替。
此外,数字57
在金色代码中出现了4次--看似冗长的表达式(w%2?4-i/6-p/57:p/57)*57+p%57
使消除变量y
成为可能,从而使代码更短。
发布于 2015-07-28 07:31:43
这两个ascii图片是基-216编码,一个字节=3个字符。
" _\/|-":A;S7*"!D!D"+:B;qi2%{B"h °°¤8 2 °2,J° °"",4# °³8=Ô° Ó\"# Ó °""\"z °Â89D-D·° z ·!¶"}{B"' '!J"+"#h °¼88 2 °° ° °""2/\" °²8=Ô° Óh#L Ó °"" h°°9D-D°,2 h° °"}?]{{i32-__36/A=@6/6%A=@6%A=}/N}/
测试它这里
https://codegolf.stackexchange.com/questions/53925
复制相似问题