“Cool S” çizin


38

Giriş

Hepimiz havalı S'yi (Süpermen S, Stüssy S, Süper S, Patenci S, Sivri S, Graffiti S vb. Olarak da bilinir) biliyoruz: dünyadaki milyarlarca öğrenci bu S'yi çekti ve hemen kendileriyle gurur duyuyordu. Unutmuş veya tamamen soğukkanlı bir çocukluk geçirmiş olmanız durumunda , işte cool S’ın bir görüntüsü:

Bir ölçek faktörü göz önüne alındığında, ngirdi olarak (burada ), çıkış ASCII alanda serin S.1n20

Nasıl çizilir

Gönderen Vikipedi sayfası Serin S:

Çıktı

n= 1 olduğunda Soğuk S :

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

Ve farklı değerleri niçin, çıktı nzamanlarını daha büyük hale getirin. Örneğin, n= 2:

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

Dikey bölümlerin iki kat daha uzun olduğunu ve dikey çizgiler arasındaki boşluğun iki kat daha geniş olduğunu unutmayın.

Ve ne zaman n= 3:

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

Not: Zorunlu olmamakla birlikte, kodunuzn= 0özelliğini destekleyebilir:

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

Kazanan

Bayt cinsinden en kısa program kazanır.



İçimdeki ASCII 90'lı çocuk, bahşiş için ^ yerine / \ kullanılmasını önermek istiyor. Bu şekilde daha temiz görünüyor, ayrıca aynı eğim eğimini koruyor :)
Flater

@Flater'ın tek problemi / \ 'nin iki karakter kullanmasıdır, bu nedenle merkezi dikey çizginin dengelenmesi gerekecekti, bu da çok düzensiz görünmesine neden olur
Beta Decay

@ BetaDecay: N = 2 ve N = 3'te iyi görünüyor (nokta simetrisini koruduğundan), ancak N = 1 için aynı fikirdeyim. Ayrıca ters V seçeneği var:Λ
Flater

2
@JacobGarby: Benim argümanım stilistikti, golfy değil :)
Flater

Yanıtlar:


14

Kömür , 58 53 47 43 41 bayt

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

Çevrimiçi deneyin!

Sadece başka bir yaklaşımı denemek istedim, bu yansımaları kullanarak dışını çizer (fikri genişlettiği için Neil sayesinde) ve sonra iç kısmını çizer. Kömürün :Leftçizgi çizmek için varsayılan yönü olduğu gibi, S'yi yatay olarak çizerek bazı baytları kaydetmek için bu yönü mümkün olduğunca kullanıyorum:

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

Sonra tuvali saat yönünün tersine 90 derece döndürmem gerekiyor.


Orada bir şeylere karşı olabilirsiniz ... 22 byte dışarının hepsini alır ...
Neil

@Bu tam olarak böyle değildi, fikrinizin küçük bir düzeltmeye ihtiyacı vardı, ama bu gerçekten de büyük bir gelişme oldu!
Charlie,

Evet, orijinal yazıma benzer bir hata yaptım çünkü ölçeklemenin etkisini doğru kontrol etmedim.
Neil

Birisi Rotatemi dedi ? Bu bana bir fikir verir ...
Neil

@Neil hey, orada oldukça bir gelişme var! :-)
Charlie

13

Python 3 , 255 249 248 209 bayt

Kevin Cruijssen sayesinde -6 bayt

Kevin Cruijssen sayesinde -1 bayt

Rod ve Jo King sayesinde -39 bayt

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

Çevrimiçi deneyin!

Şimdi n = 0.


Her ikisi o+~dde olabilir m-dve range(o)olabilir range(m+1)ve ardından o=m+1\n6 bayttan tasarruf etmek için kaldırabilirsiniz . Güzel cevap olsa da, benden +1.
Kevin Cruijssen

1
Oh, ve bir daha bayt değiştirerek p(s)\np(s[::-1])için p(s+q+s[::-1]): 248 byte
Kevin Cruijssen

Eğer tek kullanırsanız 6 bayt kaydedebilirsiniz printkaldırarak daha 4 ve []gelen join([...]), 238 bayt bütünleştirici
Çubuk

Ayrıca q.joinbir bayt kaydetmek için bir değişkende saklayabilirsiniz
Rod

217 . Tüm q.join
Jo King,

13

Kömür , 47 42 41 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama: Aşağıdaki satırları sırayla çizer:

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

5Dizenin geçerli karakteri nerede v^. İlk döngünün sonunda imleç daha sonra noktaya yerleştirilir 9. Tuvalin tamamı, Cool S'nin diğer yarısının çizilebilmesi için döndürülür. (Tuval aslında iki kez döndürülüyor, ancak bu sadece bir uygulama detayı.)

Kömür desteklemiyor, RotateCopy(:Up, 4)ancak öyleyse, bu 33 bayt için işe yarar:

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

@BetaDecay Bunun için üzgünüm. Ben de ... Neyse yanlış bayt sayımı vardı
Neil

Güzel, o da n = 0 alır
Beta Decay

6

Tuval , 36 32 29 bayt

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

Burada dene!

Bir sürü yığın manipülasyonu. (eski) açıklama:

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

Python 2 , 227 208 207 202 196 181 bayt

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

Çevrimiçi deneyin!

Jo King'e 1 bayt için teşekkürler ; ve sonra bir başka 5 byte toplam (üzerinden n => 2*n).

De için çalışıyor n=0.


3

C (gcc) , 379 353 344 334 bayt

#defineAlt ifadelerin kaldırılması için birkaç saniye ve iç işlevler arasında iletişim kurmak için birkaç küre kullandım. Ana döngü, S'yi oluşturmak için {0,1,2,3,3,2,1,0} 'a gider.

Önerileriniz için Jonathan Frech'e teşekkürler.

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

Çevrimiçi deneyin!


w -r-1muhtemelen golf oynayabilirdi w~r.
Jonathan Frech

Rağmen o zaman inlining bir byte kısadır .
Jonathan Frech



3

C (gcc) , 260 254 bayt

-Katıcı sayesinde 6 bayt .

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

Çevrimiçi deneyin!

Bitkin

Şekli parçalara bölebiliriz:

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

Her bölüm birkaç satır, üç karakter ve her satırdaki alan genişliğini belirleyen belirli değerlerle üç ilişkiyle tanımlanabilir.

İlk tekrarlama şöyle oldu:

#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()Makroya çağrılar, bir masanın üzerine kurulabildiği ve tekrar bağlanabileceği gibi görünüyor. Alan genişlikleri bazen indeks sayacı ile ilişkilidir, bazen değildir. Alan genişliğini genelleştirebiliriz F * i + A, burada F ile çarpılacak bir faktördür ive A, genişliğe eklenecek bir değerdir. Dolayısıyla yukarıdaki dördüncü aramanın son genişliği olacaktır -2 * i + t.

Böylece biz alırız:

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.

Sonunda, arayanın sıkılaştırılmış versiyonundan daha kısa değildi g(), ama daha kısa.


@ceilingcat Şerefe.
gastropner 4

@ceilingcat Fonksiyon argümanlarının tanımlanmamış değerlendirme sırası beni durdurur.
gastropner,

2

Java, 435 bayt

İşlev, 435 bayt alır. Hangi karakterin yerleştirileceğine ilişkin kuralları (sonunda S nokta-simetriktir) ve "düşük-seviyeli", klasik golf oynayarak (belki başka bir değişkeni çekerek) kesinlikle iyileştirmeye yer var, "yüksek seviye" var. for-loops'un ikisini birleştirerek ). Ancak bu oldukça ungolfy dili ile ilk atış:

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

Merhaba. İthalat, korktuğum bayt sayısının bir parçası, bu yüzden şu anki cevabınız aslında 478 bayttır . Bununla birlikte, mevcut 435 bayt'ınıza (tesadüfen) golf oynamak için bazı temel şeylerle golf yapabilirsiniz.
Kevin Cruijssen

Bazı değişkenleri kaldırarak ve baytları kurtaracağı yeri biraz daha az kullanarak , 405 bayta kadar biraz golf oynatabildim t=.... Yaptığım değişiklikler hakkında herhangi bir sorunuz varsa, bana bildirin. :)
Kevin Cruijssen

Teşekkürler @KevinCruijssen, maalesef şu anda burada daha fazla zaman harcayamıyorum - bu sadece eğlence amaçlı bir şeydi ve Java’nın “ayrıntılarını” göz önünde bulunduruyor, yine de ciddi bir rakip değil ;-) Çözümünüzü kendi cevabı olarak eklemeyi düşünüyoruz - o zaman biz en azından bazı dil içi yarışmalara
katılabilirsiniz

2

PHP , 378 374 378 377 376 335 331 328 bayt

-3 bayt, insan işi sayesinde

-4 bayt, str_repeat yerine kullanılan str_pad

-41 bayt, çalışmaların önerileri sayesinde

-1 bayt, iki artışla + = 2 değerine birleştirildi

-1 bayt, gereksiz çıkarıldı \

Bir kez yankılayarak -4 bayt. Bu fonksiyonun daha fazla byte olması için stringi fonksiyona geçirmem gerektiğini unuttum.

N = 0 için de çalışıyor.

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;

Çevrimiçi deneyin!


1
İşlev bildirimi oldukça pahalı olduğundan ve yalnızca iki kez t () kullandığınızda, onsuz daha kısa olur . 9 bildirimin yanında 1 uyarı da alırsanız 'v', finaldeki alıntıları kaldırabilirsiniz echo.
Manatwork

1
Sen olabilir tek bir döngü kullanmak üst ve alt eğik parçalar için. $ A ve $ i'nin başlatılması, ilk kullanımlarında hareket ettirilerek sıkıştırılabilir.
manatwork

1
Oh, ve $i>0ve $m>0basitçe yazılabilir $ive $m.
Manatwork

1
Diğer çözümlerde olduğu gibi iz bırakma boşluklarıyla .
Manatwork

1
Ayrıca $ c bildirimini ilk kullanımına taşıyabilirsiniz. Sadece .birleştirme işlemini ondan sonra değiştir ,. Çevrimiçi deneyin!
Manatwork

1

Python 3 , 321 307 bayt

14 bayt kaydettiğiniz için @EsolangingFruit için teşekkürler

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

Çevrimiçi deneyin!

Python 2,303 bayt

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)

Çevrimiçi deneyin!


Üç bayttan tasarruf etmek '\\','/'için ikinci satırdakilerle değiştirebilirsiniz *'\/'.
Esolanging Fruit,


Teşekkürler! @EsolangingFruit! Python'daki bit işlemlerinin farkında değildim. Ayrıca, Python2'yi bölme ve parantezler nedeniyle kullanmak için bir kaç bayt tasarruf edersinizprint
Pétur

Python 2'de input()otomatik olarak eval()dize olur, böylece int()aramayı da atlayabilirsiniz .
Esolanging Fruit,

Python 3 için son satırı for l in L:print(*l,sep="")(Python 2'de bir eşdeğeri olduğunu sanmıyorum) olarak değiştirebilirsiniz.
Esolanging Fruit,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.