Давайте намалюємо Triforce


29

Triforce вигаданий артефакт Легенда про Zelda , з трьох однакових смотрящим рівносторонніх трикутників , які представляють владу, мудрість і мужність. Кілька ігор у сазі включають анімацію, коли три частини нарешті з’єднуються.

Мета цього завдання - намалювати єдиний 2D-кадр такої спрощеної анімації із заданою шириною для трикутників та заданим проміжком між частинами.

Вхідні дані

Вхід складається з двох цілих чисел: ширина і значення інтервалу .w1s0

Вихід

Рама повинна бути намальована відповідно до таких специфікацій:

         /\
        /  \____________ this part is horizontally centered
       /    \
      /______\
                    \___ s empty lines
                    /
   /\          /\
  /  \        /  \______ w+1 backslashes
 /    \      /    \
/______\    /______\
                \_______ 2w underscores
        |__|
          \_____________ 2s spaces

У наведеному вище прикладі маємо і .w=3s=2

Більше прикладів

w=1 , :s=0

   /\   
  /__\  
 /\  /\ 
/__\/__\

, s = 0 :w=2s=0

     /\     
    /  \    
   /____\   
  /\    /\  
 /  \  /  \ 
/____\/____\

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



   /\            /\   
  /  \          /  \  
 /    \        /    \ 
/______\      /______\

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

    /\          /\    
   /  \        /  \   
  /    \      /    \  
 /      \    /      \ 
/________\  /________\

Правила

  • Пробіли в кожному рядку необов’язкові.
  • Не допускаються додаткові провідні місця в кожному рядку.
  • Ви можете вивести один додатковий провідний новий рядок та / або один додатковий останній новий рядок.
  • Це .

Відповіді:



8

Вугілля деревне , 25 байт

←×_N↗⊕θ‖M≔⁺⊕θNηCη±η‖BO⊗⊕θ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

←×_N

Введіть wі намалюйте w _s.

↗⊕θ

Малюємо w+1 /с.

‖M

Поміркуйте, щоб виконати перший трикутник.

≔⁺⊕θNη

Введіть sта обчисліть зміщення між лівим та середнім трикутниками.

Cη±η

Скопіюйте лівий трикутник до середини.

‖BO⊗⊕θ

Відбийте навколо середнього трикутника, щоб завершити дію.


А, перевірте свою математику на цьому. Це може бути 25 символів , але це від 50 до 65 байт (залежно від того, використовуєте ви представлення UTF-16 або UTF-8 відповідно).
Стюарт П. Бентлі

Моє ліжко; мабуть, у вугілля та полотна є власні відображення персонажів , що мені здається на дотик нерозумним (якщо ви збираєтесь використовувати довільні символи, чому б не використовувати існуючий вибір), але що б там не було.
Стюарт П. Бентлі

@ StuartP.Bentley Суть цього сайту - розмір програми для гольфу. Багато мов (є багато, набагато більше, ніж просто полотно та деревне вугілля) вибрали використання всіх 8 біт на байт, оскільки це дуже хороший спосіб наблизитися до максимальної гольфістичності. Симпатичний unicode - це просто для полегшення читання та запису коду (ви намагаєтесь програмувати на C, написавши байт-код; ми теж люди)
dzaima


7

Полотно , 20 19 16 байт

+├:⁸╵\L_×;∔║ω╋║↕

Спробуйте тут!

Пояснення:

+├                s + w + 2
  :               duplicated (for both X & Y)
   ⁸╵\            w+1 sized diagonal
      L_×         "_"*width of the diagonal
         ;∔       prepended before the diagonal
           ║      palindromize that
            ω     and push the argument of ║ (aka the unpalindromized version)
             ╋    overlap the upside down half-triangle over the upside down triangle at (s+w+2; s+w+2)
              ║   and palindromize the whole thing
               ↕  reverse everything vertically

зауважте: при цьому я виправив помилку в коді, без цього виправлення це було б 18 байт .


Як і у відповіді Ніла , це може бути 16 символів , але в термінах Unicode це або 32, або 44 байти, залежно від того, який UTF ви використовуєте. (Я вважав, що це може бути представленим у застарілому однобайтовому наборі символів, як кодова сторінка 437 , але там немає ω чи ⁸, тому мені здається, вам доведеться перейти з форматом перетворення Unicode.)
Stuart П. Бентлі

@ StuartP.Bentley Canvas використовує користувацьку кодову сторінку, пов’язану з назвою моєї публікації. Вікі github для деревного вугілля містить і свою кодову сторінку. У PPCG домовлено, що відповідати на відповіді у форматі Unicode можна, якщо є кодова сторінка / конвертер, що резервує її.
dzaima

Tcsh, гаразд (хоча в тому випадку, коли ви використовуєте довільні перетворювачі, мені здається, ви могли б також писати мовою з повними іменами та вимірювати складену довжину інструкції по байтовому коду VM).
Стюарт П. Бентлі

@ StuartP.Bentley Перевірте посилання відповідей на деревне вугілля - воно містить код, прочитаний людиною! (так, так, 2 переклади: p) Тут люди відповідають у складі балів як машинний код, тому немає жодних підстав відповідати і в
машинах

7

R , 225 , 224 , 214 , 211 , 208 байт

function(w,s){M=matrix
C=cbind
h=w+1
k=C(apply(m<-diag(h)*60,1,rev)/4,m)
k[row(k)==h&!k]=63
z=rbind(C(a<-M(0,h,h+s),k,a),M(0,s,h*4+2*s),C(k,M(0,h,2*s),k))
z[]=intToUtf8(z+32,T)
apply(z,1,cat,sep='','
')
rm()}

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

  • -1 байт завдяки Джузеппе
  • -10 байт після зміни підходу
  • -3 байти, що використовують код ASCII
  • -3 байти завдяки JayCe

Оскільки я не зміг знайти щось до цього ... Я просто перейменував змінні, а також пропоную інший шлях, щоб повернутися мовчки ... що я не повністю задоволений TBH. Продовжуватиме пошук! TIO
JayCe

о зачекайте ... if(F)0прийнятно точно і економить один байт. Або ще краще rm()на 3 байти.
JayCe

Моя пропозиція використовувати q()в моєму першому коментарі є недійсною відповідно до цієї мета
JayCe

@JayCe: чудовий трюк із використанням rm ()!
digEmAll


4

Python 2 , 256 248 240 228 199 195 байт

Більш тривала програма, але дещо інший підхід:

f,b,o='/\ '
O=o*2
w,s=input()
l=f+'__'*w+b
a=l+O*s+l
m=n=[]
p=lambda g:(len(a)-len(g))/2*o+g
for i in range(w):m=m+[p(f+O*i+b)];t=f+O*i+b;n+=p(t+O*(w-i+s)+t),
print'\n'.join(m+[p(l)]+[o]*s+n+[a])

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


врятувало багато байтів завдяки ігноруванню пробілу пробілів, а також включенню деяких трюків від @ovs
зберегли ще більше, визначивши змінну раніше


Мені доведеться це виправити завтра (це працює, але я можу зробити краще)
micsthepick




це був побічний продукт, коли було два
micsthepick


2

Сітківка 0,8,2 , 141 байт

\d+
$* 
(?=( *),( *))
¶$1/$`$`\$1$2$2$1/$`$`\
T` `\_`/ *\\(?=.*,)
s`¶(.*),( *)
$1¶$.2$*¶$1
\G(( *)/(  |__)*\\)\2(  )*\1 *¶
$2 $#3$* $#4$* $1¶

Спробуйте в Інтернеті! Примітка. Деякі пробіли пробілу у виході. Пояснення:

\d+
$* 

Перетворення входів у пробіли. (Другий рядок закінчується пробілом.)

(?=( *),( *))
¶$1/$`$`\$1$2$2$1/$`$`\

Створіть на сторонах низу два трикутники з відповідним інтервалом.

T` `\_`/ *\\(?=.*,)

Заповніть основу трикутників.

s`¶(.*),( *)
$1¶$.2$*¶$1

Скопіюйте трикутники з відповідним вертикальним проміжком.

\G(( *)/(  |__)*\\)\2(  )*\1 *¶
$2 $#3$* $#4$* $1¶

Перетворіть верхні трикутники в єдиний центральний трикутник.


2

C (gcc), 404 389 байт

#define p(x)putchar(x);
#define F for
W;S;i;a=32;b=47;c=92;f(w,s){W=w,S=s;F(;w;--w){F(i=W+w+s+1;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)p(10)}F(i=W+s+1;i--;)p(a)p(b)F(i=0;i++-2*W;)p(95)p(c)F(;s--+1;)p(10)F(w=W;w;--w){F(i=w;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)F(i=w*2+S*2;i--;)p(a)p(b)F(i=w*2;i++-2*W;)p(a)p(c)p(10)}p(b)F(i=0;i++-2*W;)p(95)p(c)F(i=S*2;i--;)p(a)p(b)F(i=0;i++-2*W;)p(95)p(c)}

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

-14 байт від Rodolvertice

-1 байт шляхом фіксації зменшення змінної циклу

перекреслений 404 майже все ще 404

Безголовки:

#define p(x)putchar(x); // save 7 bytes per putchar call (+24, -182)
#define F for // save 2 bytes per for loop (+14, -28)
int W, S, i; // W is w backup, S is s backup, i is an counter variable;
int a = ' '; // save 1 byte per space printed (+5, -8) (use a instead of 32)
int b = '/'; // save 1 byte per slash printed (+5, -6) (use b instead of 47)
int c = '\\'; // save 1 byte per backslash printed (+5, -6) (use c instead of 92)
// This isn't worth it for '\n' (-5, +3) (10), or '_' (-5, +3) (95)
int f(int w, int s) {
    W = w; // Backup w and s, as we will modify them later, 
    S = s; // but will need their original values
    for(; w != 0; --w) { // Top triangle (not the bottom line)
        for(i = W+w+s+1; i != 0; --i) // leading spaces
            putchar(' ');
        putchar('/'); // left side of triangle
        for(i = 2*w; i != 2*W; ++i) // inner spaces
            putchar(' ');
        putchar('\\'); // right side of triangle
        putchar('\n'); // newline
    }
    for(i = W+s+1; i != 0; --i)
        putchar(' '); // leading spaces for the bottom line
    putchar('/'); // left side
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // the bottom line
    putchar('\\'); // right side
    for(; s-- + 1 != 0;)
        putchar('\n'); // newline after the bottom line and S empty lines
    for(w = W; w != 0; --w) { // Bottom triangles
        for(i = w; i != 0; --i)
            putchar(' '); // leading spaces
        putchar('/'); // left of left triangle
        for(i = w*2; i != 2*W; ++i)
            putchar(' '); // inside of left triangle
        putchar('\\'); // right of left triangle
        for(i = w*2+S*2; i != 0; --i)
            putchar(' '); // spaces between left and right triangles
        putchar('/');
        for(i = w*2; i != 2*W; ++i)
            putchar(' '); // inside of right triangle
        putchar('\\'); // right of right triangle
        putchar('\n'); // newline
    }
    putchar('//'); // left of left
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // bottom of left triangle
    putchar('\\'); // right of left
    for(i = S*2; i != 0; --i)
        putchar(' '); // space between triangles
    putchar('/'); // left of right
    for(i = 0; i != 2*W; ++i)
        putchar('_'); // bottom of left triangle
    putchar('\\'); // right of right
}


1
#define f для збереження декількох байт
rodolphito

Ти не можеш цього зробити #define p putchar?
РК.

1
@RK. Якби я це зробив, тоді мені доведеться використовувати p(x);замість p(x), для (+26, -6) = +20 байт. Точка з комою включається, коли макрос розгортається.
pizzapants184


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.