「クールS」を描く


38

前書き

私たちは皆、クールS(スーパーマンS、ステューシーS、スーパーS、スケーターS、ポインティS、グラフィティSなどとしても知られています)を知っています。あなたが忘れているか、完全に冷静な子供時代を過ごした場合、ここに言われた冷静なSのイメージがあります:

n入力としてスケールファクター()を指定すると、ASCIIアートでCool Sが出力されます。1n20

描き方

Cool SのWikipediaページから:

出力

クールSがn1の場合:

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

また、の値が異なる場合はn、単に出力n時間を大きくします。たとえば、n= 2:

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

垂直セクションは2倍長く、垂直線の間隔は2倍広いことに注意してください。

そしてn= 3の場合:

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

注:必須ではありませんが、コードでn= 0をサポートできる場合もあります。

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

勝ち

バイト単位の最短プログラムが優先されます。



私のASCII構築の90年代の子供は、ヒントに^ではなく/ \を使用することをお勧めします。そのようにきれいに見える、さらに同じ傾斜角を維持します:)
18

@Flater唯一の問題は、それは非常にだらしない、中央の縦線が作るどのオフセットされなければならないので、/ \ 2つの文字を使用して、それが外観です
ベータ崩壊

@BetaDecay:N = 2およびN = 3(点対称性を保持しているため)では正常に見えますが、N = 1には同意します。逆さまVのオプションもありますΛ
。–フラット

2
@JacobGarby:私の主張はスタイル的であり、ゴルフではありませんでした:)
18

回答:


14

58 53 47 43 41バイト

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

オンラインでお試しください!

別のアプローチを試してみたかっただけです。これは、反射を介して外側を描画し(アイデアを拡張してくれたNeilに感謝します)、次に内側の部分を描画します。Charcoalには:Left線を描画するデフォルトの方向があるので、次のように、Sを水平に描画することでバイトを節約するために、可能な限りその方向を利用します。

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

そして、キャンバスを反時計回りに90度回転するだけです。


あなたはそこに何かがあるかもしれません... 22バイトはあなたのすべての外側を取得します
ニール

@Neilそれはまったく同じではありませんでした、あなたのアイデアはマイナーな修正が必要でしたが、実際にはこれは大きな改善でした!
チャーリー

スケーリングの効果を正しくチェックしなかったため、元の投稿で同様の間違いを犯しました。
ニール

誰かが言ったRotate?それは私にアイデアを与えます
ニール

@ニールねえ、あなたはそこにかなりの改善を得ました!:-)
チャーリー

13

Pythonの3255の 249 248 209バイト

Kevin Cruijssenのおかげで-6バイト

-1バイト、Kevin Cruijssenに感謝

RodとJo Kingのおかげで-39バイト

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-dとであるrange(o)場合がrange(m+1)あり、その後削除o=m+1\nして6バイトを節約できます。いい答えだ、私から+1。
ケビンクルーッセン

1
変更することにより、ああ、もう一つのバイトp(s)\np(s[::-1])p(s+q+s[::-1])248バイト
ケビンCruijssen

あなたは、単一を使用する場合は6つのバイトを保存することができますprint削除することによって、さらに4 []からjoin([...])238のバイト積算
ロッド

また、保存することができますq.joinバイトを保存するための変数に
ロッド

217。すべてのq.joins、および他のいくつかのものに参加しました
ジョーキング

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^。最初のループの終わりで、カーソルはポイントに配置されます9。次に、Cool Sの残りの半分を描画できるように、キャンバス全体が回転します。(キャンバスは実際には2回回転しますが、これは単なる実装の詳細です。)

チャコールはサポートしていませんRotateCopy(:Up, 4)が、サポートしている場合、これは33バイトで機能します。

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

@BetaDecayそれについてすみません。私はとにかく間違ったバイトカウントも持っていました
ニール

いいですね、n = 0も正しいです
Beta Decay

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

C(gcc)379 353 344 334バイト

#define副次式の除去にいくつかのs を使用し、内部関数間で通信するためにいくつかのグローバルを使用しました。メインループは{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
ジョナサンフレッチ

ただし、インライン化は1バイト短くなります。
ジョナサンフレッチ



3

C(gcc)260 254バイト

ceilingcatのおかげで-6バイト。

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

各部分は、複数の行、3つの文字、および各行のフィールド幅を決定する特定の値への3つの関係によって記述できます。

最初の反復は次のようになりました:

#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()マクロの呼び出しは、テーブルを作成してループオーバーできるように見えます。フィールド幅はインデックスカウンターに関連する場合と関連しない場合があります。フィールド幅をに一般化できますF * i + A。ここで、Fは乗算iする係数であり、Aは幅に追加する値です。したがって、上記の4番目の呼び出しの最後の幅は、-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乾杯。
ガストナー

@ceilingcat関数引数の未定義の評価順序により、一時停止します。
ガストナー

2

Java、435バイト

関数自体は435バイトを使用します。確かに改善の余地があります。「高レベル」はどのキャラクターを配置するかに関するルールを分析することで(最終的にSは点対称です)、「低レベル」は古典的なゴルフ(別の変数または2つのforループを組み合わせます)。しかし、それはこのかなり無意味な言語での最初のショットです:

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バイトまで(偶然にも)ゴルフできます。
ケビンCruijssen

いくつかの変数を削除し、バイトを節約する場所を少し減らすことで、405バイトまでもう少しゴルフできるようになりましたt=...。私が行った変更について質問がある場合は、お知らせください。:)
ケビンクルーイッセン

@KevinCruijssenおかげで、残念ながら私は現在、ここに多くの時間を投資することはできません-これは単なる娯楽のものだった、とJavaの「冗長性」を考慮すると、深刻な競争相手はとにかく;-)ものの、自身の答えとしてあなたのソリューションを追加することを検討していない- そして、我々少なくともいくつかの言語内競争があります:-)
Marco13

2

PHP378 374 378 377 376 335 331 328バイト

-3バイト、manatworkのおかげ

-4バイト、str_repeatの代わりにstr_padを使用

-41バイト、manatworksの提案のおかげ

-1バイト、2つの増分を+ = 2にマージ

-1バイト、余分な\を削除

エコー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()を2回しか使用しないため、それなしでは短くなります。9つの通知に加えて1つの警告も受け取る場合'v'は、finalで引用符を削除できますecho
マナトワーク

1
上部と下部の斜め部分に単一のループ使用できます。$ aと$ iの初期化は、最初の使用時にそれらを移動することで圧縮できます。
マナトワーク

1
ああ、$i>0$m>0のように簡単に書くことができる$i$m
マナトワーク

1
他のソリューションのように、末尾のスペースを使用します。
マナトワーク

1
また、$ cの宣言を最初の使用方法に移動することもできます。.その後の連結をに変更し,ます。オンラインでお試しください!
マナトワーク

1

Pythonの3321の 307バイト

14バイトを節約してくれた@EsolangingFruitに感謝

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)

オンラインでお試しください!


'\\','/'2行目をで置き換えると、*'\/'3バイト節約できます。
エソランジングフルーツ


ありがとう!@esolangingFruit!Pythonのビット操作については知りませんでした。また、それが理由で分裂と括弧のPython2を使用するために、いくつかのバイトを救うprint
Pétur

Python 2では、文字列がinput()自動的にeval()sになるため、int()呼び出しもスキップできます。
エソランジングフルーツ

Python 3の場合、最後の行をに変更できますfor l in L:print(*l,sep="")(Python 2に同等のものがあるとは思わない)。
エソランジングフルーツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.