はじめに h2を描く>
私たちは皆、クールなS(Superman S、StüssyS、Super S、Skater S、Pointy S、Graffiti Sなどとしても知られています)を知っています:世界中の何十億もの学童がこのSを描き、すぐに誇りに思いました自分自身の。 「完全にクールでない子供時代を忘れた、または持っていた」場合のために、次のクールなSの画像を示します。
入力としてスケールファクターn
を指定すると(\ $ 1 \ leq n \ leq 20 \ $)、CoolSをASCIIアートで出力します。
描画方法
CoolSのウィキペディアページから:
出力
n
= 1の場合のクールSは次のとおりです。
^ / \ / \ / \ | | | | | | \ \ / \ \/ /\ \ / \ \ | | | | | | \ / \ / \ / v
また、n
の値が異なる場合は、出力をn
倍大きくするだけです。例:n
= 2:
^ / \ / \ / \ / \ / \ | | | | | | | | | | | | \ \ / \ \ / \ \/ /\ \ / \ \ / \ \ | | | | | | | | | | | | \ / \ / \ / \ / \ / v
垂直セクションは2倍長く、間隔は垂直線の幅は2倍です。
n
= 3の場合:
^ / \ / \ / \ / \ / \ / \ / \ | | | | | | | | | | | | | | | | | | \ \ / \ \ / \ \ / \ \/ /\ \ / \ \ / \ \ / \ \ | | | | | | | | | | | | | | | | | | \ / \ / \ / \ / \ / \ / \ / v
注: 必須ではありませんがiredの場合、コードはn
= 0:
^ / \ \\/ /\\ \ / v
勝利
バイト単位の最短プログラムが優先されます。
コメント
回答
木炭、 58 53 47 43 41バイト
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
別のアプローチを試してみたかったのですが、これは反射を介して外側を描画し(アイデアを拡張してくれたニールに感謝)、次に内側の部分を描画します。 Charcoalは線を引くためのデフォルトの方向として:Left
を持っているので、次のようにSを水平に描くことによって、いくつかのバイトを節約するために可能な限りその方向を利用します。 div id = “938ef2b10f”>
次に、キャンバスを反時計回りに90度回転する必要があります。
コメント
- そこに何かがあるかもしれません… 22バイトですべての外部を取得できます…
- @Neilそれはありませんでした’まったく同じように、あなたのアイデアにはマイナーな修正が必要でしたが、実際、これは大きな改善でした!
- ええ、元の投稿で同様の間違いをしました。 ‘スケーリングの効果を正しく確認しません。
- 誰かが
Rotate
と言いましたか?それは私にアイデアを与えます… - @Neilねえ、あなたはそこでかなりの改善を得ました! 🙂
回答
Python 3 、 255 249 248 209バイト
-KevinCruijssenのおかげで6バイト
-KevinCruijssenのおかげで1バイト
-RodとJoKingのおかげで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を処理するようになりました。
コメント
回答
チャコール、 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
は文字列
。最初のループの終わりに、カーソルはポイント9
に配置されます。次に、Cool Sの残りの半分を描画できるように、キャンバス全体が回転します。 (キャンバスは実際には2回回転しますが、これは実装の詳細にすぎません。)
CharcoalはRotateCopy(:Up, 4)
をサポートしていませんが、サポートしている場合は、 33バイト:
↖^↖⊕⊗θ→↑⊗θ↗⊕θ‖BM↓↙⊗θ→↓⊗θ⟲C↑⁴J⁰¦⁰v
コメント
- @BetaDecay申し訳ありません。バイトも間違っていましたとにかく数えます…
- いいですね、n = 0も正しくなります
回答
キャンバス、 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
回答
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
でも機能します。
回答
C(gcc)、 379 ストライク> 353 ストライク> 344 ストライク> 334バイト
部分式除去にいくつかの#define
を使用しました。内部機能間で通信するためのグローバル。メインループは{0,1,2,3,3,2,1,0}になり、Sを構築します。
提案してくれたJonathanFrechに感謝します。
#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バイト短くなります。
- 344バイト。
- 321バイト
回答
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) }
マクロは、テーブルを作成してループできるように見えます。フィールド幅は、インデックスカウンターに関連する場合と、関連しない場合があります。フィールド幅を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関数の未定義の評価順序引数を指定すると一時停止します。
回答
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バイトまでゴルフすることができます(偶然にも十分です)。
- いくつかの変数を削除し、
t=...
divを使用することで、 405バイトまでもう少しゴルフをすることができます。 >バイトを節約する場所が少し少なくなります。私が行った変更について質問がある場合は、お知らせください。 🙂 - @KevinCruijssenに感謝します。残念ながら、現在ここにこれ以上時間を投資することはできません。これは単なる娯楽であり、”冗長性を考慮しています” Javaの、とにかく深刻な競争相手ではありません;-)独自の答えとしてソリューションを追加することを検討してください。ただし、-その後少なくとも言語内の競争があります:-)
回答
PHP 、 378 374 378 377 376 335 331 328バイト
-manatworkのおかげで3バイト
-4バイト、str_repeatの代わりにstr_padを使用
-manatworksのおかげで41バイト”提案
-1バイト、2つの増分を+ = 2にマージ
-1バイト、余分な\
を削除-エコーによって4バイト文字列を関数に渡す必要があったので、これはより多くのバイトになります
n = 0でも機能します。
コメント
- 関数宣言は非常にコストがかかり、t()を2回しか使用しないため、それがないと短くなります。 9つの通知の横に1つの警告が表示される場合は、最後の
echo
の'v'
の前後の引用符を削除できます。 - 上部と下部の斜めの部分にシングルループを使用できます。 $ aと$ iの初期化は、最初の使用時に移動することで圧縮できます。
- ああ、
$i>0
と$m>0
は単純に$i
および$m
と書くことができます。 - 他のいくつかのソリューションと同様に、末尾にスペースがあります。
- $ cの宣言を最初の使用法に移動することもできます。その後の
.
連結を,
に変更するだけです。 オンラインでお試しください!
回答
Python 3 、 321 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バイト節約できます。 - 307バイト:オンラインでお試しください!
- ありがとうございます! @EsolangingFruit! Pythonでのビット演算を知りませんでした。また、
print
- Python 2では、
input()
は自動的に文字列をeval()
するので、int()
呼び出しもスキップできます。 - Pythonの場合3、最後の行を
for l in L:print(*l,sep="")
に変更できます(’ Python 2に同等のものがあるとは思いません)。
Λ