Narysuj “ Cool S ”

Wprowadzenie

Wszyscy znamy fajne S (znane również jako Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S itp.): miliardy uczniów na całym świecie narysowały to S i od razu poczuły dumę samych siebie. Na wypadek, gdybyś zapomniał lub miał zupełnie niefajne dzieciństwo , oto obraz wspomnianego fajnego S:

Biorąc pod uwagę współczynnik skali n jako dane wejściowe (gdzie \ $ 1 \ leq n \ leq 20 \ $), wypisz Cool S w grafice ASCII.

Jak to narysować

Ze strony Wikipedii na Cool S:

Wyjście

Cool S when n = 1 to:

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

A dla różnych wartości n po prostu zwiększasz wynik n razy. przykład, n = 2:

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

Zwróć uwagę, że sekcje pionowe są dwa razy dłuższe, a odstępy między pionowe linie są dwa razy szersze.

A kiedy n = 3:

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

Uwaga: Chociaż nie jest to wymagane ired, Twój kod może również obsługiwać n = 0:

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

Zwycięstwo

Najkrótszy program w bajtach wygrywa.

Komentarze

  • Powiązane: narysuj S- Łańcuch
  • Dziecko budujące ASCII 90 ' we mnie chce zasugerować użycie / \ zamiast ^ jako wskazówkę. Wygląda czysto w ten sposób, a ponadto zachowuje to samo nachylenie stoku 🙂
  • @Flater Jedynym problemem jest to, że / \ używa dwóch znaków, więc środkowa linia pionowa musiałaby być przesunięta, co sprawia, że wygląda bardzo nieporządnie
  • @BetaDecay: Wygląda dobrze na N = 2 i N = 3 (ponieważ zachowuje symetrię punktową), ale zgadzam się na N = 1. Jest też ' opcja odwróconego V: Λ
  • @JacobGarby: Mój argument był stylistyczny, nie golfy 🙂

Odpowiedź

Węgiel drzewny , 58 53 47 43 41 bajtów

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

Wypróbuj online !

Chciałem po prostu wypróbować inne podejście, które rysuje zewnętrzną stronę poprzez refleksje (dzięki Neilowi za rozwinięcie pomysłu), a następnie rysuje część wewnętrzną. Ponieważ węgiel drzewny ma :Left jako domyślny kierunek rysowania linii, używam tego kierunku w jak największym stopniu, aby zaoszczędzić trochę bajtów, rysując S poziomo, na przykład:

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

A potem wystarczy obrócić płótno o 90 stopni w lewo.

Komentarze

  • Możesz znaleźć się na czymś … 22 bajty dostaniesz wszystko z zewnątrz …
  • @Neil to nie było ' t dokładnie tak, Twój pomysł wymagał drobnej poprawki, ale rzeczywiście była to duża poprawa!
  • Tak, popełniłem podobny błąd w moim oryginalnym poście, ponieważ nie ' t sprawdzaj efekt skalowania poprawnie.
  • Czy ktoś powiedział Rotate? Daje mi to pewien pomysł …
  • @Neil hej, masz tam spory postęp! 🙂

Odpowiedź

Python 3 , 255 249 248 209 bajtów

-6 bajtów dzięki Kevinowi Cruijssenowi

-1 bajt dzięki Kevinowi Cruijssenowi

-39 bajtów dzięki Rod i 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")  

Wypróbuj online!

Teraz obsługuje n = 0.

Komentarze

  • Oba o+~d mogą być m-d i range(o) może być range(m+1), a następnie możesz usunąć o=m+1\n, aby zaoszczędzić 6 bajtów. Dobra odpowiedź, +1 ode mnie.
  • Aha, i jeszcze jeden bajt, zmieniając p(s)\np(s[::-1]) na p(s+q+s[::-1]): 248 bajtów
  • Możesz zaoszczędzić 6 bajtów, używając jednego print i nie tylko 4 usuwając [] z join([...]), sumując 238 bajtów
  • Możesz również zapisać q.join w zmiennej, aby zapisać bajt
  • 217 . Dołączył do wszystkich q.join i kilku innych rzeczy

Odpowiedź

Węgiel drzewny , 47 42 41 bajtów

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

Wypróbuj online! Link prowadzi do pełnej wersji kodu.Wyjaśnienie: rysuje kolejno następujące linie:

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

Gdzie 5 to aktualny znak ciągu v^. Na końcu pierwszej pętli kursor zostaje umieszczony w punkcie 9. Całe płótno jest następnie obracane, aby można było narysować drugą połowę Cool S. (Płótno faktycznie jest obracane dwukrotnie, ale to tylko szczegół implementacji.)

Węgiel nie obsługuje RotateCopy(:Up, 4), ale gdyby tak było, to działałoby 33 bajty:

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

Komentarze

  • @BetaDecay Przepraszam za to. Miałem też zły bajt licz mimo to …
  • Świetnie, n = 0 też się zgadza

Odpowiedź

Canvas , 36 32 29 bajtów

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

Wypróbuj tutaj!

Dużo manipulacji stosem. (Nieaktualne) wyjaśnienie:

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

Odpowiedź

Python 2 , 227 208 207 202 196 181 bajtów

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

Wypróbuj online!

Dziękujemy za Jo King za 1 bajt; a następnie łącznie kolejne 5 bajtów (przez n => 2*n).

Działa również dla n=0.

Odpowiedź

C (gcc) , 379 353 344 334 bajty

Użyłem kilku #define s do eliminacji podwyrażeń i kilku globalne do komunikacji między funkcjami wewnętrznymi. Główna pętla prowadzi {0,1,2,3,3,2,1,0}, aby skonstruować S.

Dzięki Jonathanowi Frechowi za sugestie.

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

Wypróbuj online!

Komentarze

Odpowiedź

C (gcc) , 260 254 bajtów

-6 bajtów dzięki 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);}  

Wypróbuj online!

Podsumowanie

Możemy podzielić kształt na części:

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

Każda część może być opisana liczbą linii, trzema znakami i trzema relacjami do pewnych wartości, które decydują o szerokości pola w każdym wierszu.

Nadeszła pierwsza iteracja być:

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

Wywołania do g() makro wygląda bardzo podobnie do tabeli, która może zostać skonstruowana i zapętlona. Szerokości pól są czasami powiązane z licznikiem indeksu, a czasami nie. Możemy uogólnić szerokość pola na F * i + A, gdzie F to czynnik do pomnożenia i, a A to wartość do dodania do szerokości. Zatem ostatnia szerokość czwartego powyższego wywołania będzie na przykład wynosić -2 * i + t.

W ten sposób otrzymujemy:

 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.  

Ostatecznie był niewiele krótszy niż zaostrzona wersja g() wywołanie jednego, ale krótszy jest krótszy.

Komentarze

  • @ceilingcat Cheers.
  • @ceilingcat Nieokreślona kolejność oceny funkcji argumenty dają mi przerwę.

Odpowiedź

Java, 435 bajtów

Sama funkcja zajmuje 435 bajtów. Z pewnością jest miejsce na ulepszenia, „wysoki poziom” poprzez analizę zasad określających, gdzie umieścić dany znak (w końcu S jest punktowo symetryczny) i „niski poziom”, poprzez klasyczne golfa (może wyciągając inną zmienną lub połączenie dwóch pętli for). Ale to „pierwsze ujęcie w tym raczej nieprzyzwoitym języku:

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

Komentarze

  • Cześć. Importy są częścią licznika bajtów I ' obawiam się, więc aktualna odpowiedź to w rzeczywistości 478 bajtów . może jednak sprowadzić go do (przypadkowo) obecnego 435 bajtów , uwzględniając kilka podstawowych rzeczy do gry w golfa.
  • Udało mi się zagrać nieco więcej do 405 bajtów , usuwając niektóre zmienne i używając t=... trochę mniej, gdzie zaoszczędziłoby bajty. Jeśli masz jakieś pytania dotyczące wprowadzonych przeze mnie zmian, daj mi znać. 🙂
  • Dzięki @KevinCruijssen, niestety obecnie nie mogę poświęcić więcej czasu tutaj – to była tylko rekreacja i biorąc pod uwagę ” gadatliwość ” Java, w każdym razie nie jest to poważny konkurent 😉 Rozważ jednak dodanie swojego rozwiązania jako własnej odpowiedzi – wtedy mamy przynajmniej konkurencję wewnątrzjęzykową: -)

Odpowiedź

PHP , 378 374 378 377 376 335 331 328 bajtów

-3 bajty, dzięki manatwork

-4 bajty, użyte str_pad zamiast str_repeat

-41 bajtów, dzięki manatworks „sugestie

-1 bajt, połączono dwie inkrementy w + = 2

-1 bajt, usunięto zbędne \

-4 bajty przez echo raz. Zapomniałem, że muszę przekazać ciąg znaków do funkcji, więc jest to więcej bajtów

Działa również dla n = 0.

  

Wypróbuj online!

Komentarze

  • Ponieważ deklaracja funkcji jest dość droga i używasz t () tylko dwa razy, byłaby krótsza bez niego . Jeśli obok 9 powiadomień przyjmiesz również 1 ostrzeżenie, możesz usunąć cudzysłowy wokół 'v' w końcowym echo.
  • Możesz użyć pojedynczej pętli dla górnej i dolnej części ukośnej. Inicjalizację $ a i $ i można skompaktować, przenosząc je przy pierwszym użyciu.
  • Aha, i $i>0 i $m>0 można zapisać po prostu jako $i i $m.
  • Ze spacjami końcowymi , jak w niektórych innych rozwiązaniach.
  • Możesz również przenieść deklarację $ c do pierwszego użycia. Po prostu zmień konkatenację . po nim na ,. Wypróbuj online!

Odpowiedź

Python 3 , 321 307 bajtów

Dzięki @EsolangingFruit za zaoszczędzenie 14 bajtów

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

Wypróbuj online!

Python 2 , 303 bajty

 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)  

Wypróbuj online!

Komentarze

  • Możesz zamienić '\\','/' w drugiej linii na *'\/', aby zaoszczędzić trzy bajty.
  • 307 bajtów: Wypróbuj online!
  • Dzięki! @EsolangingFruit! Nie byłem świadomy operacji bitowych w Pythonie. Ponadto użycie Pythona2 pozwoliło zaoszczędzić kilka bajtów ze względu na podział i nawiasy w print
  • W Pythonie 2 input() automatycznie eval() s ciągiem, więc możesz pominąć również wywołanie int().
  • W przypadku Pythona 3, możesz zmienić ostatnią linię na for l in L:print(*l,sep="") (nie ' nie sądzę, że istnieje odpowiednik w Pythonie 2).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *