Давайте нарисуем Triforce


29

Triforce вымышленный артефакт Легенда о Zelda , из трех одинаковых смотрящим равносторонних треугольников , представляющих власть, мудрость и мужество. Несколько игр в саге содержат анимацию, когда эти три части наконец объединяются.

Цель этой задачи - нарисовать один 2D-кадр с такой упрощенной анимацией, с заданной шириной для треугольников и заданным интервалом между частями.

вход

Вход состоит из двух целых чисел: ширины и значения расстояния s 0 .w1s0

Выход

Рамка должна быть нарисована в соответствии со следующими характеристиками:

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

В приведенном выше примере мы имеем и s = 2 .w=3s=2

Больше примеров

, s = 0 :w=1s=0

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

, s = 0 :w=2s=0

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

, s = 3 :w=3s=3

          /\          
         /  \         
        /    \        
       /______\       



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

, s = 1 :w=4s=1

          /\          
         /  \         
        /    \        
       /      \       
      /________\      

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

правила

  • Конечные пробелы в каждой строке не обязательны.
  • Дополнительные пробелы в каждой строке не допускаются.
  • Вы можете вывести одну дополнительную ведущую новую строку и / или одну дополнительную завершающую новую строку.
  • Это .

Ответы:


10

Python 2 , 197 194 169 167 155 144 байта

w,s=input()
l=['']*(2*-~w+s)
for i in range(-~w):W=w-i;b='/'+'_ '[i<w]*2*i+'\\';l[i::w-~s]=' '*(w+s-~W)+b,' '*W+b+'  '*(W+s)+b
print'\n'.join(l)

Попробуйте онлайн!


Добавлено:

  • -3 байта, спасибо мистеру Xcoder

8

Древесный уголь , 25 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

←×_N

Ввести wи нарисовать w _с.

↗⊕θ

Draw w+1 /s.

‖M

Подумайте, чтобы завершить первый треугольник.

≔⁺⊕θNη

Введите sи рассчитайте смещение между левым и средним треугольниками.

Cη±η

Скопируйте левый треугольник в середину.

‖BO⊗⊕θ

Отражение вокруг среднего треугольника, чтобы завершить тройку.


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

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

@ StuartP.Bentley Смысл этого сайта - размер программы гольфа. Многие языки (их много, гораздо больше, чем просто Canvas & Charcoal) выбрали использование всех 8 битов на байт, поскольку это очень хороший способ приблизиться к максимальной игре в гольф. Симпатичный юникод просто для того, чтобы сделать код легче для чтения и записи (вы пытаетесь программировать на 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 символов , но в терминах Юникода это 32 или 44 байта, в зависимости от того, какой UTF вы используете. (Я подумал, что он может быть представлен в устаревшем однобайтовом наборе символов, таком как кодовая страница 437 , но там нет доступных ω или,, поэтому мне кажется, что вам придется использовать формат преобразования Unicode.)
Стюарт П. Бентли

@ StuartP.Bentley Canvas использует пользовательскую кодовую страницу, как указано в заголовке моего сообщения. GitHub Wiki для Charcoal также содержит свою кодовую страницу. На PPCG согласовано, что можно отвечать ответами в формате Unicode, если есть резервная копия кодовой страницы / конвертера.
Дзайма

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 байт из родолвертиц

-1 байт, исправляя уменьшение переменной цикла

зачеркнуто 404 почти все еще 404

Ungolfed:

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