画“酷S”


38

介绍

我们都知道酷S(也称为超人S,StüssyS,Super S,Skater S,Pointy S,Graffiti S等):全世界数十亿的学童吸引了这个S,并立即为自己感到骄傲。万一您忘记了或完全不酷的童年,以下是酷S的图片:

给定的比例因子n作为输入(其中),输出ASCII技术中的冷S上。1n20

如何画

从Cool S 的Wikipedia页面上:

输出量

n= 1 时的Cool S 为:

   ^
  / \
 /   \
/     \
|  |  |
|  |  |
\  \  /
 \  \/
 /\  \
/  \  \
|  |  |
|  |  |
\     /
 \   /
  \ /
   v

对于的不同值n,您只需n增大输出时间即可。例如,n= 2:

     ^  
    / \
   /   \
  /     \
 /       \
/         \
|    |    |
|    |    |
|    |    |
|    |    |
\    \    /
 \    \  /
  \    \/
  /\    \
 /  \    \
/    \    \
|    |    |
|    |    |
|    |    |
|    |    |
\         /
 \       /
  \     /
   \   /
    \ /
     v

请注意,垂直部分的长度是原来的两倍,垂直线之间的间距是原来的两倍。

n= 3时:

       ^
      / \
     /   \
    /     \
   /       \
  /         \
 /           \
/             \
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
\      \      /
 \      \    /
  \      \  /
   \      \/
   /\      \
  /  \      \
 /    \      \
/      \      \
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
|      |      |
\             /
 \           /
  \         /
   \       /
    \     /
     \   /
      \ /
       v

注意:尽管不是必需的,但是您的代码也可以支持n= 0:

 ^
/ \
\\/
/\\
\ /
 v

获奖

以字节为单位的最短程序获胜。



ASCII内置90年代的孩子想建议使用/ \而不是^作为提示。这样看起来更干净,加上它保持相同的倾斜度:)
较平缓的

@Flater唯一的问题是/ \使用两个字符,因此中心垂直线必须偏移,这使它看起来很不整齐
Beta Decay

@BetaDecay:在N = 2和N = 3上看起来不错(因为它保留了点对称性),但是我同意N = 1。也可以选择倒置V:Λ
平坦的

2
@JacobGarby:我的论点是风格上的,而不是高尔夫风格的:)
扁平化,2018年

Answers:


14

木炭58 53 47 43 41字节

Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T

在线尝试!

我只是想尝试另一种方法,它通过反射绘制外部(感谢Neil扩展了想法),然后绘制了内部。由于木炭具有:Left默认的绘制线方向,因此我尽可能地利用该方向通过水平绘制S来节省一些字节,如下所示:

     /----\    /----\     
    /      \  /      \    
   /        \/        \   
  /         /          \  
 /         /            \ 
v     ----/    /----     ^
 \            /         / 
  \          /         /  
   \        /\        /   
    \      /  \      /    
     \----/    \----/     

然后,我只需要将画布逆时针旋转90度即可。


您可能正在那里…… 22字节使您
Neil

@Neil并非完全一样,您的想法需要稍作修正,但确实有了很大的改进!
查理

是的,我在原始帖子上犯了类似的错误,因为我没有检查正确缩放的效果。
尼尔,

有人说Rotate吗 那给了我一个主意……
Neil

@Neil嘿,那里有了很大的进步!:-)
查理

13

Python 3中255个 249 248 209字节

-6个字节,感谢Kevin Cruijssen

-1字节感谢Kevin Cruijssen

-39字节,感谢Rod和Jo King

n=int(input())
m=2*n
a,b,q,c,l='\ \n/|'
f=m*b
s=q+q.join([f[d:]+c+b*2*d+b+a+f[d:]for d in range(m+1)]+[l+f+l+f+l]*m+[d*b+a+f+a+f[d*2:]+c+d*b for d in range(n)]+[n*b+a+f+a+c+n*b])
print(f,'^'+s+q+s[::-1]+f,'v')

在线尝试!

现在,它处理n = 0。


o+~d可以是m-drange(o)可以是range(m+1),然后可以删除o=m+1\n以保存6个字节。不错的答案,但我+1。
凯文·克鲁伊森

1
哦,还有一个字节可以更改p(s)\np(s[::-1])p(s+q+s[::-1])248个字节
Kevin Cruijssen

如果您使用单个print,则可以保存6个字节,如果[]从中删除则可以节省238个字节join([...])总共238个字节
Rod

您还可以存储q.join在变量中以保存字节
Rod '18

217。加入了所有q.joins以及其他一些功能
Jo King

13

木炭47 42 41字节

Fv^«↓⊗θ↘⊗⊕θ←↓⊗θ↙⊕⊗θ↖ι↖⊕⊗θ→↑⊗θ↗⊕θMθ⁺⊗θ⊕θ⟲⁴

在线尝试!链接是详细版本的代码。说明:依次绘制以下几行:

   ^
  / \
 /   \
/     \
|  1  |
|  1  |
\  2  /
 \  2/
 8\  2
8  \  2
7  |  3
7  9  3
6     4
 6   4
  6 4
   5

5字符串的当前字符在哪里v^。在第一个循环的末尾,光标将定位在point处9。然后旋转整个画布,以便可以绘制Cool S的另一半。(画布实际上旋转了两次,但这只是一个实现细节。)

木炭不支持,RotateCopy(:Up, 4)但如果支持,则可以使用33个字节:

↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v

@BetaDecay抱歉。无论如何,我的字节数也有误...
Neil

很好,它也得到n = 0的权利
Beta Decay '18

6

画布36 32 29 字节

«|*‼l├/L1^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔

在这里尝试!

大量的堆栈操作。(过时)说明:

«|*                                an array of input*2 "|"s
   ‼                               cast to a 2D object (needed because bug)
    :                              duplicate that (saved for the center line)
     l├                            height+2
       /                           create a diagonal that long
        L1^╋                       and in it, at (width; 1) insert "^"
            ;∔                     append the vertical bars
                               ^
                              /
          so far done:       / 
                            /  
                            |  
                            |  
              ⁸╵                   input+1
                \                  antidiagonal with that size
                 ∔                 appended to the above
                  │                mirror horizontally
                              ^
                             / \
                            /   \
                           /     \
                current:   |     |
                           |     |
                           \     /
                            \   /                                                       |
                   α               get the 2nd to last popped thing - the antidiagonal  |
                    └∔             append it to the vertical line copied way before:    \
                      ⁸«├          input/2 + 2                                            \
                         :╵        duplicate + 1
                           ╋       at (input/2 + 2; input/2 + 3) in the big part insert  ^
                            :↔↕∔   mirror a copy vertically & horizontally and append that to the original

3

Python 2中227个 208 207 202 196 181字节

I=n=2*input()
R,L,S,P='/\ |'
k=n*[2*(P+S*n)+P]
exec"k=[R+S+2*S*I+L]+k+-~I%2*[L+S*n+L+S*I+R];I-=1;"*-~n
print'\n'.join(t.center(2*n+3)for t in['^']+k+[a[::-1]for a in k[::-1]]+['v'])

在线尝试!

Jo King致谢1个字节;然后再加5个字节(通过n => 2*n)。

适用于n=0为好。


3

C(GCC) 379个 353 344 334字节

我使用了几个#defines来消除子表达式,并使用多个全局变量在内部函数之间进行通信。主循环转到{0,1,2,3,3,2,1,0}以构造S。

感谢Jonathan Frech的建议。

#define z(a,b...)printf("%*c%*c%*c\n"+a,b);}
#define y(a){for(i=~-a*t;v*i<v*a*!t+t;i+=v)
i,n,p,r,t,u,v;a(){z(6,r+2,94+t*24)b()y(-~r)z(3,-i-~r,47+u,i*2+2,92-u)c()y(r)z(0,~r,124,~r,124,~r,124)d()y(-~n)z(0,i+1,92-u,2*(n-t*i)+1,92,2*(n-!t*i)+1,47+u)(*x[])()={a,b,c,d};f(s){r=2*s;for(p=0;p<8;x[7*t-p++*(2*t-1)](n=s))t=p>3,v=2*!t-1,u=t*45;}

在线尝试!


w -r-1可能打高尔夫球w~r
乔纳森·弗雷希

虽然这样,内联要短一个字节
乔纳森·弗雷希



3

C(GCC) 260个 254字节

-6个字节,感谢ceilingcat

f(n){int s=2*n++,t=s+1,I[]={1,t,s,n,n,s,t,1},A[]={s,1,1,1,2*t,1,t,t,1,t,1,n,t,t,1,t,t,1,1,1,t,s,1,1},x;for(s=8;s--;)for(n=0;n<I[s];n++,puts(""))for(t=3;t--;)x=s*3+t,printf("%*c",n*("AAAA?BAAAAC@?ABAAACA@AAA"[x]-65)+A[x],"w!!!0]}}}]]00]]}}}]!0_!!"[x]-1);}

在线尝试!

撞倒

我们可以将形状分为几部分:

 ^           Top cap
/ \          Top slope
|||          Sides
\\/          Twist, part 1
/\\          Twist, part 2
|||          Sides
\ /          Bottom slope
 v           Bottom cap

每个部分可以由许多行,三个字符和与确定每个行的字段宽度的某些值的三个关系来描述。

第一次迭代是:

#define g(x,s,A,B,C)for(i=0;i<x;i++)printf("%*c%*c%*c\n",A,*s,B,s[1],C,s[2]);
f(n)
{
    int s=2*n++,t=s+1,i;

    g(1,  "  ^",  1,      1,  t-1)
    g(t, "/ \\",t-i,      1,2*i+1)
    g(s,  "|||",  1,      t,    t)
    g(n,"\\\\/",i+1,      t,t-2*i)
    g(n,"/\\\\",n-i,  2*i+1,    t)
    g(s,  "|||",  1,      t,    t)
    g(t, "\\/ ",i+1,2*t-2*i,    1)
    g(1,  "  v",  1,      1,  t-1)
}

对该g()宏的调用非常类似于可以构建和循环使用表。字段宽度有时与索引计数器相关,有时与索引计数器无关。我们可以将field-width概括为F * i + A,其中F是要乘以的因子i,而A是要添加到宽度的值。因此-2 * i + t,例如,上述第四个调用的最后一个宽度为。

这样我们得到:

f(n){int s=2*n++,t=s+1,         s = size of "side" parts, t = size of top and bottom slopes
I[]={1,t,s,n,n,s,t,1},          The number of lines per part.
A[]={...},x;                    A[] holds the values to add to each field-width.
for(s=8;s--;)                   Loop through the parts.
for(n=0;n<I[s];n++,puts(""))    I[s] decides how many lines to the part. Ends with newline.
for(t=3;t--;)                   Go through the three chars of each line.
x=s*3+t,                        Calculate offset.
printf("%*c",                   Print the char.
n*("..."[x]-65)+A[x],           Build field-width. The string holds the index factor, A[]
                                holds the offset part.
"..."[x]-1);}                   The char itself is grabbed from the string.
                                Shifted by 1 to eliminated double backspaces.

最后,它并不比紧缩版本短很多g(),但更短则更短。


@ceilingcat干杯。
gastropner '18

@ceilingcat函数参数的未定义求值顺序使我停顿了一下。
gastropner

2

Java,435个字节

该函数本身占用435个字节。当然,还有改进的空间,通过分析关于放置哪个角色的规则(“ S”是点对称的),“高级”,以及通过经典高尔夫运动(“拉出”另一个变量或结合两个for-loop)。但这是使用这种相当古怪的语言的第一步:

import static java.util.Arrays.*;
import static java.lang.System.*;

public class CoolS
{
    public static void main(String[] args)
    {
        print(1);
        print(2);
        print(3);
    }
    static void print(int n){int i,r,d=3+6*n,w=3+n*4,h=6+n*10,m=n+n,v=w/2,k=h-1,j=w-1;char t[],S='/',B='\\',P='|',s[][]=new char[h][w];for(char x[]:s)fill(x,' ');s[0][v]='^';s[k][v]='v';for(i=0;i<1+m;i++){r=i+1;t=s[r];t[v-r]=S;t[v+r]=B;t=s[k-r];t[v-r]=B;t[v+r]=S;}for(i=0;i<m;i++){r=2+m+i;t=s[r];t[0]=t[v]=t[j]=P;t=s[k-r];t[0]=t[v]=t[j]=P;}for(i=0;i<1+n;i++){r=2+m+m+i;t=s[r];t[i]=t[i+1+m]=B;t[j-i]=S;t=s[d-i];t[i]=S;t[v-i]=t[j-i]=B;}for(char x[]:s)out.println(x);}
}

嗨,您好。恐怕导入是字节计数的一部分,因此您当前的答案实际上是478个字节。但是,您可以通过一些基本的操作将其打高尔夫球(恰好足够)到当前的435个字节
凯文·克鲁伊森

通过删除一些变量并减少存储字节的位置,可以使高尔夫球更多地到达405t=...字节。如果您对我所做的任何更改有任何疑问,请告诉我。:)
凯文·克鲁伊森

谢谢@KevinCruijssen,不幸的是,我目前不能在这里花更多的时间-这只是娱乐性的事情,考虑到Java的“冗长性”,无论如何都不是真正的竞争对手;-)考虑将解决方案作为自己的答案,但是- 然后我们至少有一些语言内的竞争:-)
Marco13 '18

2

PHP378 374 378 377 376 335 331 328字节

-3字节,感谢操作

-4个字节,使用str_pad代替str_repeat

-41字节,感谢manatworks的建议

-1字节,合并两个增量为+ = 2

-1字节,删除了多余的

-4字节通过回显一次。忘了我需要将字符串传递给函数,所以这是更多的字节

同样适用于n = 0。

function s($b){return str_pad($w,$b);}echo s($i=1+$a=2*$argv[1]).'^
';for(;$i;$j++,$y=$z.$y)echo$z=s(--$i).'/'.s(++$j).'\
';for(;$k<$a;$k++)$x.='|'.s($a).'|'.s($a).'|
';echo$x;for(;$l<=$a/2;)echo s($m++).$c='\\',s($a).$c.s($a-$l++*2).'/
';for(;$m;$n+=2)echo s(--$m).'/'.s($n).$c.s($a).'\
';echo$x.strtr($y,'/\\','\/').s($a+1).v;

在线尝试!


1
由于函数声明非常昂贵,并且您仅使用t()两次,所以如果没有它,它会更短。如果在9条通知旁边您也发出1条警告,则可以删除'v'final 中的引号echo
manatwork '18

1
您可以对顶部和底部倾斜部分使用单环。$ a和$ i的初始化可以通过在首次使用时移动它们来进行压缩。
manatwork '18

1
哦,和$i>0$m>0可以简单地写为$i$m
manatwork '18

1
其他解决方案一样,带有尾随空格
manatwork '18

1
您也可以将$ c的声明移至其首次使用。只需将.其后的串联更改为即可,在线尝试!
manatwork '18

1

Python 3中321个 307字节

感谢@EsolangingFruit节省了14个字节

n=int(input())
b,f='\/'
c,l=4*n+3,10*n+6
r=range
h=c//2
L=[c*[' ']for _ in r(l)]
L[0][h],L[-1][h]='^v'
for i in r(h):a=L[h-i];a[i],a[c+~i]=f,b
for i in r(2*n):L[h-~i][0::h]='|'*3
for i in r(n+1):a=L[h+h+i];a[c+~i],a[i:c-1:h]=f,b*2
for i in r(1,l//2):L[l+~i]=L[i][::-1]
print('\n'.join(''.join(i)for i in L))

在线尝试!

Python 2,303字节

n=int(input())
b,f='\/'
c,l,r=4*n+3,10*n+6,range
h=c/2
L=[c*[' ']for _ in r(l)]
L[0][h],L[-1][h]='^v'
for i in r(h):a=L[h-i];a[i],a[c+~i]=f,b
for i in r(2*n):L[h-~i][0::h]='|'*3
for i in r(n+1):a=L[h+h+i];a[c+~i],a[i:c-1:h]=f,b*2
for i in r(1,l/2):L[l+~1]=L[i][::-1]
print'\n'.join(''.join(i)for i in L)

在线尝试!


您可以'\\','/'在第二行替换*'\/'为保存三个字节。
Esolanging Fruit


谢谢!@EsolangingFruit!我不了解Python中的位操作。此外,它可以节省几个字节来使用,因为分裂的Python2并在括号print
Pétur

在Python 2中,该字符串会input()自动eval()生成,因此您也可以跳过该int()调用。
Esolanging Fruit

对于Python 3,您可以将最后一行更改为for l in L:print(*l,sep="")(我认为Python 2中没有等效项)。
Esolanging Fruit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.