Намалюйте "Cool S"


38

Вступ

Ми всі знаємо крутий S (також відомий як Superman S, Stüssy S, Super S, Skater S, Pointy S, Graffiti S тощо тощо): мільярди школярів у всьому світі намалювали цю S і одразу відчули гордість за себе. У випадку, якщо ви забули або пережили зовсім нехолодне дитинство , ось образ сказаного крутого S:

Враховуючи коефіцієнт масштабу nяк вхідний (де ), виведіть Cool S в арт. ASCII.1н20

Як його намалювати

Зі сторінки Вікіпедії на Cool S:

Вихідні дані

Cool S коли n= 1 дорівнює:

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

А для різних значень nви просто збільшуєте вихідний nраз більший. Наприклад, n= 2:

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

Зауважте, що вертикальні відрізки в два рази довші, а відстань між вертикальними лініями вдвічі ширше.

А коли n= 3:

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

Примітка. Хоча код і не потрібен, ваш код також може підтримуватиn= 0:

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

Перемога

Виграє найкоротша програма в байтах.



Хлопець, який будує ASCII 90-х років, хоче запропонувати використовувати / \ замість ^ для підказки. Так виглядає більш чисто, плюс він підтримує той же нахил нахилу :)
Flater

Проблема @Flater полягає лише в тому, що / \ використовує два символи, тому центральна вертикальна лінія повинна бути зміщена, завдяки чому вона виглядає дуже неохайною
Beta Decay

@BetaDecay: Це добре виглядає на N = 2 і N = 3 (оскільки він зберігає точкову симетрію), але я погоджуюсь на N = 1. Є також варіант перевернутий V:Λ
Flater

2
@JacobGarby: Мій аргумент був стилістичним, а не голодним :)
Flater

Відповіді:


14

Вугілля , 58 53 47 43 41 байт

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

Спробуйте в Інтернеті!

Я просто хотів спробувати інший підхід, він малює зовні за допомогою роздумів (завдяки Нілу за розширення ідеї), а потім малює внутрішню частину. Оскільки Деревне вугілля має :Leftза замовчуванням напрямок для малювання ліній, я використовую цей напрямок якомога більше, щоб зберегти деякі байти, намалювавши S горизонтально, як це:

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

І тоді мені просто потрібно обертати полотно на 90 градусів проти годинникової стрілки.


Можливо, ви щось там знайдете ... 22 байти отримує вас все ззовні ...
Ніл

@Neil це було не зовсім так, ваша ідея потребувала незначного виправлення, але справді це було великим поліпшенням!
Чарлі

Так, я зробив подібну помилку в своєму первісному дописі, оскільки не перевірив ефект масштабування правильно.
Ніл

Хтось сказав Rotate? Це дає мені уявлення ...
Ніл

@Neil ей, у вас там поліпшення! :-)
Чарлі,

13

Пітон 3 , 255 249 248 209 байт

-6 байт завдяки Кевіну Крейсейну

-1 байт завдяки Kevin Cruijssen

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


І те й o+~dінше, m-dі range(o)можна range(m+1), і тоді ви можете видалити, o=m+1\nщоб зберегти 6 байт. Хоча приємна відповідь, +1 від мене.
Кевін Кройсейсен

1
О, і ще один байт, змінивши p(s)\np(s[::-1])на p(s+q+s[::-1]): 248 байт
Кевін Круїйсен

Ви можете зберегти 6 байт, якщо використовувати один printі більше 4, видаливши []з них join([...]), набравши 238 байт
стрижень

Ви також можете зберігати q.joinзмінну, щоб зберегти байт
Rod

217 . Приєднався до всіх q.joins та ще кількох речей
Jo King

13

Деревне вугілля , 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поточний символ рядка v^. В кінці першого циклу курсор розташовується в точці9 . Потім все полотно повертається таким чином, щоб можна було намалювати другу половину Cool S. (Полотно насправді обертається двічі, але це лише детальна деталізація.)

Деревне вугілля не підтримує, RotateCopy(:Up, 4)але якщо б це було, це працювало б на 33 байти:

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

@BetaDecay Вибачте за це. У мене теж був неправильний підрахунок байтів ...
Ніл

Приємно, також виходить n = 0 прямо
Beta Decay

6

Полотно , 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


3

C (gcc) , 379 353 344 334 байт

Я використав пару #define s для усунення субекспресії та кілька глобальних мереж для зв'язку між внутрішніми функціями. Основна петля йде {0,1,2,3,3,2,1,0} для побудови S.

Дякую Джонатану Фреху за пропозиції.

#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.
Джонатан Фрех

Хоча тоді вбудовування на один байт коротше .
Джонатан Фрех



3

C (gcc) , 260 254 байт

-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

Кожна частина може бути описана кількістю рядків, трьома символами та трьома співвідношеннями до певних значень, що визначають ширину поля у кожному рядку.

Першою ітерацією стали:

#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()макросу дуже схожі на те, що таблиця може бути побудована та перекинута. Ширина полів іноді пов'язана з лічильником індексу, а іноді - ні. Ми можемо узагальнити ширину поля, яка буде F * i + A, де F - деякий множник, на який потрібно помножити i, а A - деяке значення, яке слід додати до ширини. Отже, наприклад, остання ширина четвертого виклику вище -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 Не визначений порядок оцінки аргументів функції дає мені паузу.
гастропнер

2

Java, 435 байт

Сама функція займає 435 байт. Безумовно, є можливість для вдосконалення, "високого рівня", аналізуючи правила про те, де розміщувати якого персонажа (врешті-решт, S точково-симетричний) та "низького рівня", за допомогою класичного гольфу (можливо, витягуючи іншу змінну або поєднуючи дві з 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 байт з деякими основними речами для гольфу.
Кевін Кройсейсен

Ви змогли гольфувати трохи більше 405 байт , видаливши деякі змінні та скориставшись t=...трохи менше, де це би економило байти. Якщо у вас виникли запитання щодо будь-яких змін, які я внесла, повідомте мене. :)
Kevin Cruijssen

Дякую @KevinCruijssen, на жаль, я зараз не можу вкласти більше часу на це - це була просто рекреаційна річ, і, враховуючи "багатослів'я" Java, все одно не серйозний конкурент ;-) Розглянемо, як додати ваше рішення як власну відповідь - тоді ми принаймні, якісь внутрішньомовні змагання :-)
Marco13,

2

PHP , 378 374 378 377 376 335 331 328 байт

-3 байти, завдяки манатурності

-4 байти, використовується str_pad замість str_repeat

-41 байт, завдяки пропозиціям манатворців

-1 байт, об'єднавши два кроки в а = = 2

-1 байт, видалено зайве \

-4 байти, повторюючи один раз. Забув, мені потрібно було передати рядок у функцію, так що це більше байтів

Працює і для n = 0.

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;

Спробуйте в Інтернеті!


1
Оскільки декларація функції досить дорога, і ви використовуєте t () лише двічі, без неї було б коротше . Якщо поруч із 9 повідомленнями ви також маєте 1 попередження, 'v'у фіналі ви можете видалити цитати echo.
манатура

1
Можна використовувати одну петлю для верхньої та нижньої косих частин. Ініціалізацію $ a та $ i можна було ущільнити, перемістивши їх при першому використанні.
манатура

1
О, та $i>0й $m>0можуть бути записані просто як $iі $m.
манатура

1
З пробілами , як у деяких інших рішеннях.
манатура

1
Ви також можете перемістити декларацію $ c до її першого використання. Просто змініть .конкатенацію після неї на ,. Спробуйте в Інтернеті!
манатура

1

Пітон 3 , 321 307 байт

Завдяки @EsolangingFruit заощадив 14 байт

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)

Спробуйте в Інтернеті!


Ви можете замінити '\\','/'у другому рядку на, *'\/'щоб зберегти три байти.
Esolanging Fruit


Спасибі! @EsolangingFruit! Мені не було відомо про бітові операції в Python. Крім того, це дозволить заощадити кілька байт, щоб використовувати Python2 через поділ і круглі дужки вprint
Петур

У Python 2 input()автоматично eval()розміщується рядок, щоб ви могли також пропустити int()виклик.
Esolanging Fruit

Для Python 3 ви можете змінити останній рядок на for l in L:print(*l,sep="")(я не думаю, що в Python 2 є еквівалент).
Esolanging Fruit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.