Dessinez la “ Cool S ”

Introduction

Nous connaissons tous le cool S (également connu sous le nom de Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S, etc.): des milliards décoliers à travers le monde ont dessiné ce S et se sont immédiatement sentis fiers deux-mêmes. Au cas où vous « auriez oublié ou avez eu une enfance complètement pas cool , voici une image de ce S cool:

Étant donné un facteur déchelle n en entrée (où \ $ 1 \ leq n \ leq 20 \ $), affichez le Cool S dans lart ASCII.

Comment le dessiner

De la page Wikipédia sur le Cool S:

Sortie

Le Cool S quand n = 1 est:

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

Et pour différentes valeurs de n, il vous suffit de rendre la sortie n fois plus grande. Pour exemple, n = 2:

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

Notez que les sections verticales sont deux fois plus longues et lespacement entre les les lignes verticales sont deux fois plus larges.

Et lorsque n = 3:

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

Remarque: Bien que non requis ired, votre code peut également prendre en charge n = 0:

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

Winning

Le programme le plus court en octets lemporte.

Commentaires

  • Connexes: Dessinez un S- Chaîne
  • Lenfant en moi de la construction ASCII 90 ‘ veut suggérer dutiliser / \ au lieu de ^ pour le conseil. Cela semble plus propre de cette façon, en plus il maintient la même inclinaison de la pente 🙂
  • Le seul problème de @Flater est que / \ utilise deux caractères, donc la ligne verticale centrale devrait être décalée, ce qui la rend très désordonnée
  • @BetaDecay: Cela a lair bien sur N = 2 et N = 3 (car il conserve la symétrie des points), mais je suis daccord pour N = 1. Il y a ‘ aussi loption du V à lenvers: Λ
  • @JacobGarby: Mon argument était stylistique, pas golfique 🙂

Réponse

Charbon , 58 53 47 43 41 octets

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

Essayez-le en ligne !

Je voulais juste essayer une autre approche, celle-ci dessine lextérieur via des réflexions (merci à Neil davoir élargi lidée) puis dessine la partie intérieure. Comme Charcoal a :Left comme direction par défaut pour dessiner des lignes, jutilise cette direction autant que possible pour économiser quelques octets en dessinant le S horizontalement, comme ceci:

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

Et puis jai juste besoin de faire pivoter le canevas de 90 degrés dans le sens antihoraire.

Commentaires

  • Vous êtes peut-être sur quelque chose là-bas … 22 octets vous donne tout l’extérieur …
  • @Neil ce n’était pas ‘ t exactement comme ça, votre idée nécessitait une correction mineure, mais en effet cela a été une grande amélioration!
  • Ouais, jai fait une erreur similaire sur mon message dorigine parce que je nai pas ‘ t vérifier correctement leffet de la mise à léchelle.
  • Quelquun a-t-il dit Rotate? Cela me donne une idée …
  • @Neil hé, vous avez une bonne amélioration là-bas! 🙂

Réponse

Python 3 , 255 249 248 209 octets

-6 octets grâce à Kevin Cruijssen

-1 octet grâce à Kevin Cruijssen

-39 octets grâce à Rod et 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")  

Essayez-le en ligne!

Il gère maintenant n = 0.

Commentaires

  • Les deux o+~d peuvent être m-d et range(o) peut être range(m+1), puis vous pouvez supprimer o=m+1\n pour économiser 6 octets. Bonne réponse cependant, +1 de ma part.
  • Oh, et encore un octet en remplaçant p(s)\np(s[::-1]) par p(s+q+s[::-1]): 248 octets
  • Vous pouvez économiser 6 octets si vous utilisez un seul print, et plus 4 en supprimant [] de join([...]), totalisant 238 octets
  • Vous pouvez également stocker q.join dans une variable pour enregistrer un octet
  • 217 . A rejoint tous les q.join et quelques autres choses

Answer

Charbon , 47 42 41 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code.Explication: Trace les lignes suivantes dans lordre:

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

5 est le caractère actuel de la chaîne v^. À la fin de la première boucle, le curseur est alors positionné au point 9. Lensemble de la toile est ensuite tourné afin que lautre moitié du Cool S puisse être dessinée. (Le canevas est en fait tourné deux fois, mais ce nest quun détail dimplémentation.)

Le charbon de bois ne prend pas en charge RotateCopy(:Up, 4) mais si cétait le cas, cela fonctionnerait pour 33 octets:

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

Commentaires

  • @BetaDecay Désolé pour cela. Jai également eu le mauvais octet compter quand même …
  • Bien, il obtient aussi n = 0

Réponse

Canvas , 36 32 29 octets

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

Essayez-le ici!

Beaucoup de manipulation de pile. Explication (obsolète):

«|* 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 

Réponse

Python 2 , 227 208 207 202 196 181 octets

 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"])  

Essayez-le en ligne!

Merci à Jo King pour 1 octet; puis encore 5 octets au total (via n => 2*n).

Fonctionne également pour n=0.

Réponse

C (gcc) , 379 353 344 334 octets

Jai utilisé quelques #define s pour lélimination des sous-expressions et plusieurs globals pour communiquer entre les fonctions internes. La boucle principale va {0,1,2,3,3,2,1,0} pour construire le S.

Merci à Jonathan Frech pour les suggestions.

 #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;}  

Essayez-le en ligne!

Les commentaires

Réponse

C (gcc) , 260 254 octets

-6 octets grâce à plafonnier .

 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);}  

Essayez-le en ligne!

Rundown

Nous pouvons diviser la forme en plusieurs parties:

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

Chaque partie peut être décrite par un certain nombre de lignes, trois caractères et trois relations avec certaines valeurs qui déterminent la largeur du champ à chaque ligne.

Une première itération est survenue être:

 #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) }  

Les appels au ressemble beaucoup à une table qui pourrait être construite et bouclée. Les largeurs de champ sont parfois liées au compteur dindex, et parfois non. Nous pouvons généraliser la largeur du champ à F * i + A, où F est un facteur à multiplier i avec, et A est une valeur à ajouter à la largeur. Ainsi, la dernière largeur du quatrième appel ci-dessus serait -2 * i + t, par exemple.

Ainsi nous obtenons:

 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.  

En fin de compte, ce nétait pas beaucoup plus court quune version renforcée du g() en appeler un, mais le plus court est plus court.

Commentaires

  • @ceilingcat Cheers.
  • @ceilingcat Lordre dévaluation non défini de la fonction les arguments me donnent une pause.

Réponse

Java, 435 octets

La fonction elle-même prend 435 octets. Il y a certainement place à lamélioration, « de haut niveau » en analysant les règles sur lendroit où placer quel caractère (à la fin le S est point-symétrique), et « de bas niveau », par le golf classique (peut-être en retirant une autre variable ou combinant deux des boucles for). Mais cest un premier cliché avec ce langage plutôt ungolfy:

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);} } 

Commentaires

  • Bonjour. Les importations font partie du nombre doctets que jai ‘ craint, donc votre réponse actuelle est en fait 478 octets . Vous pouvez cependant le jouer jusquà (assez par hasard) votre 435 octets actuel avec quelques éléments de base pour jouer au golf.
  • Jai pu jouer un peu plus au golf à 405 octets en supprimant certaines variables et en utilisant t=... un peu moins là où il économiserait des octets. Si vous avez des questions sur les modifications que jai apportées, faites-le moi savoir. 🙂
  • Merci @KevinCruijssen, malheureusement je ne peux actuellement pas investir plus de temps ici – cétait juste une chose récréative, et compte tenu de la  » verbosité  » de Java, pas un concurrent sérieux de toute façon 😉 Pensez à ajouter votre solution comme une propre réponse, cependant – alors nous avons au moins une concurrence intra-langue: -)

Réponse

PHP , 378 374 378 377 376 335 331 328 octets

-3 octets, grâce à manatwork

-4 octets, utilisé str_pad au lieu de str_repeat

-41 octets, grâce à manatworks « suggestions

-1 octet, a fusionné deux incréments en un + = 2

-1 octet, supprimé le superflu \

-4 octets par écho une fois. Jai oublié que je devais passer la chaîne dans la fonction donc cest plus doctets

Fonctionne aussi pour n = 0.

  

Essayez-le en ligne!

Commentaires

  • Comme la déclaration de fonction est assez chère et que vous nutilisez t () que deux fois, ce serait plus court sans cela . Si, à côté des 9 avis, vous prenez également un avertissement, vous pouvez supprimer les guillemets autour de 'v' dans le dernier echo.
  • Vous pouvez utiliser une seule boucle pour les parties obliques du haut et du bas. Linitialisation de $ a et $ i peut être compactée en les déplaçant lors de leur première utilisation.
  • Oh, et $i>0 et $m>0 peut être écrit simplement comme $i et $m.
  • Avec des espaces de fin , comme dans certaines autres solutions.
  • Vous pouvez également déplacer la déclaration de $ c vers sa première utilisation. Changez simplement la concaténation . après celle-ci en ,. Essayez-le en ligne!

Réponse

Python 3 , 321 307 octets

Merci à @EsolangingFruit davoir économisé 14 octets

 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))  

Essayez-le en ligne!

Python 2 , 303 octets

 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)  

Essayez-le en ligne!

Commentaires

  • Vous pouvez remplacer '\\','/' sur la deuxième ligne par *'\/' pour économiser trois octets.
  • 307 octets: Essayez-le en ligne!
  • Merci! @EsolangingFruit! Je nétais pas au courant des opérations de bit en Python. En outre, cela permettrait déconomiser quelques octets pour utiliser Python2 en raison de la division et des parenthèses dans print
  • Dans Python 2, input() eval() automatiquement la chaîne, vous pouvez donc ignorer lappel int().
  • Pour Python 3, vous pouvez remplacer la dernière ligne par for l in L:print(*l,sep="") (je ne pense pas ‘ quil existe un équivalent en Python 2).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *