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
Réponse
Charbon , 58 53 47 43 41 octets
Nθ≔⊕⊗θδ↗θ/⊗θ↘δ^‖B↓‖M← vMδ⁰⊗θ↗⊕θM⁰δ↗θ/⊗θ⟲T
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")
Il gère maintenant n = 0.
Commentaires
- Les deux
o+~d
peuvent êtrem-d
etrange(o)
peut êtrerange(m+1)
, puis vous pouvez supprimero=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])
parp(s+q+s[::-1])
: 248 octets - Vous pouvez économiser 6 octets si vous utilisez un seul
print
, et plus 4 en supprimant[]
dejoin([...])
, 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
Où 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^╋;╶╵\∔∔│α╶«├:╵╋:↔↕∔
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"])
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;}
Les commentaires
-
w -r-1
pourraient éventuellement être transférés àw~r
. - Bien que linlining soit alors un octet plus court .
- 344 octets .
- 321 octets
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);}
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.
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 dernierecho
. - 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))
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)
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 lappelint()
. - 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).
Λ